跳转至

输入查询内容

    本页内容

    event 回调改用 uvm_callbacks 注册和删除

    影响范围

    对 uvm_event 调用 add_callback/delete_callback 或定制回调基类的代码需修改;同名的用户接口先确认类型。

    具体差异

    ev.add_callback(cb) 使用 event 自带队列;目标改用 uvm_callbacks#(uvm_event#(T), uvm_event_callback#(T))::add(ev, cb) / ::delete(ev, cb)。库的 uvm_event_callback#(T) 改为继承 uvm_callback,用户派生类仍应继承 uvm_event_callback#(T),并保留匹配同一 T 的 pre_trigger/post_trigger。直接改成 extends uvm_callback 会失去 event 回调类型契约。

    修改方案

    确认接收者为 event 后替换注册/删除调用。旧 ev.add_callback(cb) 对应 uvm_callbacks#(uvm_event#(T), uvm_event_callback#(T))::add(ev, cb);旧 ev.add_callback(cb, 0) 表示插到队首,须显式传第三参 UVM_PREPEND。删除用同一特化类型的 ::delete(ev, cb)。核对回调顺序及 pre_trigger 的阻止触发返回值。

    evuvm_event#(uvm_object)cb 是继承 uvm_event_callback#(uvm_object) 的回调对象。

    旧写法:

    ev.add_callback(cb);
    ev.delete_callback(cb);
    

    目标写法(注册与删除发生在各自原来的时机):

    1
    2
    3
    4
    typedef uvm_callbacks#(uvm_event#(uvm_object),
                          uvm_event_callback#(uvm_object)) event_callbacks;
    event_callbacks::add(ev, cb);
    event_callbacks::delete(ev, cb);
    

    若事件使用自定义数据类型,两处 uvm_object 都替换为该类型。旧 add_callback(cb, 0) 要保留队首插入顺序,改为 event_callbacks::add(ev, cb, UVM_PREPEND)

    兼容措施与范围:旧 event 注册方法不再提供;用户回调仍继承 uvm_event_callback#(T),注册类型与顺序须匹配。

    迁移后验证

    注册后 trigger 一次,检查 pre_trigger/post_trigger 次数与数据;删除 callback 后再次 trigger,确认不再回调。

    记录本条结果M03-001 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

    • C4 · 启发式:uvm_event::add_callback/delete_callback 删除。 识别带接收者及类内继承调用,允许点号附近的空白和注释;通用 callback 方法名仍需确认属于 uvm_event。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules C4
    

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_event.svh:357add_callback)、uvm_event.svh:375delete_callback);uvm_event_callback.svh:40virtual class uvm_event_callback#(T) extends uvm_object

    VCS 内置 uvm-ieee-2020-2.0:两个方法不存在;uvm_event_callback.svh:43extends uvm_callback);注册走标准回调机制 uvm_event.svh:254–272cbs_type typedef + m_register_cb

    标准依据:IEEE 1800.2-2020 §10.2(uvm_event_callback 经 uvm_callbacks 挂接,源码标注 @uvm-ieee 1800.2-2020 auto 10.1.x

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

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

    src/vcs-uvm-1.2/base/uvm_event.svh
        // to 1, the default, ~cb~ is added to the back of the callback list. Otherwise,
        // ~cb~ is placed at the front of the callback list.
    
        virtual function void add_callback (uvm_event_callback#(T) cb, bit append=1);
            for (int i=0;i<callbacks.size();i++) begin
                if (cb == callbacks[i]) begin
                    uvm_report_warning("CBRGED","add_callback: Callback already registered. Ignoring.", UVM_NONE);
                    return;
                end
            end
            if (append)
                callbacks.push_back(cb);
            else
                callbacks.push_front(cb);
        endfunction
    
    
        // Function: delete_callback
        //
        // Unregisters the given callback, ~cb~, from this event. 
    
        virtual function void delete_callback (uvm_event_callback#(T) cb);
            for (int i=0;i<callbacks.size();i++) begin
                if (cb == callbacks[i]) begin
                    callbacks.delete(i);
                    return;
                end
            end
            uvm_report_warning("CBNTFD", "delete_callback: Callback not found. Ignoring delete request.", UVM_NONE);
        endfunction
    
        virtual function void do_print (uvm_printer printer);
    `ifdef UVM_EVENT_CALLBACK_FIX                
                    uvm_object tmp_object;
    `endif
    
            super.do_print(printer);
    

    完整源码 · SHA256:c12a1067eb864f11ddc75556f783609622b4f331f5b22a488b5c9bea88ae691a

    src/vcs-uvm-1.2/base/uvm_event_callback.svh
    //
    //------------------------------------------------------------------------------
    
    virtual class uvm_event_callback#(type T=uvm_object) extends uvm_object;
    
      // Function: new
      //
      // Creates a new callback object.
    
      function new (string name=""); 
        super.new(name);
      endfunction
    
    
      // Function: pre_trigger
      //
      // This callback is called just before triggering the associated event.
      // In a derived class, override this method to implement any pre-trigger
      // functionality.
    

    完整源码 · SHA256:99c1a7a5e84aac4f49c44d4be76e75407ee7a7c7548c7ec8854cb74feae99042

    src/vcs-uvm-ieee-2020-2.0/base/uvm_event_callback.svh
    //------------------------------------------------------------------------------
    
    // @uvm-ieee 1800.2-2020 auto 10.2.1
    virtual class uvm_event_callback#(type T=uvm_object) extends uvm_callback;
    
      // Function -- NODOCS -- new
      //
      // Creates a new callback object.
    
      // @uvm-ieee 1800.2-2020 auto 10.2.2.1
      function new (string name=""); 
        super.new(name);
      endfunction
    
    
      // Function -- NODOCS -- pre_trigger
      //
      // This callback is called just before triggering the associated event.
      // In a derived class, override this method to implement any pre-trigger
    

    完整源码 · SHA256:1d0f52d0c44af4aaac8e04360eb42cd620efd6e85283d17b65ee6b6ea24ad81b

    src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh
    class uvm_event#(type T=uvm_object) extends uvm_event_base;
    
            typedef uvm_event#(T) this_type;
            typedef uvm_event_callback#(T) cb_type;
    
            // Type: cbs_type
            // Callback typedef for this event type.
            //
            // | typedef uvm_callbacks#(this_type, cb_type) cbs_type;
            // @uvm-contrib Potential Contribution to 1800.2
            typedef uvm_callbacks#(this_type, cb_type) cbs_type;
    
            // Not using `uvm_register_cb(this_type, cb_type)
            // so as to try and get ~slightly~ better debug
            // output for names.
            static local function bit m_register_cb();
           return uvm_callbacks#(this_type,cb_type)::m_register_pair(
                                                    "uvm_pkg::uvm_event#(T)",
                                                    "uvm_pkg::uvm_event_callback#(T)"
                                                         );
        endfunction : m_register_cb
            static local bit m_cb_registered = m_register_cb();
    

    完整源码 · SHA256:69083cec211fdace8c2839987abc413ecad3fec1fbe13cbf7ba1c720ec170181

    术语解释 · 兼容配置

    返回Phase / Objection / Event · 迁移清单

    版本适用范围