class uvm_sequence_library #(type REQ=uvm_Sequence_item, RSP=REQ) extends uvm_sequence #(REQ, RSP);
1)、自定义的sequence library继承自uvm_sequence_library,同时需指明所产生的transaction类型;
2)、自定义的sequence library使用`uvm_object_utils( )宏注册后,还需调用 `uvm_sequence_library_utils( )宏进行注册;
3)、在new()函数中,要调用init_sequence_library()函数;
class simple_seq_library extends uvm_sequence_library #(my_transaction); //1. 指明数据包的类型
`uvm_object_utils(simple_seq_library)
`uvm_sequence_library_utils(simple_seq_library) //2. 两次注册
function new(string name="simple_seq_library");
super.new(name);
init_sequence_library(); //3. 调用函数,初始化sequence library
endfunction
endclass
1)、通过add_typewide_sequence()方法在env或者test的build_phase阶段将sequence添加入sequence library中,其使用方法见 “代码实例六”;
simple_seq_library::add_typewide_sequence(seq0::get_type()); //将seq0加入sequence library序列库中
2)、也可通过宏`uvm_add_to_seq_lib在自定义的sequence中将其加入sequence library中;uvm_add_to_seq_lib有两个参数,第一个为sequence的名字,第二个为sequence library的名字;
class seq0 extends uvm_sequence #(my_transaction);
...
`uvm_object_utils(seq0)
`uvm_sdd_to_seq_lib(seq0, simple_seq_library) //1. 调用宏将自定义seq0添加入sequence library中
virtual task body();
repeat(10)begin
`uvm_do(req);
`uvm_info("seq0", "this is seq0", UVM_MEDIUM);
end
endtask
endclass
//同一个seq可以添加到不同的sequence library中
class seq1 extends uvm_sequence #(my_transaction);
...
`uvm_object_utils(seq1)
`uvm_sdd_to_seq_lib(seq1, simple1_seq_library)
`uvm_sdd_to_seq_lib(seq1, simple2_seq_library)
...
endclass
1)、可在env或者test中进行设置,uvm_config_db::set()的第二个参数路径以main_phase结尾;
class test_base extends uvm_test;
...
function void build_phase(uvm_phase phase);
super.build_phase(phase);
uvm_config_db #(uvm_object_wrapper)::set(this, "env.i_agt.sqr.main_phase", "default_sequence", simple_seq_library::get_type()); // 注意路径的填写(易出错)
endfunciton
...
endclass
Sequence library中的sequence执行模式、执行次数是可以通过默认的变量进行控制。这些变量属于uvm_sequence_library_cfg类中的默认成员变量。
class uvm_sequence_library_cfg extends uvm_object;
...
uvm_sequence_lib_mode selection_mode; //枚举变量,控制控制sequence的执行方式
int unsigned min_random_count; // seq的最小启动数量
int unsigned max_random_count; // seq的最大启动数量
endclass
uvm_sequence_lib_mode这个枚举类型的源码:(selection_mode的取值)
typedef enum{
UVM_SEQ_LIB_RAND, // 自定义的seq完全随机
UVM_SEQ_LIB_RANDC, // 自定义的seq会先随机排序,然后按照此顺序执行,保证每个seq都执行到
UVM_SEQ_LIB_ITEM, // sequence library不执行自定义的sequence,而是自己产生transaction
UVM_SEQ_LIB_USER // 用户自定义算法
}uvm_sequence_lib_mode;
1)、自定义一个配置类(如:test_seq_lib_cfg, 继承自test_base);
2)、在配置类中声明uvm_sequence_library_cfg的句柄,并进行实例化,实例化的过程中**包括四个参数,分别为“实例名”、“selection_mode取值”、“min_random_count取值”、“min_random_count取值”;
3)、调用uvm_config_db::set()进行设置,其中第二个参数路径以main_phase结尾,第三个参数路径以config结尾;
class test_seq_lib_cfg extends test_base; // 1. 自定义配置类
uvm_sequence_library_cfg seq_cfg; // 2. 声明uvm_sequence_library_cfg的句柄
`uvm_component_utils(test_seq_lib_cfg)
function new(string name,uvm_component parent);
super.new(name,parent);
endfunction
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
seq_cfg = new("seq_cfg",UVM_SEQ_LIB_RAND,1,1); // 3. 实例化seq_cfg,并加入控制变量
uvm_config_db#(uvm_sequence_library_cfg)::set(this,"env.i_agent*.seqr.main_phase","default_sequence.config",seq_cfg);
endfunction // 4. 在config阶段设置
endclass
注:sequence library的详细使用方法参考 “UVM代码实例六”