distでrand変数に重みづけする
distでrand変数に重みづけができます。
動作確認してみます。
「:=」の動作確認
0:10%, 1:30%, 2:30%, 4:30%
の出現確率で10,000回実行します。
module top;
class A;
rand bit [3:0] a;
constraint c1{
a dist {0 := 10, 1 := 30, [2:3] := 30};
// a dist {0 :/ 10, 1 :/ 30, [2:3] :/ 60};
}
endclass
A a;
int cnt[4];
initial begin
a = new();
foreach(cnt[i]) begin
cnt[i] = '0;
end
repeat(100000) begin
a.randomize();
cnt[a.a] = cnt[a.a] + 1;
end
foreach(cnt[i]) begin
$display("%d: %d", i, cnt[i]);
end
end
endmodule
実行結果
0: 9966
1: 30076
2: 30051
3: 29907
「:/」の動作確認
0:10%, 1:30%, 2:30%, 4:30%
の出現確率で10,000回実行します。
module top;
class A;
rand bit [3:0] a;
constraint c1{
// a dist {0 := 10, 1 := 30, [2:3] := 30};
a dist {0 :/ 10, 1 :/ 30, [2:3] :/ 60};
}
endclass
A a;
int cnt[4];
initial begin
a = new();
foreach(cnt[i]) begin
cnt[i] = '0;
end
repeat(100000) begin
a.randomize();
cnt[a.a] = cnt[a.a] + 1;
end
foreach(cnt[i]) begin
$display("%d: %d", i, cnt[i]);
end
end
endmodule
実行結果
0: 10025
1: 29929
2: 29999
3: 30047
まとめ
それっぽくなりました。
コメント