はじめに
randcaseは重み付きのランダムセレクタを作成できます。
使い方
randcase
w1 : x = 1;
w2 : x = 2;
endcase
上記は、x がw1/(w1 + w2) の確立で1, w2/(w1 + w2) の確立で2 になるセレクタです。
サンプル
サンプル1
下記は、a が1/4で1, 3/4で2 になるセレクタです。
module top();
int a;
initial begin
randcase
1: a = 1;
3: a = 2;
endcase
$display("%d", a);
end
endmodule
// 出力
// 1 or 2
重みを変数にする
重みは変数にすることもできます。
module top();
int a;
int b;
initial begin
randcase
1: b = 1;
3: b = 2;
endcase
$display("%d", b);
randcase
b: a = 1; // bは変数。1/2 or 1/4でa = 1となる。
1: a = 2;
endcase
$display("%d", a);
end
endmodule
確率を確認する
下記は、a が1/4で1, 3/4で2 になるセレクタです。10,000回ルールさせて、それぞれ1, 2が何回出現するか計測します。
module top();
int a;
int cnt1;
int cnt2;
initial begin
cnt1 = 0;
cnt2 = 0;
repeat(10000) begin
randcase
1: a = 1;
3: a = 2;
endcase
if (a == 1)
cnt1 += 1;
else if (a == 2)
cnt2 += 1;
end
$display("%d", cnt1); // 約2500
$display("%d", cnt2); // 約7500
end
endmodule
まとめ
randcaseについてまとめました。
コメント