3.1启动-seq启动之start task及start task源码(手动启动seq)
1.采用start task启动seq(实例化seq+randomize seq+seq.start(seqr))
(1) sequence如何向sequencer发送transaction? 定义sequence后,只需要在某个component(如my_sequencer, my_env)的main_phase中启动这个sequence即可,以在my_env中启动为例(通常放到my_test中比较合适);


1 //示例 2 class wb_conmax_flat_seq_test extends wb_conmax_base_test; 3 `uvm_component_utils(wb_conmax_flat_seq_test) 4 sequence_0 seq0; 5 6 function new(string name, uvm_component parent); 7 super.new(name,parent); 8 endfunction 9 10 virtual task main_phase(uvm_phase phase); 11 super.main_phase(phase); 12 phase.raise_objection(this,"Test main objection"); 13 seq0=sequence_0::type_id::create("seq0",this); 14 seq0.start(env.master_agent[00].mast_sqr,null); 15 seq0.wait_for_sequence_state(UVM_FINISHED); 16 phase.drop_objection(this,"Dropping Test main objection"); 17 endtask 18 19 endclass
(2) 通过在start task中传递sequencer指针, 使得sequence知道将产生的transaction交给哪个sequencer.
注1:如果该sequence是顶层sequence,即没有更上层sequence嵌套它,则它可以省略对第二个参数parent_sequence的指定;
注2:如果该sequence不是顶层sequence,则可以指定parent_sequence;这样该sequence会继承parent_sequence的优先级;
(3) start函数会依次调用pre_start, pre_body, body, post_body, post_start函数(详见uvm_sequence_base.svh);

注1:在实际应用中,可以不写seq.starting_phase=***;但是如果需要在sequence中实现objection的控制,则需要指明starting_phase.
注2:在调用create函数进行sequence例化时,可以指定sequencer(???笔误,非笔误,查看type_id::create源码);
注3:当一个sequence启动后,会自动执行sequence的body任务;此外,还会自动调用sequence的pre_body与post_body;
2. start task源码
(1) m_sequence_state表示sequence的状态(CREATED表示sequence已经实例化; STOPPED表示一中不正常的中止,比如被别的进程杀死,没有执行完; FINISHED表示正常的结束;);
(2) 当sequence实例化后, m_sequence_state默认将会是CREATED;








(3) response_queue是一个队列,用于存放driver发送给sequence的response;

(4) 如果sequence正常结束,会调用sequencer的m_sequence_exiting函数; 该函数会调用remove_sequence_from_queues函数,将该sequence从sequence的仲裁队列arb_sequence_q中删除;
(5) arb_sequence_q队列存储的内容是uvm_sequence_request类型,主要用于记录sequence向sequencer发出的请求信息,比如sequence的id, sequence的指针以及请求的类型(SEQ_TYPE_REQ, SEQ_TYPE_LOCK, SEQ_TYPE_GRAB);
浙公网安备 33010602011771号