Verilog 阻塞赋值(=)与非阻塞赋值(<=)的区别

阻塞赋值(=)

always @ (<event-expression>)
begin
<LHS1 = RHS1 assignments > //阻塞赋值语句1
<LHS2 = RHS2 assignments > //阻塞赋值语句2
...
end

而阻塞赋值语句在每个右端表达式计算完后,立即赋给左端变量,即赋值语句 LHS1=RHS1执行完后 LHS1 是立即更新的,同时只有 LHS1=RHS1 执行完后才可执行语句 LHS2=RHS2,依次类推。前一条语句的执行结果直接影响到后面语句的执行结果。

非阻塞赋值

always @ (<event-expression>)
begin
<LHS1 <= RHS1 assignments > //非阻塞赋值语句1
<LHS2 <= RHS2 assignments > //非阻塞赋值语句2
...
end

非阻塞赋值语句右端表达式计算完后并不立即赋给左端,而是同时启动下一条语句继续执行,我们可以将其理解为所有的右端表达式 RHS1、RHS2 在进程开始时同时计算,计算完后在进程结束时,同时分别赋给左端变量 LHS1、LHS2。

举例说明

假设已经有 m = 1,n = 2,i= 3

//阻塞赋值
always @ (posedge clk)
begin
m = n;
n = i;
i = m;
end
//运行结果为 m = 2,n = 3,i = 2
//非阻塞赋值
always @ (posedge clk)
begin
m <= n;
n <= i;
i <= m;
end
//运行结果为 m = 2,n = 3,i = 1

选择赋值方式的原则

  1. 当用 always 块来描述组合逻辑时,既可以用阻塞赋值,也可以采用非阻塞赋值
  2. 设计时序逻辑电路,尽量使用非阻塞赋值方式
  3. 描迷锁存器(Latch),尽量使用非阻塞赋值
  4. 若在同一个 always 过程块中既为组合逻辑建模,又为时序逻辑建模,最好使用非阻塞赋值方式
  5. 在一个 always 过程中,最好不要混合使用阻塞赋值和非阻塞赋值,虽然同时使用这两种赋值方式在综合时并不一定会出错;对同一个变量,不能既进行阻塞赋值,又进行非阻塞赋值,这样在综合时会报错
  6. 不能在两个或两个以上的 always 过程中对同一个变量赋值,这样会引发冲突,在综合时会报错

你可能感兴趣的:(Verilog 阻塞赋值(=)与非阻塞赋值(<=)的区别)