uvm中 重载的几种方法
a. transaction的重载
基于现有的transaction格式,定义新的transaction,同时约定新的约束,之后,:
1. 新定义sequence来使用新的transaction;
2. 旧的sequence来使用新的transaction;
case中使用新/旧的sequence即可。
需要新增文件 new_transaction.sv, my_test1.sv,new_sequence.sv/修改sequence。
优化做法:
基于factory重载机制,新建新的transaction,
直接在case的,build_phase中:
factory.set_type_override_by_type(my_transaction::get_type(), new_transaction::get_type());
其余不变,这样涉及的修改更少;
b. 基于上面transaction的重载,可以对每个transaction定义一个sequence,然后放在sequence_lib中,用一个case直接启动即可;
需要新增,sequence*.sv, sequence_lib.sv;
c. 重载sequence
1. 在新的sequence中约束不同的transaction元素,这样就是现在同一个sequence发送不同transaction定向约束的场景;
之后在class build_phase中,采用factory重载<参考上文>
d. 重载component
万物可重载;
e. callback机制
实现方式:
定义callback类
class A extends uvm_callback;
virtual task pre_tran (my_driver drv, ref my_transaction tr);
endtask
endclass
//my_driver代表这个A_pool会给那个类使用;
typedef uvm_callbacks #(my_driver, A) A_pool;
使用类my_driver.cc:
typedef class A;
class my_driver extends uvm_driver #(my_transaction);
……
`uvm_register_cb(my_driver, A)
task main_phase(uvm_phase phase)
….
`uvm_do_callbacks(my_driver, A, pre_tran(this, req))
….
endtask
endclass
// ------------------------------------------- 使用callback
my_test.sv
…….
class my_callback0 extends A;
virtrual task pre_tran (my_driver drv, ref my_transaction tr);
define action
endtask
endclass
function void my_test::connect_phase(uvm_phase phase)
my_callback0 my_cb;
super.connect_phase(phase);
m_cb = my_callback:;type_id:;create(“my_cb”)
A_pool::add(env.i_gaent.drv, my_cb);
endfunction
//这种方式
1. 新增callback.sv for callback class;
2. 在driver增加新的注册callback;
3. testcase中需要不断去定义不同的testcase0,来调用不同的callback;