Home Articles

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

Asked
Viewed 618 times
1

是否可以将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 Answer

  • 2

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

    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
    

Related