使用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
在打包数组它的工作原理,但也有我可以使用那里的类型的限制。这些限制显然也因供应商而异。 –
你可能会尝试只随机array2,然后使用随机后将其复制到array1 – enchanter
虽然这将工作,它不符合我想要的。我最终想要在数组上产生一系列约束来产生一个特定的结果(类似于“如果array3是这个,array1应该是什么?”(因为我只知道array1和array2以及array2和array3之间的关系)。通过在post_randomize()中赋值,我已经有效地从约束求解器中删除了关于这个关系的任何信息。 –