zoukankan      html  css  js  c++  java
  • 如何在SV中package中使用函数parameter并在子模块调用

    前言
    实际开发过程中,可能会使用到一些函数,如果在不同子模块中重复定义,则会导致代码冗余。
    而使用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

    以上。

  • 相关阅读:
    【中山纪念中学六年级模拟赛】方格翻转 题解
    高斯消元
    net 控件开发资料
    使用自定义验证组件库扩展 Windows 窗体
    POJ 3032
    UVa 10878 Decode the tape
    C语言I博客作业03
    第十周助教总结
    第十二周助教总结
    C语言I博客作业06
  • 原文地址:https://www.cnblogs.com/kingstacker/p/13495566.html
Copyright © 2011-2022 走看看