提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
UVM有一套属于自己的运行机制,名为phase机制,但是对于phase机制由谁产生,phase机制如何运行,经常让大家迷惑,接下来我将介绍一下phase机制
一、phase机制相比于SV带来了哪些便利?
SV无法保证例化的先后和组件在例化后的连接,也无法在底层组件例化前对其进行配置,而phase机制可以实现UVM在仿真阶段的层次化,不仅各个phase之间有先后执行顺序,同一phase之间的层次化组件之间的phase也有先后顺序
二、
调用机制
run_test是顶层uvm_root的函数,uvm_top是uvm_root的唯一实例。phase是由uvm_top的run_test函数所调用,但是uvm_top是何时实例化的?top的run_test又是何时调用的那?
这实际由uvm_pkg完成,看下面代码。
task run_test(string test_name="");
uvm_root top;
uvm_coreservice_t cs;
cs = uvm_coreservice_t::get();
top = cs.get_root();
top.run_test();
endtask
实际的例化和调用run_test都由全局函数run_test完成,这里的run_test由uvm_pkg提供。
run_test一般放在module的initial进行块中调用,如果没有提供参数,可以通过在仿真时使用UVM_TESTNAME = ~ 来传递参数,这样就可以灵活选择test。
编译顺序和运行顺序
0时刻前:
完成编译和建模
0时刻时:
完成硬件的always和initial语句,调用run_test开始执行phase机制(build_phase、connect_phase、end_of_elaboration_phase、start_of_simulation),这四个phase都是在0时刻完成
开始仿真(0时刻后):
完成run_phase或对应的12个phase
仿真结束:
执行extract_phase、check_phase、report_phase、final_phase
总结
UVM世界从一个run_test创建