UVM类型转换方法详解与代码示例 一、六种类型转换方法的代码示例 1. $cast方法(运行时检查) // 基类和子类定义 class Base extends uvm_object; virtual functionvoid display ( ) ; `uvm_info ( "BASE" , "Base class display" , UVM_LOW) ; endfunction endclassclass Derived extends Base; functionvoid display_derived ( ) ; `uvm_info ( "DERIVED" , "Derived class display" , UVM_LOW) ; endfunctionvirtual functionvoid display ( ) ; `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. 虚方法方式(无需转换) // 基类定义 class Base extends uvm_object; virtual functionvoid display ( ) ; `uvm_info ( "BASE" , "Base class display" , UVM_LOW) ; endfunction endclass// 子类定义(重写虚方法) class Derived extends Base; virtual functionvoid display ( ) ; `uvm_info ( "DERIVED" , "Derived class display" , UVM_LOW) ; endfunction endclass// 使用虚方法(无需类型转换) Base base_obj= Derived:: type_id:: create ( ) ; base_obj. display ( ) ; // 自动调用子类实现,无需转换 4. Factory覆盖方法(类型替换) // 定义两个可互换的类 class NormalDriver extends uvm_driver; virtual taskrun_phase ( uvm_phase phase) ; `uvm_info ( "DRIVER" , "Normal driver running" , UVM_LOW) ; endtask endclassclass LowPowerDriver extends uvm_driver; virtual taskrun_phase ( uvm_phase phase) ; `uvm_info ( "DRIVER" , "Low power driver running" , UVM_LOW) ; endtask endclass// 在测试类中使用Factory覆盖 class my_test extends uvm_test; functionvoid build_phase ( uvm_phase phase) ; // 全局类型覆盖:将所有NormalDriver替换为LowPowerDriver uvm_factory:: set_type_override_by_type ( NormalDriver :: get_type ( ) , LowPowerDriver :: get_type ( ) ) ; // 实例覆盖:仅替换特定路径下的实例 uvm_factory:: set_inst_override_by_name ( "env.driver" , "LowPowerDriver" ) ; endfunction endclass5. 类型识别+转换方法(双重保障) // 基类和子类定义 class Transaction extends uvm_object; rand bit[ 31 : 0 ] addr; rand bit[ 31 : 0 ] data; endclassclass SpecialTransaction extends 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:使用$cast SpecialTransaction st; if ( ! $cast ( st, obj) ) begin `uvm_error ( "CAST" , "Unexpected error during cast" ) ; endelse begin `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处理多态) // 定义回调类 class my_callbacks extends uvm_callbacks; virtual taskpre_tran ( uvm_driver drv, ref Transaction tr) ; // 默认实现为空 endtask endclass// 在驱动器中注册回调 class my_driver extends uvm_driver; function