2014-10-17 458 views
2

我現在對一塊Verilog代碼感到困惑,它測試阻塞或非阻塞賦值功能與Delay模型的組合。帶延遲的阻塞/非阻塞

的代碼如下EDA Playground

module cl_tb; 
    reg x,y,z; 

    initial begin 
    x = 2; 
    #4; 
    y <= #9 x; 
    x = 1; 
    #50 $stop; 
    end 

    initial begin 
    $monitor("%0t,%d,%d,%d",$time,x,y,z); 
    end 

    always @(x,y) begin 
    z = # 2 x+y; 
    end 
endmodule 

通過根據Verilog的分層事件的手工計算,我能得到的結果 時間:X值,Y值,Z值低於:

0: 2,x,x 
2: 2,0,2 
4: 1,0,2 
6: 1,0,1 
13: 1,2,1 
15: 1,2,3 

然而,模擬的結果是:

0,0,x,x 
4,1,x,x 
13,1,0,x 
15,1,0,1 

我想知道爲什麼始終@(x,y)在時隙2和4處沒有觸發。

回答

2

您已聲明x,y,z爲1位。所以當設置爲2時,您只能獲得2'b10的LSB(位0)。

如果你只是測試延遲建模,然後使用整數,而不是章。

integer x,y,z; 

您現在應該看到高於1的值。更新示例EDA playground

如果我更新您的監視器顯示

initial begin 
    forever begin 
    $display("%3t: %2d, %2d, %2d",$realtime, x, y, z); 
    #2; 
    end 
end 

我得到相同的結果沒有在#2但如果我們改變環路延遲#1看起來它工作正常。我試圖強制`timescale,但是這並不能解決問題。

# KERNEL: 0: 2, 0, 0 
# KERNEL: 1: 2, 0, 0 
# KERNEL: 2: 2, 0, 2 //<-- update at time 2 

注意:自動靈敏度列表有助於最大限度地減少RTL以降低模擬失配。

always @(a,b) begin 

成爲

always @* begin 
+0

你是正確的,寬度錯配和未初始化的X,Y,Z值導致了觀察問題。 \ n另外,只有修改該部分才能得到與手算相同的模擬結果。 $監視器足以在某個模擬步驟中捕獲「最終」結果,因爲它處於非活動區域。所以沒有永遠+ $顯示是不需要我想:)再次感謝您的時間 – DreamOn 2014-10-19 02:45:08