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

 

posted on 2022-04-14 16:08  阿基米德之音  阅读(106)  评论(0编辑  收藏  举报

导航