UVM中objection机制学习

objection机制介绍

在UVM中可以通过drop_objection来通知系统可以关闭验证平台,且在drop_objection之前raise_objection。在进入到某一phase时,UVM会收集此phase提出的所有objection,并且实时监测所有objection是否已经被撤销了,当发现所有都已经撤销后,那么就会关闭phase,开始进入下一个phase。当所有的phase都执行完毕后,就会调用$finish来将整个的验证平台关掉。如果UVM发现此phase没有提起任何objection,那么将会直接跳转到下一个phase中。

objection使用注意点

  1. objection必须在任何延时使用之前raise,如@等语句
  2. 当想要执行一些耗时语句时,要在此phase下任意一个component
    中至少提起一次objection
  3. run_phase 和其中的12个phase是并行的,即只要12个动态运行的phase只要有objection被提起,run_phase不需要raise_objection即可运行

代码实例

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

如上所示,在main_phase中raise_objection,则run_phase会自动运行,在上述代码运行结果中,可以看到 “run_phase is executed” 被输出了9次。

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

当进入到monitor后,系统会监测到已经有objection被提起了,所以会执行monitor中的代码。当过了100个单位时间之后,driver中objection被撤销。此时,UVM监测发现所有的objection都被撤销了(因为只有driver raise_objection),于是UVM会直接“杀死”monitor中的无限循环进程,并跳到下一个phase,即post_main_phase()。假设进入main_phase的时刻为0,那么进入post_main_phase的时刻就为100。
相反,如果driver中没有objection被raise,则会直接跳到post_main_phase进程,,假设进入main_phase的时刻为0,那么进入post_main_phase的时刻还是为0。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

借问众神明.

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

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

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

打赏作者

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

抵扣说明:

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

余额充值