UVM phase 机制

没有 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_phasetask(消耗仿真时间) ,其余 8 个都是 function(不消耗仿真时间)

重要补充:除了这 9 个 phase,UVM 还有 12 个 run-time phase(如 reset_phaseconfigure_phasemain_phaseshutdown_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_phaseDUT 复位操作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——连接端口,绑定 TLM
  • run_phase 只 drive——启动激励,控制仿真结束

phase 是 UVM 调度的核心,理解它就理解了 UVM 的一半。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值