set_drain_time的使用
无论任何功能的模块,都有其处理延时。如图1a所示,0时刻DUT开始接收输入,直到p时刻才有数据输出。
- 在sequence中,n时刻发送完毕最后一个transaction,如果此时立刻drop_objection,那么最后在n+p时刻DUT输出的包将无法接 收到。因此,在sequence中,最后一个包发送完毕后,要延时p时间才能drop_objection:
- 要延时的时间与激励有很大关系。图1a中处理的是短包,所以延时只有p;图1b中处理的是长包,延时的时间大于图1a。在随机发送激励时,延时的大小也是随机的。所以无法精确地控制延时,只能根据激励选择一个最大的延时。
- 这种延时对于所有sequence来说都是必须的,如果在每个sequence中都这样延时,显然是不合理的。如果某一天,DUT对于同 样的激励,其处理延时变大,那就要修改所有的延时大小。
- 考虑到这种情况,UVM为所有的objection设置了drain_time这一属性。所谓drain_time,drain_time的设置方式为:
代码清单:
24 task base_test::main_phase(uvm_phase phase);
25 phase.phase_done.set_drain_time(this, 200);
26 endtask
- phase_done是uvm_phase内定义的一个成员变量:
- 当调用phase.raise_objection或者phase.drop_objection时,其实质是调用phase_done的raise_objection和drop_objection。当UVM在 main_phase检测到所有的objection被撤销后,接下来会检查有没有设置drain_time。如果没有设置,则马上进入到 post_main_phase,否则延迟drain_time后再进入post_main_phase。如果在post_main_phase及其后都没有提起objection,那么最终会 前进到final_phase,结束仿真。