Phase的种类
funcion phase
- 不消耗仿真时间
-
八种(图中白色背景)
task phase
- 消耗仿真时间
-
一种(图中灰色背景),run_phase又可以细分为十二种
Phase的功能
- bulid_phase:uvm_component类的实例化,uvm_object实例化可以在任何phase完成;config_db的获取
- connect_phase:连接
- reset_phase:对DUT进行复位、初始化等操作
- configure_phase:进行DUT的配置
- main_phase:DUT的运行
- shutdown_phase:做一些与DUT断电相关的操作
Phase的执行顺序
不同phase执行顺序
- 自上而下,如上图所示
- run_phase和其12个小的phase并行运行。后者称为动态运行(runtime)的phase
fork begin run_phase(); end begin pre_reset_phase(); reset_phase(); post_reset_phase(); pre_configure_phase(); configure_phase(); post_configure_phase(); pre_main_phase(); main_phase(); post_main_phase(); pre_shutdown_phase(); shutdown_phase(); post_shutdown_phase(); end join
相同phase执行顺序
- 上表所示的执行顺序指空间概念,即UVM树从根到叶为自上而下
- build_phase和final_phase,自上而下
- 其他function_phase,自下而上
- task_phase,自下而上的启动,同时以fork_join none的形式在同时运行
- 对于task_phase中的12个小phase,虽然是顺序执行,但每个小phase会在前一个小phase全部执行完后再去执行
同一层次、具有兄弟关系的component
- 按照字典序执行,即实例化顺序依据new时指定的名字
- example: agent下的driver与monitor,若monitor在new时指定名字“aaa”,driver指定名字“bbb”,则先执行monitor的build_phase,再执行driver的build_phase
叔侄关系component
- 执行顺序为深度优先,即先执行的A下的全部分支执行完成后,再会去执行A的兄弟及其分支
- example:env下的agent与scoreboard属于同一层次,若agent在new时指定名字“aaa”,scoreboard指定名字“bbb”,则先执行agent的build_phase,然后执行agent下driver及monitor的build_phase,最后再执行scoreboard的build_phase
domain与phase执行顺序关系
- 同一个domain内的多个component的phase是同步的,起一个phase执行完才能进入下一个phase
- 位于不同domain内的component的phase是异步的,不用等到不同domain内的componenet的前一个phase执行完就能进入下一个phase
UVM_ERROR停止仿真
- 在end_of_elaboration_phase 及其之前的phase出现一个或多个UVM_ERROR,就会调用uvm_fatal结束仿真
- 优点是,将所有类似的问题一次性暴露出来,一次性修复
Phase的跳转
- 跳转函数:
phase.jump(xxx_phase::get());
- 可以作为jump参数的phase:uvm_pre_reset_phase::get()后的所有phase
- 向前跳转:该phase之前的动态运行的phase
- 向后跳转:可以到final phase
Phase的调试
- 命令行参数:
<sim command> +UVM_PHASE_TRACE
超时退出
- 代码中设置:
uvm_top.set_timeout(500ns, 0); //第一个参数是要设置的时间,第二个参数表示此设置是否可以被其后的其他set_timeout语句覆盖
- 命令行中设置:
<sim command> +UVM_TIMEOUT=<timeout>,<overridable> //其中timeout为设置时间,overridable表示是否能被覆盖,其值为YES/NO
- 默认超时退出时间:
`define UVM_DEFAULT_TIMEOUT 9200s