"=" 阻塞过程赋值(Blocking Procedural assignment), "<="非阻塞过程赋值(Non-blocking Procedural assignment)

RHS:right hand side

LHS:left hand side

 

  "=" 阻塞过程赋值(Blocking Procedural assignment) "<="非阻塞过程赋值(Non-blocking Procedural assignment)
执行步骤
  • 计算和赋值一步完成
  • 过程中的执行流被阻塞,直到赋值完成
  • 在同一时间步上的并发语句的计算被阻塞,直到赋值完成
  • 上图中,Q1内完成
  • 右式计算立即进行
  • 左式赋值延迟到当前同一时间步的其它右式计算都完成以后进行
  • 过程中的执行流继续进行,不被阻塞
  • 上图中,Q1 + Q2完成
   

只能用于对寄存器类型变量进行赋值,因此只能用在“initial”块和“always”块等过程块中。

不允许用于连续赋值。

在同一分支下,对同一变量不能同时使用非阻塞赋值和阻塞赋值,否则编译不通过。 但是,如下代码在coderpad网站上并不会报错,输出值:4

查看代码

module x();
  reg clk;
  reg [13:0] a = 0;
  always #10 clk = ~clk; 
  initial begin
    clk = 0;
    #15 
    $display(a);
    $finish;
  end  
  always @(posedge clk) begin
    a = a+1; // 指定a的现态为10
    a <= a+3; // 指定a的次态为20
  end
endmodule
顺序块Sequential:The order of evaluation is determinate 

A sequential blocking assignment evaluates and assigns before continuing on in the procedure

A sequential non-blocking assignment evaluates, then continues on to the next timing control before assigning
并发块Concurrent:The order of evaluation is indeterminate  Concurrent blocking assignments have unpredictable results Concurrent non-blocking assignments have predictable results
     

 

在介绍《【Verilog】深入理解阻塞和非阻塞赋值的不同》时得到下面几个原则:

  • 原则1:时序电路建模时,用非阻塞赋值。
  • 原则2:锁存器电路建模时,用非阻塞赋值。
  • 原则3:用always块写组合逻辑时,采用阻塞赋值。
  • 原则4:在同一个always块中同时建立时序和组合逻辑电路时,用非阻塞赋值。
  • 原则5:在同一个always块中不要同时使用非阻塞赋值和阻塞赋值。
  • 原则6:不要在多个always块中为同一个变量赋值。
  • 原则7:用$strobe系统任务来显示用非阻塞赋值的变量值
  • 原则8:在赋值时不要使用 #0 延迟

 

参考资料

Understanding Verilog Blocking and Non-blocking Assignments

posted @ 2024-02-22 17:46  NEWICER  阅读(34)  评论(0)    收藏  举报