callback机制
对于vip的开发者来说callback机制的流程如下:
- 定义一个类A,并定义一个virtual的函数
1 class A extends uvm_callback; 2 virtual task pre_tran(my_driver drv, ref my_transaction tr); 3 endtask 4 endclass
- 声明一个A_pool类
typedef uvm_callbacks#(my_driver, A) A_pool;
- 在driver中调用uvm_register_cb宏
1 class my_driver extends uvm_driver#(my_transaction); 2 3 virtual my_if vif; 4 5 `uvm_component_utils(my_driver) 6 `uvm_register_cb(my_driver, A) 7 function new(string name = "my_driver", uvm_component parent = null); 8 super.new(name, parent); 9 endfunction
- 在driver中使用uvm_do_callback宏
1 task my_driver::main_phase(uvm_phase phase); 2 vif.data <= 8'b0; 3 vif.valid <= 1'b0; 4 while(!vif.rst_n) 5 @(posedge vif.clk); 6 while(1) begin 7 seq_item_port.get_next_item(req); 8 `uvm_do_callbacks(my_driver, A, pre_tran(this, req)) 9 drive_one_pkt(req); 10 seq_item_port.item_done(); 11 end 12 endtask
对于vip的使用者来说callback机制的流程如下:
- 从A派生出一个类,在类中定义pre_tran函数
1 class my_callback extends A; 2 3 virtual task pre_tran(my_driver drv, ref my_transaction tr); 4 `uvm_info("my_callback", "this is pre_tran task", UVM_MEDIUM) 5 endtask 6 7 `uvm_object_utils(my_callback) 8 endclass
- 在测试用例的connect_phase中,将从A派生的类实例化,并加入到A_pool中
1 function void my_case0::connect_phase(uvm_phase phase); 2 my_callback my_cb; 3 super.connect_phase(phase); 4 5 my_cb = my_callback::type_id::create("my_cb"); 6 A_pool::add(env.i_agt.drv, my_cb); 7 endfunction