objection机制与phase之间的同步关系密切!!
一:objection机制概述
1: 在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被drop掉,当发现所有都已经drop掉时,就会关闭次phase,开始进入下一个phase。
2:如果此phase并没有被raise_objection,那么就直接进入下一个phase。
3:如果想执行一些耗时代码,那么一定要在某一component的此phase中进行raise和drop objection。(需要注意的是,这里谈及的phase的raise和drop只针对于run_phase包含的12个动态phase中)
4:植物大战僵尸
二:控制objection的最佳选择
在uvm树中,树的结点如此之多,那么在什么地方控制objection最合理?由于driver,monitor等都是永动机可能phase.drop_objection永远不会被执行到。因此我们可以使用两种方法:
1:在scb中添加参数,对比足够多数量后跳出循环,执行drop_objection.
2:直接在seq中进行phase的raise和drop。
三:set_drain_time的使用
无论任何功能的模块,处理数据时都有其延时,当trans输入到DUT与输出时肯定有一个p的延时时间,如果在最后一笔trans传输结束时立马drop,此时可能DUT还没有输出,因此在最后一个trans发送完毕后要延时p时间才能drop_objection。这种延时对于每一个seq来说是必须的,但是在每个seq中都这样延时并不合理,此时我们需要drain_time这一属性。
task base_test::main_phase(uvm_phase phase);
phase.phase_done.set_drain_time(this,200);
endtask
uvm_objection phase_done;
drain_time是当每个phase结束之后的延时时间。当UVM在main_phase检测到所有的onjection被drop后,接下来并不会直接进行到下一个phase,而是会检测有没有drain_time,如果有就延时200ns后在到下一个phase。
drain_time是objection机制的一个特性,而且是每个动态phase都会对应一个drain_time。在没有设置的情况下,drain_time默认为0.