小编Edw*_*eph的帖子

为什么我们在Verilog/Systemverilog中使用Always Block设计的Combinatorial Circuits中使用Blocking语句?为什么不Nonblocking?

它在任何地方都被提到这个作为指导,但经过多次思考后我想知道如果我们在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
Run Code Online (Sandbox Code Playgroud)

这综合为: 非阻塞和阻塞代码的RTL图

两者都被合成为和门,并给出相同的模拟结果,但是当我们检查增量时间输出的变化时,我觉得与阻塞相比,非阻塞更准确地匹配硬件.

我还经历了:IEEE P1364.1/D1.6Verilog®寄存器传输级综合标准草案,它规定了使用非阻塞进行顺序建模,但没有具体使用阻塞来使用Always Block进行组合建模.它说不要在组合语句中混合使用两者(阻塞和非阻塞).

因此,我们不应该在处理纯组合逻辑的总块中使用非阻塞用于组合语句(非顺序/不涉及时钟)

verilog synthesis fpga register-transfer-level system-verilog

3
推荐指数
1
解决办法
3220
查看次数