2012-03-11 95 views
3

當您在always block sensitivity列表中使用通配符@ *時,我對輸入被認爲是什麼感到困惑。例如,在下面的例子中,哪些信號被解釋爲導致always塊被重新評估的輸入?據我所知,clk重置不包括在內,因爲它們不會出現在總是塊的任何過程語句的右側。 ab都包含在內,因爲它們都出現在always塊的過程語句的右側。但我真的很困惑的是enmux。因爲和情況下語句是否被視爲輸入,因此它們被用作中的測試條件?總是阻止每次重新評估en多路複用器更改值?我幾乎是一個noob,在3本Verilog書中,我還沒有找到令人滿意的解釋。我總是發現這裏的解釋非常有用。感謝verilog always @ *靈敏度列表中包含什麼?

module example 
( 
    input wire clk, reset, en, a, b, 
    input wire [1:0] mux, 
    output reg x,y, z 
); 

always @*  
begin 
x = a & b;  
    if (en) 
    y= a | b; 
    case(mux) 
    2'b00: z = 0; 
    2'b01: z = 1; 
    2'b10: z = 1; 
    2'b11: z = 0; 
    endcase 
end 
endmodule 
+1

您發佈的模塊有語法錯誤。我假設'x = a&b'應該在'begin'行之後。 – toolic 2012-03-11 23:47:58

+0

@toolic謝謝。我剛剛編輯它。現在應該更加正確。 – 2012-03-12 05:24:48

+0

你應該養成編寫你發佈的代碼的習慣。它仍然有語法錯誤。 – toolic 2012-03-12 12:29:04

回答

8

任何在塊內讀取的信號都可能包含在@*之內,因此可能會導致塊結果發生更改。讀取信號使用的任何更改必須都會導致塊被重新評估,因爲它可能會導致塊的輸出發生改變。我相信你知道,如果你沒有使用@*,你會手動列出這些信號。

在您提供它的代碼的情況下,這麼是一種信號:

  • 上評價分配(ab)的右側
  • 評估爲條件的部分( enmux

...但它是任何信號,將評估任何原因。 (我現在想不出任何其他原因,但也許別人可以)

clkreset不在靈敏度列表上,因爲它們沒有被使用。就那麼簡單。他們沒有什麼特別的;他們是其他任何信號。

+0

不添加嵌套事件表達式中的標識符。 – 2012-03-12 02:15:05

+0

謝謝,不知道。 – 2012-03-12 15:19:13

3

在您的例子,以下的信號被包括在隱式靈敏度列表:

a 
b 
en 
mux 

clkreset不是靈敏度列表的一部分。

這完全在IEEE Std for Verilog中描述(例如1800-2009)。 IEEE規範是Verilog詳細信息的最佳來源。您的模擬器的文檔也可能描述@*如何工作。