《Verilog與SystemVerilog編程陷阱:如何避免101個常犯的編碼錯誤》可以幫助工程師寫出更好的Verilog/SystemVerilog的設計和驗證代碼,書中闡述了使用Verilog和SystemVerilog語言時超過100個常見的編碼錯誤;每一個例子都詳細說明了錯誤的癥狀、錯誤的語言規則以及正確的編碼方式。《Verilog與SystemVerilog編程陷阱:如何避免101個常犯的編碼錯誤》能幫助數字設計工程師和驗證工程師有效地識別與避免這些常見的編碼錯誤。書中列舉的這些錯誤許多是非常微妙的,有可能需要花費幾個小時或幾天的時間才能發現或調試。
Stuart Sutherland,IEEE 1800工作組的成員,該工作組負責起草Verilog和SystemVerilog標準。早在1993年也就是Verilog標準的誕生之際,他就已經涉足其標準的定義。同時他參與SystemVerilog標準也可追溯到2001年。此外,Stuart是IEEE官方Verilog和SystemVerilog語言參考手冊的技術編輯。Stuart先生作為獨立Verilog顧問,專注提供針對Verilog HDL、SystemVerilog 和PLI的綜合性專家訓練。Stuart是《SystemVerilog for Design》《Verilog-2001,A Guide to the New Features in the Verilog Hardware Description Language》的合著者,也是《The Verilog PLI Handbook》和頗受推崇的《Verilog HDL Quick Reference Guide》及《Verilog PLI Quick Reference Guide》的作者。
Don Mills,從1986年開始涉足ASIC的設計。在此期間,他參與了超過30個ASIC項目。Don從1991開始使用自頂向下的設計方法(綜合設計編譯器1.2)。Don在幾個公司開發并實施了自頂向下的ASIC設計流程。他精通工具整合和流程自動化。Don作為SystemVerilog和Verilog內部咨詢師服務于美國微芯技術公司。Don是IEEE Verilog和SystemVerilog委員會的成員,該委員會致力于Verilog和SystemVerilog語言的發布和完善。Don是多篇文章的作者或合著者,例如《SystemVerilog Assertions are for Design Engineers Too!》及《RTLCoding Styles that Yield Simulation and Synthesis Mismatches》。
譯者序
序
關于作者
第1章 什么是“編程陷阱”
什么是Verilog和SystemVerilog
什么是陷阱
Verilog和SystemVerilog標準
第2章 聲明以及字符表述類陷阱
陷阱1:字母大小寫的敏感性
陷阱2:網表的隱式聲明
陷阱3:默認的1bit內部網
陷阱4:單文件和多文件編譯的$unit聲明
陷阱5:局部變量的聲明
陷阱6:分層路徑的轉義名稱
陷阱7:自動變量的分層引用
陷阱8:未命名模塊中的變量分層引用
陷阱9:分層引用一個導入的包項目
陷阱10:從程序包中導入枚舉類型
陷阱11:導入多個程序包
陷阱12:默認的整數進制
陷阱13: 有符號整數
陷阱14:有符號數的位寬擴展
陷阱15:變量位寬與賦值位寬的不一致
陷阱16:將矢量全置為1
陷阱17:合并數組和并置
陷阱18:端口連接的幾點規則
陷阱19:后驅動端口
陷阱20:實型(浮點型)數字的端口間傳送
第3章 RTL建模中的陷阱
陷阱21:包含函數調用的組合邏輯靈敏度列表
陷阱22:靈敏度列表中的數組
陷阱23:時序邏輯靈敏度列表中的向量
陷阱24:靈敏度列表中的操作
陷阱25:使用begin…end的時序邏輯塊
陷阱26:帶復位的順序邏輯塊
陷阱27:異步設置/復位觸發器仿真和綜合
陷阱28:順序程序塊中的阻塞賦值
陷阱29:要求阻塞賦值的順序邏輯
陷阱30:組合邏輯中的非阻塞賦值
陷阱31:錯誤順序的組合邏輯賦值語句
陷阱32:case表達式中casez/casex掩碼用法
陷阱33:不完備的判決語句
陷阱34:重疊判決語句
陷阱35:不恰當使用unique 條件語句
陷阱36:2-狀態模型的復位
陷阱37:枚舉類型鎖定狀態機的建模
陷阱38:4-狀態邏輯中隱藏的設計問題
陷阱39:2-狀態類型中隱藏的設計問題
陷阱40:越界數組訪問中的隱藏問題
陷阱41:枚舉類型的越界賦值
陷阱42:模塊中未檢測到共享變量
陷阱43:在接口和程序包中未見共享變量
第4章 運算符陷阱
陷阱44:表達式的賦值
陷阱45:操作符的自定義和上下文定義
陷阱46:賦值語句中的運算位寬和符號擴展
陷阱47:有符號數的算數運算規則
陷阱48:基于位選擇的操作
陷阱49:遞增、遞減和賦值運算符
陷阱50:前加與后加運算
陷阱51:一條語句中變量的多次改變
陷阱52:運算求值短路
陷阱53:邏輯非(!)與按位求反符(~)
陷阱54:數組的運算
陷阱55:針對數組子集的運算
第5章 常見的編程陷阱
陷阱56:驗證零時刻的異步和同步復位
陷阱57:if…else嵌套語塊
陷阱 58:4-狀態值下等號求值
陷阱 59:事件觸發競爭條件
陷阱 60:使用信號量的同步
陷阱61:使用郵箱的同步
陷阱 62:時鐘塊的觸發
陷阱63:判斷語句后錯誤使用分號
陷阱 64:for循環語句中分號的錯誤使用
陷阱65:死循環
陷阱66:由于并發for循環引起的死鎖
陷阱67:循環控制變量的引用
陷阱68:函數返回默認的位寬
陷阱69:任務/功能函數的默認值
陷阱70:為避免毛刺而采用延遲的連續賦值
第6章 面向對象和多線程編程中的陷阱
陷阱71:類定義的編程語句
陷阱72:基于面向對象接口的測試平臺
陷阱73:郵箱中的所有對象具有相同的值
陷阱74:使用input或ref參數的句柄傳遞
陷阱75:構建一個基于對象的數組
陷阱76:靜態任務和功能的非可重入性
陷阱77:靜態變量與自動變量的初始化
陷阱78:叉型編程線程需要自動變量
陷阱79:禁用fork將終止多個線程
陷阱80:禁用一個語句塊卻未如所愿
陷阱81:仿真在測試完畢前過早退出
第7章 隨機化、覆蓋率和斷言類陷阱
陷阱82:隨機化聲明的變量并未隨機化
陷阱83:未被檢測的隨機化失敗
陷阱84:$assertoff 可以禁止隨機化
陷阱85:兩個以上隨機變量的布爾約束條件
陷阱86:不必要的負隨機值
陷阱87:覆蓋報告默認基于組而非箱
陷阱88:覆蓋率始終報告0%
陷阱89:覆蓋報告將所有實例混在一起
陷阱90:覆蓋組的參數方向具有粘黏性
陷阱91:斷言傳遞語句與空成功一同執行
陷阱92:程序塊中的并發斷言
陷阱93:assert…else語句中的不匹配
陷阱94:不能失敗的斷言
第8章 工具兼容性陷阱
陷阱95:默認的仿真時間單位和精度
陷阱96:程序包鏈接
陷阱97:不同工具的隨機數生成不一致
陷阱98:使用always_latch/always_ff來加載存儲器模型
陷阱99:非標準語言擴展
陷阱100:數組常量的級聯
陷阱101:傳輸浮點數值(實數類型)的模塊端口