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中完成依赖注入后,这次主要实现栏目的添加功能.按照前面思路栏目有三种类型,常规栏目即可以添加子栏目也可以选择是否添加内容,内容又可以分文章或其他类型,所以还要添加一个模块功能.这次主要实现栏目 ...
随机推荐
- Span<T>和ValueTuple<T>性能是.Net Core非常关键的特性
Span<T>和ValueTuple<T> 性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. ...
- django的静态文件的引入
django的静态文件的引入 1.路径配置 在templates文件夹的同级目录下新建static文件夹 在setting里面写上STATICFILES_DIRS = [os.path.join(BA ...
- Python开发 標準內建方法 (未完代補)
abs(number) 絕對值 The abs() method takes a single argument: num - number whose absolute value is to ...
- Linux scp命令详解
Linux scp命令 Linux scp命令用于Linux之间复制文件和目录. scp是 secure copy的缩写, scp是linux系统下基于ssh登陆进行安全的远程文件拷贝命令. 语法: ...
- 2013-7-30 802.1X企业级加密
今天做了U9510的企业级加密标杆测试,写了企业级加密标杆设备的操作指南.最后做到server 2003却出了问题,peap能关联,但是TLS怎么都关联不上.用adb shell查看logcat日志, ...
- phpcms调用语句
title 标题:url 链接地址:thumb缩略图 :先调用moreinfo="1" content 内容: {php list($copyfrom) = explode('| ...
- centos7如何查看网络状态?
参考https://www.jb51.net/os/RedHat/520187.html 查看网络状态: lsof -Pnl +M -i4 显示ipv4服务及监听端情况 netstat -anp 所有 ...
- 关于Django部分
1 安装 执行pip安装即可 pip install Django 2 开启项目 3 项目新建后所在位置: 4 开启端口命令 python manage.py runserver 0.0.0.0:9 ...
- Metasploit 简单渗透应用
1.Metasploit端口扫描: 在终端输入msfconsole或直接从应用选metasploit 进入msf>nmap -v -sV 192.168.126.128 与nmap结果一样 用 ...
- 长短记忆神经网络LSTM
转载: https://www.jianshu.com/p/dcec3f07d3b5 https://blog.csdn.net/dream_catcher_10/article/details/48 ...