首页 > 其他 > 详细

如何在SV中package中使用函数\parameter并在子模块调用

时间:2020-08-13 14:08:55      阅读:87      评论:0      收藏:0      [点我收藏+]
前言
实际开发过程中,可能会使用到一些函数,如果在不同子模块中重复定义,则会导致代码冗余。
而使用SV语法则可以把函数定义在包中,包是单独的一个文件,子模块只需要include这个文件即可使用函数。
技术分享图片
而包中可以包含哪些定义?
技术分享图片
流程
以下操作需要两个文件:definition.sv 和 demo_sv.sv文件
(1)definition文件内容:包含位宽计算函数clogb2
`ifndef DFFS_DONE
    `define DFFS_DONE
    package p_demo;
        function integer clogb2 (input integer depth);
        begin
            for (clogb2=0; depth>0; clogb2=clogb2+1
                depth = depth >>1;                          
        end

endfunction
    endpackage 
    import p_demo::*;
`endif
(2)demo_sv文件内容:通过include文件,然后可直接调用clogb2。
`include "definitions.sv"
module demo_sv (
    input  logic i_clk,
    output logic l_b        
);
logic [clogb2(1024)-1:0] l_cnt = ‘0;
always_ff @(posedge i_clk)
begin
    l_cnt <= l_cnt + ‘d1;
end
assign l_b = | l_cnt;

endmodule:demo_sv
(3)在Vivado2018.3中综合看结果。和计算器的位宽比较,可以看到结果是吻合的。偷懒不想算位宽使用。
技术分享图片
技术分享图片
(4)在包中可以定义parameter等,使用跟verilog类似。
`ifndef DFFS_DONE
    `define DFFS_DONE
    package p_demo;
        localparam p_width = 4;
    endpackage 
    import p_demo::*;
`endif

`include "definitions.sv"
module demo_sv (
    input  logic i_clk,
    output logic l_b        
);
logic [p_width-1:0] l_cnt = ‘0;
always_ff @(posedge i_clk)
begin
    l_cnt <= l_cnt + ‘d1;
end 
assign l_b = | l_cnt;

endmodule:demo_sv

以上。

如何在SV中package中使用函数\parameter并在子模块调用

原文:https://www.cnblogs.com/kingstacker/p/13495566.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!