2. UVM框架基础回顾:UVM核心概念、树形结构与phase机制
在进入硬件加速部署之前,必须牢固掌握UVM框架的核心概念。UVM(Universal Verification Methodology)基于SystemVerilog构建,其核心组件与机制构成了验证环境的基本骨架。本章将系统回顾UVM的四大核心组件(sequence、driver、monitor、scoreboard)、UVM树形结构以及phase机制,为后续的硬件加速部署打下坚实基础。
2.1 UVM核心组件
UVM验证环境由多个标准化的组件构成,每个组件承担特定的职责。下表列出了最核心的四个组件及其功能:
| 组件 | 基类 | 核心职责 | 典型操作 |
|---|---|---|---|
| sequence | uvm_sequence | 生成并组织事务级激励 | body() 任务中创建并发送 transaction |
| driver | uvm_driver | 将事务级激励转换为接口级信号 | 从 seq_item_port 获取 item,驱动到 DUT 接口 |
| monitor | uvm_monitor | 被动采集接口信号并打包为事务 | 监测接口信号变化,组装 transaction 并发送至 analysis_port |
| scoreboard | uvm_scoreboard | 比对预期结果与实际结果 | 通过 analysis_export 接收 monitor 数据,执行比对 |
2.1.1 Sequence 与 Driver 的交互机制
sequence 与 driver 之间通过 sequencer 进行通信。sequence 在 body() 中创建 transaction 对象,并通过 start_item() 和 finish_item() 发送给 sequencer;driver 则通过 seq_item_port.get_next_item() 获取 item,驱动完成后调用 item_done() 通知 sequencer。这种握手机制保证了激励的有序传递。
// sequence 端示例
class my_sequence extends uvm_sequence #(my_transaction);
`uvm_object_utils(my_sequence)
task body();
my_transaction tr;
repeat(10) begin
tr = my_transaction::type_id::create("tr");
start_item(tr);
// 随机化事务
assert(tr.randomize());
finish_item(tr);
end
endtask
endclass
// driver 端示例
class my_driver extends uvm_driver #(my_transaction);
`uvm_component_utils(my_driver)
task run_phase(uvm_phase phase);
forever begin
seq_item_port.get_next_item(req);
// 将事务驱动到接口
drive_transaction(req);
seq_item_port.item_done();
end
endtask
endclass
2.1.2 Monitor 与 Scoreboard 的数据通路
monitor 通过 analysis_port 将采集到的 transaction 广播出去;scoreboard 则通过 analysis_export 接收这些 transaction。这种基于 TLM(Transaction-Level Modeling)的通信方式实现了组件间的松耦合。
// monitor 端示例
class my_monitor extends uvm_monitor;
`uvm_component_utils(my_monitor)
uvm_analysis_port #(my_transaction) ap;
function new(string name, uvm_component parent);
super.new(name, parent);
ap = new("ap", this);
endfunction
task run_phase(uvm_phase phase);
my_transaction tr;
forever begin
tr = my_transaction::type_id::create("tr");
// 采集接口信号并填充 tr
collect_transaction(tr);
ap.write(tr); // 发送至 scoreboard
end
endtask
endclass
// scoreboard 端示例
class my_scoreboard extends uvm_scoreboard;
`uvm_component_utils(my_scoreboard)
uvm_analysis_imp #(my_transaction, my_scoreboard) analysis_imp;
function new(string name, uvm_component parent);
super.new(name, parent);
analysis_imp = new("analysis_imp", this);
endfunction
function void write(my_transaction tr);
// 执行比对逻辑
compare_transaction(tr);
endfunction
endclass
2.2 UVM树形结构
UVM采用树形层次结构来组织验证环境中的所有组件。每个组件都有一个唯一的父节点(root节点为uvm_top),通过 create() 方法创建时指定父节点指针。这种树形结构带来了以下优势:
- 自动资源管理: 父节点负责子节点的创建、配置和销毁
- 层次化配置: 配置可以沿树形结构向下传递
- 统一phase调度: phase机制沿树形结构自上而下或自下而上执行
- 工厂覆盖: 树形结构支持按层次进行类型覆盖
下图展示了典型的UVM验证环境树形结构:
2.3 UVM Phase机制
UVM phase机制为验证环境的启动、运行和关闭提供了统一的时序控制。所有组件按照预定义的phase顺序执行,确保环境初始化和数据流建立的正确性。Phase分为两大类:
| Phase类别 | 执行顺序 | 典型用途 | 是否消耗仿真时间 |
|---|---|---|---|
| build_phase | 自上而下 | 创建子组件、配置对象 | 否(function) |
| connect_phase | 自下而上 | 连接TLM端口、建立通信通路 | 否(function) |
| end_of_elaboration_phase | 自上而下 | 打印环境拓扑、最终配置检查 | 否(function) |
| start_of_simulation_phase | 自上而下 | 初始化仿真状态、打印横幅 | 否(function) |
| run_phase | 并行执行 | 驱动激励、采集数据、执行比对 | 是(task) |
| extract_phase | 自下而上 | 从组件中提取最终数据 | 否(function) |
| check_phase | 自下而上 | 检查断言、报告错误计数 | 否(function) |
| report_phase | 自上而下 | 生成最终测试报告 | 否(function) |
| final_phase | 自上而下 | 清理资源、关闭文件 | 否(function) |
下图展示了UVM phase的执行流程:
2.4 核心概念在硬件加速中的映射
在硬件加速部署场景下,UVM核心概念需要重新审视其实现方式:
- Sequence → 硬件序列生成器: sequence 的随机化和事务生成逻辑需要被综合到硬件中,或通过预生成的事务列表驱动
- Driver → 硬件驱动逻辑: driver 的时序驱动逻辑直接映射为硬件状态机,与DUT接口紧密耦合
- Monitor → 硬件采集逻辑: monitor 的信号采集逻辑需要与DUT时钟域同步,避免亚稳态
- Scoreboard → 硬件比对器: scoreboard 的比对逻辑可以部分硬件化,但复杂比对仍需软件辅助
- 树形结构 → 硬件层次映射: 树形结构指导硬件加速器的模块划分和接口定义
- Phase机制 → 软硬件协同调度: function phase 在软件侧执行,run_phase 在硬件侧执行