always @( A or B)

case(A)

1b0: F=B;

1b1: G=B;

endcase

標準答案:2 不能綜合或與預先設想不一致

&>

&


本質上是因為沒有全覆蓋描述而推斷出錯,就比如你本意可能是想實現個組合邏輯demux;

default當然也是一種讓綜合器不會胡亂推斷的方法,但是否能實現設計本意要看情況而說;

就比如,在這裡,這種組合邏輯風格的描述,你指定了A=0 -&> F=B 那麼A=1時 F = ? ,上面沒有指定,所以綜合器無從推斷(你的本意),會使用綜合器當前環境下的默認行為,這個綜合就不可控了。

第二種修改方法是用時鐘沿事件觸發的always語句,實現時序邏輯demux,由於時序邏輯固有記憶性,所以可以不用顯式的描述else分支(實際上就是類似else q &<= q這種,可以省略不寫),這時候指定了A = 0 -&>F&<=B,可以略寫A=1時F的情況,也就是verilog規範約定默認F&<=F可控。

以上只是假設你聲明A的空間為0,1,雖然實際電路中也肯定是0,1;但不利於模擬,因為一般而言,模擬中A的空間可能為0,1,X,Z;所以即使你完全描述了A=0,A=1下所以可能的邏輯,也要加上default語句,以便覆蓋X,Z的情形。


這個問題考點應該不是能不能綜合,而是在於組合電路綜合後會產生latch,可能會產生跟自己預想的不一樣的結果。case...default一起用纔可避免latch,就像if...else一起用一樣,都能起到在組合電路中避免latch效果。綜合後是不是很明顯產生了latch。


default在哪?1b1的時候,F是什麼值?case裏條件不列完整,綜合結果會很奇怪的。


會生成Latch。


會報worning。

A為0時F賦值為B,

A為1時G賦值為B。

那麼問題來了:

A為0時G怎麼辦?

A為1時F怎麼辦?

A為高阻態或其他狀態時F和G怎麼辦?

狀態描述不完整,3個狀態2個信號,共6種情況,你只描述了兩種,而你這個模塊又不是時鐘信號邊沿觸發的,所以會產生latch,會報警告的。對於ASIC電路來說,如果這確實是你想要的,那無所謂,但是對於FPGA電路來說,應該盡最大可能讓更多電路處於同一個時鐘域,因此不建議這樣設計。

新手建議每個process或者always塊只進行一個信號的賦值,別圖省事。


always塊開頭給所有情況賦初值就可以了


always裡面的邏輯要在begin end語句中,FG都需要是reg。case最好寫default情況。多看看基礎吧


推薦閱讀:
相關文章