配列などの複数のデータに対してrandomizeにおける制約を適用する際、foreachを用いることで、一括で制約を加えることができます。
foreachによる制約実装
ここでは、実装2行目で要素数4の配列を作成し、これらにrandomize()における制約を付与することを行っています。
配列要素へ制約適用:SystemVerilog
class Transaction;
rand bit [(8-1):0] a[4];
// random constraint
constraint c1 {
foreach (a[i]) {
(a[i] < 100) -> (a[i+1] > 100);
(a[i] >= 100) -> (a[i+1] < 100);
}
}
endclass
Transaction tr = new();
initial begin
repeat(10) begin
if(!tr.randomize()) $finish;
$display("a[0] : %d, a[1] : %d, a[2] : %d, a[3] : %d", tr.a[0], tr.a[1], tr.a[2], tr.a[3]);
end
$finish();
end
配列要素へ制約適用:実行結果
foreach (a[i]) {
(a[i] < 100) -> (a[i+1] > 100);
(a[i] >= 100) -> (a[i+1] < 100);
}
----------------------------
a[0] : 50, a[1] : 127, a[2] : 66, a[3] : 195
a[0] : 73, a[1] : 254, a[2] : 97, a[3] : 123
a[0] : 69, a[1] : 213, a[2] : 20, a[3] : 244
a[0] : 66, a[1] : 148, a[2] : 45, a[3] : 172
a[0] : 25, a[1] : 157, a[2] : 31, a[3] : 172
a[0] : 71, a[1] : 131, a[2] : 5, a[3] : 158
a[0] : 16, a[1] : 217, a[2] : 30, a[3] : 177
a[0] : 52, a[1] : 230, a[2] : 30, a[3] : 243
a[0] : 20, a[1] : 248, a[2] : 99, a[3] : 204
a[0] : 6, a[1] : 208, a[2] : 81, a[3] : 243
- (a[i] < 100) -> (a[i+1] > 100);
- (a[i] >= 100) -> (a[i+1] < 100);
この2つの制約を順序関係なく付与すると、a[0]でかならず100未満となることについては疑問が残りますが、ひとまず、a[i]が100未満の数のとき、a[i+1]の値が100以上。a[i]が100以上の数のとき、a[i+1]の値が100未満という条件が成立していることが分かるかと思います。
randomize制約一覧
参考:
・http://japanese.sugawara-systems.com/systemverilog/constraint_random_value_generation.htm