`uvm_declare_p_sequencer可以认为就是定义一个SEQUENCER类型的变量p_sequencer,并且定义一个函数m_set_p_sequencer()(这个函数在uvm_sequence类中肯定以经存在了,否则还需要用户再手动调用,而我们从来没有自己调用过,所以UVM源代码中原本应该已经实现了该函数的调用了,这里要做的就是override覆盖原有函数定义),该函...
p_sequencer是由`uvm_decalre_p_sequencer宏,定义在用户指定的sequence(例如类库中的your_sequence)中的,用户指定的类型的句柄(例如类库中的your_sequencer),也就是说 p_sequencer是由uvm_decalre_p_sequencer宏产生的 p_sequencer是用户指定的sequence的成员变量(这里是your_sequence的成员变量,因为`uvm_decalre_p_...
其实,当在sequence中使用uvm_do宏时,其默认的sequencer就是此sequence启动时为其指定的sequencer(my_sequence.start(my_sequencer), 括号里的my_sequencer),sequence会将这个sequencer的指针my_sequencer放在其成员变量m_sequencer中,换句话说就是m_sequencer此时指向的就是my_sequencer。这里要注意,虽然m_sequencer句柄具...
基于2.1节的内容,其实`uvm_declare_p_sequencer(my_sqr)的作用,就是在case0_sequence中声明了一个my_sqr类型的句柄p_sequencer,将m_sequencer通过cast的方式赋值了p_sequencer,看一下这个宏的定义: 值得注意的是,在cast的过程中,其实是改写了m_set_p_sequencer这个虚方法,其实这个方法是见过的,也就是1.2节,在...
这里首先需要明白,在UVM中m_sequencer句柄的类型是uvm_sequencer_base,并且定义在uvm_sequence_item类中,可以理解为其是sequence的member sequencer的简写,是uvm_sequence_item类中的一个成员(如下图),用户编写的sequence大都派生自该类。在建立sequence和sequencer关系(uvm_sequence::start())时,该成员将指向该sequence...
m_sequencer是uvm_sequencer_base类型的句柄,默认情况下在每个sequence中都可用。连接到driver 的真正的sequencer 是从uvm_sequencer_base类派生出来的,其 被参数化为用于与driver 通信的sequence item类型。 因此要访问正在运行sequence 的真实sequencer ,我们需要将m_sequencer类型转化为真实sequencer ,通常称为p_sequencer...
在start()函数中,首先调用了函数set_item_context()函数,这个函数位于sequence的父类uvm_sequence_item中,负责给成员变量m_sequencer, m_parent_sequence赋值。 如果没有指定挂载的sequencer,则挂载到parent_sequence的sequencer上。 此处seq0显示传入了需要挂载的p_sqr0,则调用set_sequencer()函数完成挂载,给m_sequenc...
set_sequencer 函数 会使m_sequencer 句柄指向执行当前 sequence 的 sequencer,即指向 env.vsqr 如果没有指定挂载的sequencer,则挂载到parent_sequence的sequencer上 `uvm_do() 宏: 相比直接调用start函数,uvm_do()宏节省了sequence的实例化和随机化的步骤 ...
`uvm_do_pri(m_trans, 100) or `uvm_do_pri_with(m_trans, 200, {m_trans.pload.size < 500;}) 第二个参数是优先级,这个数必须是一个大于等于-1的整数,数字越大,优先级越高。 (2)sequencer的仲裁算法: SEQ_ARB_FIFO(默认仲裁算法,遵循先入先出,不考虑优先级) SEQ_ARB_WEIGHTED(加权的仲裁) ...
(uvm_object_wrapper)::set(null,"$full_path(sequencer.main_phase)","default_sequence",xx_sequence::type_id::get()); 1function xx::build_phase(uvm_phase phase);2 super.build_phase(phase);3 xx_sequence m_xx_sequence;4 m_xx_sequence = new("m_xx_sequence");5 uvm_c...