UVM测试结束机制指南
如何正确结束UVM测试
1. UVM测试结束机制概述
传统定向测试平台通过调用$finish系统任务结束测试,而UVM采用基于异议机制(Objection Mechanism)的协同式结束策略。主要方法包括:
- 异议机制(Raise/Drop Objection)
- phase_ready_to_end方法
- set_drain_time设置
graph TD
A[测试结束机制] --> B[异议机制]
A --> C[phase_ready_to_end]
A --> D[set_drain_time]
2. 异议机制详解
2.1 核心原理
- 使用
uvm_objection类实现组件间计数器共享 raise_objection()增加计数器drop_objection()减少计数器- 计数器归零触发"all dropped"状态
2.2 典型应用示例
class my_test extends uvm_test;
`uvm_component_utils(my_test)
task main_phase(uvm_phase phase);
phase.raise_objection(this);
read_after_write_seq.start(Env.Agnt.Sqnr);
phase.drop_objection(this);
endtask
endclass
3. 阶段执行流程
3.1 UVM阶段分组
| 阶段组 | 包含阶段 | 时间消耗 |
|---|---|---|
| 构建阶段 | build_phase, connect_phase等 | 零时间 |
| 运行阶段 | 12个子阶段(reset/main/shutdown等) | 实时 |
| 清理阶段 | extract_phase, check_phase等 | 零时间 |
3.2 运行阶段执行时序
%%{init: {"theme": "neutral"}}%%
sequenceDiagram
participant Test
participant Env
participant Scoreboard
Test ->> Env: reset_phase
Env -->> Test: drop objection
Test ->> Env: main_phase
activate Env #FFBBBB #lightred颜色可自定义(可选)
Env ->> Scoreboard: 数据比对
Scoreboard -->> Test: drop objection
Test ->> Env: shutdown_phase
Env -->> Test: drop objection
4. phase_ready_to_end方法
4.1 应用场景
- 延迟阶段结束(如Scoreboard最终校验)
- 处理耗时后处理任务
4.2 实现示例
class scoreboard extends uvm_scoreboard;
bit check_state = 0;
function void phase_ready_to_end(uvm_phase phase);
if(phase.is(uvm_run_phase::get)) begin
if (!check_state) begin
phase.raise_objection(this, "Test Not Ready");
fork
wait_for_ok_to_finish();
phase.drop_objection(this, "Test Ready");
join_none
end
end
endfunction
task wait_for_ok_to_finish();
#50; // 实际场景替换为校验逻辑
check_state = 1;
endtask
endclass
5. set_drain_time方法
5.1 排水时间设置
class my_test extends uvm_test;
task run_phase(uvm_phase phase);
phase.raise_objection(this);
my_seq.start(m_sequencer);
phase.phase_done.set_drain_time(this, 20ns);
phase.drop_objection(this);
endtask
endclass
5.2 设置策略
| 场景类型 | 推荐排水时间 | 注意事项 |
|---|---|---|
| 常规数据包处理 | 1-5个时钟周期 | 覆盖最后数据包传输延迟 |
| 复杂协议校验 | 10-20个时钟周期 | 考虑最坏情况下的校验时间 |
| 多组件协同处理 | 双重校验机制 | 结合phase_ready_to_end使用 |
6. 最佳实践
- 异议操作应集中在Test层
- 为Scoreboard等校验组件保留phase_ready_to_end
- 排水时间设置应考虑最坏情况
- 使用
uvm_info添加调试信息:
`uvm_info("PHASE_END", $sformatf("Drain time set to %0tns", drain_time), UVM_MEDIUM)
7. 常见问题处理
graph LR
A[测试无法正常结束] --> B{检查点}
B --> C[异议未正确drop]
B --> D[phase_ready_to_end死锁]
B --> E[排水时间不足]
C --> F[添加调试打印]
D --> G[检查fork/join_none]
E --> H[增加排水时间]
关键总结:
- 异议机制是UVM测试结束的基础
- phase_ready_to_end处理延迟结束场景
- 合理设置排水时间确保环境稳定
- 调试阶段应启用UVM调试信息

浙公网安备 33010602011771号