私もこれに苦労しました。
ただし、最初に、非ブロッキングまたはブロッキングは、実際にはラッチ/ffが作成されるかどうかとは関係がないことを理解する必要があります。
それらの違いについては、この時点で簡単に(最初に)理解できます。ブロッキングを使用する場合、変数を使用すると、ブロックセンテンスのLHSに変更されたものが更新されて使用される可能性があるため、ブロックセンテンスのLHSが値を割り当てるまで実行できませんでした。ただし、非ブロックの場合、次の文と並行して次の文をブロックしません(実際には、RHS計算を最初に実行する必要がありますが、混乱する場合は無視してください)。LHSは、今回の実行では変更/更新されません(次回、常にブロックが再度トリガーされたときに更新されます)。そして、次の文は、実行サイクルの終わりに更新された古い値を使用します。
a = 0; b= 0;
a = 1;
b = a;
--> output a = 1, b = 1;
a = 0; b= 0;
a <= 1;
b = a;
--> output a = 1, b = 0;
重要なポイントの1つは、コード内に(常にブロックする)値が割り当てられていないが発生する可能性のあるケース変数があるかどうかを確認することです。値を渡さずにその場合が発生した場合は、値を保持するためにラッチ/ffが作成されます。
例えば、
always @(*) begin
if(in) out = 1;
else out = 0;
end
--> this end without latch/ff
always @(*) begin
if(in) out = 1;
end
--> this end with one latch/ff to keep value when in = 0, as it might happen and you didn't assign value to out as in=1 do.
以下もラッチ/ffを作成する可能性があります。
always @(*) begin
if(in) a = 1;
else b = 1;
end
-> in = 1、b割り当てなし、in=0で割り当てなしのラッチ/ffsが作成されました。
また、clkのポーズを感知するalways @(posedge clk)
と、latch/ffで終了します。clkの場合、負のエッジが存在する必要があり、何もしないため、古い値をすべて保持するためにラッチ/ffsが作成されます。