1.阻塞赋值
阻塞赋值的赋值号是用"="表示,对应的电路结构往往与触发沿没有关系,只与输入电平的变化有关系.它的操作结构可以认为是只有一个步骤的操作,即计算赋号右边的语句并更新赋值号左边的语句,此时不允许有来自任何其他verilog语句的干扰,直到现行的赋值完成,才允许下一条的赋值语句的执行.
串行块(begin-end)中,各条阻塞 赋值语句将以它们在顺序块排列次序依次执行.
a = 1 ,b = 2,c = 3,
begina = b+1;b = a+2;c = a-1;
end
//a=3,b=5,c=2
2.非阻塞赋值
非阻塞赋值的赋值号用"<="表示,对应的电路结构往往与触发沿有关,只有在触发沿的时刻才能进行非阻塞赋值.
它的操作可以看做为两个步骤的过程:在赋值开始时刻计算赋值号右边的语句.在赋值结束时刻,更新赋值号左边语句
在计算非阻塞语句赋值号右边的语句和更新赋值号左边的语句期间,允许其他的verilog语句同时进行操作.
非阻塞操作只能用于对寄存器类型变量进行赋值,因此只能用于"initial"和"always"块中,不允许用于连续赋值"assign".
a = 1 ,b = 2,c = 3,
begina < = b+1;b < = a+2;c < = a-1;
end
//只有end语句结束之后,才会将右边计算出来的结果赋值给左边语句
//a=3,b=3,c=0
3.阻塞赋值和非阻塞的建议规范
官方建议
:在写组合逻辑的的时候使用阻塞赋值,在编写时序逻辑的时候使用非阻塞赋值
其他建议
:
-
编写时序逻辑时要采用非阻塞赋值的方式
-
使用always语句块来编写组合逻辑时,要使用阻塞赋值的方式,这时候要注意敏感列表要使用电平触发的方式
-
在一个always语句块中,不要即使用阻塞赋值又使用非阻塞赋值,这样会造成不可预测的后果
-
锁存器不推荐使用,但如果非要使用,一定要采用非阻塞赋值的方式,因为采用非阻塞赋值实现时序逻辑,进而实现锁存器是最安全的
-
一个always语句块只对一个变量进行赋值,这样方便后期的维护和修改.