跳转至

输入查询内容

    本页内容

    pack、unpack、record 宏的文件拆分

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

    影响范围

    直接 include uvm_object_defines.svh 并依赖其中的 pack/unpack/record 子宏。通过 uvm_macros.svh 使用默认 policy 参数的原调用保持源码兼容;公开 pack 位流变化由 M02-001 承接。

    具体差异

    宏从 uvm_object_defines.svh 拆到 5 个新 policy defines 文件(对用户透明,include 由 uvm_macros.svh 完成);签名新增默认实参(PACKER=packerRECORDER=recorderCOMPARER=comparerCOPIER=copier),在 do_pack(uvm_packer packer) 等标准上下文中的既有调用保持源码兼容。

    修改方案

    直接 include 子宏文件的代码改用 uvm_macros.svh;跨版本打包须遵循 M02-001 的逐位验收,不能仅替换 compat packer。

    兼容措施与范围

    显式使用兼容包提供的类或宏后生效。部分(仅 packer 行为有 uvm_compat_packer 替代类;宏本身无需覆盖)。

    迁移后验证

    改用 uvm_macros.svh 后编译全部使用方;跨边界位流仍与 1.2 golden 逐位对照,文件包含成功不能证明数据兼容。

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

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_object_defines.svh:3481uvm_record_attribute)、uvm_object_defines.svh:3502uvm_record_int)、uvm_object_defines.svh:3699uvm_pack_int

    VCS 内置 uvm-ieee-2020-2.0uvm_packer_defines.svh:136uvm_pack_int(VAR,PACKER=packer))、uvm_recorder_defines.svh:77/uvm_recorder_defines.svh:100uvm_comparer_defines.svh:52uvm_copier_defines.svh:36uvm_resource_defines.svh:41;统一由 uvm_macros.svh:114–119 编入

    标准依据:IEEE 1800.2-2020 §B.2.4(pack/unpack 宏)

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

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

    src/vcs-uvm-1.2/macros/uvm_object_defines.svh
    `ifndef uvm_record_attribute
     `ifdef QUESTA
        `define uvm_record_attribute(TR_HANDLE,NAME,VALUE) \
          $add_attribute(TR_HANDLE,VALUE,NAME);
      `else
        `define uvm_record_attribute(TR_HANDLE,NAME,VALUE) \
          recorder.record_generic(NAME, $sformatf("%p", VALUE)); 
      `endif
    `endif
    
    // Macro: `uvm_record_int
    //
    //| `uvm_record_int(NAME,VALUE,SIZE[,RADIX])
    //
    // The ~`uvm_record_int~ macro takes the same arguments as
    // the <uvm_recorder::record_field> method (including the optional ~RADIX~).
    //
    // The default implementation will pass the name/value pair to
    

    src/vcs-uvm-1.2/macros/uvm_object_defines.svh
    //
    
    `ifndef uvm_record_int
      `define uvm_record_int(NAME,VALUE,SIZE,RADIX = UVM_NORADIX) \
        if (recorder != null && recorder.is_open()) begin \
          if (recorder.use_record_attribute()) \
            `uvm_record_attribute(recorder.get_record_attribute_handle(),NAME,VALUE) \
          else \
            if (SIZE > 64) \
              recorder.record_field(NAME, VALUE, SIZE, RADIX); \
            else \
              recorder.record_field_int(NAME, VALUE, SIZE, RADIX); \
        end
    `endif
    
    // Macro: `uvm_record_string
    //
    //| `uvm_record_string(NAME,VALUE)
    //
    

    src/vcs-uvm-1.2/macros/uvm_object_defines.svh
    //
    //| `uvm_pack_int(VAR)
    //
    `define uvm_pack_int(VAR) \
       `uvm_pack_intN(VAR,$bits(VAR))
    
    
    // Macro: `uvm_pack_enum
    //
    // Pack an enumeration value. Packing does not require its type be specified.
    //
    //| `uvm_pack_enum(VAR)
    //
    `define uvm_pack_enum(VAR) \
       `uvm_pack_enumN(VAR,$bits(VAR))
    
    
    // Macro: `uvm_pack_string
    //
    

    完整源码 · SHA256:fad4b0a983286e771a025f28de582e35b21fd1dc49d8fcc5c1b2be9f4ebe99d1

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_packer_defines.svh
    // @uvm-ieee 1800.2-2020 auto B.2.4.6
    `define uvm_pack_int(VAR,PACKER=packer) \
       `uvm_pack_intN(VAR,$bits(VAR),PACKER)
    
    // uvm_pack_object
    `define uvm_pack_object(VAR,PACKER=packer) \
      PACKER.pack_object_with_meta(VAR);
    
    // @uvm-ieee 1800.2-2020 auto B.2.4.7
    `define uvm_pack_enum(VAR,PACKER=packer) \
       `uvm_pack_enumN(VAR,$bits(VAR),PACKER)
    
    
    
    // @uvm-ieee 1800.2-2020 auto B.2.4.8
    `define uvm_pack_string(VAR,PACKER=packer) \
      PACKER.pack_string(VAR);
    

    完整源码 · SHA256:08f5c945fa7d7fe4bb53cb9478756c920dfff5d1e86bbbd93054999813f717ab

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_recorder_defines.svh
    `ifndef uvm_record_attribute
     `ifdef QUESTA
        `define uvm_record_attribute(TR_HANDLE,NAME,VALUE,RECORDER=recorder) \
          $add_attribute(TR_HANDLE,VALUE,NAME);
      `else
        // @uvm-ieee 1800.2-2020 auto B.2.3.1
        `define uvm_record_attribute(TR_HANDLE,NAME,VALUE,RECORDER=recorder) \
          RECORDER.record_generic(NAME, $sformatf("%p", VALUE)); 
      `endif
    `endif
    
    // Macro -- NODOCS -- `uvm_record_int
    //
    //| `uvm_record_int(NAME,VALUE,SIZE[,RADIX])
    //
    // The ~`uvm_record_int~ macro takes the same arguments as
    // the <uvm_recorder::record_field> method (including the optional ~RADIX~).
    //
    

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_recorder_defines.svh
    `ifndef uvm_record_int
      // @uvm-ieee 1800.2-2020 auto B.2.3.2
      `define uvm_record_int(NAME,VALUE,SIZE,RADIX = UVM_NORADIX,RECORDER=recorder) \
        if (RECORDER != null && RECORDER.is_open()) begin \
          if (RECORDER.use_record_attribute()) \
            `uvm_record_attribute(RECORDER.get_record_attribute_handle(),NAME,VALUE,RECORDER) \
          else \
            if (SIZE > 64) \
              RECORDER.record_field(NAME, VALUE, SIZE, RADIX); \
            else \
              RECORDER.record_field_int(NAME, VALUE, SIZE, RADIX); \
        end
    `endif
    
    // Macro -- NODOCS -- `uvm_record_string
    //
    //| `uvm_record_string(NAME,VALUE)
    //
    

    完整源码 · SHA256:182dfa5e33826150d5ad29527498a0dfb0418ab868e578332308841cb4c84c00

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_comparer_defines.svh
      `m_uvm_compare_threshold_end
    
    // uvm_compare_int
    `define uvm_compare_int(LVALUE, RVALUE, RADIX, COMPARER=comparer) \
      `uvm_compare_named_int(`"LVALUE`", LVALUE, RVALUE, RADIX, COMPARER)
    
    `define uvm_compare_named_int(NAME, LVALUE, RVALUE, RADIX, COMPARER=comparer) \
      `m_uvm_compare_begin(LVALUE, RVALUE, COMPARER) \
         if ($bits(LVALUE) <= 64) \
           void'(COMPARER.compare_field_int(NAME , LVALUE, RVALUE, $bits(LVALUE), RADIX)); \
         else \
           void'(COMPARER.compare_field(NAME , LVALUE, RVALUE, $bits(LVALUE), RADIX)); \
      `m_uvm_compare_end 
    
    // uvm_compare_enum
    
    `define uvm_compare_enum(LVALUE, RVALUE, TYPE, COMPARER=comparer) \
      `uvm_compare_named_enum(`"LVALUE`", LVALUE, RVALUE, TYPE, COMPARER) 
    

    完整源码 · SHA256:bc5a1f24eadb26912cc84e92d77fdd35970a281965fa6afc60d9b56b02d36352

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_copier_defines.svh
    // uvm_copy_object
    
    `define uvm_copy_object(LVALUE, RVALUE, POLICY=UVM_DEFAULT_POLICY, COPIER=copier) \
    if (LVALUE != RVALUE) begin \
      if ((RVALUE == null) || \
          (POLICY == UVM_REFERENCE) || \
          ((POLICY == UVM_DEFAULT_POLICY) && \
           (COPIER.get_recursion_policy() == UVM_REFERENCE))) begin \
        LVALUE = RVALUE; \
      end \
      else begin \
        uvm_object lvalue_ref__; \
        if (!COPIER.get_first_copy(RVALUE,lvalue_ref__) || !$cast(LVALUE,lvalue_ref__)) begin \
            uvm_recursion_policy_enum prev_pol__ = COPIER.get_recursion_policy(); \
            uvm_recursion_policy_enum curr_pol__; \
            if (POLICY != UVM_DEFAULT_POLICY) \
              COPIER.set_recursion_policy(POLICY); \
            curr_pol__ = COPIER.get_recursion_policy(); \
    

    完整源码 · SHA256:44dd0b5d425833a899da4dddfe96cce59c3d30b65b54a1991fead765da9aae73

    src/vcs-uvm-ieee-2020-2.0/macros/uvm_resource_defines.svh
    // ~SUCCESS~ shall be set to true if the resource was succesfully
    // read, false otherwise.
    
    `define uvm_resource_read(SUCCESS, RSRC, TYPE, VAL, OBJ=null)   \
    begin                                                           \
      uvm_resource#(TYPE) __tmp_rsrc__;                             \
      SUCCESS = $cast(__tmp_rsrc__, RSRC);                          \
      if (SUCCESS) begin                                            \
        VAL = __tmp_rsrc__.read(OBJ);                               \
      end                                                           \
    end                                                             
    
    // uvm_resource_builtin_int_read
    // -----------------------------
    // Attempts to read an integral typed resource ~RSRC~
    // into VAL.
    //
    // ~SUCCESS~ shall be set to true if the resource was succesfully
    // read, false otherwise.
    

    完整源码 · SHA256:6d3002de0c763a865adac11b443e5788d646b2c30f653cd3b831372a1bca051b

    src/vcs-uvm-ieee-2020-2.0/uvm_macros.svh
    `include "macros/snps_macros.svp"
    `include "macros/uvm_message_defines.svh"
    `include "macros/uvm_phase_defines.svh"
    `include "macros/uvm_printer_defines.svh"
    `include "macros/uvm_comparer_defines.svh"
    `include "macros/uvm_recorder_defines.svh"
    `include "macros/uvm_resource_defines.svh"
    `include "macros/uvm_packer_defines.svh"
    `include "macros/uvm_copier_defines.svh"
    //`ifdef UVM_ENABLE_DEPRECATED_API
     //`include "deprecated/macros/uvm_object_defines.svh"
    //`else
     `include "macros/uvm_object_defines.svh"
    //`endif
    `include "macros/uvm_tlm_defines.svh"
    `include "macros/uvm_sequence_defines.svh"
    `include "macros/uvm_callback_defines.svh"
    `include "macros/uvm_reg_defines.svh"
    

    完整源码 · SHA256:d85eb414948cb37c6249b33c0c7f728296e86f833a81d772c86e09245d8df764

    术语解释 · 兼容配置

    pack 位流格式改变(M02-001)

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

    版本适用范围