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

    以上。

  • 相关阅读:
    如何使用Java、Servlet创建二维码
    Java线程池主线程等待子线程执行完成
    Java多线程--让主线程等待所有子线程执行完毕
    查询及删除重复记录的方法
    聚集索引和非聚集索引
    数据库索引类型及实现方式
    各种排序算法的分析及java实现
    两个变量交换值的方法
    Java性能优化技巧
    JVM调优总结(九)-新一代的垃圾回收算法
  • 原文地址:https://www.cnblogs.com/kingstacker/p/13495566.html
Copyright © 2011-2022 走看看