跳转至

输入查询内容

    本页内容

    自定义 recorder 的对象递归与文本输出

    影响范围

    自定义 recorder 的对象递归实现或解析文本 inst_id。

    具体差异

    2.0 基类提供 do_record_object 默认递归实现,record_object 的 cycle_check/递归由基类 m_recur_states 接管。已有 override 且签名相同的子类无需改动;但子类若靠 super.do_record_object 之外自行调 value.record(this) 做递归,2.0 下会与新机制叠加(循环检测报错路径变化)。另:uvm_text_recorder 记录对象 id 的属性名由"字段名"改为固定 "inst_id"uvm_recorder.svh:819),解析 tr_db.log 的脚本注意。

    修改方案

    仅用于手工递归的 do_record_object override 可移除,由目标基类递归。需要自定义属性时保留该 override,但只保留一次递归入口:选择 super.do_record_object(name, value) 后,删除重复的 value.record(this)。自定义后端仍保留必要的写属性逻辑;文本后处理改为读取 inst_id,并核对嵌套对象身份。

    兼容措施与范围:主库保留 tr_handle、physical/abstract/identifier/default_radix/policy 字段;对象递归和 inst_id 输出仍按目标语义核对。 相关实现:uvm_recorder.svh:104

    迁移后验证

    记录含嵌套对象和重复引用的样例,核对递归次数与对象身份;检查覆盖 do_record_object 后是否意外重复递归。

    记录本条结果M02-007 · 状态与证据

    补充查阅

    扫描定位与记录结果

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

    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules S27
    

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

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

    源码与标准依据

    核查方式:源码核对。未单独进行 VCS 行为实测。

    VCS 内置 UVM-1.2uvm_recorder.svh:613(pure virtual do_record_object)、uvm_recorder.svh:43(extends uvm_object)

    VCS 内置 uvm-ieee-2020-2.0uvm_recorder.svh:513(virtual 默认实现,内部走 do_execute_op+do_record)、uvm_recorder.svh:48(extends uvm_policy)、uvm_recorder.svh:149(flush)

    标准依据:IEEE 1800.2-2020 §16.4.7.7(Mantis 6591 将 LRM pure virtual 改 virtual)

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

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

    src/vcs-uvm-1.2/base/uvm_recorder.svh
    //
    //------------------------------------------------------------------------------
    
    virtual class uvm_recorder extends uvm_object;
    
      // Variable- m_stream_dap
      // Data access protected reference to the stream
      local uvm_set_before_get_dap#(uvm_tr_stream) m_stream_dap;
    
      // Variable- m_warn_null_stream
      // Used to limit the number of warnings 
      local bit m_warn_null_stream;
    
      // Variable- m_is_opened
      // Used to indicate recorder is open
      local bit m_is_opened;
    
      // Variable- m_is_closed
      // Used to indicate recorder is closed
    

    src/vcs-uvm-1.2/base/uvm_recorder.svh
       // Records an object field.
       //
       // ~Mandatory~ Backend implementation of <record_object>
       pure virtual protected function void do_record_object(string name,
                                                             uvm_object value);
    
       // Function: do_record_string
       // Records a string field.
       //
       // ~Mandatory~ Backend implementation of <record_string>
       pure virtual protected function void do_record_string(string name,
                                                             string value);
    
       // Function: do_record_time
       // Records a time field.
       //
       // ~Mandatory~ Backend implementation of <record_time>
       pure virtual protected function void do_record_time(string name,
                                                           time value);
    

    完整源码 · SHA256:c27078db07e6a49a9e91f17c4c41251a60b1d6f1bad2c8adbc959a5f7322f6c1

    src/vcs-uvm-ieee-2020-2.0/base/uvm_recorder.svh
    //------------------------------------------------------------------------------
    
    // @uvm-ieee 1800.2-2020 auto 16.4.1
    virtual class uvm_recorder extends uvm_policy;
    
       `uvm_object_abstract_utils(uvm_recorder)
    
      // Variable- m_stream_dap
      // Data access protected reference to the stream
      local uvm_set_before_get_dap#(uvm_tr_stream) m_stream_dap;
    
      // Variable- m_warn_null_stream
      // Used to limit the number of warnings 
      local bit m_warn_null_stream;
    
      // Variable- m_is_opened
      // Used to indicate recorder is open
      local bit m_is_opened;
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_recorder.svh
      endfunction : get_default_radix
    
      // @uvm-ieee 1800.2-2020 auto 16.4.4.1
      virtual function void flush();
        policy      = UVM_DEFAULT_POLICY;
        identifier  = 1;
        free();
        m_recur_states.delete();
      endfunction : flush
    
       // Variable- m_ids_by_recorder
       // An associative array of int, indexed by uvm_recorders.  This
       // provides a unique 'id' or 'handle' for each recorder, which can be
       // used to identify the recorder.
       //
       // By default, neither ~m_ids_by_recorder~ or ~m_recorders_by_id~ are
       // used.  Recorders are only placed in the arrays when the user
       // attempts to determine the id for a recorder.
       local static int m_ids_by_recorder[uvm_recorder];
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_recorder.svh
       // virtual protected function void do_record_object(string name, uvm_object value);
    
       // @uvm-ieee 1800.2-2020 auto 16.4.7.7
       virtual protected function void do_record_object(string name,
                                                        uvm_object value);
         if ((get_recursion_policy() != UVM_REFERENCE) &&
             (value != null)) begin
           uvm_field_op field_op = uvm_field_op::m_get_available_op();
           field_op.set(UVM_RECORD, this, null);
           value.do_execute_op(field_op);
           if (field_op.user_hook_enabled())
             value.do_record(this);
           field_op.m_recycle();
         end
       endfunction : do_record_object
    
       // @uvm-ieee 1800.2-2020 auto 16.4.7.8
       virtual function uvm_policy::recursion_state_e object_recorded ( uvm_object value,
                                                                        uvm_recursion_policy_enum recursion);
    

    完整源码 · SHA256:7ddfdb26fbb8381875d930eb499dced2bc6d95eabd5252e13a39ce2abb7c6b6a

    术语解释 · 兼容配置

    返回Comparer / Printer / Packer / Recorder · 迁移清单

    版本适用范围