callback机制最大的用处是提高验证平台的可重用性。另外,还用于构建异常的测试用例。
用uvm_callback派生出自己的类,并声明好要用的方法。
1
2
3virtual class my_cb extends uvm_callback;
pure virtual task my_f(int a);
endclass在要使用的地方注册,然后使用该callback。
1
2
3
4
5
6class 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作为使用者,继承并实现my_cb,实例化,设置进去,一般在case的end_of_elaboration阶段
1
2
3
4
5
6
7
8
9
10
11class 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