callback机制
1.
在UVM验证平台中,callback机制的最大用处就是提高验证平台的可重用性。如果把两个项目不同的地方使用callback函数来做,而把相同的地方写成一个完整的env,这样重用时,只要改变相关的callback函数env可完全的重用。
除了提高可重用性外,callback机制还用于构建异常的测试用例,只是在UVM中,构建异常的测试用例有很多种方式,如factory机制的重载,callback机制只是其中的一种。
post_randomize
函数是SystemVerilog提供的广义的callback函数。UVM也为用户提供了广义的callback
函数/任务:pre_body
和post_body
,除此之外还有pre_do
、mid_do
和post_do
。
2.
首先定义一个A类:
class A extends uvm_callback;
virtual task pre_tran(my_driver drv, ref my_transaction tr);
endtask
endclass
A类一定要从uvm_callback派生,另外还需要定义一个pre_tran的任务,此任务的类型一定要是virtual的,因为从A派生的类需要重载这个任务。
接下来声明一个A_pool类:
typedef uvm_callbacks#(my_driver, A) A_pool;
A_pool的声明相当简单,只需要一个typedef语句即可。另外,在这个声明中除了要指明这是一个A类型的池子外,还要指明这个池子将会被哪个类使用。在本例中,my_driver将会使用这个池子,所以要将此池子声明为my_driver专用的。之后,在my_driver中要做如下声明:
typedef class A;
class my_driver extends uvm_driver#(my_transaction);
`uvm_component_utils(my_driver)
`uvm_register_cb(my_driver, A)
endclass
这个声明与A_pool的类似,要指明my_drive