乱数を生成するrandomize()の制約(constraint)の一つ、uniqueについて使用例をまとめます。
乱数の制約uniqueは対応しているツールに制限が大きいような気がしています。少なくとも無料で使うことのできるVivado(vsim)やiverilogなどで使用していた特定のバージョンでは使うことができませんでした。
有償ツールであれば、たいていのベンダーのもので対応しているんでしょうか?
unique制約で乱数の重複を無くす
乱数で生成する値の組をそれぞれの値がユニーク(かぶりが無いよう)に、制限することができます。それぞれが独立した値を取る組み合わせの信号などに対して便利につかうことができます。
組み合わせにおける重複防止:SystemVerilog
class Transaction;
rand bit x;
rand bit [(2-1):0] y;
rand bit [(2-1):0] z;
rand bit m;
// random constraint
constraint c1 {
unique {x, y, z, m};
}
endclass
//- Instance
Transaction tr = new();
initial begin
repeat(10) begin
if(!tr.randomize()) $finish;
$display("x : %d, y : %d, z : %d, m : %d", tr.x, tr.y, tr.z, tr.m);
end
$finish();
end
組み合わせにおける重複防止:実行結果
unique {x, y, z, m};
----------------------------
x : 1, y : 3, z : 2, m : 0
x : 0, y : 2, z : 3, m : 1
x : 1, y : 3, z : 2, m : 0
x : 1, y : 2, z : 3, m : 0
x : 1, y : 3, z : 2, m : 0
x : 1, y : 3, z : 2, m : 0
x : 0, y : 2, z : 3, m : 1
x : 0, y : 2, z : 3, m : 1
x : 1, y : 3, z : 2, m : 0
x : 1, y : 3, z : 2, m : 0
zとmは1bitの信号なので、必ずどちらかが1、どちらかが0になっています。また、yとzについても、0~3の値を取ることができますが、xとmが0と1を必ず取るため、yかzが3か2をどちらかが必ず取る組み合わせとなっていることが分かります。
uniqueと他の制約との組み合わせ
下記は、uniqueとinsideのように、ほかの制約と組み合わせることも可能ということを示す例です。
unique+inside:SystemVerilog
class Transaction;
rand bit x;
rand bit [(8-1):0] y;
rand bit [(2-1):0] z;
rand bit m;
// random constraint
constraint c1 {
unique {x, y, z, m};
y inside {1, 100, 255};
}
endclass
//- Instance
Transaction tr = new();
initial begin
repeat(10) begin
if(!tr.randomize()) $finish;
$display("x : %d, y : %d, z : %d, m : %d", tr.x, tr.y, tr.z, tr.m);
end
$finish();
end
unique+inside:実行結果
unique {x, y, z, m};
y inside {1, 100, 255};
----------------------------
x : 1, y : 255, z : 3, m : 0
x : 0, y : 100, z : 2, m : 1
x : 1, y : 255, z : 2, m : 0
x : 1, y : 100, z : 3, m : 0
x : 1, y : 255, z : 3, m : 0
x : 1, y : 255, z : 2, m : 0
x : 0, y : 100, z : 3, m : 1
x : 0, y : 100, z : 3, m : 1
x : 1, y : 255, z : 3, m : 0
x : 1, y : 255, z : 2, m : 0
randomize()制約一覧
実行環境:
・https://www.edaplayground.com/
(Aldec Riviera Pro 2022.04)