第1章 功能验证技术与方法学概要 1
1.1 功能验证与验证平台 1
1.1.1 专用芯片设计流程 1
1.1.2 什么是验证 2
1.1.3 验证平台可以做些什么 3
1.1.4 功能验证流程 5
1.2 验证技术和验证方法学 8
1.2.1 黑盒、白盒与灰盒验证 8
1.2.2 验证技术 9
1.2.3 验证存在的挑战 13
1.2.4 验证方法学 13
1.2.5 断言验证 15
1.2.6 覆盖率驱动验证 16
1.3 硬件验证语言 21
1.3.1 Open Vera 21
1.3.2 e语言 21
1.3.3 PSL 22
1.3.4 SystemC 22
1.3.5 SystemVerilog 22
第2章 数据类型与编程结构 24
2.1 数据类型 24
2.1.1 两态数据类型 25
2.1.2 枚举类型和用户自定义类型 26
2.1.3 数组与队列 28
2.1.4 字符串 36
2.1.5 结构体和联合体 37
2.1.6 常量 39
2.1.7 文本表示 41
2.1.8 操作符和表达式 43
2.2 过程语句 45
2.2.1 赋值语句 45
2.2.2 控制结构 46
2.3 函数和任务 52
2.3.1 函数和任务的区别 52
2.3.2 子程序定义 53
2.3.3 子程序参数 53
2.3.4 子程序返回 56
2.3.5 自动存储 56
2.4 编程结构 57
2.4.1 模块 57
2.4.2 接口 59
2.4.3 过程块和语句块 60
2.4.4 数据对象 62
2.4.5 程序块 62
2.4.6 简单的验证架构 63
2.5 数据的生命周期和作用域 64
2.6 数据类型转换 65
2.6.1 静态类型转换 66
2.6.2 动态类型转换 66
第3章 并发进程与进程同步 68
3.1 fork...join 68
3.1.1 三种并发方式 69
3.1.2 进程与变量 72
3.1.3 进程控制 73
3.2 mailbox 74
3.2.1 mailbox的基本操作 75
3.2.2 参数化mailbox 77
3.2.3 mailbox应用实例 77
3.3 semaphore 78
3.3.1 semaphore的基本操作 79
3.3.2 semaphore应用实例 80
3.4 event 81
3.4.1 事件触发 81
3.4.2 等待事件 81
3.4.3 事件的触发属性 81
第4章 面向对象编程入门 83
4.1 过程编程语言与面向对象编程语言 83
4.2 类 84
4.2.1 类的基本概念 85
4.2.2 构造函数 87
4.2.3 静态属性与方法 89
4.2.4 this操作符 91
4.2.5 对象的赋值与复制 91
4.2.6 块外声明 94
4.3 石头、剪刀、布仲裁器实例(基于类的验证平台) 95
4.3.1 验证环境顶层 96
4.3.2 验证组件 99
第5章 虚接口 107
5.1 虚接口的基本概念及应用 107
5.1.1 虚接口的基本概念 107
5.1.2 虚接口的应用 109
5.2 端口模式和时钟控制块 113
5.2.1 端口模式 113
5.2.2 时钟控制块 114
第6章 随机测试 118
6.1 激励产生 118
6.1.1 什么是随机 119
6.1.2 潜在问题 119
6.2 随机生成机制 120
6.2.1 随机系统函数 120
6.2.2 randcase/randsequence 121
6.3 基于对象的随机生成 122
6.3.1 随机变量 123
6.3.2 约束定义 124
6.3.3 随机方法 130
6.3.4 随机使能控制 131
6.3.5 约束的动态修改 134
6.4 标准随机函数 134
6.5 随机激励的应用 135
第7章 继承与多态 137
7.1 继承和多态的基本概念 137
7.2 继承与子类 137
7.2.1 类的继承与重写 138
7.2.2 子类对象与父类对象的赋值 141
7.2.3 构造函数调用 142
7.3 虚方法与多态 144
7.3.1 虚方法 145
7.3.2 多态 148
7.4 虚类和参数化类 148
7.4.1 虚类 148
7.4.2 参数化类 149
7.5 约束重写 150
7.6 数据的隐藏与封装 151
第8章 功能覆盖率 153
8.1 覆盖率 153
8.1.1 目标覆盖率 153
8.1.2 代码覆盖率 154
8.1.3 功能覆盖率 154
8.2 SystemVerilog的功能覆盖率 155
8.2.1 覆盖组(covergroup) 155
8.2.2 覆盖点(coverpoint) 157
8.2.3 交叉覆盖点(cross) 159
8.3 覆盖率驱动的验证平台 162
第9章 断言 167
9.1 断言的概念及作用 167
9.2 SVA 169
9.2.1 SVA的语法层次结构 170
9.2.2 SVA应用实例 173
9.2.3 bind 175
第10章 验证重用与验证方法学 178
10.1 验证重用中存在的问题 178
10.2 验证方法学OVM 179
10.3 OVM的四大核心技术 180
10.3.1 基于Factory的验证平台动态构建 181
10.3.2 动态的配置机制 183
10.3.3 测试用例在验证架构的顶层 184
10.3.4 激励产生与验证架构分离 185
第11章 SystemVerilog与C语言的接口 187
11.1 什么是DPI 187
11.2 DPI的应用 188
11.2.1 方法的导入 188
11.2.2 方法的导出 190
11.2.3 DPI的数据类型映射 191
11.2.4 DPI的具体应用 192
附录A 覆盖率内置参数和方法列表 193
附录B 断言重复操作符和序列操作符列表 195
附录C QuestaSim简要介绍 198
附录D 常用术语中英文对照 205
参考文献 207
后记 208
源代码2-1 枚举类型实例:enum_example.sv 26
源代码2-2 用户自定义类型实例:typedef_example.sv 28
源代码2-3 多维数组和压缩数组实例:array_example.sv 30
源代码2-4 动态数组实例:dy_array_example.sv 31
源代码2-5 关联数组实例:as_array_example.sv 33
源代码2-6 队列实例:queue_example.sv 35
源代码2-7 结构体实例:struct_example.sv 38
源代码2-8 类型参数化实例:para_type_example.sv 40
源代码2-9 赋值语句实例:assign_example.sv 46
源代码2-10 if条件选择语句实例:if_example.sv 47
源代码2-11 case条件选择语句实例:case_example.sv 47
源代码2-12 for循环语句实例:for_example.sv 48
源代码2-13 while循环语句实例:while_example.sv 49
源代码2-14 do...while循环语句实例:dowhile_example.sv 49
源代码2-15 repeat循环语句实例:repeat_example.sv 50
源代码2-16 forever循环语句实例:forever_example.sv 51
源代码2-17 foreach循环语句实例:foreach_example.sv 51
源代码2-18 ref引用端口类型实例:ref_example.sv 54
源代码2-19 模块实例:module_example.sv 58
源代码2-20 接口实例:interface_example.sv 59
源代码2-21 静态变量实例:static_auto_example.sv 65
源代码3-1 fork...join语句实例:fork_example.sv 70
源代码3-2 fork...join_any语句实例:fork_any_example.sv 71
源代码3-3 fork...join_none语句实例:fork_none_example.sv 71
源代码3-4 disable语句实例:disable_example.sv 73
源代码3-5 mailbox应用实例:mailbox_example.sv 77
源代码3-6 semaphore应用实例:semaphore_example.sv 80
源代码3-7 event应用实例:event_example.sv 82
源代码4-1 简单以太包的类实例:ether_packet.sv 84
源代码4-2 类的构造函数实例:new_construct_example.sv 88
源代码4-3 类的静态变量实例:static_var_class.sv 89
源代码4-4 类的静态方法实例:static_method_class.sv 90
源代码4-5 this操作符实例:this_class_example.sv 91
源代码4-6 类的浅复制实例:shallow_copy.sv 92
源代码4-7 类的自定义深复制实例:deep_copy.sv 93
源代码4-8 仲裁器设计(石头、剪刀、布):rps_dut.sv 95
源代码4-9 验证环境顶层(石头、剪刀、布):top_class_based.sv 96
源代码4-10 时钟复位模块(石头、剪刀、布):rps_clock_reset.sv 97
源代码4-11 验证环境库文件(石头、剪刀、布)——激励单元片段:rps_env_pkg.sv 98
源代码4-12 验证环境库文件(石头、剪刀、布)——激励生成器片段:rps_env_pkg.sv 99
源代码4-13 事务驱动器(石头、剪刀、布):rps_driver.sv 100
源代码4-14 监控器(石头、剪刀、布):rps_monitor.sv 101
源代码4-15 基于类的验证环境(石头、剪刀、布):rps_env.sv 102
源代码4-16 验证环境库文件(石头、剪刀、布)——记分板片段:rps_env_pkg.sv 103
源代码5-1 虚接口例子:virtual_interface_example.sv 108
源代码5-2 定义虚接口(石头、剪刀、布):interface.sv 109
源代码5-3 基于虚接口的事务驱动器(石头、剪刀、布):rps_driver.sv 110
源代码5-4 基于虚接口的监控器(石头、剪刀、布):rps_monitor.sv 111
源代码5-5 基于虚接口的验证环境(石头、剪刀、布):rps_env.sv 111
源代码5-6 基于虚接口的验证顶层(石头、剪刀、布):rps_tb_top.sv 112
源代码5-7 端口模式实例:interface_mode.sv 113
源代码6-1 randcase实例:randcase_example.sv 121
源代码6-2 randsequence实例:randsequence_example.sv 122
源代码6-3 基于类的随机变量实例:class_random_example.sv 123
源代码6-4 随机约束块实例:constraint_example.sv 125
源代码6-5 inside操作实例:inside_example.sv 125
源代码6-6 dist操作实例:dist_example.sv 126
源代码6-7 foreach操作实例:foreach_random_example.sv 128
源代码6-8 solve...before操作实例:solve_before_example.sv 129
源代码6-9 随机变量使能模式实例:rand_mode_example.sv 132
源代码6-10 随机约束使能模式实例:constraint_mode_example.sv 133
源代码6-11 标准随机函数实例:std_randomize_example.sv 135
源代码6-12 基于类的随机激励实例(石头、剪刀、布):rps_env_pkg.sv 135
源代码7-1 类的继承实例:class_extend_example.sv 139
源代码7-2 类的重写实例1:class_override_example.sv 139
源代码7-3 基类与派生类实例:base_derived_example.sv 141
源代码7-4 super操作实例:super_example.sv 142
源代码7-5 构造函数链实例:new_chain_example.sv 143
源代码7-6 类的重写实例2:base_override_example.sv 144
源代码7-7 虚方法与多态实例:virtual_poly_example.sv 145
源代码7-8 参数化类实例:parameterized_class.sv 149
源代码7-9 约束块重写实例:constraint_override_example.sv 150
源代码8-1 功能覆盖组实例:covergroup_example.sv 156
源代码8-2 功能覆盖点实例:coverpoint_example.sv 156
源代码8-3 功能分组柜实例:bin_example.sv 158
源代码8-4 功能交叉覆盖点实例:cross_example.sv 159
源代码8-5 功能覆盖模块(石头、剪刀、布):rps_coverage.sv 162
源代码8-6 基于功能覆盖率验证环境(石头、剪刀、布):rps_env.sv 165
源代码9-1 断言序列实例:sequence_example.sv 171
源代码9-2 断言属性实例:property_example.sv 172
源代码9-3 断言模块(石头、剪刀、布):rps_sva.sv 173
源代码9-4 基于断言的验证顶层(石头、剪刀、布):rps_tb_top.sv 174
源代码9-5 bind操作实例:bind_example.sv 175
源代码11-1 外部Hello程序1(基于C):example 1/hello_c.c 190
源代码11-2 DPI导入方法实例:example 1/hello.v 190
源代码11-3 外部Hello程序2(基于C):example 2/hello_c.c 191
源代码11-4 DPI导出方法实例:example 2/hello.v 191