uvm中的callback

callback机制最大的用处是提高验证平台的可重用性。另外,还用于构建异常的测试用例。

  1. 用uvm_callback派生出自己的类,并声明好要用的方法。

    1
    2
    3
    virtual class my_cb extends uvm_callback;
    pure virtual task my_f(int a);
    endclass
  2. 在要使用的地方注册,然后使用该callback。

    1
    2
    3
    4
    5
    6
    class my_driver extends uvm_driver;
    `uvm_register_cb(my_driver,my_cb)
    virtual task do();
    `uvm_do_callback(my_driver,my_cb,my_f(1))
    endtask
    endclass
  3. 作为使用者,继承并实现my_cb,实例化,设置进去,一般在case的end_of_elaboration阶段

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class son_cb extends my_cb;
    virtual task my_f(int a);
    $display("got it");
    endtask
    endclass
    class my_case extends uvm_test;
    function void end_of_elaboration(uvm_phase phase);
    son_cb cb = new("cb");
    uvm_callbacks#(my_driver,my_cb)::add(env.agent.driver, cb);
    endfunction
    endclass