由于想要实现事件发生的不同顺序,UVM提供了不同的phase,每个phase运行时间不一样。
常见phase及运行顺序:
不消耗仿真时间根据继承关系自顶向下
build_phase我们一般这里完成需要的对象实例化和资源的初始化
不消耗仿真时间根据继承关系自下而上
connect_phase完成端口的连接工作
消耗仿真时间根据继承关系自下而上
run_phase和12个小phase并行运行(如reset_phase、configure_phase、main_phase、shutdown_phase),一般复杂消耗时间的逻辑在这里运行。
objection
可以使用两种方法结束仿真,一种是调用$finish(),一种是通过UVM objection机制关闭。
objeciton机制需要我们在run_time的phase中raise一下objection,phase运行时会收集objection,如果objection被drop完或者没有raise objection会直接进入下一个phase中。
task main_phase(uvm_phase phase);
......
phase.raise_objection(this);
#100;
phase.drop_objection(this);
endtask
通常一般在sequence中使用来控制平台的关闭,通过设置为phase的default_sequence,设置时会自动将phase指针传入sequence,从而可以使用uvm_component方法。