在之前的文章中,我们分别讨论了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
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号