1.UVM通过objection来控制验证平台的关闭。

2.在每个phase中,UVM会检查是否raise_objection,如果有,那等待drop_objection后停止仿真;如果没有,马上结束当前phase,上篇就是这样。


3.加入objection的driver如下:

`ifndef MY_DRIVER__SV
`define MY_DRIVER__SV
class my_driver extends uvm_driver;

   `uvm_component_utils(my_driver)
   function new(string name = "my_driver", uvm_component parent = null);
      super.new(name, parent);
      `uvm_info("my_driver", "new is called", UVM_LOW);
   endfunction
   extern virtual task main_phase(uvm_phase phase);
endclass

task my_driver::main_phase(uvm_phase phase);
   phase.raise_objection(this);//<=================
   `uvm_info("my_driver", "main_phase is called", UVM_LOW);
   top_tb.rxd <= 8'b0; 
   top_tb.rx_dv <= 1'b0;
   while(!top_tb.rst_n)
      @(posedge top_tb.clk);
   for(int i = 0; i < 256; i++)begin
      @(posedge top_tb.clk);
      top_tb.rxd <= $urandom_range(0, 255);
      top_tb.rx_dv <= 1'b1;
      `uvm_info("my_driver", "data is drived", UVM_LOW);
   end
   @(posedge top_tb.clk);
   top_tb.rx_dv <= 1'b0;
   phase.drop_objection(this);//<=================
endtask
`endif


1)raise_objection和drop_objection总是成对出现。(所以UVM 1.2合二为一了吗?)



现在打印信息和时间,都是ok的。

UVM:2.2只有driver的验证平台->2.2.3 加入objection机制_sed

4.raise_objection必须放在第一个消耗仿真时间的语句之前。比如吧$uvm_info放到它前面:

UVM:2.2只有driver的验证平台->2.2.3 加入objection机制_i++_02

输出信息也ok。


5类似@(posedge top.clk)等消耗仿真时间的,如果放在raise_objection前面,则不行:

UVM:2.2只有driver的验证平台->2.2.3 加入objection机制_sed_03

输出:

UVM:2.2只有driver的验证平台->2.2.3 加入objection机制_sed_04

0ps 结束,引文进入到这个phase,超过0时刻,发现没有objection举起,马上退出。在run_test里传的还是my_driver,也就不跑别的了。