2015-11-07 64 views
1

以下是使用case語句和總是@(*)塊的示例代碼。我不明白always塊是如何被觸發的,以及爲什麼它在x被聲明爲wire的情況下工作。總是在塊/ case語句中連接線 - Verilog

wire [2:0] x = 0; 
always @(*) 
begin 
case (1'b1) 
    x[0]: $display("Bit 0 : %0d",x[0]); 
    x[1]: $display("Bit 1 : %0d",x[1]); 
    x[2]: $display("Bit 2 : %0d",x[2]); 
    default: $display("In default case"); 
endcase 
end 

任何幫助表示讚賞。

謝謝。

回答

1

正如我們所知,reg可以由wire驅動,我們可以肯定地使用wire作爲任何程序塊中作業的右側。

在這裏,你的代碼檢查其中的x1'b1(當然給予優先到第零位)。可以說x更改爲3'b010。然後,將顯示Bit 1等。現在,如果x=3'b011然後Bit 0顯示,因爲第零位首先檢查。

正如你所看到的,沒有賦值x,程序塊只讀取它的值。而且,系統任務$display也讀取x的值。

該塊的信號值沒有變化。因此,這段代碼工作正常。如果偶然,我們有類似x[0] = ~x[0]而不是$display,那麼這段代碼將提供編譯問題。

更多信息可在thisthis鏈接找到。

+0

謝謝。我們可以使用$ fwrite或直接從這個始終阻止的線路斷言? – rahulcodesinverilog

+0

是的。立即斷言可以寫在這裏。但這取決於你如何使用它們。如果以任何方式,「x」的值改變,那麼它將導致錯誤。我不確定$ fwrite,但我想,它也應該可以工作。 – sharvil111

1

在這裏,這個always塊不會給x賦值,但它只是檢查x的值。所以這是合法使用電線。

+0

謝謝。我們可以使用$ fwrite或直接從這個始終阻止的線路斷言? – rahulcodesinverilog

1

因此,解釋你如何總是問題的一部分@(*)被觸發如下:出現在分配的右側

「籃網和變量,例程和條件表達式的子例程調用作爲賦值左側的索引變量,或作爲項目表達式的變量應始終包含在@(*)中。「

編號:IEEE標準一八零零年至2012年秒9.4.2.2

正如@ sharvil111的回答的延伸,如果你的代碼是這樣的

always @(*) 
begin 

case (sel) 
x[0]: $display("Bit 0 : %0d",x[0]); 
x[1]: $display("Bit 1 : %0d",x[1]); 
x[2]: $display("Bit 2 : %0d",x[2]); 
default: $display("In default case"); 

endcase 
end 

的程序塊將每當sel信號或x發生變化時被觸發,即它將等於always @(s el或x)

+0

因此,在我目前的情況下,我認爲它必須等於總是@(x),我正確嗎?感謝您的答覆。我們可以使用$ fwrite或直接從這個始終阻止的線路斷言?例如'assert(x [0] == 1'b0)'或'$ fwrite(文件,「x是%0d」,x)'? – rahulcodesinverilog