如何在SV中使用結構體struct語法


前言
測試下可綜合的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
(4)頂層:注意需包含定義文件。同時定義結構體變量。實例化genafic和test模塊。
`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
(5)genafic文件內容:產生了兩個時鍾和復位。結構體的方向是輸出。
`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
(6)test文件內容:使用了50M的時鍾,結構體為輸入。
`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綜合看看結果:
采用結構體對信號進行分組,可實現偷懶以及更佳維護性效果。

以上。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM