手続き型ブロックのステートメントは順次実行されるのに、ブロック 1、ブロック 2、またはブロック 3 のいずれもラッチを推論しないのはなぜでしょうか?
module testing(
input logic a, b, c,
output logic x, y, z, v
);
logic tmp_ref, tmp1, tmp2, tmp3;
//reference
always_comb begin: ref_block
tmp_ref = a & b;
x = tmp_ref ^ c;
end
always_comb begin: block1
y = tmp1 ^ c;
tmp1 = a & b;
end
always @(*) begin: block2
tmp2 <= a & b;
z = tmp2 ^ c;
end
always @(c) begin: block3
tmp3 = a & b;
v = tmp3 ^ c;
end
endmodule: testing
block1 では、tmp1 の新しい値が使用可能になる前に、ブロッキング割り当てを使用して y が計算されます。
block2 では、tmp2 は非ブロッキング割り当てを使用して計算されます。これにより、always ブロックが終了するまで割り当てが延期されます。一方、z はブロッキング割り当てを使用して計算され、tmp2 の新しい値はまだ利用できません。
ブロック 3 には不完全なセンシティビティ リストがあり、まだラッチがありません。
Quartus II 14.1 からの合成結果は次のとおりです。
このブロックを追加した場合にのみ、ラッチが推測されます。
//infers a latch
always @(*) begin: block4
if (c == 1'b1) begin
tmp4 = a & b;
w = tmp4 ^ c;
end
end
値が更新される前に不完全な機密リストまたは変数を使用すると、組み合わせブロックのラッチが推論されない理由を誰かが説明できますか?