跳转至

输入查询内容

    本页内容

    类抽象性调整(uvm_reg/uvm_reg_block/uvm_reg_file/uvm_reg_cbs 去 virtual;uvm_vreg_cbs/uvm_vreg_field_cbs 加 virtual)

    影响范围

    直接 new uvm_vreg_cbs 或 uvm_vreg_field_cbs。

    具体差异

    前四个类在 2.0 可直接实例化(正向放宽,无破坏);后两个回调基类变为抽象类,直接实例化 uvm_vreg_cbs 的代码会报错(正常用法均为 extend)。uvm_reg_frontdoor 同步补挂 uvm_object_abstract_utils(1.2 src/vcs-uvm-1.2/reg/uvm_reg_sequence.svh:517 → 2.0 src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_sequence.svh:395)。

    修改方案

    将直接构造的 uvm_vreg_cbs / uvm_vreg_field_cbs 换成自己的具体派生类:构造函数接收 string name 并调用 super.new(name),原回调方法体迁入对应 override。uvm_callbacks 注册的对象仍指向原 vreg/field,传入新派生实例;原本已经使用具体回调类的代码可保留。uvm_reg/uvm_reg_block/uvm_reg_file/uvm_reg_cbs 的抽象限制放宽不要求反向修改已有派生类。

    兼容措施与范围:兼容措施不恢复直接构造抽象 vreg callback;原有具体回调类可保留并验证挂载。

    迁移后验证

    编译具体派生 callback,注册后触发一次访问,确认需要的回调运行;不对已可构造的其他类强制改写。

    记录本条结果M07-013 · 状态与证据

    补充查阅

    扫描定位与记录结果

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

    • C25 · 启发式:直接构造目标抽象 backdoor、callback 或 socket 基类。 区分基类句柄声明和直接 new,支持先声明后赋值及嵌套类型参数;同文件按词法作用域和局部遮蔽关联,复杂路径、typedef、类外定义与预处理仍需人工核对。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules C25
    

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_reg.svh:37uvm_reg_block.svh:38uvm_reg_file.svh:34uvm_reg_cbs.svh:44(均为 virtual class);uvm_vreg.svh:617uvm_vreg_field.svh:378(普通 class)

    VCS 内置 uvm-ieee-2020-2.0uvm_reg.svh:90uvm_reg_block.svh:33uvm_reg_file.svh:30uvm_reg_cbs.svh:48(均为普通 class);uvm_vreg.svh:342uvm_vreg_field.svh:237virtual class,并加 uvm_object_abstract_utils

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

    src/vcs-uvm-1.2/reg/uvm_reg.svh
    // A register may be mapped to one or more address maps,
    // each with different access rights and policy.
    //-----------------------------------------------------------------
    virtual class uvm_reg extends uvm_object;
    
       local bit               m_locked;
       local uvm_reg_block     m_parent;
       local uvm_reg_file      m_regfile_parent;
       local int unsigned      m_n_bits;
       local int unsigned      m_n_used_bits;
       protected bit           m_maps[uvm_reg_map];
       protected uvm_reg_field m_fields[$];   // Fields in LSB to MSB order
       local int               m_has_cover;
       local int               m_cover_on;
       local semaphore         m_atomic;
       local process           m_process;
       local string            m_fname;
       local int               m_lineno;
       local bit               m_read_in_progress;
    

    完整源码 · SHA256:a01d27ace4190cce87f4bf8f78d0db63b1517ffb43a412e187e67391984971b6

    src/vcs-uvm-1.2/reg/uvm_reg_block.svh
    // interface on the block.
    //
    //------------------------------------------------------------------------
    virtual class uvm_reg_block extends uvm_object;
    
       local uvm_reg_block  parent;
    
       local static bit     m_roots[uvm_reg_block];
       local int unsigned   blks[uvm_reg_block];
       local int unsigned   regs[uvm_reg];
       `ifdef UVM_SPARSE_ARRAY
       local int unsigned   regarrays[uvm_reg_file];
       `endif
       local int unsigned   vregs[uvm_vreg];
       local int unsigned   mems[uvm_mem];
       local bit            maps[uvm_reg_map];
    
       // Variable: default_path
       // Default access path for the registers and memories in this block.
    

    完整源码 · SHA256:6ca6f50282876b0cf52951223df74e4f721ad7443e194ec27b1e6dd995da8d43

    src/vcs-uvm-1.2/reg/uvm_reg_file.svh
    //
    // Register files are usually instantiated as arrays.
    //
    virtual class uvm_reg_file extends uvm_object;
    
       local uvm_reg_block     parent;
       local uvm_reg_file   m_rf;
       local string            default_hdl_path = "RTL";
       local uvm_object_string_pool #(uvm_queue #(string)) hdl_paths_pool;
    
    
       //----------------------
       // Group: Initialization
       //----------------------
    
       //
       // Function: new
       //
       // Create a new instance
    

    完整源码 · SHA256:fe1bcac3b7ab995a94d88d2bb783769bfa05853f5a1a42ddfa19c32b9e0794c5

    src/vcs-uvm-1.2/reg/uvm_reg_cbs.svh
    // access callback methods. 
    //------------------------------------------------------------------------------
    
    virtual class uvm_reg_cbs extends uvm_callback;
    
       function new(string name = "uvm_reg_cbs");
          super.new(name);
       endfunction
    
    
       // Task: pre_write
       //
       // Called before a write operation.
       //
       // All registered ~pre_write~ callback methods are invoked after the
       // invocation of the ~pre_write~ method of associated object (<uvm_reg>,
       // <uvm_reg_field>, <uvm_mem>, or <uvm_reg_backdoor>). If the element being
       // written is a <uvm_reg>, all ~pre_write~ callback methods are invoked
       // before the contained <uvm_reg_fields>. 
    

    完整源码 · SHA256:dc5277e4b6183544014a9d50c4f44fb510c5a08c9943143a0c30a6d7d6e3ca98

    src/vcs-uvm-1.2/reg/uvm_vreg.svh
    //
    //------------------------------------------------------------------------------
    
    class uvm_vreg_cbs extends uvm_callback;
    
       string fname;
       int    lineno;
    
       function new(string name = "uvm_reg_cbs");
          super.new(name);
       endfunction
    
    
       //
       // Task: pre_write
       // Callback called before a write operation.
       //
       // The registered callback methods are invoked after the invocation
       // of the <uvm_vreg::pre_write()> method.
    

    完整源码 · SHA256:c55c17b0cd5e422d35188c7688c3c98a4d6e547b6eeaed2edc5714dc49eb04e4

    src/vcs-uvm-1.2/reg/uvm_vreg_field.svh
    //
    //------------------------------------------------------------------------------
    
    class uvm_vreg_field_cbs extends uvm_callback;
       string fname;
       int    lineno;
    
       function new(string name = "uvm_vreg_field_cbs");
          super.new(name);
       endfunction
    
    
       //
       // Task: pre_write
       // Callback called before a write operation.
       //
       // The registered callback methods are invoked before the invocation
       // of the virtual register pre-write callbacks and
       // after the invocation of the <uvm_vreg_field::pre_write()> method.
    

    完整源码 · SHA256:06c614e32675c7ff38df1d67098abcd171e041d0eb0228236e19a708777c9bba

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg.svh
    // the addition of API described below.
    
    // @uvm-ieee 1800.2-2020 auto 18.4.1
    class uvm_reg extends uvm_object;
    
       local bit               m_locked;
       local uvm_reg_block     m_parent;
       local uvm_reg_file      m_regfile_parent;
       local int unsigned      m_n_bits;
       local int unsigned      m_n_used_bits;
       protected bit           m_maps[uvm_reg_map];
       protected uvm_reg_field m_fields[$];   // Fields in LSB to MSB order
       local int               m_has_cover;
       local int               m_cover_on;
       local semaphore         m_atomic;
       local process           m_process;
       local string            m_fname;
       local int               m_lineno;
       local bit               m_read_in_progress;
    

    完整源码 · SHA256:a0b3ba54fe8e7a696018aa531a0e93c98cfdc89c74073dfcf7eed58b9833618e

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh
    // @uvm-ieee 1800.2-2020 auto 18.1.1
    class uvm_reg_block extends uvm_object;
    
    
       `uvm_object_utils(uvm_reg_block)
    
    
       local uvm_reg_block  parent;
    
       local static bit     m_roots[uvm_reg_block]; 
       local static int unsigned m_root_names[string];
    
       local string               m_name;
       local static bit           m_enable_reg_lookup_cache; 
       local static uvm_reg_block m_reg_block_registry[string];
    
       local uvm_reg_block  blks[int unsigned];
    

    完整源码 · SHA256:8ddc84d53bbce80c641eb7a6c02b0fef630ee9244c536d195d3dc93c068e2915

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_file.svh
    // @uvm-ieee 1800.2-2020 auto 18.3.1
    class uvm_reg_file extends uvm_object;
    
       local uvm_reg_block     parent;
       local uvm_reg_file   m_rf;
       local string            default_hdl_path = "RTL";
       local uvm_object_string_pool #(uvm_queue #(string)) hdl_paths_pool;
    
    
       `uvm_object_utils(uvm_reg_file)
    
    
       //----------------------
       // Group -- NODOCS -- Initialization
       //----------------------
    

    完整源码 · SHA256:9fe02e0a466f0dc2810e286dda97b667271ff8b314ba8ec43f8bcb9376080f7b

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_cbs.svh
    //------------------------------------------------------------------------------
    
    // @uvm-ieee 1800.2-2020 auto 18.11.1
    class uvm_reg_cbs extends uvm_callback;
    
       `uvm_object_utils(uvm_reg_cbs)
    
    
       // @uvm-ieee 1800.2-2020 auto 18.11.2.1
       function new(string name = "uvm_reg_cbs");
          super.new(name);
       endfunction
    
    
    
       // @uvm-ieee 1800.2-2020 auto 18.11.2.2
       virtual task pre_write(uvm_reg_item rw); endtask
    

    完整源码 · SHA256:ec950ba966406566bba26041d749769bd04a5c362a3870e823353f615ed98c1f

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_vreg.svh
    //------------------------------------------------------------------------------
    
    // @uvm-ieee 1800.2-2020 auto 18.9.2.1
    virtual class uvm_vreg_cbs extends uvm_callback;
    
       `uvm_object_abstract_utils(uvm_vreg_cbs)
    
       string fname;
       int    lineno;
    
       function new(string name = "uvm_reg_cbs");
          super.new(name);
       endfunction
    
    
    
       // @uvm-ieee 1800.2-2020 auto 18.9.2.2.1
       virtual task pre_write(uvm_vreg         rg,
                              longint unsigned     idx,
    

    完整源码 · SHA256:8c3e9d9002f9ad4e16d2bbd1f37c5a03303a038521092198ef8ea00619f55682

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_vreg_field.svh
    //------------------------------------------------------------------------------
    
    // @uvm-ieee 1800.2-2020 auto 18.10.6.1
    virtual class uvm_vreg_field_cbs extends uvm_callback;
       string fname;
       int    lineno;
    
    
       `uvm_object_abstract_utils(uvm_vreg_field_cbs)
    
       function new(string name = "uvm_vreg_field_cbs");
          super.new(name);
       endfunction
    
    
    
       // @uvm-ieee 1800.2-2020 auto 18.10.6.2.1
       virtual task pre_write(uvm_vreg_field       field,
                              longint unsigned     idx,
    

    完整源码 · SHA256:48504073360ea6afa0a6fdba009863209d65e9465ac00dafe48e8a31be058ec7

    src/vcs-uvm-1.2/reg/uvm_reg_sequence.svh
    // The frontdoor allows access using a non-linear and/or non-mapped mechanism.
    // Users can extend this class to provide the physical access to these registers.
    //
    virtual class uvm_reg_frontdoor extends uvm_reg_sequence #(uvm_sequence #(uvm_sequence_item));
    
       // Variable: rw_info
       //
       // Holds information about the register being read or written
       //
       uvm_reg_item rw_info;
    
       // Variable: sequencer
       //
       // Sequencer executing the operation
       //
       uvm_sequencer_base sequencer;
    
       // Function: new
       //
    

    完整源码 · SHA256:7a1ac0e79f51749d06dcde2977fbfc881c5f866ad37bb831f0e8380bada05664

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_sequence.svh
    // @uvm-ieee 1800.2-2020 auto 19.4.2.1
    virtual class uvm_reg_frontdoor extends uvm_reg_sequence #(uvm_sequence #(uvm_sequence_item));
    
       `uvm_object_abstract_utils(uvm_reg_frontdoor)
    
    
       // Variable -- NODOCS -- rw_info
       //
       // Holds information about the register being read or written
       //
       uvm_reg_item rw_info;
    
       // Variable -- NODOCS -- sequencer
       //
       // Sequencer executing the operation
       //
       uvm_sequencer_base sequencer;
    

    完整源码 · SHA256:6edc59e13f8136932b1f31bcb0c69d640ccc294438d675185546872a393a5849

    术语解释 · 兼容配置

    返回RAL(寄存器模型) · 迁移清单

    版本适用范围