1. 9大phase
1.1 整体介绍
uvm中的phase共有9种,按照是否消耗仿真时间可以分为function phase和task phase。其中只有run_phase是耗时的,给DUT施加激励和检测输出也是在这个phase里完成的。
UVM整体框架的运行都是从tb中的一句run_test("my_test")开始 ,那么在这句程序背后发生了什么呢?
首先uvm的树根uvm_root类对象uvm_top创建了uvm_test_top,这一过程体现在仿真中就是在0时刻创建。接着引入的phase机制清晰地实现UVM树的层次例化,同时将仿真过程层次化。具体而言,uvm_top从时间和空间两个维度规定了执行顺序。时间上,仿真时不同phase按照某种时间顺序执行。空间上,仿真时同—phase不同组件按照某种层次顺序执行。
而这一切都是由UVM自动完成的,整体流程就是先例化uvm_top,之后例化uvm_test_top,之后全部component按照一定顺序实现build_phase之后,全部component再按照定顺序实现connect_phase()等等,直到最终的$finish()。
以一个case举例,包含的phase的执行顺序代码可能如下:
class my_case0 extends base_test;
string tID = get_type_name();
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_info(tID, "build_phase is executed", UVM_LOW)
endfunction
virtual function void start_of_simulation_phase(uvm_phase phase);
super.start_of_simulation_phase(phase);
uvm_info(tID, "start_of_simulation_phase is executed", UVM_LOW)
endfunction
virtual task run_phase(uvm_phase phase);
`uvm_info(tID, "run_phase is e