电子说
Q:激励最初产生在driver中,后来产生在sequence中。为什么会有这个过程呢?
Q:当一个激励在driver中产生,当要对DUT施加不同的激励时,那应该怎么办呢?
Q:如何在定义后启动一个sequence
//当完成一个sequence的定义后,可以使用start任务将其启动
my_sequence my_seq;
my_seq = my_sequence::create("my_seq");
my_seq.start(sequencer);
//除了直接启动之外,还可以使用default_sequence启动
uvm_config_db#(uvm_object_wrapper)::set(this,"env.i_agt.sqr.main_phase","default_sequence", case0_sequence::get());
A:使用sequence机制之后,在不同的测试用例中,将不同的sequence设置成sequencer的main_phase的default_sequence。当sequencer执行到main_phase时,发现有default_sequence,那么它就启动sequence。
A:当一个sequence启动后会自动执行sequence的body任务。其实,除了body外,还会自动调用sequence的pre_body与post_body
文件:src/my_case0.sv3
class case0_sequence extends uvm_sequence #(my_transaction);
…
virtual task pre_body();
`uvm_info("sequence0", "pre_body is called!!!", UVM_LOW)
endtask
virtual task post_body();
`uvm_info("sequence0", "post_body is called!!!", UVM_LOW)
endtask
virtual task body();
…
#100;
`uvm_info("sequence0", "body is called!!!", UVM_LOW)
…
endtask
`uvm_object_utils(case0_sequence)
endclass
Q:UVM支持同一时刻在同一sequencer上启动多个sequence,那同时启动多个sequence时,哪个先执行呢?
Q:sequencer根据什么选择使用哪个sequence的transaction呢?这是UVM的sequence机制中的仲裁问题
//例如如下启动了seq0和seq1
文件:src/no_pri/my_case0.sv
task my_case0::main_phase(uvm_phase phase);
sequence0 seq0;
sequence1 seq1;
seq0 = new("seq0");
seq0.starting_phase = phase;
seq1 = new("seq1");
seq1.starting_phase = phase;
fork
seq0.start(env.i_agt.sqr);
seq1.start(env.i_agt.sqr);
join
endtask
A:对于transaction来说,存在优先级的概念,通常来说,优先级越高越容易被选中。当使用uvm_do或者uvm_do_with宏时,产生的transaction的优先级是默认的优先级,即-1。可以通过uvm_do_pri及uvm_do_pri_with改变所产生的transaction的优先级
文件:src/item_pri/my_case0.sv3
class sequence0 extends uvm_sequence #(my_transaction);
…
virtual task body();
…
repeat (5) begin
`uvm_do_pri(m_trans, 100)
`uvm_info("sequence0", "send one transaction", UVM_MEDIUM)
end
#100;
…
endtask
…
endclass
class sequence1 extends uvm_sequence #(my_transaction);
…
virtual task body();
…
repeat (5) begin
`uvm_do_pri_with(m_trans, 200, {m_trans.pload.size < 500;})
`uvm_info("sequence1", "send one transaction", UVM_MEDIUM)
end
…
endtask
…
endclass
uvm_do_pri与uvm_do_pri_with的第二个参数是优先级,这个数值必须是一个大于等于-1的整数。数字越大,优先级越高。
A:除transaction有优先级外,sequence也有优先级的概念
文件:src/sequence_pri/my_case0.sv
task my_case0::main_phase(uvm_phase phase);
…
env.i_agt.sqr.set_arbitration(SEQ_ARB_STRICT_FIFO);
fork
seq0.start(env.i_agt.sqr, null, 100);
seq1.start(env.i_agt.sqr, null, 200);
join
endtask
全部0条评论
快来发表一下你的评论吧 !