是否可以将SystemVerilog中的整个数组约束为与另一个数组具有相同的值?
我试过了:
class some_class;
rand bit array1[10][10];
rand bit array2[10][10];
constraint arrays_c {
array1 == array2;
}
enclass
在我尝试过的2台Big3模拟器中,我们不允许这样做。一个人说它目前不受支持,另一个人指的是约束BNF,抱怨它不是一个有效的积分表达式。
除了设置一些foreach约束之外,还有其他方法吗?我最终想要的是从函数返回一个数组,并用它来约束另一个类字段的数组。
答案 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
如果约束块中的foreach
和post_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