UVM工厂注册歧义问题:多包同名类重复注册的解决方法问询
解决UVM不同包同名类工厂注册冲突的方案
当两个包中存在大量同名类,且都通过uvm_object_utils宏注册到UVM工厂时,冲突的根源是UVM工厂默认使用类的简单名称字符串作为注册键,导致重复注册警告。以下是几种可行的解决方法:
1. 修改类名,添加包标识前缀
直接给不同包的类名加上包名前缀,从根源上区分类型名称,确保工厂注册的字符串唯一。这种方法直观且彻底,适合允许修改包源码的场景。
pkg_A.sv 修改后:
class pkg_A_some_name; `uvm_object_utils(pkg_A_some_name) function new(string name = "pkg_A_some_name"); super.new(name); endfunction endclass
pkg_B.sv 修改后:
class pkg_B_some_name; `uvm_object_utils(pkg_B_some_name) function new(string name = "pkg_B_some_name"); super.new(name); endfunction endclass
2. 自定义UVM工厂注册的字符串
无需修改类名,通过uvm_object_utils宏的第二个参数指定自定义注册字符串,让不同包的类使用不同的注册键。这种方法保留原类名,仅修改注册逻辑。
pkg_A.sv 修改后:
class some_name; // 第二个参数指定注册到工厂的字符串 `uvm_object_utils(some_name, "pkg_A_some_name") function new(string name = "some_name"); super.new(name); endfunction endclass
pkg_B.sv 修改后:
class some_name; `uvm_object_utils(some_name, "pkg_B_some_name") function new(string name = "some_name"); super.new(name); endfunction endclass
后续通过字符串查找创建对象时,需要使用自定义的注册字符串:
uvm_object obj = uvm_factory::get().create_object_by_name("pkg_A_some_name", get_full_name(), "obj");
而通过类型直接创建时不受影响,因为编译器能通过包名区分不同类:
pkg_A::some_name obj = pkg_A::some_name::type_id::create("obj", this);
3. 重写get_type_name方法
通过重写类的get_type_name虚函数,让不同包的类返回不同的类型名称字符串,UVM工厂会使用该返回值作为注册键。
pkg_A.sv 修改后:
class some_name; `uvm_object_utils(some_name) function new(string name = "some_name"); super.new(name); endfunction virtual function string get_type_name(); return "pkg_A_some_name"; endfunction endclass
pkg_B.sv 修改后:
class some_name; `uvm_object_utils(some_name) function new(string name = "some_name"); super.new(name); endfunction virtual function string get_type_name(); return "pkg_B_some_name"; endfunction endclass
4. 避免全局导入,使用包名限定访问
如果不需要同时使用两个包的同类名类,避免使用import pkg_A::*;和import pkg_B::*;的全局导入方式,而是通过包名直接限定访问类:
// 直接使用包名访问,无需全局导入 pkg_A::some_name obj_a = pkg_A::some_name::type_id::create("obj_a", this); pkg_B::some_name obj_b = pkg_B::some_name::type_id::create("obj_b", this);
注意:这种方法仅解决编译时的名称冲突,工厂注册的警告仍会存在,需要配合前面的方法(如自定义注册字符串或重写get_type_name)彻底消除警告。
内容的提问来源于stack exchange,提问作者bradpin
相关产品推荐
相关产品推荐

