基于另一个数组在SystemVerilog中约束整个数组

时间:2014-05-19 08:04:19

标签: system-verilog constraint-programming

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

我试过了:

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

   constraint arrays_c {
      array1 == array2;
   }
enclass

在我尝试过的2台Big3模拟器中,我们不允许这样做。一个人说它目前不受支持,另一个人指的是约束BNF,抱怨它不是一个有效的积分表达式。​​

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

1 个答案:

答案 0 :(得分:2)

使用foreach,请参阅IEEE Std 1800-2012§18.5.8.1 foreach迭代约束

constraint arrays_c {
  foreach(array1[i,j]) {
    array1[i][j] == array2[i][j];
  }
}

如果您想要随机数组的副本,更好的方法是在post_randomize函数中分配副本。它减少了CPU的激励。

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

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

如果约束块中的foreachpost_randomize计算不是可行的解决方案,则使用打包数组。

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