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



我有以下函数:

   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"进行比较:将句柄与打包类型进行比较是非法的。

我必须检查它是否为空,因为我想在没有值的情况下显示一条消息

如何使参数minmax 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。此外,它们定义函数头的方式,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 的值,如果最小值>最大值,则max

最新更新