马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
virtual sequence介绍 使用示例: 1. 定义一个virtual sequencer: class my_vsqr extends uvm_sequencer;
my_sequencer0 p_sqr0;
my_sequencer1 p_sqr1;
…
endclass
2. 在base_test中,实例化vsqr,并将相应的sequencer赋值给vsqr中的sequencer的指针:
class base_test extends uvm_test;
my_env env0;
my_env env1;
my_vsqr v_sqr;
…
endclass
function void base_test::build_phase(uvm_phase phase);
super.build_phase(phase);
env0 = my_env::type_id::create("env0", this);
env1 = my_env::type_id::create("env1", this);
v_sqr = my_vsqr::type_id::create("v_sqr", this);
endfunction
function void base_test::connect_phase(uvm_phase phase);
v_sqr.p_sqr0 = env0.i_agt0.sqr0;
v_sqr.p_sqr1 = env1.i_agt1.sqr1;
endfunction
3. 在virtual sequene中则可以使用uvm_do_on系列宏来发送transaction: 实现效果:1.先发送一个drv0_seq类型的长包;2.然后开始并行发两种类型的包 ;
class case0_vseq extends uvm_sequence;
`uvm_object_utils(case0_vseq)
`uvm_declare_p_sequencer(my_vsqr)
…
virtual task body();
my_transaction tr;
drv0_seq seq0;
drv1_seq seq1;
…
`uvm_do_on_with(tr, p_sequencer.p_sqr0, {tr.pload.size == 1500;})
`uvm_info("vseq", "send one longest packet on p_sequencer.p_sqr0", UVM_MEDIUM)
fork
`uvm_do_on(seq0, p_sequencer.p_sqr0);
`uvm_do_on(seq1, p_sequencer.p_sqr1);
join
…
endtask
endclass
小扩展(`uvm_declare_p_sequencer(SEQUENCER)宏): 相当于在sequence里声明了一个SEQUENCER类型的成员变量,然后就可以在sequence里使用p_sequencer里的成员了;(示例中就可以使用my_vsqr里的p_sqr0了)
4. 上述过程也可以采用手动启动sequence:
class case0_vseq extends uvm_sequence;
…
virtual task body();
my_transaction tr;
drv0_seq seq0;
drv1_seq seq1;
…
`uvm_do_on_with(tr, p_sequencer.p_sqr0, {tr.pload.size == 1500;})
`uvm_info("vseq", "send one longest packet on p_sequencer.p_sqr0", UVM_MEDIUM)
seq0 = new("seq0");
seq1 = new("seq1");
fork
seq0.start(p_sequencer.p_sqr0);
seq1.start(p_sequencer.p_sqr1);
join
…
endtask
endclass
|