raise_objection和drop_objection的学习

UVM中通过objection 机制来控制phase的执行,通过raise or drop objection来决定phase中事件的开始和停止。在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经撤销后,那么就会关闭此phase,开始进入下一个phase。当所有的phase都执行完毕后,就会调用$finish来将整个的验证平
台关掉。
在这里插入图片描述
注意点:

  1. Objection机制应该用在耗时语句之前
  2. 若phase中没有任何objection被提起,则会直接跳转到下一个phase中。
  3. run_phase与动态运行的12个phase是并行的,即如果动态运行的pahse中有Objection被提起,run_phase会自动执行,而不会等待其drop_objection以后再执行。
task driver::main_phase(uvm_phase phase);
phase.raise_objection(this);
#100;
phase.drop_objection(this);
endtask
task monitor::main_phase(uvm_phase phase);
while(1) begin
…
end
endtask

如上所示,当进入main_phase以后,发现有objection被提起,那么monitor中的代码会被执行,而当100个时间单位以后,objection被撤销,那么uvm则会立即跳入到下一个phase中,即post_main_phase,当然,monitor中的进程也被”杀死“
如果,去掉driver的main_phase中的objection, 那么程序执行到main_phase时会立刻跳到post_main_phase。

同样,通过如下代码可以证明,run_phase与动态运行的12个phase是并行的,只要动态phase中有Objection被提起,run_phase就会被执行

task my_case0::main_phase(uvm_phase phase);
 phase.raise_objection(this);
 #100;
 phase.drop_objection(this);
 endtask

task my_case0::run_phase(uvm_phase phase);

 for(int i = 0; i < 9; i++) begin
 #10;
 `uvm_info("case0", "run_phase is executed", UVM_LOW)
 end
endtask

上述代码运行结果可以看到“run_phase is executed”被输出了9次

一般来说,基于UVM的设计哲学,激励的生成应该全部由sequence来控制,因此一般情况下在sequence中控制objection。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

借问众神明.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值