[Verilog] 組み合わせ回路記述の罠(その2)

[Verilog] 組み合わせ回路記述の罠(その1)


の続きですが、ちょっと脱線します。
前回のソースをちょっと書き直しました。
変数:controlから生成される信号:tb_a, tb_bをそれぞれ監視したものです。

module testbench();

  reg [2:0] control = 0;
  reg tb_a = 0, tb_b = 0;

  task automatic print (input in);
    if(in==0)
      $display("Call a - @%0t control = '%3b, tb_a = %0b, tb_b = %0b"
               , $time, control, tb_a, tb_b);
    else
      $display("Call b - @%0t control = '%3b, tb_a = %0b, tb_b = %0b"
               , $time, control, tb_a, tb_b);
  endtask

  initial begin
    #10;
    control = 'b001; #10; // print();
    control = 'b010; #10; // print();
    control = 'b110; #10; // print();
    $finish();
  end

  always @(control) begin
    tb_a = 0;
    tb_b = 0;
    casex (control)
      3'b00x : tb_a = 1 ;
      3'b1xx : tb_b = 1 ;
    endcase
  end

  always @(tb_a) begin
    print(0);
  end

  always @(tb_b) begin
    print(1);
  end
endmodule


実行結果

  • シミュレータA
  • # Call b - @0 control = '000, tb_a = 0, tb_b = 0
    # Call a - @0 control = '000, tb_a = 0, tb_b = 0
    # Call a - @0 control = '000, tb_a = 1, tb_b = 0
    # Call a - @10 control = '001, tb_a = 1, tb_b = 0
    # Call a - @20 control = '010, tb_a = 0, tb_b = 0
    # Call b - @30 control = '110, tb_a = 0, tb_b = 1
    
  • シミュレータB
  • # Call a - @10 control = '001, tb_a = 1, tb_b = 0
    # Call a - @20 control = '010, tb_a = 0, tb_b = 0
    # Call b - @30 control = '110, tb_a = 0, tb_b = 1
    


シミュレータAの 0時刻に出ている表示に関しては、Verilog HDLにて曖昧な部分(初期化部分)になります。 しかし、SystemVerilog ではこの曖昧な部分は無くなっており SystemVerilogでコンパイルすると消えます。


つまり、色々とVerilog HDLでは書き方によって変わります。
注意しないと恐ろしいことが起こります。
次回、「書いてはいけない組み合わせ回路記述」

関連記事

コメントの投稿

非公開コメント

プロフィール

Kocha

Author:Kocha
なんでもチャレンジ!(^o^)/
E-mail
github:Kocha
イベントカレンダー

カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリ
OVP (4)
最新記事
最新コメント
アーカイブ
リンク
Twitter
アクセス人数