
文章目录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