$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文に直接記述した為、符号あり整数として処理され、負の余りは負の値になります。

  • あーなるほど。そういえばランダムシードも符合付きで負の値になったりしますよね。ベンダーに文句をいったら、仕方がないと言われました。 - ともすけ 2012-07-07 00:38:07

Top > 言語 > verilog > Tips > $randomの罠
link_pdfプラグインはご利用いただけなくなりました。























-

最終更新:2008年12月23日 09:55