跳转至

输入查询内容

    本页内容

    __m_uvm_field_automation 签名变更 + __m_uvm_status_container 删除

    内部实现:文件组织、内部数据结构与实现钩子的变化。直接依赖内部接口时查阅,普通 API 的使用不需要重审这些源码。

    影响范围

    手写旧 automation override,或读写旧 status container;只改签名不能恢复操作调用。

    具体差异

    __m_uvm_field_automation 并未从类中删除,2.0 保留了第二参为 uvm_field_flag_t 的空实现;字段操作主路径已改为 do_execute_op()。旧手写 override 可能因签名不匹配报错,即使同步签名也不能恢复操作分派。应区分“兼容空钩子仍存在但不再由标准操作调用”与“status container 被删除”;后者的直接引用才是符号缺失的编译断点。 utils_begin/end 宏生成的函数也由 __m_uvm_field_automation 改为 do_execute_op(uvm_field_op op),并用局部 __m_uvm_execute_field_op 分派 COPY/COMPARE/PRINT/RECORD/PACK/UNPACK/SET 等操作。旧内部辅助宏 m_uvm_print_int / m_uvm_record_* 同步退出旧分派路径;手写这些宏的代码改用对应 policy API。只使用 field 宏的代码无需手写分派函数,但仍须按 M09-002 核对 FLAG

    修改方案

    手写 automation 改为对应 do_copy/do_compare/do_print/do_pack/do_record,或在确需统一操作分派时 override do_execute_op(uvm_field_op op)(M01-011);不再读写旧 status container,改用对应 comparer/printer 等策略对象的接口与结果。只改旧钩子签名不能恢复操作调用。

    兼容措施与范围:主库保留旧 automation 钩子的空实现,但不会恢复旧字段操作分派;status container 引用仍需改写。

    迁移后验证

    在迁移后的 do_* 或 do_execute_op 中计数;执行 copy/compare/print/pack,注入字段差异并检查对应钩子确实运行、compare 返回不等。

    记录核销:在无规则及补充检查中记录实际依赖与证据。

    已有实测与复现

    补充查阅

    扫描定位与记录结果

    有扫描规则,覆盖部分可识别写法。脚本检查名称、参数和部分 FLAG 表达式,并对少数直接声明关联使用点;未做完整类型解析或预处理,行为结果仍需验证。

    • C11 · 文本匹配:field automation 旧钩子不再被调用,status container/scope stack 删除。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules C11
    

    核对命中对象及生效分支后,在条目清单记录修改与验证证据;扫描规则记录用于整理命中位置。

    扫描器下载、输入范围与报告说明

    源码与标准依据

    核查方式:源码与实测核对。实测仅覆盖本条所列场景。

    VCS 内置 UVM-1.2uvm_object.svh:804__m_uvm_status_container)、uvm_object.svh:807(声明,int what__)、uvm_object.svh:1172(实现) ;补充:uvm_object_defines.svh:153

    VCS 内置 uvm-ieee-2020-2.0uvm_object.svh:744(声明,uvm_field_flag_t what__)、uvm_object.svh:1010(实现);status container 已不存在 ;补充:uvm_object_defines.svh:177

    标准依据:IEEE 1800.2-2020 §5.3.13(do_execute_op)、§5.7(uvm_field_op)

    标为“源码标注”或未注明原文核对的条款仅作定位;具体库行为以源码和实测为准。

    引用代码(高亮为引用行);上方行号链接可直接定位。

    src/vcs-uvm-1.2/base/uvm_object.svh
      local int m_inst_id;
      static protected int m_inst_count;
    
      static /*protected*/ uvm_status_container __m_uvm_status_container = new;
    
      extern virtual function void __m_uvm_field_automation (uvm_object tmp_data__,  
                                                       int        what__, 
                                                       string     str__);
    
      extern protected virtual function uvm_report_object m_get_report_object();
    
      // the lookup table
      local static uvm_object uvm_global_copy_map[uvm_object];
    endclass
    
    //------------------------------------------------------------------------------
    // IMPLEMENTATION
    //------------------------------------------------------------------------------
    
    // new
    // ---
    

    src/vcs-uvm-1.2/base/uvm_object.svh
    // ------------------
    
    function void uvm_object::__m_uvm_field_automation (uvm_object tmp_data__,
                                                  int        what__,
                                                  string     str__ );
      return;
    endfunction
    
    
    
    // do_print (virtual override)
    // ------------
    
    function void uvm_object::do_print(uvm_printer printer);
      return;
    endfunction
    
    
    // m_pack
    

    完整源码 · SHA256:5bacc747c3d5a16a0206864bd84eedf1aeff153a7152dcb0d0e40af208fbe4ec

    src/vcs-uvm-1.2/macros/uvm_object_defines.svh
    // implementations of these two methods, or when you are setting up field macros
    // for an abstract class (i.e. virtual class).
    
    `define uvm_field_utils_begin(T) \
       function void __m_uvm_field_automation (uvm_object tmp_data__, \
                                         int what__, \
                                         string str__); \
       begin \
         T local_data__; /* Used for copy and compare */ \
         typedef T ___local_type____; \
         string string_aa_key; /* Used for associative array lookups */ \
         uvm_object __current_scopes[$]; \
         if(what__ inside {UVM_SETINT,UVM_SETSTR,UVM_SETOBJ}) begin \
            if(__m_uvm_status_container.m_do_cycle_check(this)) begin \
                return; \
            end \
            else \
                __current_scopes=__m_uvm_status_container.m_uvm_cycle_scopes; \
         end \
    

    完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1

    src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh
      static protected int m_inst_count;
    
      extern virtual function void __m_uvm_field_automation (uvm_object tmp_data__,  
                                                       uvm_field_flag_t what__, 
                                                       string           str__);
    
      extern protected virtual function uvm_report_object m_get_report_object();
    
    
      // Compatibility methods
    
      //@uvm-compat for compatibility with 1.2
      extern virtual function void  set_int_local    (string      field_name,
                                                      uvm_bitstream_t value,
                                                      bit         recurse=1);
    
      //@uvm-compat for compatibility with 1.2
      extern virtual function void  set_string_local (string field_name,
                                                      string value,
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_object.svh
    // ------------------
    
    function void uvm_object::__m_uvm_field_automation (uvm_object tmp_data__,
                                                  uvm_field_flag_t what__,
                                                  string           str__ );
      return;
    endfunction
    
    
    
    // do_print (virtual override)
    // ------------
    
    function void uvm_object::do_print(uvm_printer printer);
      return;
    endfunction
    
    
    // m_pack
    

    完整源码 · SHA256:53c99f38f1ce6cb3c6a215858b84938d18eb858f9396d3dba281a32addb3c9c9

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_object_defines.svh
    // <do_execute_op> method.
    
    // @uvm-ieee 1800.2-2020 auto B.2.1.1
    `define uvm_field_utils_begin(T)                                                \
    function void do_execute_op( uvm_field_op op );                                 \
      super.do_execute_op(op);                                                      \
      __m_uvm_execute_field_op(op);                                                 \
    endfunction : do_execute_op                                                     \
    local function void __m_uvm_execute_field_op( uvm_field_op __local_op__ );      \
       uvm_field_flag_t local_op_type__; /* Used to avoid re-querying */            \
       T local_rhs__; /* Used for $casting copy and compare */                      \
       uvm_resource_base local_rsrc__; /* Used for UVM_SET ops */                   \
       string local_rsrc_name__;                                                    \
       uvm_object local_obj__; /* Used when trying to read uvm_object resources */  \
       bit local_success__; /* Used when trying to read resources */                \
       typedef T __local_type__; /* Used for referring to type T in field macros */ \
       int local_size__; /* Used when unpacking size values */                      \
       /* All possible policy classes */                                            \
       /* Using the same name as the do_* methods, allows macro reuse */            \
    

    完整源码 · SHA256:072baece05e653f6811936de05739a8ff55c02651d89a9278f39cca11372a260

    术语解释 · 兼容配置

    新增 uvm_policy / uvm_copier / uvm_field_op 与 do_execute_op / set_local 钩子(M01-011) · uvm_field_* automation(M09-002)

    返回Field Automation / 版本宏 · 迁移清单

    版本适用范围