代码之家  ›  专栏  ›  技术社区  ›  Karan Shah

Verilog中阻塞和NBA的帧间和帧内延迟混淆

  •  0
  • Karan Shah  · 技术社区  · 6 年前

    这是代码。

    module temp();
      bit a;
      bit w_inter_nonblocking, x_inter_blocking, y_intra_blocking, z_intra_nonblocking;
    
      always @ (a)
      begin 
        $display("@%0t : Blocking x_inter_blocking", $time());
        #7 x_inter_blocking = a;
      end
    
      always @ (a)
      begin 
        $display("@%0t : Nonblocking w_inter_nonblocking", $time());
        #7 w_inter_nonblocking <= a;
      end
    
      always @ (a)
      begin 
        $display("@%0t : Nonblocking z_intra_nonblocking", $time());
        z_intra_nonblocking <= #7 a;
      end
    
      always @ (a)
      begin
        $display("@%0t : Blocking y_intra_blocking", $time());
        y_intra_blocking = #7 a;
      end
    
      initial
        forever #5 a = $random();
    
      initial 
        #150 $finish();
    
      // initial 
      //   #40 disable karan;
    
      initial 
      begin
        $dumpvars(0, temp);
        $dumpfile("temp.vcd");
      end
    endmodule
    

    下面是相应的打印语句和波形。

    @10 : Nonblocking z_intra_nonblocking
    @10 : Blocking x_inter_blocking
    @10 : Nonblocking w_inter_nonblocking
    @10 : Blocking y_intra_blocking
    @40 : Nonblocking z_intra_nonblocking
    @40 : Blocking x_inter_blocking
    @40 : Nonblocking w_inter_nonblocking
    @40 : Blocking y_intra_blocking
    @45 : Nonblocking z_intra_nonblocking
    @55 : Nonblocking z_intra_nonblocking
    @55 : Blocking x_inter_blocking
    @55 : Nonblocking w_inter_nonblocking
    @55 : Blocking y_intra_blocking
    @60 : Nonblocking z_intra_nonblocking
    @70 : Nonblocking z_intra_nonblocking
    @70 : Blocking x_inter_blocking
    @70 : Nonblocking w_inter_nonblocking
    @70 : Blocking y_intra_blocking
    @75 : Nonblocking z_intra_nonblocking
    @80 : Nonblocking z_intra_nonblocking
    @80 : Blocking x_inter_blocking
    @80 : Nonblocking w_inter_nonblocking
    @80 : Blocking y_intra_blocking
    @85 : Nonblocking z_intra_nonblocking
    @90 : Nonblocking z_intra_nonblocking
    @90 : Blocking x_inter_blocking
    @90 : Nonblocking w_inter_nonblocking
    @90 : Blocking y_intra_blocking
    @95 : Nonblocking z_intra_nonblocking
    @105 : Nonblocking z_intra_nonblocking
    @105 : Blocking x_inter_blocking
    @105 : Nonblocking w_inter_nonblocking
    @105 : Blocking y_intra_blocking
    @110 : Nonblocking z_intra_nonblocking
    @115 : Nonblocking z_intra_nonblocking
    @115 : Blocking x_inter_blocking
    @115 : Nonblocking w_inter_nonblocking
    @115 : Blocking y_intra_blocking
    @130 : Nonblocking z_intra_nonblocking
    @130 : Blocking x_inter_blocking
    @130 : Nonblocking w_inter_nonblocking
    @130 : Blocking y_intra_blocking
    @135 : Nonblocking z_intra_nonblocking
    @140 : Nonblocking z_intra_nonblocking
    @140 : Blocking x_inter_blocking
    @140 : Nonblocking w_inter_nonblocking
    @140 : Blocking y_intra_blocking
    

    Output Waveform

    正如您所看到的,只有具有非阻塞分配的内部延迟提供延迟输出,其余所有延迟/分配提供不同的输出。

    我知道帧间/帧内延迟之间的区别,但是似乎在替代事件上不会触发always块(延迟为 #7 ,如果发生任何信号变化 < #7 延迟)。然而,NBA的内部延迟总是会被正确触发。

    有人能帮我吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   dave_59    6 年前

    always @(expression) statement 并不意味着执行 statement 每一次 expression 变化。它的意思是等待时间 表示 要更改,请执行 陈述 ,然后重复返回到等待 表示

    之后 你开始等待。

    这和我的问题是一样的 this one 我早就回答了。