SystemVerilog如何设计和调用常数函数
时间:10-02
整理:3721RD
点击:
目的:对模块的例化参数进行判断处理,并生成对应的内部常数,将这一功能封装于package中以便于复用。设计的示例代码如下:
- package pkg;
- function bit[15:0] bitgen(int bit1idx);
- automatic bit[15:0] res = '0;
- if (bit1idx >= 0 && bit1idx < 16)
- res[bit1idx] = 1'b1;
- return res;
- endfunction
- function bit bit2test(bit[15:0] bits2test); if ((bits2test&bitgen(2)) != 0) return 1'b1; return 1'b0;endfunction
- endpackage
- module mod2test #( parameter para2test = 16'h000F); localparam bit2set_flag = pkg::bit2test(para2test); initial begin if (bit2set_flag == 0) $error("bit2 of para2test is not set!); endendmodule
这些代码在modelsim中编译时报错,大概意思是:
1.不能在pkg命名空间找到bit2test函数
2.参数para2test必须是常数
查询了SystemVerilog相关的标准,大概意思似乎是应用在常数表达式中的函数不能是“DPI”函数,函数的参数必须赋给常值。但在上面的代码中,para2test应该是编译时确定的值,对运行时来说应该可以作为常值对待,为什么modelsim却不能编译通过呢?有没有办法实现我的设计意图呢?
