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

    以上。

  • 相关阅读:
    vscode配置远程开发环境
    C++条件语句和循环语句
    C++整数相除、取模运算和自加
    C++基础数据类型
    C++定义常量、标识符命名、整型数据类型
    Android压力测试工具Monkey简介
    adb shell命令后出现error: device not found报错解决方案
    xadmin修改登录页面背景图
    windbg如何让.cmdtree自动执行?
    Rabbitmq入门到进阶看这篇就够了!
  • 原文地址:https://www.cnblogs.com/kingstacker/p/13495566.html
Copyright © 2011-2022 走看看