跳转至

输入查询内容

    本页内容

    不要直接 new sequence/sequencer 抽象基类

    影响范围

    直接 new sequence_base/sequencer_base/sequencer_param_base。

    具体差异

    1.2 的 sequence_base 可直接 new;2.0 直接构造抽象类会编译失败。通过新 abstract registry 的 create 调用可编译,但无具体 override 时运行报告抽象创建错误;两条路径必须区分。声明抽象类型句柄不受影响。uvm_sequence#(REQ,RSP) 在 1.2 已为 virtual。库内 execute_item 改用具体 m_uvm_sqr_seq_base。

    修改方案

    直接构造 uvm_sequence_base 的代码改用具体业务 sequence,或在确需通用具体 sequence 时使用 uvm_compat_proxy_sequence#(REQ,RSP)。直接构造 uvm_sequencer_base / uvm_sequencer_param_base 的代码需改成匹配 REQ/RSP 的 uvm_sequencer#(REQ,RSP) 或业务派生 sequencer;声明基类句柄不要求改写。

    如果原来直接构造 sequencer 基类:

    uvm_sequencer_base seqr = new("seqr", this);
    

    改用与 driver 请求类型一致的具体 sequencer,例如 bus_item

    uvm_sequencer#(bus_item) seqr = new("seqr", this);
    

    仅声明 uvm_sequencer_base seqr; 句柄不受影响。sequence 一侧优先创建已有的具体业务 sequence;uvm_compat_proxy_sequence 只用于确需通用 sequence 对象的场景,不能替代 sequencer。

    兼容措施与范围

    显式使用兼容包提供的类或宏后生效。uvm_compat_proxy_sequence 只承接 sequence 的构造,不是 sequencer 的替代类(src/vcs-uvm-ieee-2020-2.0/compat/uvm_compat_proxy_sequence.svh:35)。

    迁移后验证

    编译具体派生类或 compat proxy;运行至少一笔请求并检查 item 类型、parent 和 sequencer 关联。

    记录本条结果M06-004 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

    • C8 · 文本匹配:uvm_sequence_base 新增抽象限制;uvm_sequence 在 1.2 已抽象。 覆盖规则所列直接构造与 type_id::create,支持先声明后赋值;使用调用处可见声明,typedef、宏、类外定义与跨文件类型仍可能漏报。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules C8
    

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_sequence_base.svh:134uvm_sequencer_base.svh:41uvm_sequencer_param_base.svh:31

    VCS 内置 uvm-ieee-2020-2.0uvm_sequence_base.svh:143virtual class + `uvm_object_abstract_utils)、src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_base.svh:50src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequencer_param_base.svh:37

    标准依据:IEEE 1800.2-2020 §14.2.1(virtual class uvm_sequence_base extends uvm_sequence_item

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

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

    src/vcs-uvm-1.2/seq/uvm_sequence_base.svh
    // will produce a run-time error.
    //------------------------------------------------------------------------------
    
    class uvm_sequence_base extends uvm_sequence_item;
    
      protected uvm_sequence_state m_sequence_state;
                int                m_next_transaction_id = 1;
      local     int                m_priority = -1;
                uvm_recorder       m_tr_recorder;
                int                m_wait_for_grant_semaphore;
    
      // Each sequencer will assign a sequence id.  When a sequence is talking to multiple
      // sequencers, each sequence_id is managed separately
      protected int m_sqr_seq_ids[int];
    
      protected bit children_array[uvm_sequence_base];
    
      protected uvm_sequence_item response_queue[$];
      protected int               response_queue_depth = 8;
    

    完整源码 · SHA256:1594d38afd79cb400a689fdbe6c8e33ff60714bb7527cd8d79739d9357b31682

    src/vcs-uvm-1.2/seq/uvm_sequencer_base.svh
    //
    //------------------------------------------------------------------------------
    
    class uvm_sequencer_base extends uvm_component;
    
      typedef enum {SEQ_TYPE_REQ,
                    SEQ_TYPE_LOCK,
                    SEQ_TYPE_GRAB} seq_req_t; // FIXME SEQ_TYPE_GRAB is unused
    
    // queue of sequences waiting for arbitration
      protected uvm_sequence_request arb_sequence_q[$];
    
      protected bit                 arb_completed[int];
    
      protected uvm_sequence_base   lock_list[$];
      protected uvm_sequence_base   reg_sequences[int];
      protected int                 m_sequencer_id;
      protected int                 m_lock_arb_size;  // used for waiting processes
      protected int                 m_arb_size;       // used for waiting processes
    

    完整源码 · SHA256:66b7addbfd531ae8a5579d82e77865fab23259c17a87a43ee4d1dbf7d67133fd

    src/vcs-uvm-1.2/seq/uvm_sequencer_param_base.svh
    // request (REQ) and response (RSP) types.
    //------------------------------------------------------------------------------
    
    class uvm_sequencer_param_base #(type REQ = uvm_sequence_item,
                                     type RSP = REQ) extends uvm_sequencer_base;
    
      typedef uvm_sequencer_param_base #( REQ , RSP) this_type;
      typedef REQ req_type;
      typedef RSP rsp_type;
    
      REQ m_last_req_buffer[$];
      RSP m_last_rsp_buffer[$];
    
      protected int m_num_last_reqs = 1;
      protected int num_last_items = m_num_last_reqs;
      protected int m_num_last_rsps = 1;
      protected int m_num_reqs_sent;
      protected int m_num_rsps_received;
      uvm_sequencer_analysis_fifo #(RSP) sqr_rsp_analysis_fifo;
    

    完整源码 · SHA256:f9ff13f008702014f969b332b9915301a0a0b32dededf21214c83fe3f16245f3

    src/vcs-uvm-ieee-2020-2.0/seq/uvm_sequence_base.svh
    //------------------------------------------------------------------------------
    
    // @uvm-ieee 1800.2-2020 auto 14.2.1
    virtual class uvm_sequence_base extends uvm_sequence_item;
      `uvm_object_abstract_utils(uvm_sequence_base)
    
    
      // This semaphore is provided to ensure that a sequence is only being
      // run from a single thread at a time.
      protected semaphore          m_sequence_state_mutex;
      protected uvm_sequence_state m_sequence_state;
                int                m_next_transaction_id = 1;
      local     int                m_priority = -1;
                uvm_recorder       m_tr_recorder;
                int                m_wait_for_grant_semaphore;
    
      // Each sequencer will assign a sequence id.  When a sequence is talking to multiple
      // sequencers, each sequence_id is managed separately
      protected int m_sqr_seq_ids[int];
    

    完整源码 · SHA256:aedbad6d9991d5712dd8e5e676a9fb5487ab33af52219ae4786e6adaa7001375

    src/vcs-uvm-ieee-2020-2.0/compat/uvm_compat_proxy_sequence.svh
    // were defined as abstract, meaning they can't be arbitrarily instanced.
    // 
    
    class uvm_compat_proxy_sequence #(type REQ = uvm_sequence_item,
                                      type RSP = REQ) extends uvm_sequence#(REQ,RSP);
      `uvm_object_param_utils(uvm_compat_proxy_sequence#(REQ,RSP))
      function new(string name="unnamed-uvm_compat_proxy_sequence");
        super.new(name);
      endfunction : new
    endclass : uvm_compat_proxy_sequence
    

    完整源码 · SHA256:788faafd415984971746d2d42f9fe61f4286f541191e603fb2aa7267b3d5af6a

    术语解释 · 兼容配置

    返回Sequence / Sequencer · 迁移清单

    版本适用范围