1.sequence机制
uvm_task_phase,start_default_sequence调用seq.start(sqr)调用uvm_do。
start_phase_sequence,sequencer内部函数,启动default.非正常sequencer.start启动.匹配到default sequence,然后执行seq.start,调用body。
进入到熟悉的uvm_do,这就牵涉到item的送取以及done的过程。
简化就是 start_item(seq);
finish_item(seq);
可以看到sequencer在这个地方的组件作用被弱化,只是调用了sequener的seq处理方法。送到seq_expert端口。结合tlm的fifo机制,不难理解,fifo从sequencer的port端口得到item,送到driver的port端口。连接关系:
seq_port ==== <export_fifo ---- export> ====driver_port
virtual sequence. ----多个virtual主要对应于多接口下发的数据存在一些时序先后关系。
使用方法:
重新定义virtual sequence和sequencer。定义过程有一些约束,在定义virtual sequence的时候需要'uvm_declare_p_sequencer(vir_sequencer).赋值给p_sequencer.后续调用uvm_on的时候会用到。
class vsequencer extends uvm_sequencer;
'uvm_component_utils(v_sequencer);
c_sequencer c_seqr;
d_sequencer d_seqr;
endclass
class tc_base uvm_test;
b_env env;
vsequencer vsqr;
function build_phase(uvm_phase phase);
v_sequencer::type_id::create("vsqr",this);
endfunction
function connect_phase();
vsqr.c_sqr=env.d_vip.c_sqr;
vsqr.d_sqr=env.d_vio.d_sqr;
endfunction
endclass
class vseq extends uvm_sequence;
'uvm_object_with();
'uvm_declare_p_sequencer(v_sequencer);
task body();
c_seq cseq;
d_seq dseq;
'uvm_do_on(cseq,p_sequencer.c_sqr);
'uvm_do_on(dseq,p_sequencer.d_sqr);
endtask
endclass