m_sequencer、p_sequencer
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的更多相关文章
- js-静态、原型、实例属性
本篇来说一下js中的属性: 1.静态属性 2.原型属性 3.实例属性 静态属性: function klass(){} var obj=new klass(); klass.count=0; klas ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法
直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...
- jQuery UI resizable使用注意事项、实时等比例拉伸及你不知道的技巧
这篇文章总结的是我在使用resizable插件的过程中,遇到的问题及变通应用的奇思妙想. 一.resizable使用注意事项 以下是我在jsfiddle上写的测试demo:http://jsfiddl ...
- 初识Hadoop、Hive
2016.10.13 20:28 很久没有写随笔了,自打小宝出生后就没有写过新的文章.数次来到博客园,想开始新的学习历程,总是被各种琐事中断.一方面确实是最近的项目工作比较忙,各个集群频繁地上线加多版 ...
- boosting、adaboost
1.boosting Boosting方法是一种用来提高弱分类算法准确度的方法,这种方法通过构造一个预测函数系列,然后以一定的方式将他们组合成一个预测函数.他是一种框架算法,主要是通过对样本集的操作获 ...
- 《Web 前端面试指南》1、JavaScript 闭包深入浅出
闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...
- .Net Core MVC 网站开发(Ninesky) 2.4、添加栏目与异步方法
在2.3中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...
随机推荐
- 关于JVM的一些冷知识
(1) Java加载类的一般顺序: 1.静态属性,静态方法声明,静态块. 2.动态属性,普通方法声明,构造块. 3.构造方法. 当加载一个类时,JVM会根据属性的数据类型第一时间赋默认值(一举生成的) ...
- .net调用系统软键盘(兼容win7及win10)
没有什么技术说明,也是查询出来的,在此做记录 public class StartKeyBoard { public static bool isShowNumBoard = fa ...
- 【自动化测试:笔记一】adb命令
1.查看当前连接的设备数 adb devices 2.连接设备 adb connect <设备名> 3.安装卸载app adb install packagesname adb unins ...
- shell脚本使用## or %%
今天写脚本的时候,遇到一个文件路径需要去掉右边一部分,当时就想到了这个,但是很久没用过了,很多不记得了,记录一下这种用法 1:vim test.sh #!/bin/bash location=/f ...
- 使用sshpass方式实现ssh自动登录
1:sshpass下载地址(用yum安装不了) https://sourceforge.net/projects/sshpass/files/ or wget http://sourcef ...
- PPTV(pplive)_forap_1084_9993.exe 木马清除经历
## 流氓行经 这几天电脑上突然自动安装pptv,金山毒霸清除了也不管用, 卸载了pptv过一会又自动安装上了,太嚣张了哈. ## 监控进程跟目录变化 接下来使用 ProcessMonitor 监控进 ...
- 格式化输出=========》format 和 %
str.format() 实现格式化输出的功能 s1 = "i am {0},gae{1}".format("alex",18) 普通版,直接输入元祖 ...
- Ubuntu 14.10 下安装Ambari
安装ambari有两种方式,一是自己下载源码编译,另外一个是使用公共仓库 1 使用Public Respositories Step1: Download the Ambari repository ...
- 饥饿的牛(dp一维最大覆盖)
问题 H: 饥饿的牛 时间限制: 1 Sec 内存限制: 128 MB提交: 12 解决: 12[提交][状态][讨论版][命题人:外部导入][Edit] [TestData] [同步数据] 题目 ...
- 基于MNIST数据集使用TensorFlow训练一个没有隐含层的浅层神经网络
基础 在参考①中我们详细介绍了没有隐含层的神经网络结构,该神经网络只有输入层和输出层,并且输入层和输出层是通过全连接方式进行连接的.具体结构如下: 我们用此网络结构基于MNIST数据集(参考②)进行训 ...