2016-09-25 3 views
1

私はVerilog HDLを使用してパイプラインプロセッサを作ろうとしています。自分のコードのどこかに競合条件があるかもしれないことに気付きました。だから私はsudoのコードを記述するつもりだし、そこに競合状態が内にあり、それを回避する方法場合についてお聞きしたいと思います:Verilog:次のコードは競合状態になる予定ですか?

module A(input wire reset, input wire clock, output reg a_reg_o); 
    always @(posedge clock) 
    begin 
     if(reset == 1'h1) 
     begin 
     a_reg_o = 1'h0; 
     end 
     else 
     begin 
     a_reg_o = 1'h1; 
     end 
    end 
endmodule 

module B(input wire reset, input wire clock, input a_i); 
    reg b; 

    always @(posedge clock) 
    begin 
     if(reset == 1'h1) 
     begin 
     b = 1'h0; 
     end 
     else 
     begin 
     if(a_i == 1'h1) 
     begin 
      b = 1'h1; 
     end 
     else 
     begin 
      b = 1'h0; 
     end 
     end 
    end 
endmodule 

module Main(input wire reset, input wire clock); 
    wire a_o; 
    A a(reset, clock, a_o); 
    B b(reset, clock, a_o) 
endmodule 

だから私は、リセット信号をトリガ想像してみてください。クロックの最初の正のエッジの後、レジスタa_reg_oは0になり、モジュールBからのレジスタbも0になります(競合条件はまだありません)。今度はリセットボタンを放して、それをマイナスにします。クロックの次の正のエッジでは、レジスタa_reg_oは1になりますが、モジュールBのレジスタbはどうなりますか?それは次のようになるでしょう: 1.まだ、a_iの変更が見えなかったのでゼロ。 2.モジュール(AとB)の合計遅延(競合状態)によって異なります。

ありがとうございます。

答えて

1

これは、Verilogにノンブロッキング(NBA)割り当てがある理由です。コーディングルールは、同じイベント(@posdege clock)に同期した同じ信号(a_o)に複数のプロセス(この場合は複数のalwaysブロック)がアクセスし、別のプロセスが読み込みを行い、NBA <=を割り当てる必要がある信号に書き込む。

+0

お返事ありがとうございます。まだ2つの質問があります:1.私はブロックを書くためだけにNBAを使うべきですか? 2.競合状態はシミュレーション上の問題か物理的な実装(合成後)の問題か?私は合成後、異なるパスの遅延のために異なる動作を持つことが可能であることを意味しますか? –

+0

あなたが私が与えたルールに従ってNBAを使うべきです、そうでなければ通常の割り当てを使用してください。 RTLでは、NBAを使用して順次ロジックを出力します。残念なことに、あなたはあなたのRTLでレースをすることができます。これは物理的な実装には存在せず、RTLには存在しない物理的な実装のレースもあります。 –

1

はいネットワークa_oが最初にモジュールAによって駆動され、次にモジュールBによって捕捉されたかどうか、またはその逆であるかどうかはわからないため、競合状態になる可能性があります。

これは、ブロックされていない割り当てを使用する必要があります。これにより、モジュールが実行されても、モジュールBのネット値は常にa_oになります。

この非ブロッキング割り当てについての詳細は、次のリンクをご覧ください。 http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdf