1.功能
- 在UVM验证平台,callback机制的最大用处就是提高验证平台的可重用性;
- 增加或者修改UVM组件的操作,增加新的功能,不需要创建复杂的OOP层次结构;
- 还可以用于构建异常的测试案例
2.步骤
- 在UVM组件中内嵌callback函数或任务;
- 声明一个UVM callback空壳类;
- 从UVM callback空壳类中扩展UVM callback类;
- 在验证环境中创建并登记UVM callback实例。
在UVM组件中内嵌callback函数或任务:
- 在组建中登记UVM callback(`uvm_register_cb);
- 使用uvm_do_callbacks宏嵌入UVM callback函数或任务.
class driver extends uvm_driver#(transation);
`uvm_register_cb(driver,driver_callback)
…………
virtual task run_phase(uvm_phase phase);
forever begin
seq_item_port.get_next_item(req);
`uvm_do_callbacks(driver,driver_callback,pre_send(this,req));
send(req);
`uvm_do_callbacks(driver,driver_callback,post_send(this,req));
seq_item_port.item_done();
end
endtask
endclass
声明一个UVM callback空壳类:
- 通常都声明在同一个组件文件中;
- 所有的方法都声明为virtual;
- 函数体为空
typedef class driver;
class driver_callback extends uvm_callback;
function new (string name = "driver_callback");
super.new(name);
endfunction
virtual task pre_send (driver drv, transaction tr);endtask
virtual task post_send (driver drv, transaction tr);endtask
endclass
通过扩展callback空壳类创建错误类error class
- 在callback中嵌入错误信息
class driver_error_callback extends driver_callback;
virtual task pre_send(driver drv, transaction tr);
drv.req.payload.delete();
endtask
endclass
在测试案例中创建并登记callback的实例
- 在测试案例中例化callback对象
- 创建并登记callback对象
class driver_err_test extends test_base;
…………
driver_error_callback drv_err_cb;
virtual function void connect_phase(uvm_phase phase);
super.connect_phase(phase);
drv_err_cb = new();
uvm_callbacks #(driver,driver_callback)::add(env.drv,drv_err_cb);
uvm_callbacks #(driver,driver_callback)::display();
endfunction
endclass