到处都提到它作为指导方针,但经过深思熟虑后,我想知道如果我们在 Always Block for Combinatorial 中也使用 Nonblocking 语句会造成什么危害。我不会把两者混在一起。但是我的感觉是,当我们在 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 Block 的组合建模使用阻塞。它说不要在组合语句中混合两者(阻塞和非阻塞)。
所以,我们不应该在处理纯组合逻辑的总是块中使用非阻塞组合语句(非顺序/不涉及时钟)