深入理解Verilog HDL中阻塞和非阻塞赋值的不同

一、概述:

1、阻塞赋值对应的电路往往与触发沿没有关系,只与输入电平的变化有关系。阻塞赋值符号: =

   

2 非阻塞赋值对应的电路结构往往与触发沿有关系,只有在触发沿时才有可能发生赋值的情况。非阻塞赋值符号: <=


二、阻塞赋值和非阻塞赋值

阻塞(Blocking)赋值方式  = , 如 b = a;赋值语句执行完后,块才结束。b的值在赋值语句执行完后立刻就改变的。

非阻塞(Non_Blocking)赋值方式 <,如 b <= a;块结束后才完成赋值操作。b的值并不是立刻就改变的。这是一种比较常用的赋值方法(特别在编写可综合时序模块时)。

三、阻塞赋值定义

阻塞赋值操作符号(=)表示。阻塞赋值时先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的语句的干扰,直到现在的赋值完成时刻,即把RHS赋值给LHS
的时刻,它才允许别的赋值语句的执行。一般可综合的阻塞赋值操作在RHS不能设定有延迟,(即使是零延迟也不允许)。若在RHS加上延迟,则在延迟期间会阻止赋值语句的执行,延迟后才执行赋值,这种赋值语句是不可综合的,在需要综合的模块设计中不可使用这种风格的代码。
阻塞赋值的执行可以认为是只有一个步骤的操作:所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后在开始赋值的。

四、非阻塞赋值定义

  非阻塞赋值操作符用小于等于号 (<= )表示。在赋值操作时刻开始时计算非阻塞赋值符的RHS表达式,赋值操作时刻结束时更新LHS在计算非阻塞赋值的RHS表达式和更新LHS间,其他的Verilog语句,包括其他的Verilog非阻塞赋值语句都能同时计算RHS表达式和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。

非阻塞赋值的操作可以看作为两个步骤的过程

      1)在赋值时刻开始时,计算非阻塞赋值RHS表达式。

      2)在赋值时刻结束时,更新非阻塞赋值LHS表达式。

非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在initial块和always块等过程块中。非阻塞赋值不允许用于连续赋值。


五、实例










六、要点总结

1 在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构。

2 在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。

RHS 方程式右手方向的表达式或变量可分别缩写为: RHS表达式或RHS变量。

LHS 方程式左手方向的表达式或变量可分别缩写为: LHS表达式或LHS变量  



七、深入理解阻塞和非阻塞的概念

       阻塞赋值的执行可以认为是只有一个步骤的操作:计算RHS并更新LHS,此时不能允许有来自任何其他Verilog语句的干扰。所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。

  如果在一个过程块中阻塞赋值的RHS变量正好是另一个过程块中阻塞赋值的LHS变量,这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作会出现问题,即如果阻塞赋值的

次序安排不好,就会出现竞争。若这两个阻塞赋值操作用同一个时钟沿触发,则执行的次序是无法确定的。

非阻塞赋值的操作可以看作为两个步骤的过程:

1 在赋值时刻开始时,计算非阻塞赋值RHS表达式。

2 在赋值时刻结束时,更新非阻塞赋值LHS表达式。

非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中。非阻塞赋值不允许用于连续赋值。 


八、例子
















十、编程要点


1 时序电路建模时,用非阻塞赋值。

2 锁存器电路建模时,用非阻塞赋值。

3 always块建立组合逻辑模型时,用阻塞赋值。

4 在同一个always块中建立时序和组合逻辑电路

时,用非阻塞赋值。

5 在同一个always块中不要既用非阻塞赋值又用阻

塞赋值。

6 不要在一个以上的always块中为同一个变量赋值。

7 $strobe系统任务来显示用非阻塞赋值的变量值

在赋值时不要使用 #0 延迟




  



你可能感兴趣的:(深入理解Verilog HDL中阻塞和非阻塞赋值的不同)