当前位置: 首页 > 工具软件 > objection > 使用案例 >

UVM中objection机制学习

丘友樵
2023-12-01

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。

 类似资料: