为什么能够通过type_id::create创建实例
X::type_id::create是如何创建实例的
当利用factory机制创建实例的时候,往往使用X::type_id::create(name, parent)来创建实例,比如
function void MyEnv::build_phase(uvm_phase phase);super.build_phase(phase);x = X::type_id::create("x", this); // factory机制创建实例
endfunction : build_phase
当然X::type_id::create本质依然是调用new()去创建实例,但是问题在于其UVM内部是如何一步步实现调用new()成功创建实例的。
X::type_id从何而来
要实现通过X::type_id::create创建实例,首先需要对需要创建的class X进行factory注册,即使用宏`uvm_component_utils(X)(或者`uvm_object_utils(X)),从[宏uvm_component_utils以及uvm_object_uitls是帮我们添加了哪些代码](./`uvm_component_utils做了什么.md),我们可以得知`uvm_component_utils(X)中的宏`m_uvm_component_register_internal(X,X)为我们的class添加了两个函数(get_type()和get_object_type())以及一个类型定义(type_id)。所以我们可以使用X::type_id来定位到type_id这个类。深入一下源码,可以看到
typedef uvm_component_register #(T, `"S`") type_id;
所以type_id本质就是在X中定义的uvm_component_register #(X, "X")这个类,所以调用X::type_id::create("x", this)就是调用了uvm_component_register #(X, "X")中的create方法。
create方法如何创建实例
在类uvm_component_register #(X, "X")的create方法中有如下代码段
static function T create(string name, uvm_component parent, string contxt = ""); // 这里的T就是我们需要创建的X的类型...uvm_object obj;...obj = factory.create_component_by_type(get(), contxt, name, parent);...if (!$cast(create, obj)) begin...end
endfunction
可以看出create()方法本质是调用了factory变量的create_component_by_type方法实现的创建实例,create_component_by_type()方法需要的其他三个参数先不关注,重点在于第一个参数,通过get()方法获得。
get()方法也是类uvm_component_register #(X, "X")中的方法,它基于单例模式创建一个类uvm_component_register #(X, "X")的实例me并返回。这里存在一个问题在于:明明我需要创建的对象类型为X,怎么传入create_component_by_type()第一个类型参数的却是type_id类型的实例?于是我们需要继续挖掘create_component_by_type()的函数实现。
create_component_by_type()的创建实例
在class uvm_default_factory中对create_component_by_type()进行了实现
function uvm_component uvm_default_factory::create_component_by_type (uvm_object_wrapper requested_type, string parent_inst_path = "", string name, uvm_component parent);...return requested_type.create_component(name, parent);
endfunction
这里的requested_type就是我们传入的type_id的实例me,原来create_component_by_type()还是调用type_id中的方法create_component()来创建的X的实例,那么create_component()方法是怎么实现的,看看源码
virtual function uvm_component create_component (string name, uvm_component parent);T obj;obj = new(name, parent);return obj;
endfunction
就回到了我们熟悉的使用new()函数来创建实例,至此X::type::create(name, parent)创建实例的过程就剖析明白了,当然X::type::create(name, parent)方法不仅仅做了创建实例的工作,其中还包含了在factory中注册等工作,其实现代码没有在本文中细究,有兴趣的可以自己深入源码中探索一番。
为什么能够通过type_id::create创建实例相关推荐
- rails4 ajax 例子,Ajax和Rails 4:创建实例变量并更新视图而不刷新
我有一个部分的coaching_notes索引和一个用于创建备注的表单.我想创建一个教练笔记,并进行部分更新而不刷新页面.我收到一个未知动作错误:CoachingNotesController无法找到 ...
- ECS开放批量创建实例接口RunInstances
摘要: 为了更方便的实现弹性的资源创建,方便您一次运行多台ECS按量实例来完成应用的开发和部署,我们开放了ECS的批量创建实例接口RunInstances.和目前的CreateInstance相比,R ...
- 使用类名称创建实例并调用构造函数
本文翻译自:Creating an instance using the class name and calling constructor Is there a way to create an ...
- Unirech阿里云国际版云服务器代充-使用Python批量创建实例
当您对海外云服务器有需求时,可选择Unirech阿里云代充,那么在注册好账户之后,下面将介绍如何通过RunInstances批量创建实例接口,可以帮助您一次创建多个阿里云国际版海外云服务器实例来完 ...
- oracle 10 dbca第12步,第10步:DBCA创建实例
注意,创建磁盘组时需要以oracle用户身份执行,在那之前可能需要以root身份执行xhost+,即命令: 代码1 [root@sgdb1~]# xhost+ [root@sgdb1~]# su - ...
- openstack创建实例报Build of instance d401db9e-xxxx-97c5d7685592 aborted: Unknown auth type: None
这是在Dashborad界面得到以上报错 排查半天没有任何结果,发现keystone还是报认证错误.controller其他日志正常. 通过shell手动创建实例 [root@controller ~ ...
- 一键DG脚本(静默安装创建实例创建DG)
本人原创,请勿转载:http://blog.csdn.net/ashic/article/details/46923761 ##首先,这只是为了练习shell而写 大神们不屑请别看 不懂shell的可 ...
- Oracle创建并安装实例失败,11gr2创建实例一直失败,百度无果,求解
在DL580G5上安装红旗DCserver(AS2) linux系统后,再安装oracle11gR2数据库,ASM磁盘创建已经用grid用户创建完成,数据库软件也安装成功,就在创建实例时一直失败,界面 ...
- PySide2 基础入门-创建实例窗口(详细解释)
PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...
最新文章
- 【直播】鱼佬:心跳信号分类赛高分突破
- Python 【第八章】:JavaScript 、Dom、jQuery
- linux内核err实现,Linux中IS_ERR()函数的理解
- CSS3最颠覆性的动画效果,基本属性[过渡和2D]
- 整理python笔记001(列表(深浅copy),元祖,字典,集合)
- python导入datetime模块_Python时间模块datetime用法
- 框架分析--框架的类关系图
- VirtualBox 教程
- 体检导检系统服务器系统,全科智能导检系统
- 蓬莱小课:HR问“你的职业规划是什么”,这样回答90%不出错
- 精品文章!精讲光模块的方方面面,收藏!
- 教你如何给小米5续命
- 核心单词Word List 48
- ElasticSearch7 集群安装和配置
- python青少年编程_机器人Python青少年编程开发实例
- new和delete与内存分配
- 【概率论】2-1:条件概率(Conditional Probability)
- 机器学习-各种距离的定义
- 1688商品详情接口
- Software Testing - UI自动化测试设计规范
热门文章
- 手机QQ公众号亿级消息实时群发架构
- SpringCloud 教程 (二) 服务链路追踪(Spring Cloud Sleuth)
- MSN样式的消息提示
- VS Code 插件的开发及发布指南
- 怎么免费把pdf转换成jpg图片
- mac 终端上运行NPM INSTALL时出现问题:npm error!cb() 从未调用过!解决了
- 时间同步——TSN(Time Sensitive Network-时间敏感网络)协议802.1AS介绍
- C++核心准则​T.46:要求模板参数最少是正规或半正规的
- oracle opaque_transform,使用dblink导致的/*+ OPAQUE_TRANSFORM */
- intel CPU集显ID速查