factory - UVM工厂机制的实现详细解析
文章目录UVM factory1. factory的核心定位2. uvm_factory的内部结构2.1 类型注册表 m_type_table2.2 类型重载映射表 m_type_overrides2.3 实例重载映射表 m_inst_overrides3. factory 的关键方法3.1 获取单例实例 get()3.2 类型注册 register3.3 object ,component create方法3.4 重载规则管理4. uvm_component_utils 工作流程 ,举例:创建my_driver类4. 创建uvm_object_wrapper4.2 生成 type_id 的嵌套类4.3 注册到全局工厂4.4 支持类型查询5. uvm_object_wrapper解析5.1 uvm_object_wrapper的核心定位5.2 uvm_object_wrapper的派生类自动生成6. uvm_object_wrapper 和 factory机制的交互6.1 类注册阶段6.2 重载配置阶段6.3 实例创建阶段7. type_id类解析7.1 type_id的核心定位7.2 type_id的自动生成7.3 type_id的核心方法UVM factoryuvm factory管理所有uvm类的注册对象创建和类型重载,是实现“动态类型替换” 和 ”统一对象创建“ 的底层支撑众所周知使用factory重载机制的有如下前提所有参与factory重载机制的类都必须被注册到factory中(uvm_component/object_utils)所有参与factory重载的类都必须使用factory的实例化方式(type_id::create())参与重载的两个类之间要有派生关系(class my_comp extends uvm_component;)以下揭秘为何有如此要求factory的特殊重载和其他oop语言的重载有何不同1. factory的核心定位单例模式全局只存在一个uvm_factory实例通过uvm_factory::get()方法获取确保所有类型管理和对象创建操作的一致性核心职责维护所有注册到工厂类的元信息处理object, component的create request, 根据overriderules返回正确的类型实例管理type override和instance override的规则映射2. uvm_factory的内部结构2.1 类型注册表 m_type_table存储所有通过uvm_component_utilsuvm_object_utils注册的类的 元信息m_type_table是以uvm_object_wrapper指针为键的哈希表值为类的注册详情(class name, 创建函数)uvm_object_wrapper是每个注册类的包装器包含该类的实例化方法(create_object/create_component),是工厂识别类的唯一标识2.2 类型重载映射表 m_type_overrides记录元类型 - 重载类型的映射关系是一个以uvm_object_wrapper指针为键的哈希表value: 目标重载类型的uvm_object_wrapper指针当原type被重载后工厂创建原类型实例时会自动替换为目标重载类型2.3 实例重载映射表 m_inst_overrides记录“原类型实例路径- 重载类型”的映射关系实例重载数据结构 嵌套哈希外层键为原类型的uvm_object_wrapper指针内层键为实例的层次路径字符串value: 目标重载类型的uvm_object_wrapper指针仅当“原类型”且“实例路径完全匹配”才会触发重载优先级高于类型重载3. factory 的关键方法3.1 获取单例实例 get()/***get方法源码 */staticfunction uvm_factoryget();/**get 方法的使用*/uvm_factory factoryuvm_factory::get();功能返回全局唯一的factory实例确保所有操作指向同一工厂使用场景任何需要直接操作工厂的地方3.2 类型注册 register功能由uvm_object_wrapper注册到工厂的m_type_table中调用由uvm_component_utilsuvm_object_utils自动调用说明注册到工厂后工厂才能识别该类并支持对其对象的创建和重载3.3 object ,component create方法create_object_by_type功能 根据requested_type创建对象若存在重载则返回重载类型的实例调用sequence::type_id::create()最终调用此方法create_component_by_type同object的使用create_object_by_namecreate_component_by_name3.4 重载规则管理类型重载(set_type_override)在m_type_overrides 中添加“ 原类型- 重载类型”的映射original_type::type_id::set_type_override(override_type::type_id::get());实例重载(set_inst_override)original_type::type_id::set_inst_override(override_type::type_id::get(),inst_path);清除重载virtual functionvoidclear_override(uvm_object_wrapper original_type,string inst_path);4. uvm_component_utils 工作流程 ,举例:创建my_driver类4. 创建uvm_object_wrapperuvm_component_utils自动创建my_driver_wrapper类,作为在uvm中的唯一元标识staticmy_driver_wrapper inst;该实例提供create_component构造方法get例化方法4.2 生成 type_id 的嵌套类type_id是uvm_register的扩展类实例化后成为my_driver::type_idtype_id继承了create方法,继承get方法返回my_driver_wrapper继承set_type_override等重载4.3 注册到全局工厂通过uvm_factory::register将my_driver_wrapper注册到工厂4.4 支持类型查询宏会自动生成get_type_name()方法5. uvm_object_wrapper解析uvm_object_wrapper是uvm工厂机制中连接用户自定义类于uvm_factory的 桥梁它是注册到工厂类的“元信息载体” 负责在工厂中标识类type并提供 实例创建接口5.1 uvm_object_wrapper的核心定位抽象基类uvm_object_wrapper是一个纯虚类本身不能被实例化需要由用户注册的类通过uvm宏自动生成派生类核心作用作为类在工厂中的唯一标识符工厂通过uvm_object_wrapper指针区分提供创建对应类实例的接口(create_object和create_component),屏蔽了不同类的实例化细节存储类的元信息类名支持工厂的类型查询和重载管理uvm_object_wrapper的定义virtualclassuvm_object_warpperextendsuvm_void;// 纯虚方法返回类的名字pure virtual function stringget_type_name();pure virtual function uvm_objectcreate_object(string name);pure virtual function uvm_componentcreate_component(string name,uvm_component parent);//辅助方法类型比较注册检查pure function bitis_component();return0;endfunction endclass所有方法均为虚方法其中get_type_name, create_object, create_component是纯虚方法必须由派生类包装器实现5.2 uvm_object_wrapper的派生类自动生成用户定义的类通过uvm_component_utils,uvm_object_utils宏注册到工厂时宏会自动生成一个集成自uvm_object_wrapper的派生类并实现其纯虚方法// 自动生成wrapper ,嵌套在my_driver::type_id 中classmy_driver_wrapperextendsuvm_object_wrapper;staticmy_driver_wrapper inst;// 获取单例实例staticfunction my_driver_wrapperget();if(instnull)instnew();returninst;endfunction virtual function stringget_type_name();returnmy_driver;endfunction// 实现基类方法: 创建 my_driver 组件实例virtual function uvm_componentcreate_component(string name,uvm_component parent);my_driver obj;objnew(name,parent);returnobj;endfunction virtual function bitis_component();return1;endfunction endclass注意wrapper是单例模式通过get方法返回唯一实例确保工厂中每个类对应唯一的包装器指针方法get:return实例化的my_driver_wrappercreate_component / create_object调用用户类的new()构造函数完成创建get_type_name 返回类的字符串名称6. uvm_object_wrapper 和 factory机制的交互6.1 类注册阶段用户通过uvm_component_utils注册时 宏自动生成my_driver_wrapper并调用uvm_factory::register(my_driver_wrapper::get()), 将包装器注册到工厂的m_type_table中工厂会记录:my_driver_wrapper对应my_driver类 可以通过该包装器创建其实例6.2 重载配置阶段当用户调用my_driver::type_id::set_type_override(my_driver_ext::type_id::get())时 实际是将my_driver_wrapper与my_driver_ext_wrapper的映射关系存入工厂的m_type_overrides6.3 实例创建阶段用户调用my_driver::type_id::create(drv,this)时该方法先获取my_driver_wrapper通过my_driver::type_id::get()) 调用工厂的create_component_by_type方法。7. type_id类解析type_id是与工厂机制深度绑定的嵌套类由uvm_component_utilsuvm_objet_utils自动生成是用户与工厂交互的主要接口。 它封装了类的工厂注册信息提供了class create, set_type_override等核心方法是uvm类型管理的 入口7.1 type_id的核心定位嵌套类特性type_id是每个注册到工厂的类的嵌套类即my_driver::type_id,my_sequence::type_id与原类一一对应核心作用作为原类与工厂的“交互代理”提供标准方法create,get,set_type_override), 操作工厂封装原类在工厂中的注册信息隐藏工厂机制实现的底层细节简化用户对工厂的使用无需直接操作uvm_factory/ uvm_object_wrapper)7.2 type_id的自动生成由uvm_component_utils在编译阶段自动生成classmy_driverextendsuvm_driver;// 宏注册自动产生 嵌套类 type_idtypedef uvm_component_registry #(my_driver,my_driver)type_id;// 工厂注册 将my_driver 的wrapper 注册到uvm_factoryuvm_object_registry_utils(my_driver)...endclassuvm_component_registry #(my_driver,my_driver)是uvm预定义的模板类实例化后即为uvm_dirver::type_id, 其核心功能是uvm_registry实现的包含create, get等发方法7.3 type_id的核心方法create(string name,uvm_component parent)/create(string name)功能通过工厂创建原类或重载类的实例是uvm推荐的对象实例化方法返回原类的实例句柄原理内部调用uvm_factory的create_component_by_type或create_object_by_type,结合重载规定返回正确实例get()功能 返回原类在工厂中的uvm_object_wrapper包装器 单例uvm_driver_wrapper)返回值uvm_object_wrapper类型句柄代表原类在工厂中注册的标识用途 主要用于类型重载set_type_override)set_type_override(uvm_object_wrapper override_type, bit_replace1)功能 设置类型重载使原类的 所有实例化请求都被替换为override_type对应的类参数override_type: 重载类的uvm_object_wrapper(通过override_class::type_id::get()获取replace: 若已存在重载规则默认替换内部调用uvm_factory::set_type_override, 将原类与重载类的包装器映射关系存入工厂set_inst_override(uvm_object_wrapper override_type, string inst_path, bit replace1)参考set_type_override

相关新闻

终极SQL注入测试工具:SQLMap-GUI完整使用指南

终极SQL注入测试工具:SQLMap-GUI完整使用指南

终极SQL注入测试工具:SQLMap-GUI完整使用指南 【免费下载链接】sqlmap-gui 基于官版本 SQLMAP 进行人工汉化,并提供GUI界面及多个自动化脚本 项目地址: https://gitcode.com/gh_mirrors/sq/sqlmap-gui SQLMap-GUI是基于经典SQL注入工具SQLMap开发…

2026/7/19 16:51:33阅读更多 →
SetDPI:Windows多显示器DPI缩放命令行控制终极指南

SetDPI:Windows多显示器DPI缩放命令行控制终极指南

SetDPI:Windows多显示器DPI缩放命令行控制终极指南 【免费下载链接】SetDPI 项目地址: https://gitcode.com/gh_mirrors/se/SetDPI 你是否厌倦了Windows系统DPI缩放设置的繁琐操作?面对多显示器环境下每个屏幕需要不同缩放比例的困境&#xff0c…

2026/7/19 16:49:33阅读更多 →
TMS320F2838x EMIF与Flash配置:多核存储访问与性能优化实战

TMS320F2838x EMIF与Flash配置:多核存储访问与性能优化实战

1. EMIF配置寄存器:多核系统的外部存储“看门人”在TMS320F2838x这类多核实时微控制器上搞开发,外部存储器接口(EMIF)的配置绝对是个绕不开的坎。这玩意儿就像是连接芯片内部高速世界和外部低速存储世界的“海关”,管着…

2026/7/19 16:49:33阅读更多 →
ngx_output_chain_get_buf

ngx_output_chain_get_buf

1 定义 ngx_output_chain_get_buf 函数 定义在 src/core/ngx_output_chain.cstatic ngx_int_t ngx_output_chain_get_buf(ngx_output_chain_ctx_t *ctx, off_t bsize) {size_t size;ngx_buf_t *b, *in;ngx_uint_t recycled;in ctx->in->buf;size ctx->buf…

2026/7/20 0:15:05阅读更多 →
互联网大厂常见Java面试题及答案汇总(2026持续更新)

互联网大厂常见Java面试题及答案汇总(2026持续更新)

金九银十即将来袭,又是一个跳槽的好季节,准备跳槽的同学都摩拳擦掌准备大面好几场,今天为大家准备了互联网面试必备的 1 到 5 年 Java 面试者都需要掌握的面试题,分别 JVM,并发编程,MySQL,Tomca…

2026/7/20 0:15:05阅读更多 →
python数据可视化技巧的100个练习 -- 31. 类别数据的点图

python数据可视化技巧的100个练习 -- 31. 类别数据的点图

重要性★★★☆☆ 难度★★☆☆☆ 你是一家零售公司的数据分析师。你的经理要求你可视化最近产品发布的客户满意度评级分布。评级是分类的,范围从“非常不满意”到“非常满意”。创建一个点图以显示每个评级类别的频率。使用 Python 进行数据处理和可视化。在代码中生成输入…

2026/7/20 0:13:05阅读更多 →
智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

智能体走进物理世界,千里科技携舱驾协同成果亮相WAIC 2026

在2026世界人工智能大会(WAIC 2026)举办期间,千里科技董事长、阶跃星辰董事长印奇作为特邀嘉宾出席大会开幕式并在大会主论坛(上午场)发表主题演讲《当智能体进入物理世界》。在印奇看来,"智能体"…

2026/7/20 0:13:05阅读更多 →
商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

商汤大装置发布“技术-生态-商业”闭环布局,共启“国产AI基础设施规模化商用元年”

7月18日,在WAIC 2026商汤科技 “基座大模型架构创新与生态合作论坛”上,商汤科技联合创始人、大装置事业群总裁杨帆发表《智变共生——加速AI基础设施持续升级》主题演讲,系统呈现了商汤大装置国产AI基础设施“技术-生态-商业”闭环布局&…

2026/7/20 0:13:05阅读更多 →
2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026郑州美发学校避坑指南:拆解5种教学方式,谁在“流水线”谁在“真传技”?

2026年想在郑州学美发,很多零基础学员最先搜索的问题就是:郑州美发学校哪家好?这个问题没有一个只看学校名字就能得出的答案。因为不同学校的课程方向、学习周期、教学方式和适合人群并不一样。有的更适合零基础,有的偏向发型师进修,还有的只做某一项短期技术培训。对于完全没…

2026/7/20 0:11:05阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/20 0:50:54阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/20 0:50:54阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/20 0:50:54阅读更多 →
2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

2026 WAIC:努比亚二代“豆包手机”NaviX Ultra亮相,智能体验全面升级!

7月18日智东西消息,在2026 WAIC期间,努比亚联合字节豆包打造的二代“豆包手机”努比亚NaviX Ultra首次亮相,相比一代有诸多升级。智能体手机理念中兴通讯终端事业部总裁、努比亚总裁倪飞表示,智能体手机要从人操作手机变为手机帮人…

2026/7/20 0:01:04阅读更多 →
努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra亮相WAIC,智能体手机能否让用户生活更简单?

努比亚NaviX Ultra:外观与功能双升级在2026 WAIC期间,首次亮相的努比亚NaviX Ultra吸引了众多目光。它是努比亚联合字节豆包打造的二代“豆包手机”,与一代努比亚M153相比,外观设计变化较大。其机身背部搭载横向排布的大尺寸影像模…

2026/7/20 0:01:04阅读更多 →
C# 将逗号分割的字符串转换为long,并添加到List<long>

C# 将逗号分割的字符串转换为long,并添加到List<long>

目录 方法1:使用Split和Convert.ToInt64 方法2:使用LINQ的Select和ToList 方法3:使用TryParse进行异常安全转换(推荐) 如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天…

2026/7/20 0:01:04阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/19 18:50:36阅读更多 →