我有以下函数:
function void my_randomize_int(int seed, inout int mem, int min, int max);
if(max == null) begin
`uvm_info("my_randomize_int", "No max constraint, using default value", UVM_LOW)
max = 2147483647;
end
if(min == null) begin
`uvm_info("my_randomize_int", "No min constraint, using default value", UVM_LOW)
min= -2147483647;
end
mem = ($urandom(seed) % (max-min+1)) + min;
endfunction: my_randomize_int
我收到以下错误: 无法将类型"int"与类型"null"进行比较:将句柄与打包类型进行比较是非法的。
我必须检查它是否为空,因为我想在没有值的情况下显示一条消息
如何使参数min
并max
longint
s并给出超出int
范围的默认值?
function void my_randomize_int(int seed, inout int mem, input longint min = -2147483648, longint max = 2147483648);
if(max == 2147483648) begin
`uvm_info("my_randomize_int", "No max constraint, using default value", UVM_LOW)
max = 2147483647;
end
if(min == -2147483648) begin
`uvm_info("my_randomize_int", "No min constraint, using default value", UVM_LOW)
min= -2147483647;
end
mem = ($urandom(seed) % (max-min+1)) + min;
endfunction: my_randomize_int
https://www.edaplayground.com/x/5_qB
在SystemVerilog中,除非声明了默认参数值,否则必须将值传递给函数参数
function void my_randomize_int( int seed,
inout int mem,
input longint min = -2147483648,
longint max = 2147483648);
如果您没有将值传递给 min 或 max 参数,则无法从函数内部知道是否使用了默认值,或者用户是否碰巧传递了等于默认值的值。我只是假设他们永远不会那样做。
与其他数值数据类型一样,int
不能null
。此外,它们定义函数头的方式,min
和max
必须在方法调用中绝望,否则将是编译错误。
要解决此问题,min
和 max
需要声明为 integer
并具有默认值 'x
。然后使用$isunknown
系统功能确定min
和max
是否具有合法价值。
function void my_randomize_int(int seed, inout int mem, integer min = 'x, integer max = 'x);
if($isunknown(max)) begin
`uvm_info("my_randomize_int", "No max constraint, using default value", UVM_LOW)
max = 2147483647;
end
if($isunknown(min)) begin
`uvm_info("my_randomize_int", "No min constraint, using default value", UVM_LOW)
min= -2147483647;
end
mem = ($urandom(seed) % (max-min+1)) + min;
endfunction: my_randomize_int
另一种方法是将它们保留为int
,并为其分配最小值/最大值。请注意,此方法不会让您检查是否给出了最小/最大约束。
function void my_randomize_int(int seed, inout int mem, int min = -2147483647, int max = 2147483647);
仅供参考:您需要交换 min
的值,如果最小值>最大值,则max