uvm启动过程及phase机制实现原理介绍

我们通常会在top写下类似下面的代码

module top();
    import uvm_pkg::*;
 
    ......
    initial begin
         run_test();
    end
    ......
endmoudle

我们写的这个run_test()就是整个UVM验证平台最顶层的入口。这里的run_test()不是任何一个类的成员,而是一个global task,位于uvm_globals.svh中。如下:

Caption

在这个global的run_test task中,通过cs.get_root创建了uvm_root单例,然后调用了uvm_root的的run_test task。在uvm_root的run_test task中,根据plus args UVM_TESTNAME创建了uvm_test_top对象,如下:

Caption

然后,还是在uvm_root的run_test task中,调用了uvm_phase的一个static task m_run_phases, 开始了uvm phases的启动,如下:

Caption

uvm_phase的静态成员m_run_phases的实现如下:

Caption

上面的m_phase_hopper是一个uvm_phase类型的mailbox,在m_run_phases中,先是将common domain的第一个phase(即build_phase) put进mailbox中,然后进入forever,在forever中不断地去get phase,get成功就去执行phase的execute_phase task。

在uvm_phase的execute_phase中,会遍历uvm components tree上的所有component. 这里是通过调用uvm_phase的traverse()函数实现的。如下,在execute_phase中调用traverse:

Caption

遍历完成之后,当然要进入下一个phase,于是在退出execute_phase之前,将下一个phase给put进mailbox中。如下:

Caption

这里还涉及到一些phase跳转的处理,暂时不作具体的研究讨论。

uvm_phase分为function phase和task phase, 而function phase又可以分为uvm_topdown_phase和uvm_bottomup_phase。uvm_bottomup_phase和uvm_task_phase都是从下往上遍历,而uvm_topdown_phase是从上往下遍历。function phase中只有build_phase和final_phase是topdown phase,其它的都是bottomup_phase。uvm_task_phase,uvm_bottomup_phase和uvm_topdown_phase都是继承于uvm_phase的子类,而traverse又是uvm_phase的虚函数,所以这3个子类理所当然地实现了自己的traverse()。

这里我们就挑uvm_topdown_phase的traverse实现出来看看吧,如下:

Caption
Caption

这里通过函数迭代的方式实现了遍历,不断地去get_child并用child去迭代。这个地方调用了execute函数,execute函数的实现如下:

Caption

这里的execute函数又调用了exec_func(),exec_func也是虚函数,各个子类有不同的实现,比如uvm_build_phase的实现:

Caption

终于,uvm_build_phase实现的地方调用了component的build_phase函数。

总结一下整个过程的调用栈:run_test -> uvm_root::run_test -> uvm_phase::m_run_phases -> uvm_phase::execute_phase -> uvm_topdown_phase::traverse -> uvm_topdown_phase::execute -> uvm_build_phase::exec_func -> uvm_component::build_phase

 

  • 10
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值