2012-06-29 93 views
0

我只想在verilog中使用一些if else語句。 所以我必須總是使用塊。Verilog總是阻止

integer count,index; 
reg a=0; 
[email protected](a) begin 
    a=1; 
    for(count=0;count<7;count=count+1) begin 
     index=4*count; 
     if((significand[index]==1'b0)&&(significand[index+1]==1'b0)&& 
    (significand[ind‌​ex+2]==1'b0) &&(significand[index+3]==1'b0)) 
    lzero=lzero+1; 
    end 
end 

此代碼的確具有一定的現實意義。我能夠得到正確的模擬結果,但是我沒有在板上得到正確的綜合結果。請幫助

回答

2

assign 1'b1;assign 1'b0;都不是有效的賦值。如果你想不斷地用1'b1驅動一些網絡,那麼你必須寫一些類似assign myvar = 1'b1;的東西。

另外,如果你的目的是爲了真正分配給a,然後總是塊是沒有意義的,因爲a是它的靈敏度名單意味着,每當a改變其值塊必須執行的唯一的事情。由於a基本上不會改變它的值,所以該塊不應該被執行。

除非您提供證明您的問題的最簡單工作示例,否則很難幫助您。我可以推薦的唯一方法是在assign右邊的聲明中使用ternary operator。這樣,您可以在不使用always塊的情況下對行爲邏輯進行建模。例如:

assign a = (b == 1'b1 ? c : 1'b0); 

希望它有幫助。

UPDATE:

你的第二個代碼示例既不完整也不合法爲好。對於同一個網絡,您不能有兩個組合分配。

但是,always塊中的靈敏度列表現在是一顆明星,它是Verilog 2001符號,可將所有右側操作數自動包含在靈敏度列表中。在你的情況下,該塊將每次執行significandlzero更改。

+0

雅抱歉它是一個錯字。它被分配a = 1'b1並且分配a = 0'b1;事情是我實際上想要使用許多if和else語句,而且這也只是一次。可能在不久的將來,我必須使用for循環。所以我只需要知道如何使用始終阻止。請幫忙,因爲我不知道該怎麼辦。 – user1491918

+0

整數計數,指數; wire [0:1] a; 賦a = 1'b1; 總是@(*) \t開始 \t爲(計數= 0;計數<7;計數=計數+ 1) \t \t開始 \t \t索引= 4 *計數; \t \t \t如果((有效數[指數] == 1'b0)&&(有效數[指數+ 1] == 1'b0)&&(有效數[指數+ 2] == 1'b0) \t \t \t && (significantand [index + 3] == 1'b0)) \t \t \t \t lzero = lzero + 1; \t \t end \t \t end assign a = 1'b0; – user1491918

4

這是一個非常典型的問題,知道如何用C或C++編程的人,但忘記了Verilog和VHDL與那些不一樣。

ALWAYS塊內的Verilog代碼的每條信號線都同時「執行」。 ALWAYS塊外部的組合邏輯也一樣。

在你的代碼,無論是

assign a=1'b1; 

assign a=1'b0; 

將發生在同一時間,不管是什麼。

要改變這一點,唯一的方法是在for循環的結束語句之後,將最後一行放在always塊中。

一個頁面,這將使你在瞭解C和Verilog的之間的差別一些幫助是頁面:EE-Times: The C Programmers Guide to Verilog