內容簡介
本書深入地探討了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