使用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()中賦值,我已經有效地從約束求解器中刪除了關於這個關係的任何信息。 –