Function与Task Phase
UVM中Phase机制分为两大类:
1.不耗时function phase
2.耗时task phase
图1中灰色背景是task phase,白色背景是function phase,所有的phase按照图中的顺序自上而下自动执行
图1 UVM中的Phase
对于function phase来说,在同一时间只有一个phase在执行;但是在task phase中,12个小phase并行运行,称为run-time动态运行phase。对于task phase,从全局观点来看是有先后顺序的。phase机制的存在,便于将不同代码写入不同的phase,有利于验证方法之间的迁移。
动态运行Phase
12个小phase中,reset、configure、main、shutdown四个phase是核心,通常用来模拟DUT的正常工作方式,他们的功能分别为:对DUT进行复位/初始化、DUT配置、DUT运行、断电。
Phase的执行顺序
自上而下:时间上phase是自上而下执行;空间上build_phase也是自上而下执行,例如先执行my_case,再执行env。UVM的设计思想就是在build_phase中做实例化的工作(component及其派生类的实例化),driver和monitor的实例化都要在agent的build_phase中执行,要在driver实例化之后再执行agent,如果在其他phase实例化component,那么系统会报错;object的实例化可以在任何phase中完成。
自下而上:除了build_phase之外所有的function phase都是自下而上执行的,例如对于connect_phase:先执行driver和monitor的connect_phase,再执行agent的connect_phase。
以上关系都只适用于UVM树中有直系关系的component。那么对于有兄弟关系同一层次的component如driver和monitor之间,执行顺序是什么?是按照字典序执行,即按照new函数制定的名字执行。因此无论是自上而下(build)还是自下而上(connect),执行顺序都与实例化顺序无关,而是按照指定名字的字典序执行。
task_phase:自下而上(先phase再agent)启动,同时在运行(并不是执行完一个再执行另一个),通过fork...join_none全部启动。
从整个验证平台的角度来讲,只有所有component的run_phase和post_shutdown_phase都完成后才能进入下一个phase。
UVM树的遍历
图论中树的遍历方式有两种:广度优先和深度优先。UVM采用的是深度优先原则,如图2中,i_agt中build_phase先执行,接下来执行driver、monitor、sequencer的build_phase,当全部执行完后再执行scoreboard的build_phase。(同一层侧按照自定义的字典序)
图2