详解如何使用“非阻塞赋值”描述组合逻辑

在之前的文章中,我们分别讨论了Verilog HDL里面的“非阻塞赋值”和“阻塞赋值”。用实例分析了如果在一个always块内等式右边的表达式或者变量,是另一个always块内等式左边的表达式或者变量,仿真器在同一个时间(同一个时钟的边沿)内同时执行两个等式,这就会导致竞争产生。并且我们详细分析了在同一个always块里面,如果混合使用“非阻塞赋值”和“阻塞赋值”,所可能出现的结果,并且给出了建议的编码方式。

今天我们继续探讨如何使用Verilog HDL描述组合逻辑,特别是当我们使用always块来描述组合逻辑时候的情况。

详解如何使用“非阻塞赋值”描述组合逻辑

使用非阻塞赋值描述组合逻辑

在以前的文章中,我一直推荐的描述方式是,用阻塞赋值来描述组合逻辑,但是不是说,非阻塞赋值就一定不能用呢?当然不是。

当always块里面只有一个赋值表达式时,使用阻塞赋值和非阻塞赋值都可以正常工作。比如说:

always@(a or b)

c = a + b;功能上等价于 c <= a + b;

有的教材里面,我们看到作者不仅仅推荐使用非阻塞赋值来描述时序逻辑,也推荐使用非阻塞赋值来描述组合逻辑。

但是我想要强调的是,这种推荐,对于简单的always块组合逻辑是没问题,但是如果在always块里面,不仅仅只有一条赋值语句,那么用非阻塞赋值来描述,可能引起仿真的错误。我们还是通过例子来说明:

input in1,in2,in3,in4;

output out;

reg out,out1,out2;

always@(in1 or in2 or in3 or in4)

begin

out1 <= in1 | in2;

out2 <= in3 | in4;

out <= out1 | out2;

end

在这个例子中,因为非阻塞赋值的右边的变量计算完毕之后,才能赋值给左边,所以out1和out2的值和out的值,并不是处在同一个仿真时间刻度内,所以导致仿真功能的不正确。

详解如何使用“非阻塞赋值”描述组合逻辑

那么如何修改上面的问题呢?我们再看个例子:

input in1,in2,in3,in4;

output out;

reg out,out1,out2;

always@(in1 or in2 or in3 or in4 or out1 or out2)

begin

out1 <= in1 | in2;

out2 <= in3 | in4;

out <= out1 | out2;

end

在这个例子中,我们将out1和out2放到了敏感变量列表里面,这样虽然仿真正确,但是不推荐。

推荐的写法如下所示:

input in1,in2,in3,in4;

output out;

reg out,out1,out2;

always@(in1 or in2 or in3 or in4 )

begin

out1 = in1 | in2;

out2 = in3 | in4;

out = out1 | out2;

end

推荐的原因,就是我们一直在说的组合逻辑使用“阻塞赋值”。

详解如何使用“非阻塞赋值”描述组合逻辑

小结

今天我们分享了在always块内,使用“非阻塞赋值”进行描述的方式,并给出了一种推荐的描述语句,希望能让大家加深对“非阻塞赋值”和“阻塞赋值”的理解。

展开阅读全文

页面更新:2024-02-22

标签:组合   赋值   逻辑   仿真器   边沿   时序   刻度   等式   表达式   变量   语句   详解   例子   功能   方式   时间   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top