RTL基本知識:Verilog常見錯誤
【問題描述】
在使用Verilog對硬件邏輯進行建模和模擬的同時,必須理解代碼與硬件實現的聯系和Verilog語言本身的語法規則,如果對於這些理解不夠,往往會造成代碼調試周期延長,更有甚者造成電路邏輯功能異常的情況出現,從而拖延電路設計的周期。本文列舉的錯誤不僅初學者經常遇到,在一些經驗豐富的電路設計人員中也經常會出現這些問題,為此,本文以盡量淺顯易懂的方式及示例展示這些常見的問題,希望對於廣大有需要的朋友提供一些力所能及的幫助。同時,希望大家在完成必要的編碼之後能夠對編寫的代碼進行代碼規則檢查,目前常用的代碼規則檢查工具有:SpyGlass(Synopsys)、Leda(Synopsys)、HAL(Cadence)等,同時這些工具中還集成了大量的業界標準規則集,可以通過這些EDA工具對於設計代碼進行比較全面的檢查,為後續電路的仿真及實現提供必要的幫助,可以極大地縮短研制周期。
【問題一】
過程性賦值語句左側信號沒有聲明為reg或者logic類型,而是聲明為了線網類型,例如:
【問題二】
使用begin-end沒有配對使用,導致語句執行與預期不相符,特別是在條件表達式中,例如:
【問題三】
進行常量賦值時,沒有執行相應的數制,可能導致結果與預期不一致。例如:
【問題四】
語句結尾缺失當前行結束標誌“;”,將會導致編譯失敗。例如:
【問題五】
混用“‘”(位於回車鍵旁)和“`”(位於ESC鍵下方),“‘”常用語具體數字表達式中的進制中,而“`”常用語各種編譯命令中。例如:
【問題六】
混淆使用“=”,“==”和“===”
【問題七】
混淆使用“||”和“or”
如果將“||”用於敏感信號列表中,進程是否不觸發不是取決於其中任何一個信號的變化,而是取決於兩個敏感信號列表中的信號“||”完的結果是否發生變化,所以將“||”放入敏感信號列表並不會導致仿真錯誤,但是將會導致你的結果不是期望的,試想“||”任何一側的信號如果為常1,那麽另一側信號怎麽變化,其結果都是1,此時進程是不會被觸發的。但是or是如果用在了賦值語句中,編譯即會報錯。
【問題八】
使用關鍵字作為信號名,具體關鍵詞可參考IEEE中附錄,建議不要使用如下關鍵詞命名信號。
【問題九】
在always未使用時序控制相關的描述,導致always進程陷入無限循環。例如:
【問題十】
在設計中使用隱含線網連接多位矢量端口,將會導致多位矢量僅有最低位的變化會反應到隱含線網上,即隱含線網默認為1位寬。例如:
RTL基本知識:Verilog常見錯誤