logo资料库

UVM Primer.pdf

第1页 / 共141页
第2页 / 共141页
第3页 / 共141页
第4页 / 共141页
第5页 / 共141页
第6页 / 共141页
第7页 / 共141页
第8页 / 共141页
资料共141页,剩余部分请下载后查看
目录
第一章 引言
短而美
你说的是些什么"概念"呢?
网上资源
示例设计
代码字体说明
第二章 用于TinyALU的一个常规验证平台
TinyALU的功能覆盖率模型
验证平台文件
验证平台变量定义
covergroup模块
tester模块
用Scoreboard循环来做自检
我们有一个验证平台了
第三章 SystemVerilog interfaces和BFM
TinyALU的BFM
创建一个模块化验证平台
总结
第四章 面向对象编程
为什么人人都爱OOP
代码重用
代码维护
内存管理
总结
第五章 类和继承
从结构体开始
定义一个类
继承类
总结
第六章 多态
虚函数
抽象类和纯虚函数
总结
第七章 静态变量和方法
声明静态变量
定义静态方法
总结
第八章 类的参数化定义
造一个动物笼子
用参数来定义变量
总结
第九章 Factory模式
为什么用Factory模式?
创建动物Factory
使用动物Factory
总结
第十章 面向对象的验证平台
TinyALU验证平台对象
基于对象的顶层module
引入类定义
例化DUT和BFM, 定义验证平台类变量
例化并启动testbench对象
testbench类
声明
execute()方法
tester类
scoreboard类
coverage类
模块集合
总结
第十一章 UVM Test
使用Factory模式创建测试用例
用UVM启动仿真
定义并注册UVM Test
run_test()方法
理解objection
编写add_test类
总结
第十二章 UVM Component
第一步: 从uvm_component类继承创建模块
第二步: 用uvm_component_utils()宏注册类到Factory
第三步: 提供最简uvm_component构造器
第四步: 有必要的话重写UVM phase
重载比较器类中的方法
用build_phase()方法来建立验证平台
总结
第十三章 UVM Env
复杂性编程VS适应性编程
构建适应性代码
结构与激励分离
env类
用UVM Factory来创建UVM组件
Factory重载
总结
第十四章 一个新思路
对象和脚本
两种对象通信的类型
第十五章 与多个对象通信
观察者设计模式
UVM和观察者设计模式
uvm_analysis_port
uvm_subscriber
实现我们的订阅者
在dice_roller里用uvm_analysis_port
connect_phase()方法
得A
总结
第十六章 在验证平台里使用analysis port
重复代码问题
验证平台图解
BFM中的对象句柄
监控TinyALU的指令
用command_monitor_h操作指令
TinyALU的coverage类用作订阅者
订阅多个analysis port
订阅到monitor
总结
第十七章 线程间通信
等一下, 没有对象端口吗?
producer作为对象
consumer作为对象
连接端口
连接端口到TLM FIFO
非阻塞通信
图解put端口和get端口
总结
第十八章 put和get端口的实践
base_tester类
TinyALU的driver
总结
第十九章 UVM报告
UVM报告宏
UVM verbosity等级
设置verbosity门限(级别)
设置全局verbosity门限
在UVM层级中设置verbosity
禁用warning, error和fatal信息
总结
第二十章 类层级和深度操作
还是回到狮子的例子
深度拷贝
总结
第二十一章 UVM Transaction
用对象存放数据的益处
transaction启动
定义transaction
创建随机化数据域
uvm_object构造器
do_copy()方法
clone_me()方法和MOOCOW
do_compare()方法
conver2string()方法
使用transaction
第1步: 创建result_transaction类操作结果.
第2步: 从command_transaction继承创建add_transaction类来生成加法指令.
第3步: 将base_tester命名为tester, 因为现在可以用来做任意的Test了.
第4步: 修改command_monitor来创建command_transaction
第5步: 修改result_monitor来创建result_transaction.
第6步: 修改scoreboard来使用result_transaction的compare()方法.
第7步: 修改add_test来使用add_transaction.
总结
第二十二章 UVM Agent
编写TinyALU agent
使用UVM Agent
顶层Module
dual_test类
TinyALU环境
总结
第二十三章 UVM Sequence
第一步: 创建携带数据的TinyALU sequence项目.
第二步: 把tester替换成uvm_sequencer.
第三步: 对driver进行支持sequence的升级.
第四步: 在环境里例化driver和sequence然后相互连接.
第五步: 编写UVM sequence.
第六步: 编写用sequencer启动sequencer的Test.
斐波那契Test
Virtual Sequence
不用Sequencer启动Virtual Sequence
多线程里的Virtual Sequence
总结
第二十四章 UVM伴我同行
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
分享到:
收藏