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