UVM 实用指南
a practical guide to adopting the universal verfication
methodology
洋文馆
2013 年 11 月 10 日
目录
1 UVM 介绍
验证规划和覆盖驱动验证 . . . . . . . . . . . . . .
多语言和方法学 . . . . . . . . . . . . . . . . . . .
本书的特点 . . . . . . . . . . . . . . . . . . . . . .
如何使用本书. . . . . . . . . . . . . . . . . . . . .
1.4.1 如何运行例子 (略)
. . . . . . . . .
1.4.2 文本风格的约定 (略) . . . . . . . .
1.4.3 缩略语 . . . . . . . . . . . . . . . .
2 UVM 概述
UVM testbench 和环境. . . . . . . . . . . . . . . .
UVC 接口. . . . . . . . . . . . . . . . . . . . . . .
2.2.1 数据项 (数据项) . . . . . . . . . . .
2.2.2 Driver/Bus 功能模型 (BFM)
. . . .
. . . . . . . . . . . . .
2.2.3 Sequencer
. . . . . . . . . . . . . . .
2.2.4 Monitor
2.2.5 Collector
. . . . . . . . . . . . . .
2.2.6 Agent
. . . . . . . . . . . . . . . .
2.2.7 环境 . . . . . . . . . . . . . . . . .
2.2.8 testbench . . . . . . . . . . . . . .
系统和 UVC 模块. . . . . . . . . . . . . . . . . . .
2.3.1 软件化 UVC . . . . . . . . . . . . .
systemverilog UVM 类库. . . . . . . . . . . . . . .
2.4.1 UVM 工具 . . . . . . . . . . . . . .
1
1
2
2
3
3
3
3
5
5
6
6
6
6
6
7
7
7
7
8
8
9
9
3 面对对象编程
11
介绍. . . . . . . . . . . . . . . . . . . . . . . . . . 11
大型软件的应用设计 . . . . . . . . . . . . . . . . . 11
OOP 的对象 . . . . . . . . . . . . . . . . . . . . . 11
分布式开发环境 . . . . . . . . . . . . . . . . . . . 12
关键部分的隔离 . . . . . . . . . . . . . . . . . . . 12
类, 对象和程序 . . . . . . . . . . . . . . . . . . . . 12
泛型和继承 . . . . . . . . . . . . . . . . . . . . . . 13
创建可重用代码 . . . . . . . . . . . . . . . . . . . 14
多态性 . . . . . . . . . . . . . . . . . . . . . . . . 14
下行封装 . . . . . . . . . . . . . . . . . . . . . . . 15
类库. . . . . . . . . . . . . . . . . . . . . . . . . . 16
静态方法和属性 . . . . . . . . . . . . . . . . . . . 16
类的参数化 . . . . . . . . . . . . . . . . . . . . . . 16
包和名字空间. . . . . . . . . . . . . . . . . . . . . 17
UML. . . . . . . . . . . . . . . . . . . . . . . . . . 18
软件设计模式. . . . . . . . . . . . . . . . . . . . . 19
3.16.1 软件设计的反模式 . . . . . . . . . 19
为什么不使用已有的 OOP 方法 . . . . . . . . . . . 19
面向式的编程. . . . . . . . . . . . . . . . . . . . . 20
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 20
4 UVM 库
21
使用 UVM 库 . . . . . . . . . . . . . . . . . . . . . 21
4.1.1 Hello World 例子 . . . . . . . . . . 21
4.1.2 UVM 库的使用指南 . . . . . . . . . 22
UVM 库的基类 . . . . . . . . . . . . . . . . . . . . 22
uvm_object 类 . . . . . . . . . . . . . . . . . . . . 22
4.3.1 UVM 数据域的自动化 . . . . . . . 23
4.3.2 uvm_object 定义指南 . . . . . . . 23
4.3.3 UVM 对象自动化的应用 . . . . . . 24
4.3.4 UVM 数据域自动化的应用 . . . . . 26
uvm_component 类 . . . . . . . . . . . . . . . . . 26
4.4.1 仿真阶段的方法 . . . . . . . . . . . 27
4.4.2 分层功能 . . . . . . . . . . . . . . 28
4.4.3 uvm_top 组件 . . . . . . . . . . . . 30
UVM 配置机制 . . . . . . . . . . . . . . . . . . . . 30
UVM 事务级建模 . . . . . . . . . . . . . . . . . . . 32
4.6.1 关键的 TLM 概念 . . . . . . . . . . 32
UVM Factory . . . . . . . . . . . . . . . . . . . . . 38
UVM 消息. . . . . . . . . . . . . . . . . . . . . . . 40
4.8.1 UVM 消息 API
. . . . . . . . . . . 40
4.8.2 UVM 消息的使用指南 . . . . . . . 41
4.8.3 修改消息的显示等级 . . . . . . . . 41
回调. . . . . . . . . . . . . . . . . . . . . . . . . . 42
4.9.1 使用回调 . . . . . . . . . . . . . . 42
4.9.2 回调的使用指南 . . . . . . . . . . . 43
4.9.3 内建的报告捕获回调 . . . . . . . . 43
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 44
5 接口 UVC
45
激励模型和生成 . . . . . . . . . . . . . . . . . . . 45
5.1.1 数据项建模 . . . . . . . . . . . . . 45
5.1.2 控制域的定义 . . . . . . . . . . . . 46
5.1.3 继承和约束的分层 . . . . . . . . . 46
5.1.4 在测试中使用空约束块 . . . . . . . 47
5.1.5 简单的数据项测试 . . . . . . . . . 47
创建 driver . . . . . . . . . . . . . . . . . . . . . . 48
5.2.1 SystemVerilog 接口和虚接口 . . . 49
创建 Sequencer . . . . . . . . . . . . . . . . . . . 50
5.3.1 关键的随机化需求 . . . . . . . . . 50
5.3.2 非 UVM 生成器 . . . . . . . . . . . 50
5.3.3 UVM Sequencer
. . . . . . . . . . 51
连接 driver 和 Sequencer . . . . . . . . . . . . . . 52
5.4.1 driver 和 Sequencer 的基本交互 . 52
5.4.2 随机项的查询 . . . . . . . . . . . . 53
5.4.3 支持流水线协议 . . . . . . . . . . . 53
5.4.4 回传给 Sequencer 的处理数据 . . 54
i
目录
ii
5.5.1 连接 Collector 和 Monitor
创建 Collector 和 Monitor . . . . . . . . . . . . . . 54
. . . . . 56
UVM 模型拓扑 . . . . . . . . . . . . . . . . . . . . 56
Agent 创建 . . . . . . . . . . . . . . . . . . . . . . 58
5.7.1 使用 connect() 连接组件 . . . . . . 59
5.7.2 Agent 配置 . . . . . . . . . . . . . 60
创建 UVM 验证组件 . . . . . . . . . . . . . . . . . 61
5.8.1 环境类 . . . . . . . . . . . . . . . . 61
5.8.2 点对点的环境 . . . . . . . . . . . . 62
5.8.3 UVM 配置机制 . . . . . . . . . . . 63
5.8.4 设定 Agent 虚接口 . . . . . . . . . 65
创建 UVM 序列 . . . . . . . . . . . . . . . . . . . . 67
5.9.1 用户定制序列 . . . . . . . . . . . . 68
5.9.2 预定义序列 . . . . . . . . . . . . . 70
配置 Sequencer 的默认序列. . . . . . . . . . . . . 71
5.10.1 控制 Sequencer 以及生成序列 . . 71
5.10.2 重载序列项和序列 . . . . . . . . . 72
5.10.3 构建可重用的序列库 . . . . . . . . 72
EOT 的协调 . . . . . . . . . . . . . . . . . . . . . 72
5.11.1 UVM 窗口机制 . . . . . . . . . . . 72
5.11.2 EOT 的窗口机制 . . . . . . . . . . 73
5.11.3 跟踪窗口信息 . . . . . . . . . . . . 74
5.11.4 设定等待时间 . . . . . . . . . . . . 74
5.11.5 标记处理的缺失 . . . . . . . . . . . 74
与协议相关的覆盖和检查 . . . . . . . . . . . . . . 77
5.12.1 放置覆盖组 . . . . . . . . . . . . . 77
5.12.2 实现检查 . . . . . . . . . . . . . . 78
5.12.3 使能和失效覆盖和检查 . . . . . . . 79
5.12.4 接口的覆盖和检查 . . . . . . . . . 79
处理复位 . . . . . . . . . . . . . . . . . . . . . . . 80
5.13.1 UVC 接口的复位方式 . . . . . . . 80
UVC 接口的封装 . . . . . . . . . . . . . . . . . . . 81
5.14.1 接口 UVC 的目录结构 . . . . . . . 82
5.14.2 文件命名的约定 . . . . . . . . . . . 82
5.14.3 UVC 包 . . . . . . . . . . . . . . . 82
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 83
6 UVC 创建的自动化
84
UVC 的开发流程 . . . . . . . . . . . . . . . . . . . 84
代码生成器 . . . . . . . . . . . . . . . . . . . . . . 85
Checklist . . . . . . . . . . . . . . . . . . . . . . . 86
自动检查 . . . . . . . . . . . . . . . . . . . . . . . 87
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 87
7 简单 testbench 集成
88
testbench 和测试. . . . . . . . . . . . . . . . . . . 88
7.1.1 testbench 类 . . . . . . . . . . . . 88
7.1.2 测试类 . . . . . . . . . . . . . . . . 88
创建一个简单 testbench . . . . . . . . . . . . . . . 89
7.2.1 在 testbench 中实例化 UVC . . . . 89
testbench 配置 . . . . . . . . . . . . . . . . . . . . 91
7.3.1 UVC 配置参数 . . . . . . . . . . . 91
7.3.2 UVC 配置机制 . . . . . . . . . . . 91
7.3.3 使用配置类 . . . . . . . . . . . . . 92
创建测试 . . . . . . . . . . . . . . . . . . . . . . . 93
7.4.1 创建基本测试 . . . . . . . . . . . . 93
7.4.2 使用基本测试创建测试库 . . . . . 93
7.4.3 测试选择 . . . . . . . . . . . . . . 94
创建有价值的测试 . . . . . . . . . . . . . . . . . . 94
7.5.1 数据项约束 . . . . . . . . . . . . . 94
7.5.2 序列和 Sequencer 控制 . . . . . . 96
virutal Sequencer 和 virutal 序列 . . . . . . . . . . 100
7.6.1 virutal Sequencer
. . . . . . . . . 101
7.6.2 创建 virutal 序列 . . . . . . . . . . 101
7.6.3 控制其他 Sequencer . . . . . . . . 102
7.6.4 virutal Sequencer 和 子 Se-
quencer 的连接 . . . . . . . . . . . 102
检查 dut. . . . . . . . . . . . . . . . . . . . . . . . 103
7.7.1 Scoreboard . . . . . . . . . . . . . 103
实现覆盖模型. . . . . . . . . . . . . . . . . . . . . 104
7.8.1 选择覆盖方式 . . . . . . . . . . . . 105
7.8.2 实现功能覆盖的模型 . . . . . . . . 105
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 105
8 激励生成
106
序列的生成控制 . . . . . . . . . . . . . . . . . . . 106
并发执行多个序列 . . . . . . . . . . . . . . . . . . 107
8.2.1 序 列 body 中 使 用 fork/join 和
uvm_do . . . . . . . . . . . . . . . 108
8.2.2 并行多个序列 . . . . . . . . . . . . 108
使用 p_sequencer . . . . . . . . . . . . . . . . . . 108
使用 pre_body 和 post_body 方法. . . . . . . . . . 108
仲裁控制 . . . . . . . . . . . . . . . . . . . . . . . 109
中断序列 . . . . . . . . . . . . . . . . . . . . . . . 109
分层协议 . . . . . . . . . . . . . . . . . . . . . . . 110
8.7.1 协议的分层 . . . . . . . . . . . . . 111
8.7.2 分层和序列 . . . . . . . . . . . . . 111
8.7.3 分层风格 . . . . . . . . . . . . . . 113
8.7.4 使用分层 Sequencer . . . . . . . . 115
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 117
9 寄存器和内存包
118
与寄存器关联的术语 . . . . . . . . . . . . . . . . . 118
寄存器包的预览 . . . . . . . . . . . . . . . . . . . 119
9.2.1 寄存器包的使用流程 . . . . . . . . 119
9.2.2 uvm_rgm 的连接和数据流 . . . . . 119
9.2.3 寄存器数据库 (RGM_DB)
. . . . . 120
9.2.4 随机化和注入 . . . . . . . . . . . . 120
9.2.5 监控 . . . . . . . . . . . . . . . . . 120
使用 uvm_rgm 包 . . . . . . . . . . . . . . . . . . 121
9.3.1 定义寄存器和内存模型 . . . . . . . 121
9.3.2 创建 IP-XACT 文件 . . . . . . . . . 121
9.3.3 创建 uvm_rgm 类 . . . . . . . . . . 122
9.3.4 扩展可自动生成的 uvm_rgm 类 . . 126
连接 testbench 的 uvm_rgm 组件 . . . . . . . . . . 126
9.4.1 寄存器组件和 testbench 的连接 . . 126
9.4.2 总线主 Sequencer 中加入必要的
框架 . . . . . . . . . . . . . . . . . 126
9.4.3 testbench 的连接和实例化 . . . . . 128
9.4.4 复位处理 . . . . . . . . . . . . . . 130
寄存器控制 . . . . . . . . . . . . . . . . . . . . . . 130
9.5.1 寄存器操作 . . . . . . . . . . . . . 131
9.5.2 寄存器的读写序列 . . . . . . . . . 131
9.5.3 多个寄存器序列的操作 . . . . . . . 132
9.5.4 序列重用 . . . . . . . . . . . . . . 133
使用 uvm_rgm 进行检查 . . . . . . . . . . . . . . . 133
9.6.1 使用影子模型进行检查 . . . . . . . 133
9.6.2 高级寄存器检查 . . . . . . . . . . . 133
9.6.3 寄存器获取函数 . . . . . . . . . . . 133
目录
iii
更新寄存器数据库模型. . . . . . . . . . . . . . . . 134
9.7.1 模块 UVC 的更新 . . . . . . . . . . 134
寄存器操作的覆盖收集. . . . . . . . . . . . . . . . 135
9.8.1 uvm_rgm 的自动覆盖功能 . . . . . 135
9.8.2 用户定制覆盖 . . . . . . . . . . . . 136
控制覆盖采样的时间 . . . . . . . . . . . . . . . . . 136
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 136
10 系统 UVC 和 testbench 集成
137
介绍. . . . . . . . . . . . . . . . . . . . . . . . . . 137
模块和系统 UVC 的架构 . . . . . . . . . . . . . . . 138
10.2.1 模块和系统 UVC 的重用 . . . . . . 138
10.2.2 模块 UVC 架构 . . . . . . . . . . . 139
10.2.3 系统 UVC 架构 . . . . . . . . . . . 139
模块和系统 UVC 的子组件. . . . . . . . . . . . . . 140
10.3.1 Monitor
. . . . . . . . . . . . . . . 140
10.3.2 内存块和寄存器文件 . . . . . . . . 142
10.3.3 激活互换模式 . . . . . . . . . . . . 142
10.3.4 模块 UVC 类 . . . . . . . . . . . . 142
模块 UVC 配置 . . . . . . . . . . . . . . . . . . . . 143
10.4.1 标准配置模式 . . . . . . . . . . . . 143
10.4.2 模块 UVC 的重新配置 . . . . . . . 144
testbench . . . . . . . . . . . . . . . . . . . . . . . 144
10.5.1 UART 控制器的 testbench 策略 . . 146
10.5.2 virtual Sequencer 和 寄 存 器 Se-
quencer . . . . . . . . . . . . . . . 147
10.5.3 接口 UVC 扩展 . . . . . . . . . . . 147
序列. . . . . . . . . . . . . . . . . . . . . . . . . . 148
10.6.1 开发可重用序列 . . . . . . . . . . . 148
覆盖. . . . . . . . . . . . . . . . . . . . . . . . . . 149
10.7.1 模块 UVC 的覆盖 . . . . . . . . . . 149
10.7.2 系统级覆盖 . . . . . . . . . . . . . 151
互换模式 . . . . . . . . . . . . . . . . . . . . . . . 151
系统验证的扩展 . . . . . . . . . . . . . . . . . . . 153
10.9.1 随机化和激励生成 . . . . . . . . . 153
10.9.2 覆盖 . . . . . . . . . . . . . . . . . 153
10.9.3 消息 . . . . . . . . . . . . . . . . . 153
模块 UVC 的目录结构 . . . . . . . . . . . . . . . . 154
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 154
11 UVM 的未来
155
商用 UVM 验证 IP . . . . . . . . . . . . . . . . . . 155
类库的增强 . . . . . . . . . . . . . . . . . . . . . . 155
11.2.1 寄存器包 . . . . . . . . . . . . . . 155
11.2.2 实时阶段 . . . . . . . . . . . . . . 155
11.2.3 多语言的集成 . . . . . . . . . . . . 156
多个域的 UVM . . . . . . . . . . . . . . . . . . . . 157
总结. . . . . . . . . . . . . . . . . . . . . . . . . . 157
前言
基于 A Practical Guide to Adopting the Universal Verification Methodology.
iv
UVM 介绍
UVM 提供了一套优秀实用的完整方法学, 可用于高效完备的验证. 其中的一个关键概念就是开发可重用的验证组
件, 也被称为 UVC(UVM Verification Component), UVM 既可验证小设计, 也可以在基于 IP 的大型 Soc(system-on-
chip) 设计中使用.
UVM 提供的所有验证特性和功能, 都已经被证明是可以使用的.
稳定, UVM 代码基于 OVM(Open Verification Methodology) 库, 有些代码直接来自已论证的 OVM 代码.
开源, 它是一类开源的 Accellera 标准 (将来有可能成为 IEEE 标准)
兼容性和移植性, 在所有主流的商用仿真器中都可以进行测试.
在技术层面上, UVM 提供一种通用的面对对象的 UVM 验证组件 (UVC) 的用法模型, 这使得所有与 UVM 兼容的
UVC 可以相互操作, 而不必关心 UVC 是由那种语言所开发的, 并且 UVM 中还包含了以下特性:
数据设计, 通过方法学和库代码, 使得包含在特殊数据项和组件集合中的验证环境能被划分, 另外 UVM 还提
供了大量的可简单应用的内建功能, 例如文本打印, 对象的图形化观察, 层次化设定和获取对象的数据, 以及一
些自动化操作, 比如复制, 比较和打包. 这使得工程师只需关注包含的对象和它们的工作状态, 而不是对应的代
码.
激励生成, 所提供的类和基本框架, 可对序列数据流进行细粒度控制, 从而实现模块级和系统级的激励生成, 用
户可基于环境的当前状态进行随机, 其中包含了 dut 状态, 接口或之前生成的数据, UVM 中提供了内建的激励
生成, 可定制层次化事务和事务数据流的创建.
构建和运行 testbench, 可为 Soc 创建一个完整的 testbench(验证环境), 其中包含了多种协议, 接口, 以及多个
处理器, 所以 testbench 会变得很复杂, 而 UVM 基类则提供了必要的自动化帮助, 一个定义完备的构建流程,
允许建立一个可重用的分层环境, 一个通用的配置接口可使用户定制运行时行为, 以及在不修改原有实现的情
况下, 定制 testbench 拓扑, 这也是一个关键的重用概念.
覆盖模型的设计和检查策略, 采用了一种流行的实现方式, 也就是在可重用 UVC 中, 合并功能覆盖以及对物理
用户示例, 这是一个珍贵的 SystemmVerilog 示例, 它基于一个易理解的 XBus 完整协议, 在示例中包含了测
的, 临时性的和协议的数据进行检查.
试, 序列,testbench 结构, 以及使用基类和方法学派生的 UVC
验证规划和覆盖驱动验证
UVM 的最终目的是帮助你更早地在设计过程中查找错误, 在过去 14 年为客户定制验证环境的过程中, 我们学会了
查找某些难于预期的错误时, 采用的最好方式是随机性控制 (controlled randomness), 事实上我们也见到过许多用
户在使用随机性控制来查找那些不可预期的错误, 而不是使用其他的验证技术, 在大多数技术合同中, 我们需要为准
备好验证自己设计的客户而工作, 并会询问他们,”你是否要我们在一个星期之内找到错误?”
这时大多数工程师只能接受用户的要求, 但是对于一个你并不了解的系统, 如何来查找错误? 这是一个在项目
特定验证中, 已进行了长期工作且有经验的工程师才能办到的事情, 你具备这个条件吗? 正如你所猜测的, 解决方案
就是随机性测试, 这时我们需要与原有的设计工程师进行沟通, 并抽象出协议和系统的属性, 以实现随机化测试的方
案, 那成功就在不远处.
UVM 提供了最好的框架, 来实现覆盖驱动验证 (cdv,coverage-driven verification),cdv 中合并了自动测试生成,
自检 testbench, 以及减少验证时间消耗的覆盖指标, cdv 的目的在于:
使用预定义的目标来验证
消除手动创建几百个测试所造成的时间和精力的消耗
使用实时自检简化错误的分析和调试, 使之更早地接收到错误通告
cdv 流不同于传统的定向测试流, 在 cdv 中, 首先会在一个初始的规划过程中, 设定验证目标, 之后可创建一个
智能的验证环境, 它可生成随机化激励, 并将激励发送给 dut, 覆盖监视器 (monitor) 会加入到环境中, 可用于检
查处理过程和标识无法执行的功能, 检查器 (Checker) 可用于标识 dut 的一些非预期的行为, 最后当覆盖模型
1
1. UVM 介绍
2
和 testbench 完成时, 仿真可开始运行, 那么一个比较完整的验证环境已构建好了.
使用 cdv, 你可以通过修改 testbench 参数或是修改随机的种子, 对你的设计进行全面验证, 测试约束将加入到智能
架构的顶层, 用于产生激励, 以满足验证目标, 排名 (Ranking) 技术可对测试和种子进行标记, 以查看它们对验证目
标的贡献, 并在回归测试中移除那些多余测试, 图 1-1 对以上的验证流程给出了一个图形化的描述
图 1.1: 验证规划和执行流程
cdv 环境支持定向和自动测试, 推荐的方式还是首先使用自动测试, 让它来完成大部分工作, 之后编写耗时和针对性
的测试, 用于随机化很难达到的特殊测试场景, 正确的规划可使验证处理具备高效和可见性的特点, 创建一个可执行
的验证规划时, 会包含一些验证指标, 以便于你精确地检查处理过程, 设计以及验证项目. 使用这类可行的方案, 将使
代码覆盖在一个特殊等级上, 被规划, 观察, 排名和报告. 使用一个抽象的基于特性的描述 (不依赖于具体的实现细
节), 同样也是一个可阅读, 可裁剪, 可重用的验证规划, 你可在多个供应商的文档中, 找到更多优秀的处理过程与自
动化相关的功能.
多语言和方法学
多语言的项目和验证通常不会出现在一个项目或是所有项目中, 但它确实提供了一个机会, 使得不同公司之间可以
共享大多数可用的验证断言, 没有人会真的为新项目, 编写一个多语言的验证环境, 但大多数用户都需要借用已有的
验证代码, 以节省重写的时间, 这与你是否包含了多个语言开发的 VIP 组件有关, 或是未来有这类需求, 那现在就需
要考虑多语言方法学, 对于日益工业化的今天, 收购和联合开发的例子层出不穷, 我们会看到更多的用户无须再去处
理重用这类细节问题, 这在过去是不可想象的.
UVM TLM(事务级建模,Transaction-Level Modeling)API 用于验证 SystemVerilog 和其他语言 (如 e 和 systemC) 编
写的验证组件之间实现的事务级通讯, 所有的语言中都使用相同的 API, 它可减少不同语法和工具的学习难度. 因此
TLM 就是基于多语言 (ML) 的互用性,UVM TLM 可在所有标准语言中使用,TLM1.0 和 TLM2.0 的多语言示例, 已在
Cadence OVM 中进行了验证, 并在其产品中已经包含, 实用的多语言仿真中还包含了其他一些功能, 比如中央配置
机制, 随机化通讯, 以及坐标, 消息等等.
本书的特点
为了有些用户, 本书首先给出了构建方面的知识, 它提供一种更易入门的学习方法, 本书基于作者在多个应用项目中
积累的多年经验, 它可节省读者在创建自身验证方案时, 进行尝试的时间. 书中提供了成功开发验证的实用技巧和指
南, 使你能高效编码, 并避免新手所犯的一些错误. 书中不会包含整个类库, 但会关注到 UVM 用户需要使用的一些概
念.
当读者已经历过多次 UVM 开发后, 这份指南也会提供一些帮助, 例如建立一个标准的目录结构, 对于创建可重
用组件很重要. 目录结构的正确与否, 虽然看上去是一件小事, 但经验会告诉你, 它将影响到开发团队的合作, 另一个
1. UVM 介绍
3
例子就是一致性的问题, 虽然有些规则对于单用户或是小项目来说没有约束力, 但是在项目合作或是培训工程师时,
就会发现它们的重要性.
如何使用本书
一个典型的验证团队中会包含多种的组员, 他们需要不同专业技能以及承担不同的责任, 开发者和环境用户是不同
角色, 因此他们对于验证理解的深度也会不同, 所以需要在这本用户指南中, 划分一下验证团队中不同角色之间的责
任: UVC 开发者将创建一个可重用的 testbench 框架
环境用户 (或称集成者) 需要编写测试和 testbench 框架的配置, 以满足特定项目的验证目标, 当然也需要区分
集成者需要配置 testbench 并实例化, 而测试编写者需要创建 testbench 顶层的测试
不同的 testbench
本书的结构如下:
介绍 UVM testbench 和组件的结构
介绍面对对象的编程基础
UVM 库的机制和基本功能
生成一个标准可重用的接口环境, 所需的组件和基本概念
加快 UVC 开发的技术和流程
将给出一个简单 testbench 的创建, 并包含了可重用组件和其中的粘
合逻辑. 注意: 这一章将介绍 UVC 接口的集成和用法, 在第十章中将
介绍完整的集成方式, 以及如何实现寄存器包和其他 testbench 组件
的重用.
用于 sequence 和随机化控制的多种技术
产生与寄存器相关的可重用验证逻辑的方法学和自动化
如何打包与设备相关的逻辑, 以及在块, 子系统或是系统集成的重用
给出 UVM 在短期和将来所能提供的一些功能预览
第二章,UVM 预览
第三章, 面对对象编程
第四章,UVM 库基础
第五章, 接口 UVC
第六章,UVC 创建的自动化
第七章, 简单 testbench 的集成
第八章, 激励生成技术
第九章, 寄存器和内存的封装
第十章, 系统 UVC 和 testbench 集成
第十一章,UVM 的将来
在某些公司中 UVC 开发,teshbench 集成以及测试编写是同一个人, 为了获得对 UVM 的整体了解, 我们推荐你阅读
完整本书, 而不要在意验证中你所处的角色. 当然本书的组织有利于环境用户快速学习对应的知识, 以及那些无须了
解的所有方法学.
1.4.1 如何运行例子 (略)
由于原文使用的是 ius 综合环境, 但这个软件不太好找, 所以此处给予省略.
1.4.2 文本风格的约定 (略)
原文的文本风格不可能继承下来, 所以这一节略去, 并加入翻译版本的风格约定
蓝色表示原文给出的补充.
褐色表示翻译者给予的补充.
下划线表示给予补充的名词或是需要强调的句子
1.4.3 缩略语
缩略语
AHB
AMBA
AOP
APB
API
ATM
定义
Advanced High-performance Bus
Advanced Microcontroller Bus Architecture
Aspect-Oriented Programming
AMBA Advanced Peripheral Bus
Application Programming Interface
Asynchronous Transfer Mode