【发布时间】:2015-01-24 22:40:17
【问题描述】:
程序块中的语句按顺序执行,为什么块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 中,y 是在 tmp1 的新值可用之前使用阻塞分配计算的。
在 block2 中,tmp2 是使用非阻塞赋值计算的,它应该将赋值推迟到 always 块完成时。同时,z是使用blocking assignment计算的,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
有人能解释一下为什么不完整的敏感度列表或在值更新之前使用变量不会推断出组合块中的锁存器吗?
【问题讨论】:
标签: memory verilog system-verilog quartus