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

白皮书《UVM实战》学习——2.2.3 加入objection机制

常乐
2023-12-01

目录如下:

第2章 一个简单的UVM验证平台

2.1 验证平台的组成

2.2 只有driver的验证平台

2.2.1 最简单的验证平台

2.2.2 加入factory机制

2.2.3 加入objection机制

2.2.4 加入virtual interface

未完待续

正文在下面

2.2.3 加入objection机制

一、my_driver.sv

上一节在看打印信息的时候,我们发现main_phase在执行过程中好像被杀死了,已经输出了’main_phase is called’,但后面就没有了。的确是这样的,UVM通过objection机制来控制验证平台的关闭:在每个phase中,UVM会检查是否有objection被提起(raise_objection),如果有,那么等待这个objection被撤销(drop_objection)后停止仿真;如果没有,则马上结束当前phase【为何2.2.1节my_driver.sv中没有raise_objection也没有马上结束当前phase呢?】。更改之后my_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

和之前的my_driver.sv相比有什么区别呢?我们可以看到,在task下面加了’phase.raise_objection(this)‘,在endtask前面加了’phase.drop_objection(this)’。

在刚开始学习时,可以认为drop_objection是finish的替代,只是它必须和raise_objection成对使用,且后者在前面。

要注意raise_objection必须放在消耗仿真时间的语句之前。

二、小结

  1. objection机制——raise_objection和drop_objection。
 类似资料: