跳转至

输入查询内容

    本页内容

    callback 注册与重复 catcher 调用次数

    影响范围

    同时注册全局与实例 catcher、动态增删回调或重复调用 get_all 的环境需核对。

    具体差异

    m_cb_find_name 及 UVM/CB/NAM/SAM 同名告警删除;同一句柄的重复注册检查仍存在,不能将同名对象等同于同一对象。新增 get_all 将选中的 callback 按实例 ID 去重后追加到调用者队列,并不先清空传入队列。原 VCS 1.2 的全局 catcher 合并去重分支删除,依赖多层注册的环境须核对实际调用次数。

    修改方案

    注册按句柄管理;反复 get_all 前清空输出队列。utility_probe 先注册全局 catcher 再注册实例 catcher,全局调用次数为 1 / 2,实例均为 1;先完成实例注册再添加全局 catcher,两库均各调用一次。这个顺序替代仅覆盖初始化后注册集合固定的场景;后续动态创建实例或增删 catcher 必须重新核对,不能以 get_all 的去重结果推断执行路径只调用一次(S23)。

    兼容措施与范围:兼容措施不恢复 catcher 执行去重;固定注册顺序仅覆盖已验证的静态集合,动态生命周期仍需核对。

    已知限制KI-010

    迁移后验证

    分别用两种注册顺序发出一条已知消息,计数每个 catcher 的调用次数;动态注册/删除流程另测,不能以 get_all 去重证明执行队列不重复。

    记录本条结果M01-016 · 状态与证据

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_callback.svh:670uvm_callback.svh:681(对象队列合并时的 UVM_NO_GLOBAL_CATCHER_DUPL_CHK 分支)

    VCS 内置 uvm-ieee-2020-2.0uvm_callback.svh:666(队列合并)、uvm_callback.svh:926(get_all)

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

    src/vcs-uvm-1.2/base/uvm_callback.svh
            // Need to make sure that registered report catchers are added. This
            // way users don't need to set up uvm_report_object as a super type.
            uvm_report_object o;
            `ifndef UVM_NO_GLOBAL_CATCHER_DUPL_CHK 
            int qn;
            `endif 
    
            if($cast(o,obj)) begin
              uvm_queue#(uvm_callback) qr;
          void'(uvm_callbacks#(uvm_report_object, uvm_callback)::get());
              qr = uvm_callbacks#(uvm_report_object,uvm_callback)::m_t_inst.m_tw_cb_q;
              for(int i=0; i<qr.size(); ++i)
                  q.push_back(qr.get(i)); 
            end
            `ifndef UVM_NO_GLOBAL_CATCHER_DUPL_CHK 
    
            // Following change is done to avoid global catcher getting duplicated 
            // if instance-specific one is added later
            qn = q.size();
            for(int i=0; i<m_t_inst.m_tw_cb_q.size(); ++i) begin
               q.push_back(m_t_inst.m_tw_cb_q.get(i));
               // Don't add if already added by the implicit super::uvm_report_object
               for (int j = 0; j < qn; j++) begin
                  if (q.get(j) == m_t_inst.m_tw_cb_q.get(i)) begin
                     void'(q.pop_back());
                     break;
                  end
               end
            end
            `else 
    

    完整源码 · SHA256:e44692d204e7437d26b8068373bff2bc4820bc42bfd14d0302728deb87de16a9

    src/vcs-uvm-ieee-2020-2.0/base/uvm_callback.svh
            for(int i=0; i<m_t_inst.m_tw_cb_q.size(); ++i)
              q.push_back(m_t_inst.m_tw_cb_q.get(i)); 
          end
    
          //check if already exists in the queue
          if(m_cb_find(q,cb) != -1) begin
            uvm_report_warning("CBPREG", { "Callback object ", cb.get_name(), " is already registered",
                               " with object ", obj.get_full_name() }, UVM_NONE);
          end
          else begin
            if(ordering == UVM_APPEND)
              q.push_back(cb);
            else
              q.push_front(cb);
          end
        end
      endfunction
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_callback.svh
      endfunction
    
      // @uvm-ieee 1800.2-2020 auto 10.7.2.5
      static function void get_all ( ref CB all_callbacks[$], input T obj=null );
        uvm_queue#(uvm_callback) q;
        CB cb;
        CB callbacks_to_append[$];
        CB unique_callbacks_to_append[$];
    
        void'( get() );
    
        if ((obj == null) || (!m_pool.exists(obj))) begin
          // Only typewide callbacks exist
          for (int qi=0; qi<m_t_inst.m_tw_cb_q.size(); ++qi) 
        if ($cast(cb, m_t_inst.m_tw_cb_q.get(qi)))
          callbacks_to_append.push_back( cb );
        end
        else begin
          // No need to do anything special with typewide,
    

    完整源码 · SHA256:71ec97c6557f0245e0e58e51c5d138c106eacc7f288be1f154972f4ebc56d97a

    术语解释 · 兼容配置

    返回Object / Factory · 迁移清单

    版本适用范围