1. 非阻塞赋值
-
非阻塞赋值操作符用小于等于号 (即 <= )表示。在赋值操作时刻开始时计算非阻塞赋值符的RHS表达式,赋值操作时刻结束时更新LHS。在计算非阻塞赋值的RHS表达式和更新LHS期间,其他的Verilog语句,包括其他的Verilog非阻塞赋值语句都能同时计算RHS表达式和更新LHS。非阻塞赋值允许其他的Verilog语句同时进行操作。
-
非阻塞赋值的操作可以看作为两个步骤的过程:
在赋值时刻开始时,计算非阻塞赋值RHS表达式。
在赋值时刻结束时,更新非阻塞赋值LHS表达式。
- 非阻塞赋值操作只能用于对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中。非阻塞赋值不允许用于连续赋值。
2.阻塞赋值
-
阻塞赋值操作符用等号(即 = )表示。阻塞赋值时先计算等号右手方向(RHS)部分的值,这时赋值语句不允许任何别的语句的干扰,直到现行的赋值完成时刻,即把RHS赋值给 LHS
的时刻,它才允许别的赋值语句的执行。 -
阻塞赋值的执行可以认为是只有一个步骤的操作:
计算RHS并更新LHS,此时不能允许有来自任何其他Verilog语句的干扰。
- 所谓阻塞的概念是指在同一个always块中,其后面的赋值语句从概念上(即使不设定延迟)是在前一句赋值语句结束后再开始赋值的。
- 如果在一个过程块中阻塞赋值的RHS变量正好是另一个过程块中阻塞赋值的LHS变量,这两个过程块又用同一个时钟沿触发,这时阻塞赋值操作会出现问题,即如果阻塞赋值的次序安排不好,就会出现竞争。若这两个阻塞赋值操作用同一个时钟沿触发,则执行的次序是无法确定的。
3.逻辑设计所遵循的原则
原则1:时序电路建模时,用非阻塞赋值。
原则2:锁存器电路建模时,用非阻塞赋值。
原则3:用always块写组合逻辑时,采用阻塞赋值。
原则4:在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值。
原则5:在同一个always块中不要同时使用非阻塞赋值和阻塞赋值。
原则6:不要在多个always块中为同一个变量赋值。