You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UVM测试结束异议机制及phase_ready_to_end实现异常问题咨询

问题解答

疑问1确认

你的理解部分正确,补充纠正:phase_ready_to_end 不是run_phase结束后调用,而是run_phase的所有objection都被释放、即将正式结束前,UVM内核主动调用的所有component的回调方法。你在该回调中针对run_phase提起objection、fork出独立的delay_phase线程的逻辑符合UVM规范,提起的objection会阻止run_phase正式结束,直到你在delay_phase中释放objection。

疑问2确认

提起objection不会重启run_phase:run_phase只要没有正式结束,它内部的所有线程都会保持运行。delay_phase仅做等待队列清空的逻辑即可,不需要额外实现队列弹出逻辑,队列的弹出和比对本身就是run_phase中compare_queues的职责。你遇到的问题核心是run_phase内的比对线程提前卡住,而非phase_ready_to_end逻辑本身的问题。

实现问题修复方案

1. phase_ready_to_end基础规范修复

你当前的phase_ready_to_end实现遗漏了父类方法调用,这是UVM编码的强制要求,会直接导致phase状态机异常,修复方法:在方法第一行添加父类调用,同时将单队列判断改为所有业务队列的非空判断,避免残留数据漏处理:

function void phase_ready_to_end(uvm_phase phase);
  super.phase_ready_to_end(phase); // 强制要求添加
  if (phase.get_name() != "run") return;
  // 将单队列判断改为所有源端、目的端队列的非空判断
  if (src_queue1.size() !=0 || dst_queue1.size() !=0 || src_queue2.size() !=0 || dst_queue2.size() !=0) begin
    phase.raise_objection(.obj(this)); 
    fork 
      begin 
        delay_phase(phase);
      end
    join_none
  end
endfunction

2. run_phase比对线程卡住排查

根据你补充的上下文,监控队列的线程还在正常运行,说明run_phase本身没有结束,根本不会触发phase_ready_to_end回调,优先排查compare_queues逻辑的卡死问题:

  • 检查是否存在队列匹配差场景:如果你的逻辑是检测到目的端队列非空就直接弹出源端、目的端队首元素比对,若出现目的端队列有数据、源端队列为空的情况,要么会弹出空值导致比对异常,要么你添加的等待源端队列非空的逻辑会永久卡死。建议添加队列长度差阈值告警、比对超时判断规避该问题。
  • 检查队列操作线程安全:monitor的write方法是独立线程,和run_phase的比对线程同时操作队列时如果没有加互斥锁(semaphore),会出现队列状态异常,比如size显示非空但实际无元素可弹,导致wait(queue.size() !=0)逻辑永久挂起。

3. 调试建议

添加UVM调试宏定位问题:

  • 编译选项中添加+define+UVM_PHASE_DEBUG + +define+UVM_OBJECTION_TRACE,可以打印所有phase状态变化、objection的提起/释放日志,确认phase_ready_to_end是否被触发、你提起的objection是否生效。
  • 在compare_queues的每一步操作添加调试打印,确认卡住的具体代码行。

内容的提问来源于stack exchange,提问作者abdul rauf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:15:01