-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

Verilog編程藝術

( 簡體 字)
作者:魏家明類別:1. -> 電子工程 -> Verilog
譯者:
出版社:電子工業出版社Verilog編程藝術 3dWoo書號: 37471
詢問書籍請說出此書號!

缺書
NT售價: 395

出版日:1/1/2014
頁數:456
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787121220616
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

Verilog 是一種硬件描述語言(Hardware Description Language,HDL),是一種以文本形式描述數字系統硬件結構和行為的語言,可以在多個抽象層次上(從開關級到算法級)為數字設計建模。Verilog提供了一套功能強大的原語,其中包括邏輯門(Gate)和用戶定義原語(UDP),還提供范圍寬廣的語言結構,不但可以為硬件的并發行為建模,也可以為硬件的時序特性和電路結構建模。Verilog具有下述這些描述硬件的能力:行為特性、數據流特性、結構組成、監控響應和驗證能力。
Verilog HDL的發展歷史如下:
1.1983年,GDA(Gateway Design Automation)公司的Philip Moorby首創Verilog語言。Moorby后來成為Verilog HDL-XL的主要設計者和Cadence公司的第一合伙人。
2.1984年,Moorby設計出第一個用于Verilog仿真的EDA工具。
3.1986年,Moorby提出用于快速門級仿真的XL算法。隨著Verilog-XL的成功,Verilog得到迅速發展。
4.1987年,Synonsys公司開始把Verilog作為綜合工具的輸入。
5.1989年,Cadence公司收購GDA公司,Verilog成為Cadence公司的私有財產。
6.1990年,Cadence公司公開發布Verilog。隨后成立的OVI(Open Verilog HDL International)負責Verilog的發展,制定標準。
7.1993年,幾乎所有的ASIC廠商都開始支持Verilog,并且認為Verilog-XL是最好的仿真器。同時,OVI推出Verilog-2.0規范,并把它提交給IEEE。
8.1995年,IEEE發布Verilog的標準IEEE1364-1995。
9.2001年,IEEE發布Verilog的標準IEEE1364-2001,增加了一些新特性,但是驗證能力和建模能力依然較弱。
10.2005年,IEEE發布Verilog的標準IEEE1364-2005,只是對Verilog-2001做一些小的修訂。
11.2005年,IEEE發布SystemVerilog的標準IEEE1800-2005,極大地提高了驗證能力和建模能力。
12.2009年,IEEE發布SystemVerilog的標準IEEE1800-2009,它把SystemVerilog和Verilog合并到一個標準中。
13.2012年,IEEE發布SystemVerilog的標準IEEE1800-2012。
有的工程師可能覺得既然Verilog已經進化到SystemVerilog,那么就干脆直接去學習SystemVerilog吧。其實Verilog和SystemVerilog之間的關系就如同C和C++之間的關系,雖然C++很好,但是C現在還是被廣泛地使用,包含各種操作系統和各種應用軟件,同樣Verilog還是被廣泛地在設計中使用,大量的系統和IP還是用Verilog寫成。另外,當我們清楚地理解Verilog的語言特性之后,我們可以更好地學習SystemVerilog,例如,為什么要在SystemVerilog中增加unique case和 priority case?為什么要增加always_comb、always_ff和always_latch?由于篇幅所限,本書的重點在于Verilog編程,對SystemVerilog將只簡單地介紹一下它的特點。
Verilog語言發展很快,相應的EDA工具發展也很快,但是在Verilog編程上還存在很多的問題:
1.Verilog的編碼風格多樣,工程師之間的風格不統一,而且某些工程師的風格很不好,導致在代碼的整潔度、可讀性、可重用性上有很大欠缺。
2.Verilog的語法比較自由,在某些方面存在易混淆和易出錯的地方,導致競爭條件、前后仿真不一致。
3.很多工程師還局限在Verilog-1995上,沒有考慮使用Verilog-2001的新特性,導致?嗦冗余的代碼。
4.很多工程師對Verilog的某些語言元素沒有充分理解,可能存在錯誤使用的情況,導致設計失敗。
5.很多工程師對可配置和可重用的設計不夠重視,導致設計難以維護、難以移植,導致設計成為“一錘子的買賣”。
6.對于常用設計中的時鐘生成和復位設計,缺少討論,事實上這是我們需要高度關注的地方。
7.對于驗證,有些工程師或者對其不夠重視,或者存在概念上的偏差,或者存在設計上的誤解。
本書作者魏家明是我多年的同事,他具有多年的數字電路設計經驗,具有豐富的編程、驗證、綜合和STA等經驗。本書包含了他多年的寶貴經驗和設計心得,同時結合了其他專家的優秀論文。本書對Verilog的編碼風格做了較為完整的總結,對Verilog的標準和論文做了深入的研究,對簡潔高效的編程做了細致的探討。同時本書還充滿了作者的寫作個性,把Verilog編程藝術化地呈現給讀者。
不管是對Verilog編程的初學者,還是對有經驗的設計工程師,本書都有很大的借鑒意義。


北京君正集成電路股份有限公司
CTO:張緊
2013-10-31


前 言
本書來源于實際工程的設計,是從工程設計方面對Verilog編程的反饋。本書既包含作者對Verilog編程規范的總結,也包含作者對多年工程設計的經驗總結。
本書更加注重Verilog編程的方法論和實用性,深入地探討編碼風格、語言特性、簡潔高效和時鐘復位等實際問題,深入探討如何避免使用易混淆和易錯誤的語句,如何避免前后仿真不一致,如何充分發揮Verilog-2001的特性。本書主要分為以下幾大部分:
1.開發原則:探討高效開發的原則、開發的組織管理、開發工具的使用和切實可行的編碼風格等。作者對開發的原則、管理、工具和風格做了詳細的介紹,強調只有把它們有機地結合在一起,我們才能做出好的設計。作者對各種編碼風格(書本上的和網上的,好的和差的)做了較為詳盡的總結,強調只有在好的編碼風格約束下,我們才能寫出美的Verilog程序。
2.語言特性:探討Verilog語言的特性,重點在Verilog-2001標準、always語句、case語句、task和function、循環語句、調度和賦值等。作者對Verilog-1995和Verilog-2001做了對比,探討如何發揮Verilog-2001的新特性,如何用其編寫出簡潔的代碼。作者對某些語言元素做了詳細的說明,例如signed應用、loop語句、disable語句、task和function等。作者對Verilog中各種容易混淆和錯誤的地方(例如,敏感列表、case語句、靜態函數等)做了詳細的說明,探討如何避免混淆和出錯,探討如何避免前后仿真不一致。作者對賦值和調度做了詳細的探討,因為它們是理解仿真執行和避免競爭條件的關鍵。
3.書寫文檔:探討如何寫出優秀的應用文檔和設計文檔,并以GPIO文檔為實例。作者強調Verilog編程只是設計的一部分,寫出優秀的文檔也是非常重要的。
4.高級設計:探討IP使用、代碼優化、狀態機設計、可配置設計和可測性設計,并給出大量的示例代碼。作者在此介紹IP分類、選擇和使用,介紹幾種優化代碼的方法,介紹狀態機的分類和如何編寫出強壯的狀態機,介紹可測性設計的方法。作者著重地探討可配置設計的實現方法,并用不同例子說明這些實現方法。
5.時鐘復位:探討異步設計、亞穩態、時鐘生成和復位設計。作者在此探討異步設計中的亞穩態和對應的解決方法,探討時鐘生成的方法和實際例子,探討同步復位、異步復位、復位同步器、復位分布樹等問題。
6.驗證之路:探討整潔驗證、驗證方法和驗證環境。作者對驗證方法做了一些介紹,探討驗證中可能遇到的問題(例如,網表驗證、靈活驗證等),并以實際例子說明如何搭建驗證環境。
7.其他介紹:介紹SystemVerilog的特點,介紹相對于Verilog的增強,還對VMM、OVM和UVM做了對比。作者強調為了加強我們的設計和驗證,我們必須要從Verilog過渡到SystemVerilog。
本書參考并引用了著名的Verilog專家Cliff Cummings寫的一些論文,這些論文探討了我們在設計中可能遇到的各種問題和相應的解決辦法,探討了如何寫出簡潔嚴謹一致的Verilog代碼,作者在此向他表示致敬。如果讀者對原文感興趣,可以到http://www.sunburst-design.com下載這些論文,非常值得一讀。
另外,作者在編寫本書的時候,充分地考慮了閱讀的友好性,直接用1、2、3、……列出來各種特性和要點,而且特意在一些地方增加了空行以便于閱讀,總之要讓人看著舒服,看得明白。
衷心地感謝北京君正集成電路股份有限公司的CTO張緊先生,他在百忙之中為本書題寫了序言,在我走向IC設計的道路上,我從他那里學習到了很多的東西。
衷心感謝我的以前的同事們,因為我的很多思想來源于你們,因為我們在一起工作的日子很快樂,這么多年的同事,不容易呀,我總是要經常地想起你們。
衷心感謝我的朋友燕雪松、劉會娟、張奇輝、張茜歌、盧海平等人幫我審稿,幫我找到好多的缺陷和錯誤。
衷心感謝我的網上的朋友們,因為我采用了很多的網上資料,感謝你們的無私奉獻。
衷心感謝電子工業出版的支持,正是由于責任編輯王敬棟的密切聯系和各位編輯的認真工作,才使得本書得以順利地與讀者見面。
如果您在本書中發現有缺陷或者錯誤的地方,或者您對本書存有模糊或者疑惑的地方,請通過QQ或者郵件與我聯系,我的QQ號碼是943609120,您的任何反饋都是令人歡迎的。



魏家明
2013-10-16
內容簡介:

本書深入地探討了Verilog編程,分為七個部分:設計原則、語言特性、書寫文檔、高級設計、時鐘和復位、驗證之路、其他介紹。本書對這些部分做了重點的探討:Verilog編碼風格、Verilog-2001的新特性、簡潔高效的編程、容易出錯的語言元素、可配置設計、時鐘生成、復位設計、驗證方法等。另外,本書還對SystemVerilog做了簡單的介紹。

目錄:

第一部分 設 計 原 則
第1章 美的設計 2
1.1 美學觀點 2
1.2 美是修養 3
1.3 專業術語 4
第2章 高效之道 5
2.1 敏捷開發 5
2.2 代碼質量 6
2.3 版本控制 7
2.4 提早集成 7
第3章 組織管理 9
3.1 植物分類 9
3.2 SoC特性 11
3.3 設計流程 12
3.4 仔細規劃 12
3.5 管理表格 13
3.6 模塊層次 14
3.7 目錄組織 14
第4章 使用工具 19
4.1 使用Emacs 19
4.1.1 Emacs介紹 19
4.1.2 Emacs安裝 19
4.1.3 常用快捷鍵 20
4.1.4 我的.emacs 21
4.1.5 cua-base.el 22
4.1.6 verilog-mode.el 23
4.1.7 shell buffer 23
4.2 使用Shell 24
4.2.1 Shell介紹 24
4.2.2 Shell例子 24
4.2.3 Perl例子 25
4.3 使用CVS 26
4.3.1 CVS介紹 26
4.3.2 CVS術語 27
4.3.3 CVS初始化 27
4.3.4 CVS常用命令 29
第5章 編碼風格 31
5.1 干干凈凈 32
5.2 代碼劃分 32
5.3 代碼要求 33
5.3.1 Verilog部分 33
5.3.2 SystemVerilog部分 40
5.4 名字定義 40
5.5 書寫格式 42
5.5.1 模塊端口聲名 42
5.5.2 模塊實例化 45
5.5.3 函數和任務調用 47
5.5.4 書寫語句 47
5.5.5 書寫表達式 48
5.6 添加注釋 49
5.7 參數化 50
5.8 lint檢查 52
第二部分 語 言 特 性
第6章 Verilog特性 54
6.1 Verilog標準 54
6.2 抽象級別 54
6.3 可綜合子集 55
6.4 保持一致 57
第7章 常數 58
7.1 整數(integer) 58
7.2 實數(real) 60
7.3 字符串(string) 60
7.4 標識符(identifier) 60
第8章 數據類型 61
8.1 線網(net) 61
8.1.1 wire和tri 61
8.1.2 wor、wand、trior、triand 61
8.1.3 tri0、tri1 61
8.1.4 uwire 61
8.1.5 supply0、supply1 62
8.1.6 驅動強度 62
8.1.7 默認net 62
8.2 變量(variable) 62
8.3 線網和變量的區別 63
8.4 向量(vector) 64
8.5 數組(array) 65
8.6 多維數組 65
第9章 表達式 67
9.1 操作符(Operator) 67
9.1.1 操作符的優先級(Operator priority) 68
9.1.2 表達式中使用整數 68
9.1.3 算數操作符(Arithmetic operators) 69
9.1.4 算術表達式中的regs和integers 69
9.1.5 比較操作符(Compare operators) 70
9.1.6 邏輯操作符(Logical operators) 70
9.1.7 位運算操作符(Bitwise operators) 71
9.1.8 歸約操作符(Reduction operators) 71
9.1.9 移位操作符(Shift operators) 71
9.1.10 條件操作符(Conditional operator) 72
9.1.11 連接操作符(Concatenations) 72
9.2 操作數(Operands) 73
9.2.1 向量的抽取(bit-select and part-select) 73
9.2.2 part-select的例子 75
9.2.3 數組的訪問 75
9.2.4 字符串 76
9.3 表達式位長(Expression bit lengths) 77
9.3.1 表達式位長規則 77
9.3.2 表達式位長問題的例子A 78
9.3.3 表達式位長問題的例子B 79
9.3.4 表達式位長問題的例子C 79
9.3.5 表達式位長問題的例子D 79
9.3.6 表達式位長問題的例子E 80
9.4 符號表達式(Signed expressions) 80
9.4.1 表達式類型規則 81
9.4.2 計算表達式的步驟 81
9.4.3 執行賦值的步驟 82
9.4.4 signed表達式中處理x和z 82
9.4.5 signed應用的例子 82
9.4.6 signed應用的錯誤 83
9.5 賦值和截斷(Assignments and truncation) 84
9.6 與x/z比較 85
第10章 賦值操作 86
10.1 連續賦值 86
10.2 過程賦值 87
第11章 門級和開關級模型 88
11.1 門和開關的聲明語法 88
11.1.1 門和開關類型 88
11.1.2 驅動強度 88
11.1.3 延遲 89
11.1.4 實例數組 89
11.2 and、nand、nor、or、xor、xnor 90
11.3 buf、not 90
11.4 bufif1、bufif0、notif1、notif0 90
11.5 MOS switches 90
11.6 Bidirectional pass switches 91
11.7 pullup、pulldown 91
第12章 用戶定義原語 92
12.1 UDP定義 92
12.1.1 UDP狀態表 92
12.1.2 狀態表符號 93
12.2 組合UDP 93
12.3 電平敏感時序UDP 93
12.4 沿敏感時序UDP 94
第13章 行為模型 97
13.1 概覽 97
13.2 過程賦值 98
13.2.1 阻塞賦值 98
13.2.2 非阻塞賦值 99
13.3 過程連續賦值 102
13.3.1 assign和deassign過程語句 103
13.3.2 force和release過程語句 103
13.4 條件語句 104
13.5 循環語句 105
13.5.1 for循環例子 106
13.5.2 disable語句 107
13.6 過程時序控制 108
13.6.1 延遲控制(Delay control) 108
13.6.2 事件控制(Event control) 108
13.6.3 命名事件(Named events) 109
13.6.4 事件or操作符(Event or operator) 109
13.6.5 隱含事件列表(Implicit event_expression list) 109
13.6.6 電平敏感事件控制(Level-sensitive event control) 111
13.6.7 賦值間時序控制(Intra-assignment timing controls) 111
13.7 塊語句 113
13.7.1 順序塊(Sequential block) 113
13.7.2 并行塊(Parallel block) 114
13.7.3 塊名字(Block names) 114
13.7.4 開始和結束時間(Start and finish times) 114
13.8 結構化過程 116
13.8.1 initial construct 116
13.8.2 always construct 116
13.8.3 always的敏感列表 117
13.8.4 并發進程 117
13.9 always有關的問題 118
13.9.1 敏感列表不完整 118
13.9.2 賦值順序錯誤 119
第14章 case語句 120
14.1 case語句定義 121
14.2 case語句的執行 122
14.3 Verilog和VHDL對比 123
14.4 case的應用 123
14.5 casez的應用 125
14.6 描述狀態機 126
14.7 casex的誤用 127
14.8 casez的誤用 128
14.9 full_case 和parallel_case 128
14.10 full_case 129
14.10.1 不是full的case語句 129
14.10.2 是full的case語句 129
14.10.3 使用full_case綜合指令 130
14.10.4 full_case綜合指令的缺點 131
14.10.5 使用full_case指令后還是生成Latch 132
14.11 parallel_case 132
14.11.1 不是parallel的case語句 132
14.11.2 是parallel的case語句 133
14.11.3 使用parallel_case綜合指令 133
14.11.4 parallel_case綜合指令的缺點 134
14.11.5 沒有必要的parallel_case指令 135
14.12 綜合時的警告 135
14.13 case語句的編碼原則 136
第15章 task和function 137
15.1 task和function之間的不同點 137
15.2 task的聲明和使能 137
15.2.1 task的聲明 137
15.2.2 task的使能和參數傳遞 138
15.2.3 task的內存使用和并發進程 140
15.3 disable語句 141
15.3.1 disable語句的例子A 141
15.3.2 disable語句的例子B 143
15.4 function的聲明和調用 145
15.4.1 function的聲明 145
15.4.2 function的返回值 147
15.4.3 function的調用 147
15.4.4 function的規則 147
15.4.5 constant function 148
15.5 task的誤用 149
15.6 function的誤用 149
第16章 調度和賦值 151
16.1 仿真過程 151
16.2 事件仿真 151
16.3 仿真參考模型 152
16.4 分層事件隊列 153
16.4.1 事件隊列分類 154
16.4.2 事件隊列特性 155
16.4.3 事件調度例子 155
16.5 確定性和不確定性 157
16.5.1 確定性(Determinism) 157
16.5.2 不確定性(Nondeterminism) 157
16.6 賦值的調度含義 158
16.6.1 連續賦值 159
16.6.2 過程連續賦值 159
16.6.3 阻塞賦值 159
16.6.4 非阻塞賦值 159
16.6.5 開關處理 159
16.6.6 端口連接 159
16.6.7 任務和函數 160
16.7 阻塞賦值和非阻塞賦值 160
16.7.1 阻塞賦值 160
16.7.2 非阻塞賦值 161
16.8 賦值使用原則 161
16.9 自己觸發自己 162
16.10 仿真零延遲RTL模型 163
16.11 慣性延遲和傳輸延遲 165
16.11.1 門級仿真中的傳輸延遲 166
16.11.2 各種#delay的位置 168
16.11.3 仿真時鐘生成方法 169
16.12 延遲線模型 170
16.13 使用#1延遲 171
16.14 多個公共時鐘和競爭條件 172
16.15 避免混雜阻塞賦值和非阻塞賦值 173
16.16 RTL和門級混合仿真 176
16.16.1 RTL-to-Gates仿真 177
16.16.2 Gates-to-RTL仿真 177
16.16.3 有時鐘偏差的門級時鐘樹 178
16.16.4 有時鐘偏差的Vendor模型 178
16.16.5 錯誤的Vendor模型 179
16.16.6 結論和建議 183
16.17 帶有SDF延遲的門級仿真 183
16.17.1 全系統仿真 183
16.17.2 軟件要花錢 184
16.17.3 門級回歸仿真 184
16.18 驗證平臺技巧 185
16.18.1 在0時刻復位 186
16.18.2 時鐘沿之后復位 186
16.18.3 創建仿真時鐘 186
16.18.4 在無效沿輸入激勵 187
第17章 層次結構 188
17.1 模塊 188
17.1.1 模塊定義 188
17.1.2 模塊實例 188
17.2 參數 188
17.2.1 參數聲明 189
17.2.2 參數調整 189
17.2.3 參數傳遞 190
17.2.4 參數依賴 192
17.2.5 內部參數 193
17.2.6 clog2 193
17.2.7 指數** 194
17.3 端口 194
17.3.1 端口聲明 194
17.3.2 端口連接 195
17.3.3 實數傳遞 196
17.4 Generate語句 196
17.4.1 Loop generate construct 197
17.4.2 Conditional generate construct 200
17.5 實例數組 201
17.6 層次名字 203
第18章 系統任務和函數 205
18.1 顯示任務 205
18.1.1 顯示和寫出任務 205
18.1.2 探測任務 208
18.1.3 監控任務 209
18.2 文件讀寫 209
18.2.1 打開和關閉文件 209
18.2.2 文件輸出 211
18.2.3 字符串輸出 212
18.2.4 文件輸入 213
18.2.5 文件定位 216
18.2.6 刷新輸出 216
18.2.7 錯誤狀態 216
18.2.8 檢查文件尾部 217
18.2.9 加載文件數據 217
18.3 時間比例 218
18.3.1 $printtimescale 218
18.3.2 $timeformat 218
18.4 仿真控制 218
18.4.1 $finish 218
18.4.2 $stop 218
18.5 仿真時間 218
18.6 轉換函數 219
18.7 概率分布 220
18.7.1 $random 220
18.7.2 $dist_functions 220
18.8 命令行輸入 220
18.8.1 $test$plusargs 221
18.8.2 $value$plusargs 221
18.9 數學運算 223
18.9.1 整數函數 223
18.9.2 實數函數 223
18.10 波形記錄 224
第19章 編譯指令 225
19.1 `celldefine和`endcelldefine 225
19.2 `default_nettype 225
19.3 `define和`undef 226
19.4 `ifdef、`else、`elsif、`endif、`ifndef 227
19.5 `include 228
19.6 `resetall 228
19.7 `line 228
19.8 `timescale 229
19.9 `unconnected_drive和`nounconnected_drive 230
19.10 `begin_keywords和`end_keywords 230
19.11 `pragma 230
第20章 Specify塊 231
20.1 specify塊聲明 231
20.2 speparam 231
20.3 模塊路徑聲明 232
20.3.1 模塊路徑要求 232
20.3.2 簡單路徑 232
20.3.3 沿敏感路徑 233
20.3.4 狀態依賴路徑 234
20.4 模塊路徑延遲 235
第21章 時序檢查 237
21.1 概覽 237
21.2 使用穩定窗口的時序檢查 237
21.2.1 $setup、$hold、$setuphold 238
21.2.2 $recovery、$removal、$recrem 238
21.3 時鐘和控制信號的時序檢查 240
21.3.1 $skew、$timeskew、$fullskew 240
21.3.2 $width 240
21.3.3 $period 241
21.3.4 $nochange 241
21.4 使用notifier響應時序違反 241
21.5 使用條件事件 242
21.6 時序檢查中的Vector 243
21.7 Negative timing check 243
第22章 反標SDF 246
22.1 SDF標注器 246
22.2 SDF construct到Verilog的映射 246
22.2.1 SDF路徑延遲到Verilog的映射 246
22.2.2 SDF時序檢查到Verilog的映射 247
22.2.3 SDF互連延遲的標注 248
22.3 $sdf_annotate 249
22.4 SDF文件例子 250
第23章 編程語言接口 252
23.1 DirectC 252
23.2 SystemVerilog 252
第24章 綜合指令 253
24.1 Synopsys綜合指令 253
24.2 使用綜合指令 253
24.3 使用translate_off/on 254
24.4 誤用translate_off/on 256
24.5 使用attribute 256
第三部分 書 寫 文 檔
第25章 書寫文檔 260
25.1 文檔格式 260
25.2 定義文檔 261
25.3 應用文檔 262
25.4 設計文檔 262
25.5 備份文檔 263
25.6 GPIO設計 263
第26章 GPIO應用文檔 264
26.1 Overview 264
26.2 Register Description 264
26.2.1 PIN Level Register (PIN) 265
26.2.2 Data Register (DAT) 265
26.2.3 Data Set Register (DATS) 265
26.2.4 Data Clear Register (DATC) 265
26.2.5 Mask Register (IM) 266
26.2.6 Mask Set Register (IMS) 266
26.2.7 Mask Clear Register (IMC) 266
26.2.8 PULL Enable Register (PEN) 266
26.2.9 PEN Enable Set Register Register (PENS) 266
26.2.10 PEN Enable Clear Register Register (PENC) 266
26.2.11 PSEL Select Register (PSEL) 266
26.2.12 PSEL Enable Set Register Register (PSELS) 266
26.2.13 PSEL Enable Clear Register Register (PSELC) 267
26.2.14 Function Register (FUN) 267
26.2.15 Function Set Register (FUNS) 267
26.2.16 Function Clear Register (FUNC) 267
26.2.17 Select Register (SEL) 267
26.2.18 Select Set Register (SELS) 267
26.2.19 Select Clear Register (SELC) 267
26.2.20 Direction Register (DIR) 267
26.2.21 Direction Set Register (DIRS) 268
26.2.22 Direction Clear Register (DIRC) 268
26.2.23 Trigger Register (TRG) 268
26.2.24 Trigger Set Register (TRGS) 268
26.2.25 Trigger Clear Register (TRGC) 268
26.2.26 FLAG Register (FLG) 268
26.2.27 FLAG Clear Register (FLGC) 269
26.3 Program Guide 269
26.3.1 GPIO Function Guide 269
26.3.2 Alternate Function Guide 269
26.3.3 Interrupt Function Guide 269
26.3.4 Disable Interrupt Function Guide 270
第27章 GPIO設計文檔 271
27.1 文件列表(見表27-1) 271
27.2 端口列表(見表27-2) 271
27.3 配置參數(見表27-3) 272
第四部分 高 級 設 計
第28章 使用IP 274
28.1 Cadence的IP 274
28.2 Cadence的VIP 275
28.3 Synopsys的IP 275
28.4 DesignWare Building Block 276
28.5 在FPGA上使用DesignWare 276
第29章 代碼優化 278
29.1 代碼可讀 278
29.2 簡潔編碼 279
29.3 優化邏輯 281
29.4 優化遲到信號 281
29.5 括號控制結構 282
第30章 狀態機設計 283
30.1 狀態機類型 283
30.2 狀態編碼方式 283
30.3 二進制編碼FSM 284
30.3.1 兩個always塊 284
30.3.2 重要的編碼規則 285
30.3.3 錯誤狀態的轉換 285
30.3.4 next的默認值 285
30.4 獨熱碼編碼FSM 286
30.5 寄存器輸出 287
第31章 可配置設計 289
31.1 格雷碼轉換 289
31.2 通用串行CRC 290
31.2.1 general_crc.v 290
31.2.2 testbench 292
31.3 FIFO控制器 293
31.4 RAM Wrapper 例子 296
31.4.1 常規方法 296
31.4.2 名字規范化 297
31.4.3 RF1_wrapper.v 298
31.4.4 gen_wrapper.pl 302
31.4.5 ram_def.txt例子 306
31.4.6 生成wrapper 307
31.5 可配置的GPIO設計 308
31.5.1 gpio.v 308
31.5.2 gpio_params.v 317
31.5.3 gpio_check.v 317
31.5.4 gpio_reg.v 318
31.5.5 gpio_sync.v 319
31.6 可配置的BusMatrix 320
31.6.1 BusMatrix簡介 320
31.6.2 設計ABM 321
31.6.3 mini_abm 322
31.6.4 large_abm 331
31.7 可配置的Andes Core N801 333
31.8 可配置的ARM926EJS 334
31.9 靈活的coreConsultant 336
第32章 可測性設計 337
32.1 內部掃描 337
32.2 內建自測 339
32.3 邊界掃描 340
第五部分 時鐘和復位
第33章 異步時序 342
33.1 亞穩態 342
33.2 MTBF 343
33.3 同步器 344
33.3.1 電平同步器 344
33.3.2 邊沿檢測同步器 345
33.3.3 脈沖檢測同步器 345
33.4 同步多位數據 347
33.5 異步FIFO 348
33.6 Design Ware 348
33.7 DW_fifoctl_s2_sf 349
33.8 門級仿真 351
第34章 時鐘生成 352
34.1 同步電路 352
34.2 設計原則 353
34.3 分頻器 353
34.3.1 1/n分頻器 353
34.3.2 n/d分頻器 355
34.4 時鐘切換 355
34.5 時鐘生成 358
第35章 時鐘例子 362
35.1 Overview 362
35.2 CGU Clock 362
35.2.1 Clock List 362
35.2.2 Clock Diagram(見圖35-1) 363
35.2.3 Clock Divider Rate(見表35-1) 364
35.3 Register Description(見表35-2) 364
35.3.1 CGU PLL Divider Register (CGU_PDR) 364
35.3.2 CGU Counter Regsister (CGU_CNT) 365
35.3.3 CGU PLL Control Register (CGU_PCR) 365
35.3.4 CGU Low Power Control Register (CGU_LPC) 365
35.3.5 CGU Status Register (CGU_CST) 365
35.3.6 CGU Divider 0 Register (CGU_DV0→1/s) 366
35.3.7 CGU Divider 1 Register (CGU_DV1→1/x) 366
35.3.8 CGU Divider 2 Register (CGU_DV2→1/n) 366
35.3.9 CGU Divider 3 Register (CGU_DV3→1/n) 367
35.3.10 CGU Divider 4/5/6/7 Register (CGU_DV4/5/6/7→n/d) 367
35.3.11 CGU Divider 8 Register (CGU_DV8→n/d) 367
35.3.12 CGU Divider 9 Register (CGU_DV9→n/d) 367
35.3.13 CGU Module Stop 0 Register (CGU_MS0) 367
35.3.14 CGU Module Stop 1 Register (CGU_MS1) 368
35.3.15 CGU Module Stop 2 Register (CGU_MS2) 368
35.3.16 CGU Reset Control Register (CGU_RCR) 369
35.3.17 CGU Reset Status Register (CGU_RST) 369
35.4 PLL Structure 369
35.4.1 Frequency Calculation 370
35.4.2 VCO Frequency Limitation 370
35.4.3 PFD Clock Frequency Limitation 370
35.5 PLL Control 371
35.6 Sleep and Wakeup 371
35.6.1 State switch 371
35.6.2 How to wakeup 372
35.7 Module Stop 372
35.8 Application Notes 373
第36章 復位設計 374
36.1 復位的用途 374
36.2 寄存器編碼風格 374
36.2.1 有/無同步復位寄存器 374
36.2.2 寄存器推導原則 376
36.3 同步復位 376
36.3.1 編碼風格和電路 377
36.3.2 同步復位的優點 378
36.3.3 同步復位的缺點 379
36.4 異步復位 379
36.4.1 編碼風格和電路 380
36.4.2 既有異步復位又有異步置位的寄存器 380
36.4.3 異步復位的優點 381
36.4.4 異步復位的缺點 382
36.5 異步復位的問題 382
36.5.1 復位recovery時間 383
36.5.2 復位撤銷經歷不同的時鐘周期 383
36.6 復位同步器 383
36.6.1 復位同步器有亞穩態嗎? 384
36.6.2 錯誤的ASIC Vendor模型 385
36.6.3 有缺點的復位同步器 385
36.6.4 復位時的仿真驗證 386
36.7 復位分布樹 387
36.7.1 同步復位分布技巧 389
36.7.2 異步復位分布技巧 389
36.7.3 復位分布樹的時序分析 390
36.8 復位毛刺的過濾 391
36.9 異步復位的DFT 391
36.10 多時鐘復位的問題 392
36.10.1 非協調的復位撤銷 392
36.10.2 順序協調的復位撤銷 393
36.11 結論 394
第六部分 驗 證 之 路
第37章 驗證之路 396
37.1 整潔驗證 397
37.2 驗證目標 398
37.3 驗證流程 398
37.4 驗證計劃 398
37.5 隨機驗證 399
37.6 直接驗證 399
37.7 白盒驗證 399
37.8 模塊驗證 400
37.9 系統驗證 400
37.9.1 驗證重點 400
37.9.2 驗證環境 401
37.9.3 IP互連 401
37.9.4 性能驗證 401
37.10 DFT驗證 402
37.11 網表驗證 402
37.12 高級抽象 403
37.13 靈活驗證 405
37.14 ARM926EJS的Validation環境 406
37.14.1 Validation tools 407
37.14.2 Validation configuration files 407
37.14.3 Validation test suites 407
37.14.4 Validation flow 408
37.14.5 Building the model 408
37.14.6 Running Validation test suites 408
37.14.7 Debugging a single Validation test 410
37.15 AHB BusMatrix的驗證 411
37.16 某芯片的SoC驗證環境 411
第七部分 其 他 介 紹
第38章 SystemVerilog特性 414
38.1 SystemVerilog與Systemc比較 414
38.2 SystemVerilog的特點 414
38.3 新的數據類型 415
38.3.1 整型和實型 415
38.3.2 新的操作符 416
38.3.3 數組 416
38.3.4 隊列 417
38.3.5 枚舉類型 417
38.3.6 結構體和共同體 417
38.4 always_comb、always_latch和always_ff 417
38.5 unique和priority 418
38.6 loop、break和continue 419
38.7 task和function 419
38.7.1 靜態和自動作用域 419
38.7.2 參數傳遞 420
38.7.3 參數中的默認值 420
38.8 Port connection 421
38.9 Tag 421
38.10 Interface 422
38.11 class和object 425
38.11.1 對象的概念 425
38.11.2 類的創建 426
38.11.3 類的繼承 427
38.11.4 類的randomize 428
38.11.5 類的cover group 429
38.12 VMM、OVM和UVM 429
參考文獻 431
關于版權 432
序: