如何正确使用UVM工厂find_override_by_name判断类重载是否成功?
UVM工厂类重载判断方法修正
问题分析
你当前代码返回null主要有三个核心问题:
- 上下文参数错误:
find_override_by_name的第二个参数(上下文路径)不需要拼接多余的.,全局重载查询直接传空字符串""即可,组件范围查询传当前组件的get_full_name()。 - phase调用顺序错误:需先调用父类的
end_of_elaboration_phase,确保工厂完成所有重载注册后再执行查询。 - 打印格式错误:
%m用于打印层级路径,无法正确显示uvm_object_wrapper的类型信息,需用%s配合get_type_name()输出。
修正后的代码
virtual function void end_of_elaboration_phase(uvm_phase phase); uvm_object_wrapper wrapper1; // 先执行父类phase,确保工厂重载注册完成 super.end_of_elaboration_phase(phase); // 全局重载查询:上下文传空字符串 wrapper1 = factory.find_override_by_name("write_ahb_item", ""); // 若仅查询当前组件范围内的重载,改用下方语句 // wrapper1 = factory.find_override_by_name("write_ahb_item", this.get_full_name()); // 清晰输出重载结果 if(wrapper1 != null) begin $display("write_ahb_item 重载成功,目标类型: %s", wrapper1.get_type_name()); end else begin $display("write_ahb_item 未重载"); end uvm_top.print_topology(); endfunction
额外验证方法
除了find_override_by_name,还可以通过以下方式确认重载是否生效:
- 打印工厂完整重载映射:调用
factory.print();,直接查看所有类的重载关系。 - 实例化后验证类型:创建对象后通过
get_type_name()确认实际类型:write_ahb_item item; item = write_ahb_item::type_id::create("item", this); $display("实际创建对象类型: %s", item.get_type_name());
内容的提问来源于stack exchange,提问作者bu-ral
相关产品推荐
相关产品推荐

