UVM糖果爱好者教程 - 22. Phasing

当我们在Agent中创建jelly_bean_driver时,我们编写了build_phase函数和run_phase任务,但是实际调用它们的人是谁?答案是uvm_phase类。

UVM Phases

UVM有九个常见的phase类别(以黄色显示)和十二个运行时间phase类别(以粉色显示)。这些phase类是从uvm_topdown_phase,uvm_bottomup_phase或uvm_task_phase类派生的,而uvm_task_phase类又是从uvm_phase类派生的。 uvm_phase类有一个名为exec_func的虚函数和一个名为exec_task的虚任务。从uvm_topdown_phase和uvm_bottomup_phase派生的phase类实现了exec_func,而从uvm_task_phase派生的phase类实现了exec_task。如图所示,每个phase类都会调用uvm_component的相应函数或任务。例如,uvm_build_phase类的exec_func调用uvm_component的build_phase函数,并且uvm_run_phase类的exec_task调用uvm_component的run_phase任务等。


                                                                                 UVM Phase 类

Simplified Flow

UVM phase实施的方式相当复杂,但这里是一个简化的流程。


                                                                简单流程

  1. 我们调用run_test(如果您不记得,请参阅Tasting中顶层模块的第17行),然后调用uvm_root类的run_test任务。
  2. uvm_root调用uvm_phase类的m_run_phases任务。
  3. 对于每个phase,调用execute_phase任务。
  4. 如果phase是自顶向下或自下而上phase,则为每个组件调用exec_func。
  5. 例如,exec_func调用每个组件的build_phase函数。
  6. 如果phase是任务phase,则为每个组件调用exec_task。
  7. 例如,exec_task调用每个组件的main_phase任务。
  8. uvm_phase检查组件是否提出objection。 phase_done是uvm_phase跟踪的objection数量的uvm_objection对象。当我们从jelly_bean_test类的run_phase内部调用phase.raise_objection()(参见Tasting中jelly_bean_test类的第27行)时,在uvm_phase中调用了phase_done.raise_objection()。
  9. 如果没有提出objection,那么由exec_task启动的所有进程都将被终止。换句话说,除非有人提出objection,否则这个phase立即被杀死!
  10. 重复步骤3到9,直到所有phase都被执行。
我希望这篇文章能够帮助你理解UVM phase。

猜你喜欢

转载自blog.csdn.net/zhajio/article/details/80763884