【发布时间】:2016-03-30 12:06:48
【问题描述】:
到处都提到了这一点作为指导方针,但经过深思熟虑后,我想知道如果我们在 Always Block for Combinatorial 中也使用非阻塞语句会造成什么危害。我不会把两者混在一起。但是我的感觉是,当我们在 Always Block 中使用 Nonblocking for Combinatorial 语句时,它更准确地代表了硬件。难道不是……?
例如,如果我们采用以下电路:
在此图中,当提供输入 a、b、c 时,输出 x1 和 x 将不会立即可用。会有登机口延迟。第一个 x1 可用,然后 x 可用。如果我们使用阻塞语句,两者都可以立即使用。如果我们使用非阻塞,它更准确地类似于硬件。
例如,如果我们根据上图取下面的代码
module block_nonblock(output logic x,x1,y,y1,input logic a,b,c);
always@* begin : BLOCKING
x1 = a & b;
x = x1 & c;
end
always@* begin : NONBLOCKING
y1 <= a & b;
y <= y1 & c;
end
endmodule
这综合为:
两者都被合成为与门,并给出相同的模拟结果,但是当我们检查增量时间输出的变化时,我觉得与阻塞相比,非阻塞更准确地匹配硬件。
我还经历了:IEEE P1364.1 / D1.6 Verilog® 寄存器传输级综合标准草案, 它指定对顺序建模使用非阻塞,但没有具体指定使用 Always 对组合建模使用阻塞 堵塞。它说不要在组合语句中混合使用两者(阻塞和非阻塞)。
所以,我们不应该在处理纯组合逻辑(非顺序/不涉及时钟)的 always 块中对组合语句使用非阻塞
【问题讨论】:
-
注:最新标准是(免费)SystemVerilog IEEE 1800-2012 Standard。
标签: verilog fpga system-verilog synthesis register-transfer-level