The
UVM
Primer
ajzcr@qq.com
v0.0.2
2016.8.17
目录
目录 ........................................................................................................................................................ 1
第一章 引言 .......................................................................................................................................... 6
短而美 ............................................................................................................................................ 6
你说的是些什么"概念"呢? ........................................................................................................... 6
网上资源 ........................................................................................................................................ 6
示例设计 ........................................................................................................................................ 7
代码字体说明 ................................................................................................................................ 8
第二章 用于 TinyALU 的一个常规验证平台 .................................................................................. 10
TinyALU 的功能覆盖率模型 ..................................................................................................... 10
验证平台文件 .............................................................................................................................. 10
验证平台变量定义 ...................................................................................................................... 10
covergroup 模块 ....................................................................................................................... 11
tester 模块 ................................................................................................................................ 13
用 Scoreboard 循环来做自检 .................................................................................................. 14
我们有一个验证平台了 .............................................................................................................. 14
第三章 SystemVerilog interfaces 和 BFM ......................................................................................... 15
TinyALU 的 BFM ........................................................................................................................ 15
创建一个模块化验证平台 .......................................................................................................... 17
总结 .............................................................................................................................................. 18
第四章 面向对象编程 ........................................................................................................................ 19
为什么人人都爱 OOP ................................................................................................................. 19
代码重用 ...................................................................................................................................... 19
代码维护 ...................................................................................................................................... 19
内存管理 ...................................................................................................................................... 20
总结 .............................................................................................................................................. 20
第五章 类和继承 ................................................................................................................................ 21
从结构体开始 .............................................................................................................................. 21
定义一个类 .................................................................................................................................. 22
继承类 .......................................................................................................................................... 24
总结 .............................................................................................................................................. 25
第六章 多态 ........................................................................................................................................ 26
虚函数 .......................................................................................................................................... 28
抽象类和纯虚函数 ...................................................................................................................... 29
总结 .............................................................................................................................................. 30
第七章 静态变量和方法 .................................................................................................................... 31
声明静态变量 .............................................................................................................................. 31
定义静态方法 .............................................................................................................................. 32
总结 .............................................................................................................................................. 33
第八章 类的参数化定义 .................................................................................................................... 35
造一个动物笼子 .......................................................................................................................... 35
1 / 141
用参数来定义变量 ...................................................................................................................... 37
总结 .............................................................................................................................................. 38
第九章 Factory 模式........................................................................................................................... 40
为什么用 Factory 模式? .............................................................................................................. 40
创建动物 Factory......................................................................................................................... 41
使用动物 Factory......................................................................................................................... 42
总结 .............................................................................................................................................. 43
第十章 面向对象的验证平台 ............................................................................................................ 44
TinyALU 验证平台对象 ............................................................................................................. 44
基于对象的顶层 module ............................................................................................................. 44
引入类定义 .................................................................................................................................. 45
例化 DUT 和 BFM, 定义验证平台类变量 ............................................................................... 45
例化并启动 testbench 对象 .................................................................................................... 45
testbench 类 ............................................................................................................................. 46
声明 ...................................................................................................................................... 46
execute()方法 .................................................................................................................. 47
tester 类 .................................................................................................................................... 47
scoreboard 类 ........................................................................................................................... 48
coverage 类 ............................................................................................................................... 49
模块集合 ...................................................................................................................................... 49
总结 .............................................................................................................................................. 49
第十一章 UVM Test ........................................................................................................................... 51
使用 Factory 模式创建测试用例................................................................................................ 51
用 UVM 启动仿真 ...................................................................................................................... 51
定义并注册 UVM Test ................................................................................................................ 53
run_test()方法 ........................................................................................................................ 53
理解 objection .............................................................................................................................. 54
编写 add_test 类 ...................................................................................................................... 55
总结 .............................................................................................................................................. 55
第十二章 UVM Component ............................................................................................................... 57
第一步: 从 uvm_component 类继承创建模块 ........................................................................ 57
第二步: 用 uvm_component_utils()宏注册类到 Factory .................................................. 57
第三步: 提供最简 uvm_component 构造器 ............................................................................ 57
第四步: 有必要的话重写 UVM phase ...................................................................................... 58
重载比较器类中的方法 .............................................................................................................. 58
用 build_phase()方法来建立验证平台 ................................................................................ 59
总结 .............................................................................................................................................. 60
第十三章 UVM Env ........................................................................................................................... 62
复杂性编程 VS 适应性编程 ....................................................................................................... 62
构建适应性代码 .......................................................................................................................... 63
结构与激励分离 .......................................................................................................................... 65
env 类 .......................................................................................................................................... 67
用 UVM Factory 来创建 UVM 组件 .......................................................................................... 67
Factory 重载................................................................................................................................. 68
2 / 141
总结 .............................................................................................................................................. 69
第十四章 一个新思路 ........................................................................................................................ 70
对象和脚本 .................................................................................................................................. 70
两种对象通信的类型 .................................................................................................................. 71
第十五章 与多个对象通信 ................................................................................................................ 72
观察者设计模式 .......................................................................................................................... 75
UVM 和观察者设计模式 ........................................................................................................... 75
uvm_analysis_port ................................................................................................................ 75
uvm_subscriber ....................................................................................................................... 75
实现我们的订阅者 ...................................................................................................................... 76
在 dice_roller 里用 uvm_analysis_port ......................................................................... 76
connect_phase()方法 ............................................................................................................. 77
得 A .............................................................................................................................................. 78
总结 .............................................................................................................................................. 78
第十六章 在验证平台里使用 analysis port ...................................................................................... 80
重复代码问题 .............................................................................................................................. 80
验证平台图解 .............................................................................................................................. 80
BFM 中的对象句柄 .................................................................................................................... 81
监控 TinyALU 的指令 ................................................................................................................ 82
用 command_monitor_h 操作指令 .......................................................................................... 83
TinyALU 的 coverage 类用作订阅者 ......................................................................................... 83
订阅多个 analysis port ................................................................................................................ 85
订阅到 monitor ............................................................................................................................ 86
总结 .............................................................................................................................................. 87
第十七章 线程间通信 ........................................................................................................................ 88
等一下, 没有对象端口吗? ......................................................................................................... 89
producer 作为对象 ....................................................................................................................... 89
consumer 作为对象 ..................................................................................................................... 90
连接端口 ...................................................................................................................................... 91
连接端口到 TLM FIFO ............................................................................................................... 91
非阻塞通信 .................................................................................................................................. 92
图解 put 端口和 get 端口 ............................................................................................................ 93
总结 .............................................................................................................................................. 93
第十八章 put 和 get 端口的实践 ....................................................................................................... 94
base_tester 类 ......................................................................................................................... 95
TinyALU 的 driver ....................................................................................................................... 96
总结 .............................................................................................................................................. 97
第十九章 UVM 报告 ....................................................................................................................... 98
UVM 报告宏 ............................................................................................................................... 98
UVM verbosity 等级.................................................................................................................... 99
设置 verbosity 门限(级别) ........................................................................................................ 100
设置全局 verbosity 门限 ........................................................................................................... 100
在 UVM 层级中设置 verbosity................................................................................................. 100
禁用 warning, error 和 fatal 信息 .............................................................................................. 102
3 / 141
总结 ............................................................................................................................................ 103
第二十章 类层级和深度操作 .......................................................................................................... 104
还是回到狮子的例子 ................................................................................................................ 104
深度拷贝 .................................................................................................................................... 106
总结 ............................................................................................................................................ 109
第二十一章 UVM Transaction ......................................................................................................... 110
用对象存放数据的益处 ............................................................................................................ 110
transaction 启动 ......................................................................................................................... 110
定义 transaction ......................................................................................................................... 111
创建随机化数据域 .................................................................................................................... 111
uvm_object 构造器 ................................................................................................................. 112
do_copy()方法 ........................................................................................................................ 112
clone_me()方法和 MOOCOW .............................................................................................. 113
do_compare()方法 ................................................................................................................. 113
conver2string()方法 ........................................................................................................... 114
使用 transaction ......................................................................................................................... 114
第 1 步: 创建 result_transaction 类操作结果. .............................................................. 115
第 2 步: 从 command_transaction 继承创建 add_transaction 类来生成加法指令. . 115
第 3 步: 将 base_tester 命名为 tester, 因为现在可以用来做任意的 Test 了. ............ 116
第 4 步: 修改 command_monitor 来创建 command_transaction ................................... 116
第 5 步: 修改 result_monitor 来创建 result_transaction. ...................................... 116
第 6 步: 修改 scoreboard 来使用 result_transaction 的 compare()方法. ............. 117
第 7 步: 修改 add_test 来使用 add_transaction. .......................................................... 117
总结 ............................................................................................................................................ 118
第二十二章 UVM Agent .................................................................................................................. 119
编写 TinyALU agent ................................................................................................................. 121
使用 UVM Agent ....................................................................................................................... 123
顶层 Module .............................................................................................................................. 123
dual_test 类 ........................................................................................................................... 124
TinyALU 环境 ........................................................................................................................... 126
总结 ............................................................................................................................................ 126
第二十三章 UVM Sequence ............................................................................................................ 128
第一步: 创建携带数据的 TinyALU sequence 项目. .............................................................. 129
第二步: 把 tester 替换成 uvm_sequencer. ....................................................................... 129
第三步: 对 driver 进行支持 sequence 的升级. .................................................................... 130
第四步: 在环境里例化 driver 和 sequence 然后相互连接. ............................................. 130
第五步: 编写 UVM sequence. .................................................................................................. 132
第六步: 编写用 sequencer 启动 sequencer 的 Test. ................................................................ 133
斐波那契 Test ............................................................................................................................ 134
Virtual Sequence ........................................................................................................................ 135
不用 Sequencer 启动 Virtual Sequence ..................................................................................... 136
多线程里的 Virtual Sequence ................................................................................................... 137
总结 ............................................................................................................................................ 138
第二十四章 UVM 伴我同行 ........................................................................................................... 140
4 / 141
说明
原文中的以下内容不做翻译:
1. 使用等宽字体排版的, 直接与代码对应的词汇, 本文中使用 consolas 字体排版直接对应不翻译了.
2. SystemVerilog 中的关键词术语 interface, module 等.
3. UVM 中的专用术语 agent, driver, transaction 等.
4. 其他的专用术语 TLM(Transaction Level Model), OOP(Object Oriented Programming)和 BFM(Bus
Functional Model)等.
5 / 141
第一章
引言
Primer---An elementary textbook that serves as an introduction to a subject of study. (New
Oxford American Dictionary)
作为验证咨询师和通用验证方法学(UVM)应用专家的我经常接到的提问是, "我应该读什
么书来学习 UVM 呢?"
这个问题搞的我很为难, 因为虽然网上有很多 UVM 的参考资料了, 但是市面上甚至还没
有教读者 UVM 的基础书籍.
直到现在.
《The UVM Primer》是你决定开始学习 UVM 的时候可以读的书. 这本书假定你已经有了
SystemVerilog 的基础知识和验证的基本概念, 然后引领你一步一步的理解和编写基于 UVM 的
验证平台.
短而美
UVM Primer 是 UVM 的入门. 我编写的这本书可以让一个普通的验证工程师经过短暂的
阅览之后就能准备去面试了. 这本书的特点是篇幅短, 样例多, 容易阅读.
我避免了入门书通常会有的无聊的玄学问题("UVM 的历史是怎样的?" "谁写了 UVM?" "我
能用 UVM 来做个美味的煎饼吗?").
UVM Primer 提供了你所需要理解和编写 UVM 验证平台一切, 不过并没有深陷 UVM 的所
有细枝末节. UVM 是庞大的, 一本无所不包的书是很大的, 取而代之的是, UVM Primer 为你提
供了探究 UVM 特性所需要的概念.
你说的是些什么"概念"呢?
UVM 构建于以下的简单概念:
· SystemVerilog 的 OOP
· 让你可以不用重编译来指定 test 和验证平台结构的动态生成对象
· 由 Agent, Driver, Monitor 和 BFM 组成的层级化验证平台
· 对象间的 transaction 级别通信
· 验证平台激励(UVM sequence)和验证平台结构的分离
到本书结尾的时候, 你就会对这些概念和它们对验证平台的作用有坚实的掌握.
网上资源
6 / 141
The UVM P rimer 通过代码来探讨 UVM. 这对读者和作者在代码细节方面提出了挑战. 一
方面, 一行行的描述代码是枯燥的. 另一方面, 代码片段之上的讨论, 会让读者纠结于诸如代
码的实现和代码的作用这些问题上. 这些细节也不应该留作读者的作业.
在提供本书的代码行为的探讨之外, 我还在 www.uvmprimer.com 上提供了视频. 每一章的
代码示例都有配套的视频.
入门读物的读者通常会有很多相关的问题, 读者们可以在 UVM Primer 的 Facebook 主页
(这是读者进行书中的概念和代码讨论的中心)上提问. 你可以在 www.uvmprimer.com 下载 gzip
tar 文件格式的示例代码或者在 www.git-hub.com 中 pull 下代码的 GIT 仓库.
示例设计
我们会通过验证一个简单的设计---TinyALU, 来展开讨论 UVM. 这样一来, 你无需受到
DUT 复杂度的干扰, 可以投入精力到验证平台上.
TinyALU 是 VHDL 编写的一个简单的 ALU. 它接收两个 8 位数据(A 和 B), 并产生 16 位
的结果. 这里是 TinyALU 的顶层:
图 1. TinyALU 模块图
这个 ALU 在时钟的上升沿工作. 当 start 信号有效时, TinyALU 从 A, B 总线上读取操作
数, 从 op 总线上读取指令, 然后根据指令生成结果. 指令可以是任意长度时钟周期的,
TinyALU 在指令完成的时候拉高 done 信号.
reset_n 信号是低有效, 同步的复位信号.
TinyALU 有 5 个指令: NOP, ADD, AND, XOR 和 MULT. 用户在需要计算的时候对 3 位总
线 op 进行编码, 编码表如下:
7 / 141