logo资料库

A Practical Guide to Adopting the Universal Verification Methodo....pdf

第1页 / 共162页
第2页 / 共162页
第3页 / 共162页
第4页 / 共162页
第5页 / 共162页
第6页 / 共162页
第7页 / 共162页
第8页 / 共162页
资料共162页,剩余部分请下载后查看
UVM介绍
验证规划和覆盖驱动验证
多语言和方法学
本书的特点
如何使用本书
如何运行例子(略)
文本风格的约定(略)
缩略语
UVM概述
UVM testbench和环境
UVC接口
数据项(数据项)
Driver/Bus功能模型(BFM)
Sequencer
Monitor
Collector
Agent
环境
testbench
系统和UVC模块
软件化UVC
systemverilog UVM类库
UVM工具
面对对象编程
介绍
大型软件的应用设计
OOP的对象
分布式开发环境
关键部分的隔离
类,对象和程序
泛型和继承
创建可重用代码
多态性
下行封装
类库
静态方法和属性
类的参数化
包和名字空间
UML
软件设计模式
软件设计的反模式
为什么不使用已有的OOP方法
面向式的编程
总结
UVM库
使用UVM库
Hello World例子
UVM库的使用指南
UVM库的基类
uvm_object类
UVM数据域的自动化
uvm_object定义指南
UVM对象自动化的应用
UVM数据域自动化的应用
uvm_component类
仿真阶段的方法
分层功能
uvm_top组件
UVM配置机制
UVM事务级建模
关键的TLM概念
UVM Factory
UVM消息
UVM消息API
UVM消息的使用指南
修改消息的显示等级
回调
使用回调
回调的使用指南
内建的报告捕获回调
总结
接口UVC
激励模型和生成
数据项建模
控制域的定义
继承和约束的分层
在测试中使用空约束块
简单的数据项测试
创建driver
SystemVerilog接口和虚接口
创建Sequencer
关键的随机化需求
非UVM生成器
UVM Sequencer
连接driver和Sequencer
driver和Sequencer的基本交互
随机项的查询
支持流水线协议
回传给Sequencer的处理数据
创建Collector和Monitor
连接Collector和Monitor
UVM模型拓扑
Agent创建
使用connect()连接组件
Agent配置
创建UVM验证组件
环境类
点对点的环境
UVM配置机制
设定Agent虚接口
创建UVM序列
用户定制序列
预定义序列
配置Sequencer的默认序列
控制Sequencer以及生成序列
重载序列项和序列
构建可重用的序列库
EOT的协调
UVM窗口机制
EOT的窗口机制
跟踪窗口信息
设定等待时间
标记处理的缺失
与协议相关的覆盖和检查
放置覆盖组
实现检查
使能和失效覆盖和检查
接口的覆盖和检查
处理复位
UVC接口的复位方式
UVC接口的封装
接口UVC的目录结构
文件命名的约定
UVC包
总结
UVC创建的自动化
UVC的开发流程
代码生成器
Checklist
自动检查
总结
简单testbench集成
testbench和测试
testbench类
测试类
创建一个简单testbench
在testbench中实例化UVC
testbench配置
UVC配置参数
UVC配置机制
使用配置类
创建测试
创建基本测试
使用基本测试创建测试库
测试选择
创建有价值的测试
数据项约束
序列和Sequencer控制
virutal Sequencer和virutal序列
virutal Sequencer
创建virutal序列
控制其他Sequencer
virutal Sequencer和子Sequencer的连接
检查dut
Scoreboard
实现覆盖模型
选择覆盖方式
实现功能覆盖的模型
总结
激励生成
序列的生成控制
并发执行多个序列
序列body中使用fork/join和uvm_do
并行多个序列
使用p_sequencer
使用pre_body和post_body方法
仲裁控制
中断序列
分层协议
协议的分层
分层和序列
分层风格
使用分层Sequencer
总结
寄存器和内存包
与寄存器关联的术语
寄存器包的预览
寄存器包的使用流程
uvm_rgm的连接和数据流
寄存器数据库(RGM_DB)
随机化和注入
监控
使用uvm_rgm包
定义寄存器和内存模型
创建IP-XACT文件
创建uvm_rgm类
扩展可自动生成的uvm_rgm类
连接testbench的uvm_rgm组件
寄存器组件和testbench的连接
总线主Sequencer中加入必要的框架
testbench的连接和实例化
复位处理
寄存器控制
寄存器操作
寄存器的读写序列
多个寄存器序列的操作
序列重用
使用uvm_rgm进行检查
使用影子模型进行检查
高级寄存器检查
寄存器获取函数
更新寄存器数据库模型
模块UVC的更新
寄存器操作的覆盖收集
uvm_rgm的自动覆盖功能
用户定制覆盖
控制覆盖采样的时间
总结
系统UVC和testbench集成
介绍
模块和系统UVC的架构
模块和系统UVC的重用
模块UVC架构
系统UVC架构
模块和系统UVC的子组件
Monitor
内存块和寄存器文件
激活互换模式
模块UVC类
模块UVC配置
标准配置模式
模块UVC的重新配置
testbench
UART控制器的testbench策略
virtual Sequencer和寄存器Sequencer
接口UVC扩展
序列
开发可重用序列
覆盖
模块UVC的覆盖
系统级覆盖
互换模式
系统验证的扩展
随机化和激励生成
覆盖
消息
模块UVC的目录结构
总结
UVM的未来
商用UVM验证IP
类库的增强
寄存器包
实时阶段
多语言的集成
多个域的UVM
总结
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
分享到:
收藏