2690
uvm启动过程及pha机制实现原理介绍
功夫熊猫3百度网盘
我们通常会在top写下类似下⾯的代码
module top();
import uvm_pkg::*;
......
initial begin
run_test();
end
......
endmoudle
我们写的这个run_test()就是整个UVM验证平台最顶层的⼊⼝。这⾥的run_test()不是任何⼀个类的成员,⽽是⼀个global task,位于uvm_globals.svh中。如下:
joininCaption
在这个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_pha的⼀个static task m_run_phas, 开始了uvm phas的启动,如下:
Caption
uvm_pha的静态成员m_run_phas的实现如下:
Caption
上⾯的m_pha_hopper是⼀个uvm_pha类型的mailbox,在m_run_phas中,先是将common domain的第⼀个pha(即
build_pha) put进mailbox中,然后进⼊forever,在forever中不断地去get pha,get成功就去执⾏pha的execute_pha task。
在uvm_pha的execute_pha中,会遍历uvm components tree上的所有component. 这⾥是通过调⽤uvm_pha的traver()函数实现的。如下,在execute_pha中调⽤traver:
Caption
遍历完成之后,当然要进⼊下⼀个pha,于是在退出execute_pha之前,将下⼀个pha给put进mailbox中。如下:
绯闻女孩第六季大结局
Caption
这⾥还涉及到⼀些pha跳转的处理,暂时不作具体的研究讨论。
loud>graduated上海留学中介uvm_pha分为function pha和task pha, ⽽function pha⼜可以分为uvm_topdown_pha和uvm_bottomup_pha。uvm_bottomup_pha和uvm_task_pha都是从下往上遍历,⽽uvm_topdown_pha是从上往下遍历。function pha中只有build_pha和final_pha是topdown pha,其它的都是bottomup_pha。uvm_task_pha,uvm_bottomup_pha和
uvm_topdown_pha都是继承于uvm_pha的⼦类,⽽traver⼜是uvm_pha的虚函数,所以这3个⼦类理所当然地实现了⾃⼰的traver()。
这⾥我们就挑uvm_topdown_pha的traver实现出来看看吧,如下:
Caption
Caption
这⾥通过函数迭代的⽅式实现了遍历,不断地去get_child并⽤child去迭代。这个地⽅调⽤了execute
函数,execute函数的实现如下:
江西教育网中考成绩查询Caption
这⾥的execute函数⼜调⽤了exec_func(),exec_func也是虚函数,各个⼦类有不同的实现,⽐如uvm_build_pha的实现:
Caption
终于,uvm_build_pha实现的地⽅调⽤了component的build_pha函数。
总结⼀下整个过程的调⽤栈:run_test -> uvm_root::run_test -> uvm_pha::m_run_phas -> uvm_pha::execute_pha -> uvm_topdown_pha::traver -> uvm_topdown_pha::execute -> uvm_build_pha::exec_func ->bottomup
uvm_component::build_pha