私は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)の合計遅延(競合状態)によって異なります。
ありがとうございます。
お返事ありがとうございます。まだ2つの質問があります:1.私はブロックを書くためだけにNBAを使うべきですか? 2.競合状態はシミュレーション上の問題か物理的な実装(合成後)の問題か?私は合成後、異なるパスの遅延のために異なる動作を持つことが可能であることを意味しますか? –
あなたが私が与えたルールに従ってNBAを使うべきです、そうでなければ通常の割り当てを使用してください。 RTLでは、NBAを使用して順次ロジックを出力します。残念なことに、あなたはあなたのRTLでレースをすることができます。これは物理的な実装には存在せず、RTLには存在しない物理的な実装のレースもあります。 –