第一部分 设计原则 2
第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 Venlog部分 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
第二部分 语言特性 54
第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和tn 61
8.1.2 wor、wand、trior、triand 61
8.1.3 tri0、tri1 61
8.1.4 uwire 61
8.1.5 supply0、supplyl 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 paralle_ase 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 $nocbange 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
第三部分 书写文档 260
第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
第四部分 高级设计 274
第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 RFl_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
第五部分 时钟和复位 342
第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
第六部分 验证之路 396
第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
第七部分 其他介绍 414
第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