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延迟。