1. 程式人生 > >非阻塞賦值的內部延時和外部延時

非阻塞賦值的內部延時和外部延時

學習verilog有一段時間了,從字面上理解,阻塞和非阻塞的區別很直白。 前者是序列,主要用於描述組合邏輯,和軟體中的賦值類似;後者是並行,主要用於描述時序邏輯。

但是和內部延時、外部延時混用在一起的時候,各種意想不到的情況就會發生。

下面將介紹,對於非阻塞賦值,內部延遲和外部延遲造成的結果就截然不同。

例1:  假設在5ns時刻pclock上出現一個正跳變沿;而current_state在正跳變出現之前的值為5,正跳變出現3ns後變為7, 下面兩個always語句中next_state_h和next_state_l的值將會是多少?

always @(posedge pclock)
    #7 next_state_h <= current_state;

always @(posedge pclock)
     next_state_l <= #7 current_state;

經分析,next_state_l <= #7 current_state 能分解為兩句話: 1)  temp <= next_state_l;  2) #7 next_state_l <= temp; 所以儘管有7ns的delay,但next_state_l得到的還是pclock正跳變時所對應的current_state的值(5)。具體模擬結果如下

例2:根據已知的master_clock產生phase delay的slave_clock。

`timescale 1ns/1ps

module clock_shift(master_clk, slave_clk);
 output reg master_clk;
 output reg slave_clk;
 parameter tON = 2, tOFF = 3, tDELAY = 5;
 
 always
  begin
   #tON  master_clk = 0;
   #tOFF master_clk = 1;
  end

 always @(master_clk)  
   slave_clk <= #tDELAY master_clk;
endmodule

其模擬波形圖如下

但是如果將#tDELAY移到外部,如 #tDELAY slave_clk <= master_clk;則模擬圖形就會變成如下:

從這裡也可以看到,即使對於同一個非阻塞賦值, 內部delay和外部delay帶來的結果就完全不一樣。