程序块中的语句按顺序执行,那么为什么块 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 的新值尚不可用。
在 block3 中有一个不完整的敏感度列表,仍然没有锁存器。
这是 Quartus II 14.1 的综合结果:

只有当我添加这个块时,才会推断出一个锁存器:
//infers a latch
always @(*) begin: block4
if (c == 1'b1) begin
tmp4 = a & b;
w = tmp4 ^ c;
end
end
有人可以解释为什么不完整的敏感度列表或在值更新之前使用变量不会推断组合块中的锁存器吗?