System verilog 如何创建具有随机大小的不同随机值的动态数组?

System verilog 如何创建具有随机大小的不同随机值的动态数组?,system-verilog,System Verilog,面试问题: 我有一个基于systemverilog的类,如下所示: class A; rand n; constraint c:{n>=10 &&n<=15}; bit [31:0] arr[]; randc [31:0] data; endclass A类; 兰德n; 约束c:{n>=10&&n您想要唯一的约束 class A; rand bit [31:0] arr[]; constraint arr_size { arr.size() inside

面试问题: 我有一个基于systemverilog的类,如下所示:

class A;
rand n;
constraint c:{n>=10 &&n<=15};
bit [31:0] arr[];
randc [31:0] data;
endclass
A类;
兰德n;

约束c:{n>=10&&n您想要唯一的约束

class A;
  rand bit [31:0] arr[];

  constraint arr_size { arr.size() inside {[10:15]}; }
  constraint arr_uniq { unique {arr}; }

endclass

如果没有unique,您可以执行以下操作:

class T;
  randc bit [31:0] x;
endclass

class A;
  rand bit [31:0] arr[];
  local T temp;

  function void post_randomize();
    foreach (arr[i])
    begin
      void'(temp.randomize());
      arr[i] = temp.x;
    end 
    void'(temp.randomize());  
  endfunction

  constraint size_con { arr.size() inside {[10:15]}; }
endclass

只需使用一些紧约束,您就可以生成动态数组的唯一随机模式。我尝试给出一些解决方案。我还添加了一个相同的代码示例。希望对您有所帮助

class A;

  rand int a[];

  constraint generate_unique_dyn_array {
  foreach( a[ii] )
   {
       foreach( a[jj] )
       {
            if( ii != jj )
                 a[ii] != a[jj] ;
       }
   }
}
endclass

位[31:0]arr[]之前不应该有一个
rand
?是的,你是对的。面试官不希望我使用unique,那么如何在没有unique约束的情况下使用它呢?IEEE 1800-2012中添加的unique约束使这个问题变得微不足道。面试问题应该修改为询问如何在没有unique约束的情况下使用它。这种暴力解决方案会产生太多的不独立性双重约束,这可能会随着阵列的尺寸越来越大而降低模拟速度。在post_rand和pre_rand中实现这一点时是否相同?如果不是,区别是什么?我相信只有两种方法:pre_randomize&post_randomize,而不是pre_rand,post_randSry,typo。我想问一下pre_randomize和post_ran之间的区别domize.pre_randomize是在类随机化之前自动执行的方法。类似地,post_randomize将在类随机化之后执行。如果这是您想要的,则可以将其标记为答案。