一、 p_sequencer 与m_sequencer 的关系
m_sequencer是在UVM 原码中定义的,
p_sequencer 需要我们在代码中进行宏定义才能使用,通过如下定义后, 可以直接引用p_sequencer变量。
class er_gtx_ast_seq extends er_ast_transfer_seq;
`uvm_object_param_utils(er_gtx_ast_seq)
`uvm_declare_p_sequencer(er_ast_sequencer)
function new(string name="er_gtx_ast_seq");
super.new(name);
job_desc_port = new($sformatf("%s.%s", "job_desc_port", get_inst_id()), p_sequencer);
endfunction
下图描述了uvm 原码中 sequence 和 sequencer的各种集成关系,m_sequencer 是在uvm_sequence_item中例化的 uvm_sequencer_base类型的变量,p_sequencer是在用户定义的seq中定义的er_ast_sequencer类型的变量,他们的句柄类型不同,所以一些定义在er_ast_sequencer(sqr2,sqr3,sqr4)中的变量如ast_cfg,可以通过p_sequencer.ast_cfg 引用,如果通过m_sequencer.ast_cfg引用会报错找不到。
***p_sequencer与m_sequencer从本质上来说是指向同一个sequencer的实例(来自uvm 实战,怎样指向同一个实例, 可以看源码, 留作业)。