Verilog语法之六:阻塞赋值与非阻塞赋值

如题所述

在Verilog HDL语言中,信号有两种赋值方式:非阻塞(Non-Blocking)赋值和阻塞(Blocking)赋值。非阻塞赋值通过符号“<”来表示,例如“b <= a;”,而阻塞赋值通过等号“=”表示,如“b = a;”。理解这两种赋值方式的区别对于设计人员至关重要。尤其在"always"块中给reg型信号赋值时,选择非阻塞或阻塞赋值方式会影响电路功能和设计的一致性。

首先,非阻塞赋值方式并不是立即执行的。当"always"块中的语句执行后,信号的值并不会立即更新,而是等到"always"块执行完毕后才进行赋值。例如,在一个"always"块中,若使用非阻塞赋值方式设置信号b和c的值,且时钟信号(clk)上升沿到来时,b会被赋值为a,c则被赋值为b,这实际上相当于使用了两个触发器。这意味着c的值在时钟上升沿到来前保持不变,直到"always"块执行结束时才更新为b的值。

接下来,阻塞赋值方式则是立即执行的。当使用阻塞赋值方式设置信号b和c时,信号的值会立即更新为a的值,且在执行下一条语句时,b和c的值都等于a。这种方式直观明了,但在特定场景下可能导致问题。例如,假设在"always"块中,两个信号的赋值操作同时依赖于同一时钟信号的上升沿,如果赋值操作的顺序不正确,可能会导致竞争和冒险,即在时钟边沿到来时,信号的值可能是不确定的。

深入理解这两种赋值方式的不同之处有助于避免设计错误。阻塞赋值方式仅包含一个步骤:计算RHS表达式的值,并立即更新LHS表达式的值。如果在同一个"always"块中,RHS变量是另一个过程块的LHS变量,并且这两个块都依赖于同一时钟信号的上升沿,那么顺序错误可能导致竞争和冒险。反之,非阻塞赋值方式分为两个步骤:首先计算RHS表达式的值,然后在赋值时刻结束时更新LHS表达式的值。因此,在描述时序逻辑时,非阻塞赋值方式通常更为推荐,因为它允许并行执行赋值操作,且不会引起竞争和冒险问题。

最后,通过几个移位寄存器的例子,我们可以进一步理解这两种赋值方式在实际电路设计中的应用。虽然阻塞赋值方式可以用于描述移位寄存器,但其设计风格和顺序安排必须非常谨慎,以避免竞争和冒险问题。相比之下,非阻塞赋值方式在描述时序逻辑时更为稳定和可靠,且在所有设计中都能保证仿真和综合的一致性。

综上所述,选择非阻塞赋值方式可以简化电路设计,避免竞争和冒险问题,并在仿真和综合阶段提供一致的结果。尽管阻塞赋值方式在某些情况下可以简化赋值操作,但在复杂的时序逻辑设计中,非阻塞赋值方式的可预测性和一致性更为重要。
温馨提示:答案为网友推荐,仅供参考
相似回答