vrilog数字系统设计 夏宇闻 【第3版】 4.91 + 14.1
非阻塞赋值方式(Non-Blocking )
如 b<= a;
1).在语句块中,上面语句所赋的变量值不能立即为下面的语句所用;
2).块结束后才能完成这次赋值操作,而所赋的变量值是上一次赋值所得到的;
3).在编写可综合的时序逻辑模块时,这是最常用的赋值方法。
阻塞赋值方式(Blocking )
如 b= a;
1).赋值语句执行完成后,块才结束;
2).b的值在赋值语句执行完成后立即就改变;
3).在时序逻辑中使用时,可能会产生意想不到的结果。
举例说明
`timescale 1ns / 1ps
module demo_BK;
reg clk,rst;
reg [7:0] a,b1,b2,c1,c2;
initial begin
clk = 1;
rst = 1;
a = 0;
b1 = 0;
b2 = 0;
c1 = 0;
c2 = 0;
#100;
rst = 0;
end
always #2 clk = ~clk;
always@(posedge clk)begin
if(rst)
a <= 8'd0;
else
a <= a+1'd1;
end
//------------------------------------------- non_blocking
always@(posedge clk)begin
b1 <= a;
b2 <= b1;
end
//------------------------------------------- blocking
always@(posedge clk)begin
c1 = a;
c2 = c1;
end
endmodule
仿真结果如下图:
实际描述的电路功能图如下:
两者用法说明
要点:
(1)在描述组合逻辑的always块中用阻塞赋值,则综合成组合逻辑的电路结构;
(2)在描述时序逻辑的always块中用非阻塞赋值,则综合成时序逻辑的电路结构。
理解说明:
RHS-赋值等号右边的表达式或变量可分别缩写为RHS表达式或RHS变量;
LHS-赋值等号左边的表达式或变量可分别缩写为LHS表达式或LHS变量。
原则1 时序电路建模时,用非阻塞赋值。
原则2 锁存器电路建模时,用非阻塞赋值。
原则3 用always块描述组合逻辑时,应采用阻塞赋值语句。
原则4 在同一个always块中描述时序和组合逻辑混合电路时,用非阻塞赋值。
原则5 不要再同一个always块中同时使用阻塞和非阻塞赋值。
原则6 严禁在多个always块中对同一个变量赋值。
原则7 用$strobe系统任务来显示,应该用非阻塞赋值的变量值。
原则8 在赋值时不要用#0延迟。