2010-07-11 67 views
3

如果if語句像我有一個:Verilog支持短路評估嗎?

if(risingEdge && cnt == 3'b111) 
begin 
    ... 
end 

將它放在CNT檢查risingEdge是不是真的?

這是否甚至在HDL內部?

回答

6

對於模擬,未定義短路表達式是否被評估。在上面的例子中,它沒有什麼區別,但是如果你在右側有一個函數調用,那麼你可能會遇到未定義副作用的問題。

疑難雜症#52在:由斯圖爾特·薩瑟蘭和唐米爾斯「的Verilog和SystemVerilog陷阱101個通用編碼錯誤,如何避免它們」。

2

就HDL中的重要性而言,我假定您問的是合成時是否重要。簡單的答案是,它會。例如,下面的代碼是可綜合的SystemVerilog:

if(risingEdge && cnt++ == 3'b111) 
begin 
    ... 
end 

用Verilog(未SV)的遞增後可以使用具有其他分配到模塊變量表現出同樣的事情Verilog的功能所取代。所以是的,這是一個相關的問題。

Paul R通常是正確的,薩瑟蘭參考文獻是一個很好的參考文獻(很多好的東西,就像那些討論中所描述的那樣)。僅供參考,對於SystemVerilog,這一點已經改變,至少就規格而言。雖然Verilog指定短路操作可能執行也可能不執行,但SV通過指示實現不應評估短路操作數(類似於C++,Java等)來消除歧義。如果您有興趣,請參閱IEEE-1800-2009第11.3.5節。雖然這很好,但遵守SV規範的記錄並非在所有工具提供商中都很出色,所以在SV中依賴它時要小心謹慎。