没有 phase 会怎样?
想象一下:driver 和 monitor 同时启动,谁先谁后?如果 driver 还没建好,monitor 就去连它的端口,仿真直接崩溃。UVM 的 phase 机制就是给整个验证平台画了一条严格的时间线——什么时候建房子、什么时候拉电线、什么时候通电运行,全都安排得明明白白。
核心概念:9 大 phase + 12 个 runtime phase
UVM 定义了 9 个主要 phase,按固定顺序串行执行:
build → connect → end_of_elaboration → start_of_simulation
→ run → extract → check → report → final
其中只有 run_phase 是 task(消耗仿真时间) ,其余 8 个都是 function(不消耗仿真时间) 。
重要补充:除了这 9 个 phase,UVM 还有 12 个 run-time phase(如
reset_phase、configure_phase、main_phase、shutdown_phase等),它们与run_phase并行执行,用于实现更精细的阶段控制。
层次化执行顺序也很有讲究:
build_phase:自顶向下(top-down)——父组件先执行,再创建子组件connect_phase:自底向上(bottom-up)——子组件先完成内部连接,父组件再做跨层连接run_phase和 12 个 run-time phase:并行启动,各自独立运行
关键代码
class my_env extends uvm_env;
`uvm_component_utils(my_env)
my_agent agent;
my_scoreboard sb;
// build_phase:自顶向下,创建子组件
function void build_phase(uvm_phase phase);
super.build_phase(phase); // 千万不能漏!
agent = my_agent::type_id::create("agent", this);
sb = my_scoreboard::type_id::create("sb", this);
endfunction
// connect_phase:自底向上,连接端口
function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
agent.monitor.analysis_port.connect(sb.analysis_export);
endfunction
// run_phase:跑激励,必须 raise/drop objection
task run_phase(uvm_phase phase);
phase.raise_objection(this);
// 这里放测试激励
#1us;
phase.drop_objection(this);
endtask
endclass
实战场景
| Phase | 做什么 | 关键规则 |
|---|---|---|
build_phase | 创建组件、配置参数 | 自顶向下,只做 new/create |
connect_phase | 连接 TLM 端口、analysis port | 自底向上,只做 .connect() |
run_phase | 启动 sequence、驱动激励 | 必须 raise/drop objection |
reset_phase | DUT 复位操作 | 与 run_phase 并行,独立 objection |
易踩的 5 个坑
① 在 build_phase 里做 connect ❌
build_phase 执行时子组件还没创建完,连了也白连。connect 的事请留在 connect_phase。
② run_phase 漏了 raise_objection ❌
没有 objection 提起,UVM 会认为无事可做,仿真直接结束。同理,raise 了别忘了 drop,否则仿真永远不结束。
③ 自定义 phase 用错方向 ❌
自定义 phase 要选对基类——uvm_topdown_phase(自顶向下)还是 uvm_bottomup_phase(自底向上)。
④ 多个 run-time phase 抢 objection ❌
run_phase 和 12 个小 phase 是并行的,每个 task phase 都需要独立管理自己的 objection。
⑤ 漏调 super.build_phase(phase) ❌
基类的 build_phase 里做了配置传递等关键工作,不调用会导致子组件收不到配置。
总结
分工明确,各司其职:
build_phase只 create——创建对象,配置参数connect_phase只 wire——连接端口,绑定 TLMrun_phase只 drive——启动激励,控制仿真结束
phase 是 UVM 调度的核心,理解它就理解了 UVM 的一半。

1万+

被折叠的 条评论
为什么被折叠?



