我有以下功能:
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'类型进行比较:将句柄与打包类型进行比较是违法的。
我必须检查它是否为null因为我想在没有值的情况下显示消息
答案 0 :(得分:0)
如何制作参数min
和max
longint
并提供超出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
答案 1 :(得分:0)
在SystemVerilog中,除非已声明默认参数值,否则必须将值传递给函数参数
function void my_randomize_int( int seed,
inout int mem,
input longint min = -2147483648,
longint max = 2147483648);
如果你没有将值传递给min或max参数,则无法从函数内部知道是否使用了默认值,或者用户是否碰巧传递的值等于默认值。我只是假设他们永远不会这样做。
答案 2 :(得分:0)
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> gt; max
,您需要交换min
和max
的值