Verilog中阻塞赋值及非阻塞赋值
一.阻塞赋值
- 阻塞赋值是指当一个变量被赋值时,该变量的值取决于另一个变量的值而不是现有的值。
- 在阻塞赋值中,变量的值不是立即设置的,而是等待另一个变量的值设置后再进行设置。
二.非阻塞赋值
- 非阻塞赋值对应的电路往往与触发沿有关系,只有在
触发沿的时刻
才能进行非阻塞赋值。 - 可以看做两个步骤:赋值开始时刻,计算赋值号右边的语句。在赋值时刻结束,更新赋值号左边的语句。
- 在计算非阻塞赋值语句右边的语句和更新左边的语句器件,允许其他的Verilog语句进行操作。
非阻塞赋值只能用于对寄存器变量类型进行赋值 | 只能用于initial语句和always语句 |
---|---|
不允许用于连续赋值语句assign |
三.阻塞赋值和非阻塞赋值的区别
1.阻塞赋值示例
阻塞赋值是指在执行完当前语句之前,该语句后面的语句无法被执行,即阻塞后面的语句。
always@(posedge clk)
begin
a = b;
c = a;
end
在这个例子中,a被赋值为b后,才能继续执行c = a这个语句。
因此,在执行完a = b后,c = a这个语句才能被执行。
2.非阻塞赋值示例
非阻塞赋值是指当前语句执行时,后面的语句仍然可以被执行,即不阻塞后面的语句。
always@(posedge clk)
begin
a <= b;
c <= a;
end
在这个例子中,a被赋值为b后,执行c <= a这个语句的时候,a的值并没有立即改变,
而是等到下一次时钟上升沿时才会改变。
因此,在执行完a <= b后,c <= a这句语句仍然能够被执行。
3.阻塞赋值和非阻塞赋值的区别
阻塞赋值和非阻塞赋值的主要区别在于是否阻塞后面的语句执行
。阻塞赋值会等待当前语句执行完毕后,才能执行后面的语句;而非阻塞赋值则不会等待,后面的语句能够立即得到执行。