randomize()の制約の一つ、implication(->)を使うことで、制約間の関係を指定することができます。
implicationという名前ですが、コード記述内では「->」のような記述方法を使います。以下でこのimplicationの使用方法についてまとめます。
制約implicateの使用例1
変数Xが制約Aのとき、変数Yは制約Bのように、複数の制約間の関係を決定図けることができます。複数制約の重ね掛けが可能だと解釈すると分かりやすいかもしれません。
制約関係指定:SystemVerilog
class Transaction;
rand bit x;
rand bit [(8-1):0] y;
// random constraint
constraint c1 {
//- implication(包含)
(x == 1) -> (y < 10);
}
endclass
//- Instance
Transaction tr = new();
initial begin
repeat(10) begin
if(!tr.randomize()) $finish;
$display("x : %d, y : %d", tr.x, tr.y);
end
$finish();
end
制約関係指定:実行結果
(x == 1) -> (y < 10);
----------------------------
x : 0, y : 98
x : 1, y : 5
x : 0, y : 251
x : 0, y : 124
x : 1, y : 2
x : 1, y : 6
x : 1, y : 4
x : 1, y : 5
x : 0, y : 68
x : 1, y : 8
実行結果を見ると、xが1のとき10以下の数になっていることが分かります。
制約implicationの使用例2
以下のような形で、randomize()で頻繁に用いられる制約の複数を重ね掛けることもできます。
制約の組み合わせ:SystemVerilog
class Transaction;
rand bit [(8-1):0] y;
rand bit [(2-1):0] z;
// random constraint
constraint c1 {
//- implication(包含)
(z inside {[0:1]}) -> (y inside {[0:99]});
(z inside {[2:3]}) -> (y inside {[100:200]});
}
endclass
//- Instance
Transaction tr = new();
initial begin
repeat(10) begin
if(!tr.randomize()) $finish;
$display("y : %d, z : %d", tr.y, tr.z);
end
$finish();
end
制約の組み合わせ:実行結果
(z inside {[0:1]}) -> (y inside {[0:99]});
(z inside {[2:3]}) -> (y inside {[100:200]});
----------------------------
y : 187, z : 3
y : 81, z : 1
y : 131, z : 3
y : 111, z : 3
y : 36, z : 1
y : 163, z : 2
y : 90, z : 1
y : 22, z : 1
y : 2, z : 0
y : 75, z : 1
- zが0または1のとき、yは99以下
- zが2または3のとき、yは100以上200以下