文章目录
概要
UVM Objection 机制是实现验证平台同步的核心机制,它通过raise_objection和drop_objection操作控制测试的生命周期,确保所有组件完成必要的操作后才结束测试。以下从原理、实现到应用场景进行深度解析。
一、基本原理
1. 核心概念
-
Objection:测试阶段的 “通行证”,用于声明某个组件需要继续运行
-
Phase:UVM 将验证流程划分为多个阶段(如 build、run、report)
-
Objection 计数器:每个 phase 维护一个计数器,当计数为 0 时 phase 结束
2. 关键规则
- Raise:组件调用phase.raise_objection(this)声明需要继续运行
- Drop:组件完成任务后调用phase.drop_objection(this)释放通行证
- 超时机制:可设置超时时间防止测试卡死
- 层次控制:子组件的 objection 自动归属于当前 phase
二、UVM 仿真流程的基本原理
- UVM 仿真由多个阶段组成(如 build_phase, run_phase 等)。 run_phase
是一个时间消耗阶段,主要用于驱动事务和执行测试逻辑。 仿真默认会在所有组件的 run_phase 执行结束后,自动进入下一个阶段。
如果需要延长 run_phase(如等待事务完成或某些测试行为完成),可以通过 objection 机制 来实现。
1、raise_objection
用于通知 UVM 仿真框架:当前组件或测试类需要延长仿真时间。
每次调用 raise_objection,都会增加 UVM 仿真的活动计数。
2、drop_objection
用于通知 UVM 仿真框架:当前组件或测试类的任务已完成。
每次调用 drop_objection,都会减少 UVM 仿真的活动计数。
当活动计数减少到 0 时,UVM 仿真会结束当前阶段,进入下一个阶段。
三、核心 API
// 在某个phase中声明需要更多时间
virtual task my_task(uvm_phase phase);
phase.raise_objection(this, "Reason for raising"); // 提升objection
// 执行任务...
phase.drop_objection(this, "Reason for dropping"); // 降低objection
endtask
// 设置超时(防止测试卡死)
phase.phase_done.set_timeout(timeout_value); // 单位为时间单位
// 检查objection状态
phase.phase_done.get_objection_count(