$randomの罠
概要
テストシナリオを作成する時に、$randomを活用する。
で、はまりました。
動作確認
ツール |
バージョン |
結果 |
NC-Verilog |
NCV_IUS6.11_s004 |
○ |
VCS-MX |
VCS_2005.06-SP2 |
○ |
ModelSim |
|
未確認 |
Cver |
GPLCVER_2.12a of 05/16/07 |
○ |
テストコード
ランダム値を2で割って、そのあまりをcase文に使う。
case defaultの発生
module test;
initial begin
repeat(10)begin
case($random % 2)
0 : $display("case 0");
1 : $display("case 1");
default : $display("case default");
endcase
end
end
endmodule
case 0
case default
case default
case default
case 1
case 1
case default
case 0
case 1
case 1
0,1のいずれかのみ発生・・・とおもいきや、defaultも発生しています。
case -1の追加
module test;
initial begin
repeat(10)begin
case($random % 2)
0 : $display("case 0");
1 : $display("case 1");
-1 : $display("case -1");
default : $display("case default");
endcase
end
end
endmodule
case 0
case -1
case -1
case -1
case 1
case 1
case -1
case 0
case 1
case 1
その正体は"-1"でした。
seedを変えていないので、"case default"の位置に"case -1"が表示されています。
また、defaultの発生もありません。
case文に直接記述した為、符号あり整数として処理され、負の余りは負の値になります。
最終更新:2008年12月23日 09:55