https://blog.csdn.net/zhajio/article/details/79608323

p - parent sequencer - 要处理的实际sequencer类型的句柄,这个是自己定义的。

m - m_表示隐藏或局部变量(member),m_sequencer是uvm_sequencer_base类型,定义在uvm_sequence_item类中。

可以使用`uvm_declare_p_sequencer宏声明p_sequencer。

但是你也可以在sequence中做以下相同的事情:

my_sequencer p_sequencer;

task body;
assert($cast(p_sequencer,m_sequencer));

....

如果实际的sequencer有一些您需要访问的方法或变量,则p_sequencer可能很有用。在大多数情况下,m_sequencer具有您需要的一切。

sequence负责生成激励或sequence_items,因此当通过.start()方法启动sequence时,sequence会连接到特定的sequencer。m_sequencer是一个通用的sequencer,或者可以认为是一个指针,其句柄包含对sequence运行的sequencer的引用。 同时m_sequencer可用于从sequence中访问组件层次结构中的配置信息和其他资源。因为sequence是从uvm_object拓展而来,它不能访问uvm_component组成的uvm层次结构的,如果非要访问uvm_component就要通过一个媒介,这个媒介就是sequencer。

例如,如果您在名为bar_sequencer的sequencer,foo_sequence.start(bar_sequencer)上启动名为foo_sequence的序列,则start()任务将分配foo_sequence.m_sequencer作为bar_sequencer。现在,foo_sequence可以使用m_sequencer访问组件层次结构。例如,您可以通过调用m_sequencer.get_full_name()来获取sequencer的完整层次名称。请注意,m_sequencer的类型是uvm_sequencer_base。这意味着如果你有自己的sequencer,并且你已经在sequencer中定义了新的属性,那么你不能通过m_sequencer访问它们,因为它不知道它们。现在p_sequencer开始显示威力了。
如果在sequence中使用`uvm_declare_p_sequencer宏,则p_sequencer会被实例化。

例如,你可以像这样在foo_sequence中使用此宏:

class foo_sequence extends uvm_sequence #( my_transaction );
  `uvm_object_utils( foo_sequence )
  `uvm_declare_p_sequencer( bar_sequencer_class )
   
  task body;
    p_sequencer.ana_port.write(item);
    p_sequencer.prop_a;

// ...

那么`uvm_declare_p_sequencer宏到底做了哪些工作呢?无非就是用$cast实现的一个动态向下类型转换操作。从OOP继承和多态的角度来说,m_sequencer是uvm_sequencer_base类型的变量。它可以存储从uvm_sequencer_base派生的任何对象的句柄。但是,您只能引用从uvm_sequencer或uvm_sequencer扩展的任何类方法或变量。

假设你有两个从uvm_sequencer扩展的类:sqrA和sqrB sqrA有一个成员A,sqrB有一个成员B.如果你试图引用m_sequencer.A,但是m_sequencer目前有一个sqrB类型的对象的句柄,会发生什么?另外,如果sqrA和sqB都有称为C的变量但它们是完全不同的类型呢? SystemVerilog不会让你犯这个错误,它不允许动态类型切换。

因此,如果您想引用仅在sqrA中的成员或方法,则必须使用该类类型的变量引用它们。它知道sqrA_h.A总是有效的,如果sqrA_h不为空,并且sqrA_h.M是一个固定类型。

以下图为例,该宏使用您提供的sequencer类型(在本例中为bar_sequencer_class)声明p_sequencer。然后宏定义了一个名为m_set_p_sequencer的函数,它将m_sequencer转换为p_sequencer。现在,您可以通过p_sequencer访问bar_sequencer_class中定义的属性,如foo_sequence的body任务内部的p_sequencer.my_property。

---------------------
作者:PlPyRbC
来源:CSDN
原文:https://blog.csdn.net/zhajio/article/details/79608323
版权声明:本文为博主原创文章,转载请附上博文链接!

m_sequencer、p_sequencer的更多相关文章

  1. js-静态、原型、实例属性

    本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...

  2. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  3. javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈

    Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...

  4. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  5. jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧

    这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...

  6. 初识Hadoop、Hive

    2016.10.13 20:28 很久没有写随笔了,自打小宝出生后就没有写过新的文章.数次来到博客园,想开始新的学习历程,总是被各种琐事中断.一方面确实是最近的项目工作比较忙,各个集群频繁地上线加多版 ...

  7. boosting、adaboost

    1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...

  8. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  9. .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法

    在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...

随机推荐

  1. hibernate模拟(转载)

    package simulation; /** * * @author Administrator * */ public class User { private int id; private S ...

  2. Office常用技巧

    文章目录 大小写切换 把word里的自动编号转换为真实的文本 大小写切换 word中修改单词/句子的大小写:选中文字,按shift+F3,可在全大写.全小写.首字符大写间切换. 把word里的自动编号 ...

  3. java_oop_类

    类的初始化顺序    再论类的组成    类的初始化顺序详解        变量        实例变量(成员变量)        类变量(静态变量)    方法        实例方法       ...

  4. Maya中输出alembic文件的方法

    Maya中输出alembic文件是有现成api调用的,与maya中大部分api一样,这个功能参数的传入是非常类似mel的,本质上讲都是kwargs类型的参数,所以我们传入的参数就需要整理成类似于mel ...

  5. Linux操作redis 使用(VMwareWorkstation)

    项目一般都部署到linux上面,记得刚出来的时候,第一家公司 服务器是windows系统,以后公司的项目都放在了linux上面,所以掌握linux的一些基本操作是一个程序员必备的知识,本次记录如何使用 ...

  6. java中拼接两个对象集合

    目标:  根据两个list中每条记录的某个属性是否相同来拼接. 1.首先定义一个字符串 String str = "[{\"ITEMID\":2,\"ITEMN ...

  7. React+ES6+Webpack深入浅出

    React已成为前端当下最热门的前端框架之一 , 其虚拟DOM和组件化开发让前端开发更富灵活性,而Webpack凭借它异步加载和可分离打包等优秀的特性,更为React的开发提供了便利.其优秀的特性不再 ...

  8. C#控制台程序点击后暂停工作

    C#控制台应用程序,点击后就会暂停运行,但是我想让它运行不受点击的干扰.下面是程序演示: public void Test() { ThreadOut(); } private void Thread ...

  9. PHP常用的转义函数

    1. addslashes addslashes对SQL语句中的特殊字符进行转义操作,包括(‘), (“), (), (NUL)四个字符,此函数在DBMS没有自己的转义函数时候使用,但是如果DBMS有 ...

  10. 四、Html列表、块、布局