verilog HDL - 赋值语句 - 非阻塞/阻塞

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 <= 8d0;
else
    a <= a+1d1;
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延迟。

经验分享 程序员 微信小程序 职场和发展