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创建实例相关推荐

  1. rails4 ajax 例子,Ajax和Rails 4:创建实例变量并更新视图而不刷新

    我有一个部分的coaching_notes索引和一个用于创建备注的表单.我想创建一个教练笔记,并进行部分更新而不刷新页面.我收到一个未知动作错误:CoachingNotesController无法找到 ...

  2. ECS开放批量创建实例接口RunInstances

    摘要: 为了更方便的实现弹性的资源创建,方便您一次运行多台ECS按量实例来完成应用的开发和部署,我们开放了ECS的批量创建实例接口RunInstances.和目前的CreateInstance相比,R ...

  3. 使用类名称创建实例并调用构造函数

    本文翻译自:Creating an instance using the class name and calling constructor Is there a way to create an ...

  4. Unirech阿里云国际版云服务器代充-使用Python批量创建实例

    ​ 当您对海外云服务器有需求时,可选择Unirech阿里云代充,那么在注册好账户之后,下面将介绍如何通过RunInstances批量创建实例接口,可以帮助您一次创建多个阿里云国际版海外云服务器实例来完 ...

  5. oracle 10 dbca第12步,第10步:DBCA创建实例

    注意,创建磁盘组时需要以oracle用户身份执行,在那之前可能需要以root身份执行xhost+,即命令: 代码1 [root@sgdb1~]# xhost+ [root@sgdb1~]# su - ...

  6. openstack创建实例报Build of instance d401db9e-xxxx-97c5d7685592 aborted: Unknown auth type: None

    这是在Dashborad界面得到以上报错 排查半天没有任何结果,发现keystone还是报认证错误.controller其他日志正常. 通过shell手动创建实例 [root@controller ~ ...

  7. 一键DG脚本(静默安装创建实例创建DG)

    本人原创,请勿转载:http://blog.csdn.net/ashic/article/details/46923761 ##首先,这只是为了练习shell而写 大神们不屑请别看 不懂shell的可 ...

  8. Oracle创建并安装实例失败,11gr2创建实例一直失败,百度无果,求解

    在DL580G5上安装红旗DCserver(AS2) linux系统后,再安装oracle11gR2数据库,ASM磁盘创建已经用grid用户创建完成,数据库软件也安装成功,就在创建实例时一直失败,界面 ...

  9. PySide2 基础入门-创建实例窗口(详细解释)

    PySide2 基础入门-创建实例窗口(详细解释) python 3.7 / Pyside2 (如果使用pyQt5,将Pyside2 直接替换PyQt5即可)首先我们在Qt Designer中画好界面 ...

最新文章

  1. 【直播】鱼佬:心跳信号分类赛高分突破
  2. Python 【第八章】:JavaScript 、Dom、jQuery
  3. linux内核err实现,Linux中IS_ERR()函数的理解
  4. CSS3最颠覆性的动画效果,基本属性[过渡和2D]
  5. 整理python笔记001(列表(深浅copy),元祖,字典,集合)
  6. python导入datetime模块_Python时间模块datetime用法
  7. 框架分析--框架的类关系图
  8. VirtualBox 教程
  9. 体检导检系统服务器系统,全科智能导检系统
  10. 蓬莱小课:HR问“你的职业规划是什么”,这样回答90%不出错
  11. 精品文章!精讲光模块的方方面面,收藏!
  12. 教你如何给小米5续命
  13. 核心单词Word List 48
  14. ElasticSearch7 集群安装和配置
  15. python青少年编程_机器人Python青少年编程开发实例
  16. new和delete与内存分配
  17. 【概率论】2-1:条件概率(Conditional Probability)
  18. 机器学习-各种距离的定义
  19. 1688商品详情接口
  20. Software Testing - UI自动化测试设计规范

热门文章

  1. 手机QQ公众号亿级消息实时群发架构
  2. SpringCloud 教程 (二) 服务链路追踪(Spring Cloud Sleuth)
  3. MSN样式的消息提示
  4. VS Code 插件的开发及发布指南
  5. 怎么免费把pdf转换成jpg图片
  6. mac 终端上运行NPM INSTALL时出现问题:npm error!cb() 从未调用过!解决了
  7. 时间同步——TSN(Time Sensitive Network-时间敏感网络)协议802.1AS介绍
  8. C++核心准则​T.46:要求模板参数最少是正规或半正规的
  9. oracle opaque_transform,使用dblink导致的/*+ OPAQUE_TRANSFORM */
  10. intel CPU集显ID速查