如何正确结束UVM测试
1. UVM测试结束机制概述
传统定向测试平台通过调用$finish
系统任务结束测试,而UVM采用基于异议机制(Objection Mechanism)的协同式结束策略。主要方法包括:
- 异议机制(Raise/Drop Objection)
- phase_ready_to_end方法
- set_drain_time设置
graph TDA[测试结束机制] --> 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"}}%%
sequenceDiagramparticipant Testparticipant Envparticipant ScoreboardTest ->> Env: reset_phaseEnv -->> Test: drop objectionTest ->> Env: main_phaseactivate Env #FFBBBB #lightred颜色可自定义(可选)Env ->> Scoreboard: 数据比对 Scoreboard -->> Test: drop objectionTest ->> Env: shutdown_phaseEnv -->> 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)) beginif (!check_state) beginphase.raise_objection(this, "Test Not Ready");fork wait_for_ok_to_finish();phase.drop_objection(this, "Test Ready");join_noneendendendfunctiontask 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 LRA[测试无法正常结束] --> 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调试信息