本文主要是介绍UVM:callback机制的意义和用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1. 作用
Callback机制在UVM验证平台,最大用处就是为了提高验证平台的可重用性。在不创建复杂的OOP层次结构前提下,针对组件中的某些行为,在其之前后之后,内置一些函数,增加或者修改UVM组件的操作,增加新的功能,从而实现一个环境多个用例。此外还可以通过Callback机制构建异常的测试用例。
2. 使用步骤
(1)在UVM组件中内嵌callback函数或任务;
(2)声明一个UVM callback空壳类;
(3)从UVM callback空壳类中扩展UVM callback类;
(4)在验证环境中创建并登记UVM callback实例。
3. callback实现举例
第一步首先声明一个空壳类,注意所有的方法都声明为virtual,函数体为空:
class driver_callback extends uvm_callback;`uvm_object_utils(driver_callback)function new (string name = "driver_callback");super.new(name);endfunctionvirtual task pre_drive (driver drv, transaction tr);endtask virtual task post_drive (driver drv, transaction tr);endtask
endclass
第二步,在主操作函数、任务之前或之后嵌入callback函数:
typedef class driver_callback; //类的预定义,以便后续提前使用未定义的driver类class driver extends uvm_driver#(transaction); //嵌入Callback函数`uvm_register_cb(driver, driver_callback); //在组件中登记UVM_callback...virtual task run_phase(uvm_phase phase);forever beginseq_item_port.get_next_item(req); //申请数据发送`uvm_do_callbacks(driver,driver_callback,pre_drive(this,req)); //在数据处理前,使用宏`uvm_do_callbacks嵌入Callback函数或者任务drive(req); `uvm_do_callbacks(driver,driver_callback,post_drive(this,req)); //在数据处理后,使用宏`uvm_do_callbacks嵌入Callback函数或者任务seq_item_port.item_done(); endendtaskendclass
使用宏`uvm_register_cb在组件中对callback类进行注册;
使用宏`uvm_do_callbacks在具体行为前后嵌入callback函数或者任务。
第三步,编写具体的callback函数内容:
class driver_error_callback extends driver_callback; //继承Callback空壳类,实现覆盖`uvm_object_utils(driver_error_callback)function new(string name="driver_error_callback");super.new(name);endfunctionvirtual task pre_drive(driver drv, transaction tr);drv.req.payload.delete(); //在主函数操作前注入错误endtaskvirtual task post_drive(driver drv, transaction tr);`uvm_info("DRIVER_ERROR_CALLBACK","Inside post_drive method",UVM_LOW); //在主函数操作之后,打印endtask endclass
最后一步,在测试案例中创建并登记callback的实例:
class driver_err_test extends test_base; //在测试用例中创建对象并登记`uvm_component_utils(driver_err_test)function new(string name = "driver_err_test", uvm_component parent=null);super.new(name,parent);endfunction…………driver_error_callback drv_err_cb; //声明句柄function void build_phase(uvm_phase phase);super.build_phase(phase);drv_err_cb = driver_error_callback_callback::type_id::create("callback_1", this); //创建Callback实例uvm_callbacks #(driver,driver_callback)::add(env.agt.drv, drv_err_cb); //调用add()方法将回调类添加到testuvm_callbacks #(driver,driver_callback)::display(); //显示并打印登记信息用于调式endfunction
endclass
需要在测试用例中创建和例化callback对象;并调用uvm_callbacks #(T, CB) :: add(t,cb)将callback对象添加到test。
最后在编译调试时,添加选项+UVM_CB_TRACE_ON即可。
这篇关于UVM:callback机制的意义和用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!