objection的raise和drop主要用于引入结束仿真的问题。通常用于需要消耗时间的task中。
当所有组件的run_phase的objection全部drop下后,run_phase才会结束。
因为只要有一个phase中的objection没有drop,则这个phase不会终止执行。所以整个环境的运行可以只在一个phase中进行objection的raise和drop。那么在哪里控制会更好?
起初在driver中进行,但是通常driver都是一个无限循环的代码。这样的话,drop就永远不会执行发送。
task driver::main_phase(uvm_phase phase);
phase.raise_objection(this);
while(1) begin
seq_item_port.get_next_item(req);
…//drive the interface according to the information in req
end
phase.drop_objection(this);
endtask
所以,一般验证平台中,通常会在以下两种objection的控制策略
1、scb中,但感觉并不常用
2、seq中:在sequence中提起sequencer的objection,这边seq没有phase,所以提起的是seqr的。(怎么实现)当sequence产生并被dut接收然后进行比较后,drop_objection。因此需要在seq传输过后等待一段时间。这段时间被称作drain_time。通常在对应的phase进行设置。一个phase对应一个drain time,并不是所有的phase都共享一个drain_phase。在没有设置的情况下,drain time的默认值为0。