<= Verilog中的赋值运算符

biw*_*biw 5 verilog

什么是<=用Verilog吗?

例如:

always @(posedge Clock) begin
   if (Clear) begin
      BCD1 <= 0;
      BCD0 <= 0;
   end
end
Run Code Online (Sandbox Code Playgroud)

Emm*_*man 17

Verilog中的"<="称为非阻塞分配,与"="相比带来了很多不同,因为在任何基于供应商的模拟器中调度事件,所以称为阻塞分配.

建议对序列逻辑使用非阻塞分配,对组合逻辑使用阻塞分配,然后在合成期间推断出正确的硬件逻辑.

顺序块中的非阻塞语句将推断实际硬件中的触发器.

永远记住,不要在任何顺序或组合块中混合阻塞和非阻塞.

在模拟器的调度过程中:

有四个区域和命令执行顺序如下

1) Active region
     --Blocking assignments
     --Evaluation of RHS of non-blocking assignments(NBA)
     --Continuous assignment
     --$display command
     --Evaluate input and output of primitives
2) Inactive region
     --#0 blocking assignments
3) NBA(non-blocking assignment update)
     --update LHS of non-blocking assignments (NBA)
4) Postponed
     --$monitor command
     --$strobe command
Run Code Online (Sandbox Code Playgroud)

在同一时隙使用阻塞赋值"="表示两个变量会导致竞争条件

例如:具有竞争条件的Verilog代码,

always @(posedge Clock) 
   BCD0 = 0; // Usage of blocking statements should be avoided
always @(posedge Clock) 
   BCD1 = BCD0; 
Run Code Online (Sandbox Code Playgroud)

为了避免竞争条件,使用非阻塞语句"<="

例如:

   always @(posedge Clock) 
       BCD0 <= 0; // Recommended to use NBA
    always @(posedge Clock) 
       BCD1 <= BCD0; 
Run Code Online (Sandbox Code Playgroud)

执行此块时,将向非阻塞分配更新队列添加两个事件.因此,它在时间步骤结束时从BCD0更新BCD1.

根据verilog LRM,不允许在连续赋值语句中使用非阻塞"<="赋值,这将导致编译错误.

例如:

assign BCD0 <= BCD1; //Results in compilation error
Run Code Online (Sandbox Code Playgroud)

仅在程序转让声明中使用NBA,

 - initial and
 - always blocks
Run Code Online (Sandbox Code Playgroud)