0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么要同时存在m_sequencer和p_sequencer他们两个?

sanyue7758 来源:硅芯思见 2023-06-19 10:02 次阅读

在构建复杂的sequence序列的时候,我们经常会用到m_sequencer和p_sequencer,并且在很多资料中都提到两者实际指向的是同一个对象,那么为什么要同时存在他们两个,存在一个不就够用了吗?为此,本文通过示例说明下两者之间的关系。

首先,我们先来看看“白皮书”上的一个示例。

【示例】

c1bba410-0dee-11ee-962d-dac502259ad0.png

“白皮书”中讲解在case0_sequence中如果企图通过m_sequencer引用my_sequencer中的变量将会报错,需要通过调用宏声明p_sequencer后通过p_sequencer才能引用my_sequencer中的变量,并且还强调了了m_sequencer和p_sequencer指向同一个对象,那么为什么m_sequencer不能直接访问my_sequencer中的变量呢?这里首先需要明白,在UVM中m_sequencer句柄的类型是uvm_sequencer_base,并且定义在uvm_sequence_item类中,可以理解为其是sequence的member sequencer的简写,是uvm_sequence_item类中的一个成员(如下图),用户编写的sequence大都派生自该类。

在建立sequence和sequencer关系(uvm_sequence::start())时,该成员将指向该sequence将要运行的sequencer。

c1cfe54c-0dee-11ee-962d-dac502259ad0.png

那么,p_sequencer的类型是什么呢?我们从代码中的宏定义来看一下,这个宏定义展开如下。

c1eaf2a6-0dee-11ee-962d-dac502259ad0.png

在该宏中,SEQUENCER必须为“类型”,当程序中使用该宏时,SEQUENCER为用户自定义的sequencer,即示例中的my_sequencer,而因为宏中p_sequencer指定的类型为SEQUENCER,即也就是调用该宏时传入的参数my_sequencer,所以可以知道p_sequencer的类型为用户自定义的sequencer,即示例中的my_sequencer,而用户自定义的sequencer派生自uvm_sequencer。

至此,我们也就知道了m_sequencer和p_sequencer的句柄类型。我们汇总下上述信息可以得到下图。

c204cc12-0dee-11ee-962d-dac502259ad0.png

在声明p_sequencer的宏中,451行通过$cast将p_sequencer指向了m_sequencer指向的对象,而m_sequencer此时指向对象的类型就是用户自定义的sequencer,即经过一番骚操作之后,p_sequencer和m_sequencer指向了同一个sequencer。既然指向了同一个对象,为什么一个句柄(p_sequencer)可以访问对象的属性而另一个(m_sequencer)不行呢?这里就需要大家理解SystemVerilog中的句柄转换后,父类句柄都可以访问子类对象中的那些属性的问题。为了描述问题方便,我们通过一个简化示例来说明p_sequencer和m_sequencer之间的访问关系。

【示例】

c221289e-0dee-11ee-962d-dac502259ad0.png

仿真结果】

c23c0920-0dee-11ee-962d-dac502259ad0.png

示例中,m_sequencer句柄的类型为sequencer_base,p_sequencer句柄类型为sequencer_user,p_sequencer指向创建对象之后,可以访问sequencer_user中的属性user_str,通过显示函数显示出来,但是在18行将m_sequencer指向p_sequencer指向的对象之后,通过m_sequencer访问sequencer_user中的属性user_str析构时报错!这是因为在SystemVerilog中,如果企图使用父类句柄去访问子类对象时,父类句柄是不能直接访问子类对象中的属性成员,其实这也符合人之常情,时代在进步,子类肯定会具有一些父类所不具有的特性,这些特性就是父类所不具有也不能直接进行访问的。

那么,如何实现父类对于子类中属性的访问呢?可以采用曲线救国的策略,我们可以通过父类句柄访问子类中的方法,并且该方法还必须是虚方法,然后在子类中的方法访问子类中的属性实现,只不过这样实现起来有些费劲,所以我们将一些通用的属性都放在父类中,这样可以实现这些资源的共享。

回到UVM中的m_sequencer和p_sequencer中,因为m_sequencer相当于是父类句柄,而p_sequencer是子类句柄,所以不能使用m_sequencer去访问子类句柄指向的子类对象。

如果要实现对于子类对象的访问,那么应该如何实现呢?在SystemVerilog中,我们可以通过将指向子类对象的父类句柄通过$cast转换成具有子类对象类型的子类句柄,从而实现子类对象中属性的访问,我们还是通过上例进行示例说明。

【示例】

c25534b8-0dee-11ee-962d-dac502259ad0.png

【仿真结果】

c26f1946-0dee-11ee-962d-dac502259ad0.png

示例中,虽然m_sequencer句柄具有父类类型,但是其指向的是子类对象,所以此时可以通过$cast成功将p1_sequencer句柄指向m_sequencer指向的子类对象,因为p1_sequencer具有和子类对象相同的类型,所以p1_sequencer可以访问指向对象中所有的属性。

所以我们回到本文开始“白皮书”示例描述的,之所以出现“白皮书”中描述m_sequencer不能访问用户自定义的sequencer中属性的原因就是因为m_sequencer句柄的类型为当前自定义sequencer类型的父类,访问用户自定义sequencer类的对象中属性的方法只能通过具有该类型的句柄p_sequencer才行。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UVM
    UVM
    +关注

    关注

    0

    文章

    181

    浏览量

    18973
  • Verilog语言
    +关注

    关注

    0

    文章

    113

    浏览量

    8160

原文标题:m_sequencer和p_sequencer到底谁大

文章出处:【微信号:处芯积律,微信公众号:处芯积律】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    请问一下在UVM中的UVMsequences是什么意思啊

    m_sequencer类型转化为真实sequencer ,通常称为p_sequencer。下面是一简单的示例,sequence 希望访问sequ
    发表于 04-11 16:43

    介绍种交互方法来完成Sequencer和Driver的握手机制

    的API,而这些API的具体实现,都是在Sequencer中实现。这也符合TLM的基本用法。除此之外,Sequencer中拥有两个FIFO:请求FIFO m_req_fifo和响应FI
    发表于 09-23 14:39

    如何获得stm32wb55xx评估板上的Sequencer Scheduler支持

    需要 Stm32wb55xx 评估板中使用的 Sequencer 调度程序的更多支持。如何有效地使用以及是否有任何在线研讨会或任何其他文档,这将对我们有所帮助。
    发表于 12-01 06:18

    有谁知道哪里有Sequencer的详细描述以及示例?

    看起来调度器 SCH_* 已被定序器 UTIL_SEQ_* 取代。有谁知道哪里有 Sequencer 的详细描述以及示例?
    发表于 01-12 07:00

    Programmable Six Supply Sequencer and Supervisor

    Programmable Six Supply Sequencer and Supervisor,有需要的朋友下来看看。
    发表于 06-02 17:09 5次下载

    谈UVM之sequence/item见解 sequencer特性及应用(下)

    本文将接着分享sequencer的相关知识,对于sequencer的仲裁特性有几种可选,UVM_SEQ_ARB_FIFO ;UVM_SEQ_ARB_WEIGHTED
    的头像 发表于 02-19 10:14 4562次阅读
    谈UVM之sequence/item见解 <b class='flag-5'>sequencer</b>特性及应用(下)

    Sequencer的DN274-12位ADC简化了多输入应用

    Sequencer的DN274-12位ADC简化了多输入应用
    发表于 04-17 19:02 8次下载
    带<b class='flag-5'>Sequencer</b>的DN274-12位ADC简化了多输入应用

    Power System Manager和Super Sequencer选择指南

    Power System Manager和Super Sequencer选择指南
    发表于 04-20 09:38 6次下载
    Power System Manager和Super <b class='flag-5'>Sequencer</b>选择指南

    AN-1293:ADuCM350 Sequencer快速指南

    AN-1293:ADuCM350 Sequencer快速指南
    发表于 04-22 14:40 5次下载
    AN-1293:ADuCM350 <b class='flag-5'>Sequencer</b>快速指南

    UG-952:ADM1260 Super Sequencer IC使用的ADI Power Studio软件指南

    UG-952:ADM1260 Super Sequencer IC使用的ADI Power Studio软件指南
    发表于 04-24 14:15 0次下载
    UG-952:ADM1260 Super <b class='flag-5'>Sequencer</b> IC使用的ADI Power Studio软件指南

    ADM1067:采用开环裕度DAC的Super Sequencer®数据表

    ADM1067:采用开环裕度DAC的Super Sequencer®数据表
    发表于 05-18 10:23 2次下载
    ADM1067:采用开环裕度DAC的Super <b class='flag-5'>Sequencer</b>®数据表

    LTC4253/LTC4253A:-48V带Sequencer的热插拔控制器数据表

    LTC4253/LTC4253A:-48V带Sequencer的热插拔控制器数据表
    发表于 05-22 09:46 5次下载
    LTC4253/LTC4253A:-48V带<b class='flag-5'>Sequencer</b>的热插拔控制器数据表

    UVM driver和sequencer的通信

    sequencer生成激励数据,并将其传递给driver执行。UVM类库提供了uvm_sequencer基类,其参数为request和response数据类型。
    的头像 发表于 06-07 11:58 1033次阅读
    UVM driver和<b class='flag-5'>sequencer</b>的通信

    Sequencer上启动一个Sequence

    Sequencer默认不执行任何Sequence。验证工程师可以通过调用start()启动一个Sequence,也可以通过uvm_config_db指定一个自动启动的Sequence。
    的头像 发表于 06-10 09:10 499次阅读
    在<b class='flag-5'>Sequencer</b>上启动一个Sequence

    AD7927: 8-Channel, 200 kSPS, 12-Bit ADC with Sequencer in 20-Lead TSSOP Data Sheet AD7927: 8-Channel, 200 kSPS, 12-Bit ADC with Sequencer in

    电子发烧友网为你提供ADI(ADI)AD7927: 8-Channel, 200 kSPS, 12-Bit ADC with Sequencer in 20-Lead TSSOP Data
    发表于 10-12 18:50
    AD7927: 8-Channel, 200 kSPS, 12-Bit ADC with <b class='flag-5'>Sequencer</b> in 20-Lead TSSOP Data Sheet AD7927: 8-Channel, 200 kSPS, 12-Bit ADC with <b class='flag-5'>Sequencer</b> in