1)基础用法:
常用的是四种phase
build_phase中定义初始化相关的代码。
Connect_phase中定义componet的连接代码。
Run_phase中定义主程序。
Report_phase中定义打印相关的代码。
2)项目升级用法:与上一致。
3)底层原理分析
Phase按照是否消耗仿真时间一共分为2种,一种是function phase,如:build phase,connet phase等,另一种是task phase,如run_phase等。如图所示:
Run_phase和其他12个小phase并行运行。Uvm中Task都是自上而下运行,function都是自下而上运行的。然而这只适用于uvm树中有直系关系的component,对于同一层次的component,则是按照字典顺序,字典顺序则根据new时定义的名字。
uvm中采用的是深度优先原则。
代码中同样出现了super.phase等语句,如:在build_phase中,如果没有调用config中get函数,这可以不写该代码。其他雷同,假如没有用到父类定义的东西,则可不加。
Run_phase与main_phase在日常其实可以等效使用,只是要注意它们运行机制差别,还有是run_phase不需要强制写raise_objection,main_phase等小task则强制需要,否则会无法运行。小phase有一个写了raise_ objection,则run_phase不需要再写。
Phase流程:
add_uvm_phases和uvm_domain中定义了许多数组,用来存放定义的phase。
在m_run_phase()中调用了execute_phase执行之前定义的数组。
Raise_phase的实现是内部掉用了raise以及回调。
此外还有phase的跳转,遇到uvm_error退出等等,目前项目中未使用到,故不在论述。