systemVerilog - 如何验证整数成员是否为空?

时间:2017-01-18 12:02:25

标签: null system-verilog

我有以下功能:

   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因为我想在没有值的情况下显示消息

3 个答案:

答案 0 :(得分:0)

如何制作参数minmax 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

https://www.edaplayground.com/x/5_qB

答案 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。此外,他们定义了函数标头,minmax必须在方法调用中绝望,否则将是编译错误。

要解决此问题,minmax需要声明为integer,并且默认值为'x。然后使用$isunknown系统函数确定minmax是否具有合法值。

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

,您需要交换minmax的值