第1章 与UVM的第一次接触 1
1.1 UVM是什么 1
1.1.1 验证在现代IC流程中的位置 1
1.1.2 验证的语言 2
1.1.3 何谓方法学 3
1.1.4 为什么是UVM 4
1.1.5 UVM的发展史 5
1.2 学了UVM之后能做什么 6
1.2.1 验证工程师 6
1.2.2 设计工程师 6
第2章 一个简单的UVM验证平台 7
2.1 验证平台的组成 7
2.2 只有driver的验证平台 8
2.2.1 最简单的验证平台 8
2.2.2 加入factory机制 13
2.2.3 加入objection机制 14
2.2.4 加入virtual interface 16
2.3 为验证平台加入各个组件 20
2.3.1 加入transaction 20
2.3.2 加入env 23
2.3.3 加入monitor 25
2.3.4 封装成agent 28
2.3.5 加入reference model 32
2.3.6 加入scoreboard 36
2.3.7 加入field_ automation机制 38
2.4 UVM的终极大作:sequence 41
2.4.1 在验证平台中加入sequencer 41
2.4.2 sequence机制 44
2.4.3 default_sequence的使用 48
2.5 建造测试用例 50
2.5.1 加入base_test 50
2.5.2 UVM中测试用例的启动 52
第3章 UVM基础 56
3.1 uvm_component与uvm_object 56
3.1 .1uvm_component派生自uvm_object 56
3.1.2 常用的派生自uvm_object的类 57
3.1.3 常用的派生自uvm_component的类 58
3.1.4 与uvm_object相关的宏 61
3.1.5 与uvm_component相关的宏 62
3.1.6 uvm_component的限制 62
3.1.7 uvm_component与uvm_object的二元结构 63
3.2 UVM的树形结构 64
3.2.1 uvm_component中的parent参数 64
3.2.2 UVM树的根 66
3.2.3 层次结构相关函数 67
3.3 field automation机制 69
3.3.1 field automation机制相关的宏 69
3.3.2 field automation机制的常用函数 71
3.3.3 field automation机制中标志位的使用 72
3.3.4 field automation中宏与if的结合 74
3.4 UVM中打印信息的控制 76
3.4.1 设置打印信息的冗余度阈值 76
3.4.2 重载打印信息的严重性 78
3.4.3 UVM_ERROR到达一定数量结束仿真 79
3.4.4 设置计数的目标 80
3.4.5 UVM的断点功能 81
3.4.6 将输出信息导入文件中 82
3.4.7 控制打印信息的行为 84
3.5 config_db机制 85
3.5.1 UVM中的路径 85
3.5.2 set与get函数的参数 87
3.5.3 省略get语句 88
3.5.4 跨层次的多重设置 89
3.5.5 同一层次的多重设置 91
3.5.6 非直线的设置与获取 93
3.5.7 config_db机制对通配符的支持 94
3.5.8 check_config_usage 95
3.5.9 set_config与get_config 97
3.5.10 config_db的调试 98
第4章 UVM中的TLM1.0通信 100
4.1 TLM1.0 100
4.1.1 验证平台内部的通信 100
4.1.2 TLM的定义 102
4.1.3 UVM中的PORT与EXPORT 102
4.2 UVM中各种端口的互连 104
4.2.1 PORT与EXPORT的连接 104
4.2.2 UVM中的IMP 106
4.2.3 PORT与IMP的连接 109
4.2.4 EXPORT与IMP的连接 111
4.2.5 PORT与PORT的连接 111
4.2.6 EXPORT与EXPORT的连接 113
4.2.7 blocking_get端口的使用 114
4.2.8 blocking_transport端口的使用 116
4.2.9 nonblocking端口的使用 117
4.3 UVM中的通信方式 119
4.3.1 UVM中的analysis端口 119
4.3.2 一个component内有多个IMP 121
4.3.3 使用FIFO通信 124
4.3.4 FIFO上的端口及调试 126
4.3.5 用FIFO还是用IMP 128
第5章 UVM验证平台的运行 132
5.1 phase机制 132
5.1.1 task phase与function phase 132
5.1.2 动态运行phase 134
5.1.3 phase的执行顺序 134
5.1.4 UVM树的遍历 139
5.1.5 super.phase的内容 140
5.1.6 build阶段出现UVMERROR停止仿真 141
5.1.7 phase的跳转 142
5.1.8 phase机制的必要性 146
5.1.9 phase的调试 147
5.1.10 超时退出 147
5.2 objection机制 148
5.2.1 objection与task phase 148
5.2.2 参数phase的必要性 152
5.2.3 控制objection的最佳选择 152
5.2.4 set_drain_time的使用 154
5.2.5 objection的调试 156
5.3 domain的应用 158
5.3.1 domain简介 158
5.3.2 多domain的例子 158
5.3.3 多domain中phase的跳转 161
第6章 UVM中的sequence 163
6.1 sequence基础 163
6.1.1 从driver中剥离激励产生功能 163
6.1.2 sequence的启动与执行 165
6.2 sequence的仲裁机制 166
6.2.1 在同一sequencer上启动多个sequence 166
6.2.2 sequencer的lock操作 170
6.2.3 sequencer的grab操作 172
6.2.4 sequence的有效性 172
6.3 sequence相关宏及其实现 175
6.3.1 uvm_do系列宏 175
6.3.2 uvm_create与uvm_send 176
6.3.4 start_item与finish_item 178
6.3.5 pre_do、mid_do与post_do 180
6.4 sequence进阶应用 181
6.4.1 嵌套的sequence 181
6.4.2 在sequence中使用rand类型变量 183
6.4.3 transaction类型的匹配 185
6.4.4 p_sequencer的使用 186
6.4.5 sequence的派生与继承 189
6.5 virtual sequence的使用 190
6.5.1 带双路输入输出端口的DUT 190
6.5.2 sequence之间的简单同步 191
6.5.3 sequence之间的复杂同步 192
6.5.4 仅在virtual sequence中控制objection 197
6.5.5 在sequence中慎用forkjoin_none 198
6.6 在sequence中使用config_db 200
6.6.1 在sequence中获取参数 200
6.6.2 在sequence中设置参数 201
6.6.3 wait_modified的使用 203
6.7 response的使用 204
6.7.1 put_response与get_response 204
6.7.2 response的数量问题 205
6.7.3 response handler与另类的response 206
6.7.4 rsp与req类型不同 208
6.8 sequence library 209
6.8.1 随机选择sequence 209
6.8.2 控制选择算法 211
6.8.3 控制执行次数 213
6.8.4 使用sequence_library_cfg 214
第7章 UVM中的寄存器模型 216
7.1 寄存器模型简介 216
7.1.1 带寄存器配置总线的DUT 216
7.1.2 需要寄存器模型才能做的事情 218
7.1.3 寄存器模型中的基本概念 220
7.2 简单的寄存器模型 221
7.2.1 只有一个寄存器的寄存器模型 221
7.2.2 将寄存器模型集成到验证平台中 224
7.2.3 在验证平台中使用寄存器模型 227
7.3 后门访问与前门访问 229
7.3.1 UVM中前门访问的实现 229
7.3.2 后门访问操作的定义 231
7.3.3 使用interface进行后门访问操作 233
7.3.4 UVM中后门访问操作的实现:DPl+VPl 233
7.3.5 UVM中后门访问操作接口 235
7.4 复杂的寄存器模型 237
7.4.1 层次化的寄存器模型 237
7.4.2 reg_file的作用 239
7.4.3 多个域的寄存器 241
7.4.4 多个地址的寄存器 242
7.4.5 加入存储器 244
7.5 寄存器模型对DUT的模拟 246
7.5.1 期望值与镜像值 246
7.5.2 常用操作及其对期望值和镜像值的影响 247
7.6 寄存器模型中一些内建的sequence 248
7.6.1 检查后门访问中hdl路径的sequence 248
7.6.2 检查默认值的sequence 249
7.6.3 检查读写功能的sequence 250
7.7 寄存器模型的高级用法 251
7.7.1 使用reg_predictor 251
7.7.2 使用UVM_PREDICT_DIRECT功能与mirror操作 253
7.7.3 寄存器模型的随机化与update 255
7.7.4 扩展位宽 257
7.8 寄存器模型的其他常用函数 257
7.8.1 get_root_blocks 257
7.8.2 get_reg_by_offset函数 258
第8章 UVM中的factory机制 260
8.1 SystemVerilog对重载的支持 260
8.1.1 任务与函数的重载 260
8.1.2 约束的重载 261
8.2 使用factory机制进行重载 264
8.2.1 factory机制式的重载 264
8.2.2 重载的方式及种类 268
8.2.3 复杂的重载 271
8.2.4 factory机制的调试 273
8.3 常用的重载 275
8.3.1 重载transaction 275
8.3.2 重载sequence 277
8.3.3 重载component 278
8.3.4 重载driver以实现所有的测试用例 279
8.4 factory机制的实现 280
8.4.1 创建一个类的实例的方法 280
8.4.2 根据字符串来创建一个类 281
8.4.3 用factory机制创建实例的接口 282
8.4.4 factory机制的本质 284
第9章 UVM中代码的可重用性 285
9.1 callback机制 285
9.1.1 广义的callback函数 285
9.1.2 callback机制的必要性 286
9.1.3 UVM中callback机制的原理 287
9.1.4 callback机制的使用 288
9.1.5 子类继承父类的callback机制 291
9.1.6 使用callback函数/任务来实现所有的测试用例 292
9.1.7 callback机制、sequence机制和factory机制 293
9.2 功能的模块化:小而美 294
9.2.1 Linux的设计哲学:小而美 294
9.2.2 小而美与factory机制的重载 294
9.2.3 放弃建造强大sequence的想法 295
9.3 参数化的类 297
9.3.1 参数化类的必要性 297
9.3.2 UVM对参数化类的支持 298
9.4 模块级到芯片级的代码重用 299
9.4.1 基于env的重用 299
9.4.2 寄存器模型的重用 302
9.4.3 virtual sequence与virtualsequencer 305
第10章 UVM高级应用 308
10.1 interface 308
10.1.1 interface实现driver的部分功能 308
10.1.2 可变时钟 311
10.2 layer sequence 315
10.2.1 复杂sequence的简单化 315
10.2.2 layer sequence的示例 318
10.2.3 layer sequence与try_next_item 321
10.2.4 错峰技术的使用 324
10.3 sequence的其他问题 326
10.3.1 心跳功能的实现 326
10.3.2 只将virtual_sequence设置为default_sequence 329
10.3.3 disable fork语句对原子操作的影响 330
10.4 DUT参数的随机化 332
10.4.1 使用寄存器模型随机化参数 332
10.4.2 使用单独的参数类 333
10.5 聚合参数 335
10.5.1 聚合参数的定义 335
10.5.2 聚合参数的优势与问题 336
10.6 config_db 340
10.6.1 换一个phase使用config_db 340
10.6.2 config_db的替代者 341
10.6.3 set函数的第二个参数的检查 345
第11章 OVM到UVM的迁移 349
11.1 对等的迁移 349
11.2 一些过时的用法 349
11.2.1 sequence与sequencer的factory机制实现 349
11.2.2 sequence的启动与uvm_test_done 350
11.2.3 手动调用build_phase 351
11.2.4 纯净的UVM环境 352
附录ASystemVerilog使用简介 353
附录BDUT代码清单 361
附录CUVM命令行参数汇总 366
附录DUVM常用宏汇总 369