Verilog編程藝術

Verilog編程藝術

《Verilog編程藝術》是2014年電子工業出版社出版的圖書,作者是魏家明。

內容簡介

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

相關詞條

相關搜尋

熱門詞條

聯絡我們