一:简单背景介绍
- virtual_sequencer中有实际sequencer:my_seqr(my_sequencer类型);
class virtual_sequencer extends uvm_sequencer #(my_transactions);
my_sequencer my_seqr;
`uvm_component_utils(virtual_sequencer)
virtual function void build_phase(uvm_phase phase);
super.build_phase(phase);
endfunction
endclass
- virtual_sequence中有成员变量m_sequencer(uvm_sequencer_base类型)和实际sequence: my_seq(my_sequence类型);
protected uvm_sequencer_base m_sequencer;
my_sequence my_seq;
- 让virtual_sequence在virtual_sequencer上启动后,m_sequencer便指向了virtual_sequencer;
- 现在想让my_seq在my_seqr上启动,也就是在virtual_sequence内部访问virtual_sequencer中的成员变量my_seqr,通过m_sequencer.my_seqr是访问不了的,通过p_sequencer.my_seqr可以访问。
二:为什么m_sequencer.my_seqr访问不了?
因为m_sequencer是uvm_sequencer_base类型,而virtual_sequencer是uvm_sequencer类型,uvm_sequencer是uvm_sequencer_base的子类,父类句柄不能直接访问子类对象的成员。
虽然m_sequencer指向了virtual_sequencer,但是只是指向子类对象,如果要访问子类对象成员还是不可以的。
在SV中规定,如果父类句柄指向子类对象,企图使用父类句柄区访问子类对象时,父类句柄是不能直接访问子类对象中的成员的。
拓展:如何实现父类句柄对子类属性的访问呢?
曲线救国(OOP通用):我们可以通过父类句柄访问子类中的方法,前提是该方法是虚方法,然后在子类中的虚方法中访问子类中的属性。
三:为什么p_sequencer.my_seqr可以访问?
在SV中,我们可以通过将指向子类对象的父类句柄(m_sequencer)通过$cast转换成具有子类对象类型的子类句柄(virtual_sequencer),从而实现子类对象中属性的访问。
我们在virtual_sequence中使用`uvm_declare_p_sequencer(virtual_sequencer)宏来声明一个virtual_sequencer类型的子类句柄p_sequencer,并将m_sequencer通过$cast向下类型转换成p_sequencer,此时p_sequencer具有和m_sequencer的子类对象virtual_sequencer相同的类型,所以p_sequencer可以访问virtual_sequencer中的成员变量my_seqr.
四:应用
和virtual sequence/virtual sequencer一起实现sequence的统一调度和复杂同步。
参考链接
- https://mp.weixin.qq.com/s/KdcYfSOcyIysGRWXhjCHxA
- https://www.cnblogs.com/Alfred-HOO/articles/16439457.html
- https://zhuanlan.zhihu.com/p/436911218