前言
測試下可綜合的struct,
struct和interface的區別:兩者都可以是信號的組合,但interface可以定義信號的不同方向,而struct中的所有信號都是同向的。
struct可對像以太網幀格式進行建模(暫未用到)。

流程
(1)為了對struct進行建模,需要三個模塊,頂層,信號輸出模塊,信號輸入模塊。
(2)對於結構體的定義可放在模塊外部的包里面,單獨成一個文件。同時為了避免$unit的問題,使用類似C語法規則的條件編譯。
(3)條件編譯文件中的內容:文件放在src同級目錄即可。
`ifndef
DFFS_DONE
`define
DFFS_DONE
package
p_demo
;
typedef struct
{
logic
l_clk_50M;
logic
l_clk_100M;
logic
l_rst_50M;
logic
l_rst_100M;
}
t_clk_rst
;
endpackage
import
p_demo
::*
;
`endif
`include
"definitions.sv"
module
demo_sv
(
input
i_clk ,
input
i_rst_n ,
input
i_a ,
output
o_b
);
t_clk_rst
t_gene_top;
genafic
inst_genafic
(
.
i_clk
(i_clk),
.
i_rst_n
(i_rst_n),
.
t_gene
(t_gene_top)
);
test
inst_test
(
.
i_a
(i_a),
.
o_b
(o_b),
.
t_gene_in
(t_gene_top)
);
endmodule
:
demo_sv
`include
"definitions.sv"
module
genafic
(
input
logic
i_clk,
input
logic
i_rst_n,
output
t_clk_rst
t_gene
);
logic
l_locked;
clk_wiz_0
inst_clk_wiz_0
(
.
clk_out1
(t_gene.
l_clk_50M
),
.
clk_out2
(t_gene.
l_clk_100M
),
.
reset
(
~
i_rst_n),
.
locked
(l_locked),
.
clk_in1
(i_clk)
);
logic
l_rst_50M
=
1'b1
;
logic
[
9
:
0
] l_cnt_50M
=
'0
;
always_ff
@
(
posedge
t_gene.l_clk_50M)
begin
if
(
!
i_rst_n)
l_cnt_50M
<=
'0
;
else
if
(l_cnt_50M
==
'd200
)
l_cnt_50M
<=
l_cnt_50M;
else
l_cnt_50M
<=
l_cnt_50M
+
'd1
;
end
always_ff
@
(
posedge
t_gene.l_clk_50M)
begin
if
(
!
l_locked)
l_rst_50M
<=
1'b1
;
else
if
(l_cnt_50M
==
'd200
)
l_rst_50M
<=
1'b0
;
end
logic
l_rst_100M
=
1'b1
;
logic
[
9
:
0
] l_cnt_100M
=
'0
;
always_ff
@
(
posedge
t_gene.l_clk_100M)
begin
if
(
!
i_rst_n)
l_cnt_100M
<=
'0
;
else
if
(l_cnt_100M
==
'd200
)
l_cnt_100M
<=
l_cnt_100M;
else
l_cnt_100M
<=
l_cnt_100M
+
'd1
;
end
always_ff
@
(
posedge
t_gene.l_clk_100M)
begin
if
(
!
l_locked)
l_rst_100M
<=
1'b1
;
else
if
(l_cnt_100M
==
'd200
)
l_rst_100M
<=
1'b0
;
end
assign
t_gene.l_rst_50M
=
l_rst_50M;
assign
t_gene.l_rst_100M
=
l_rst_100M;
endmodule
:
genafic
`include
"definitions.sv"
module
test
(
input
logic
i_a,
output
logic
o_b,
input
t_clk_rst
t_gene_in
);
logic
[
9
:
0
] l_cnt_b
=
'0
;
always_ff
@
(
posedge
t_gene_in.l_clk_50M)
begin
if
(
!
t_gene_in.l_rst_50M)
l_cnt_b
<=
'0
;
else
if
(i_a)
l_cnt_b
<=
l_cnt_b
+
'd1
;
end
assign
o_b
=
l_cnt_b[
9
];
endmodule
:
test
(7)使用vivado2018.3綜合看看結果:


采用結構體對信號進行分組,可實現偷懶以及更佳維護性效果。
以上。