【UVM】UVM类型转换方法详解与代码示例--$cast/静态转换/虚方法/Factory覆盖/类型识别+转换/Callback机制

张开发
2026/4/5 1:43:39 15 分钟阅读

分享文章

【UVM】UVM类型转换方法详解与代码示例--$cast/静态转换/虚方法/Factory覆盖/类型识别+转换/Callback机制
UVM类型转换方法详解与代码示例一、六种类型转换方法的代码示例1. $cast方法(运行时检查)// 基类和子类定义classBaseextends uvm_object;virtualfunctionvoiddisplay();`uvm_info("BASE","Base class display",UVM_LOW);endfunction endclassclassDerivedextends Base;functionvoiddisplay_derived();`uvm_info("DERIVED","Derived class display",UVM_LOW);endfunctionvirtualfunctionvoiddisplay();`uvm_info("DERIVED","Overridden display method",UVM_LOW);endfunction endclass// 使用$cast进行类型转换Base base_obj=Derived::type_id::create();Derived derived_obj;// 安全转换并检查if(!$cast(derived_obj,base_obj))begin `uvm_fatal("CAST_ERR","Cast failed - object is not of type Derived");return;end// 成功转换后可访问子类特有方法derived_obj.display_derived();2. 静态转换方法(编译时检查)// 基类和子类定义同上// 使用静态转换Base base_obj=Derived::type_id::create();Derived derived_obj=Derived'(base_obj);// 直接转换,无运行时检查// 访问子类特有方法derived_obj.display_derived();3. 虚方法方式(无需转换)// 基类定义classBaseextends uvm_object;virtualfunctionvoiddisplay();`uvm_info("BASE","Base class display",UVM_LOW);endfunction endclass// 子类定义(重写虚方法)classDerivedextends Base;virtualfunctionvoiddisplay();`uvm_info("DERIVED","Derived class display",UVM_LOW);endfunction endclass// 使用虚方法(无需类型转换)Base base_obj=Derived::type_id::create();base_obj.display();// 自动调用子类实现,无需转换4. Factory覆盖方法(类型替换)// 定义两个可互换的类classNormalDriverextends uvm_driver;virtualtaskrun_phase(uvm_phase phase);`uvm_info("DRIVER","Normal driver running",UVM_LOW);endtask endclassclassLowPowerDriverextends uvm_driver;virtualtaskrun_phase(uvm_phase phase);`uvm_info("DRIVER","Low power driver running",UVM_LOW);endtask endclass// 在测试类中使用Factory覆盖classmy_testextends uvm_test;functionvoidbuild_phase(uvm_phase phase);// 全局类型覆盖:将所有NormalDriver替换为LowPowerDriveruvm_factory::set_type_override_by_type(NormalDriver::get_type(),LowPowerDriver::get_type());// 实例覆盖:仅替换特定路径下的实例uvm_factory::set_inst_override_by_name("env.driver","LowPowerDriver");endfunction endclass5. 类型识别+转换方法(双重保障)// 基类和子类定义classTransactionextends uvm_object;rand bit[31:0]addr;rand bit[31:0]data;endclassclassSpecialTransactionextends Transaction;rand bit[7:0]extra_field;endclass// 类型识别与转换Transaction tr=SpecialTransaction::type_id::create();uvm_object obj=tr;// 先识别类型,再进行转换if(obj.get_type_name()=="SpecialTransaction")begin// 方法1:使用$castSpecialTransaction st;if(!$cast(st,obj))begin `uvm_error("CAST","Unexpected error during cast");endelsebegin `uvm_info("CAST",$sformatf("Extra field: %0d",st.extra_field),UVM_MEDIUM);end// 方法2:使用静态转换(此时已确认类型)SpecialTransaction st2=SpecialTransaction'(obj);`uvm_info("CAST",$sformatf("Extra field (static): %0d",st2.extra_field),UVM_MEDIUM);end6. Callback机制(结合$cast处理多态)// 定义回调类classmy_callbacksextends uvm_callbacks;virtualtaskpre_tran(uvm_driver drv,ref Transaction tr);// 默认实现为空endtask endclass// 在驱动器中注册回调classmy_driverextends uvm_driver;function

更多文章