文章目录
1、基本概念
m_sequencer
- 类型是
uvm_sequencer_base
类型,定义在uvm_sequence_item类中,注意:类型很重要。 - 可以理解为每个sequence中默认都有m_sequencer这一成员变量。
- m_sequencer 是一个指向执行当前sequence的sequencer句柄。
p_sequencer
- 使用 `uvm_declare_p_sequencer(my_sequencer) 宏声明p_sequencer,宏本质是在当前sequence也就是case0_sequence中声明了一个成员变量p_sequencer。
- 类型为
my_sequencer
,定义在case0_sequence中。 - p_sequencer是my_sequencer的句柄
2、解释m_seqeuncer和p_sequencer的区别?
m_sequecer是定义在sequence_item中的成员变量,类型是uvm_sequencer_base,当seqence挂载的时候m_sequencer会自动指向同类型的sequener。
sequence是从uvm_object拓展而来,它不能访问uvm_component组成的uvm层次结构,如果非要访问uvm_component就要通过一个媒介,这个媒介就是m_sequencer。m_sequencer可用于从sequence中访问UVM组件层次结构中的配置信息和其他资源。
但又由于m_sequencer的类型是uvm_sequencer_base(uvm_sequencer的基类),而不是具体的my_sequencer类型。所以需要声明一个my_sequencer类型的句柄指向m_sequencer。(这里面其实就包含了两个过程:声明my_sequener类型的句柄;cast强制转换指向m_sequener)。其实这两个过程,UVM也为我们提供好了现成的宏,即:uvm_declare_p_sequencer宏。
3、uvm_declare_p_sequencer宏做了哪几件事?
- 声明了一个sequencer类型的句柄p_sequencer
- 将m_sequencer句柄通过$cast(p_sequencer,m_sequencer)转化为p_sequencer 类型的句柄。