为什么要用p_sequencer?

一:简单背景介绍

  1. 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
  1. virtual_sequence中有成员变量m_sequencer(uvm_sequencer_base类型)和实际sequence: my_seq(my_sequence类型);
protected uvm_sequencer_base m_sequencer;
my_sequence	my_seq;
  1. 让virtual_sequence在virtual_sequencer上启动后,m_sequencer便指向了virtual_sequencer;
  2. 现在想让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的统一调度和复杂同步。

参考链接

  1. https://mp.weixin.qq.com/s/KdcYfSOcyIysGRWXhjCHxA
  2. https://www.cnblogs.com/Alfred-HOO/articles/16439457.html
  3. https://zhuanlan.zhihu.com/p/436911218
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值