System verilog 基于另一个数组约束SystemVerilog中的整个数组

System verilog 基于另一个数组约束SystemVerilog中的整个数组,system-verilog,constraint-programming,System Verilog,Constraint Programming,是否可以约束SystemVerilog中的整个数组与另一个数组具有相同的值 我试过这个: class some_class; rand bit array1[10][10]; rand bit array2[10][10]; constraint arrays_c { array1 == array2; } enclass 我试过的Big3模拟器中有两个不允许这样做。一个说它目前不受支持,另一个说我引用了约束BNF,抱怨它不是一个有效的整数表达式 除了设置

是否可以约束SystemVerilog中的整个数组与另一个数组具有相同的值

我试过这个:

class some_class;
   rand bit array1[10][10];
   rand bit array2[10][10];

   constraint arrays_c {
      array1 == array2;
   }
enclass
我试过的Big3模拟器中有两个不允许这样做。一个说它目前不受支持,另一个说我引用了约束BNF,抱怨它不是一个有效的整数表达式


除了设置一点foreach约束之外,还有其他方法吗?我最终想要的是从函数返回一个数组,并使用它约束另一个作为类字段的数组。

使用
foreach
,请参见§18.5.8.1 foreach迭代约束

如果需要随机数组的副本,更好的方法是在
post\u randomize
函数中分配副本。这是较少的CPU激励

class some_class;
   rand bit array1[10][10];
   bit array2[10][10];

   function void post_randomize();
     array2 = array1;
   endfuction : post_randomize
enclass

如果约束块中的
foreach
post_randomize
计算不是可行的解决方案,则使用is压缩数组

class some_class;
   rand bit [9:0][9:0] array1; // double packed
   rand bit [9:0][9:0] array2;

   constraint arrays_c {
    array1 == array2;
   }
enclass
或者使用包数组和位流分配来解压缩最终结果

class some_class;
   bit array1[10][10];
   bit array2[10][10];
   rand bit [$bits(array1)-1:0] flat_array1,flat_array2;

   constraint arrays_c {
    flat_array1 == flat_array2;
   }

   function void post_randomize();
     {>>{array1}} = flat_array1; // bit-stream assignment
     {>>{array2}} = flat_array2;
   endfuction : post_randomize
enclass

在压缩阵列上它可以工作,但在那里我可以使用的类型有限制。这些限制显然也因供应商而异。您可以尝试仅使用随机阵列2,然后使用随机张贴将其复制到阵列1。虽然这样做可行,但与我想要的不兼容。我最终希望对数组进行一系列约束,从而得到一个特定的结果(比如“如果array3是这样,那么array1应该是什么?(假设我只知道array1和array2以及array2和array3之间的关系)。通过在post_randomize()中赋值)我已经有效地从约束解算器中删除了有关此关系的任何信息。请小心foreach,它将展开约束,当数组变大时,您将看到性能问题并很快耗尽内存。谢谢@Greg,但正如我所说,我不能使用foreach,因为右侧的数组将是一个字段类的,但函数的返回值,我不能切片。@Tudor,然后使用压缩数组。我在答案中添加了两个示例。好主意@Greg。我将进一步研究stream操作符。
class some_class;
   bit array1[10][10];
   bit array2[10][10];
   rand bit [$bits(array1)-1:0] flat_array1,flat_array2;

   constraint arrays_c {
    flat_array1 == flat_array2;
   }

   function void post_randomize();
     {>>{array1}} = flat_array1; // bit-stream assignment
     {>>{array2}} = flat_array2;
   endfuction : post_randomize
enclass