非阻塞赋值和阻塞赋值能出现在一个always块内吗?可以,但请慎用

我们用了两篇文章,分别讨论了Verilog HDL里面的“非阻塞赋值”和“阻塞赋值”。用实例分析了如果在一个always块内等式右边的表达式或者变量,是另一个always块内等式左边的表达式或者变量,仿真器在同一个时间(同一个时钟的边沿)内同时执行两个等式,这就会导致竞争产生。令人难受的是,一般这种竞争问题,很难去Debug,因为有时候,我们也不太清楚仿真器是如何调度RTL代码。为了规避竞争的产生,我在文章里面推荐了4中编码方式,如果能够认真体会的话,应该可以规避大量的竞争。而深刻理解“非阻塞赋值”,则能够更好的描述时序逻辑电路。

我们在建议的编码原则里面,讲到有一条,在一个always块内,只出现一种赋值类型,不能混合使用非阻塞赋值和阻塞赋值。有的朋友就问我,是不是always块里面就完全不能混合使用呢?今天我就再谈一下这个问题。

非阻塞赋值和阻塞赋值能出现在一个always块内吗?可以,但请慎用

一个always块内,两种赋值方式不能混用?

首先给出答案,在一个always块里面,这两种方式是可以混用的。Verilog语法并没有禁止这样做,所以我们看两个例子:

推荐阅读