
目录 ii
创建 Collector 和 Monitor . . . . . . . . . . . . . . 54
5.5.1 连接 Collector 和 Monitor . . . . . 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