跳转至

输入查询内容

    本页内容

    uvm_event#(T) trigger 默认数据机制:新增 set/get_default_data,reset 清数据

    影响范围

    reset 后继续读取 event trigger_data,或使用默认触发数据。

    具体差异

    默认参数从硬编码 null 变为可配置的 default data。reset() 后 1.2 保留旧 trigger_data,2.0 清回 default,已由 semantic_probe 对跑验证。2.0 还把 on/trigger_time/trigger_data 赋值移到事件触发前;此处仅描述源码顺序,不承诺消除用户 TB 中所有零延迟竞争。

    修改方案

    需要在 reset 后使用上一次数据时,在 reset 前读取并保存到用户变量;后续消费该变量,不再向已 reset 的 event 取旧值。若业务需要默认数据,显式设置 set_default_data 并按默认值语义读取;两种意图不能混用。

    以下代码位于顺序执行的 task 中,ev 为默认 uvm_event#(uvm_object)last_itemuvm_object 句柄,且本次数据已触发、尚未被其他进程 reset。

    旧代码在 reset 后取上一次数据:

    ev.reset();
    last_item = ev.get_trigger_data();
    

    需要保留上一次数据时,在 reset 前保存:

    1
    2
    3
    last_item = ev.get_trigger_data();
    ev.reset();
    // Consume last_item instead of reading the reset event again.
    

    需要访问业务字段时,先 $cast 到自己的事务类型并检查结果。该变量保存的是对象句柄;需要保留不受后续写入影响的快照时,应另行 clone 并检查转换结果。存在并发 producer/consumer 时,先用现有握手确定“数据已消费后再 reset”的边界,不能只交换两行代码就认为竞争已消除。

    若真正需要的是默认数据,可在目标版设置 ev.set_default_data(default_item)。此后无参 trigger() 和 reset 后的读回都按 default data 语义处理;这不会自动保存每次触发的历史数据。

    兼容措施与范围:现有入口无需兼容开关;这不表示两版行为相同,仍按本条条件和验证方法核对。

    迁移后验证

    设置 default data,trigger 后 reset 并读回;目标应回到 default。并发等待者的采样时点按实际 TB 调度另测。

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

    已有实测与复现

    补充查阅

    扫描定位与记录结果

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

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

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_event.svh:309trigger(T data=null));reset() 不清 trigger_data

    VCS 内置 uvm-ieee-2020-2.0uvm_event.svh:336trigger(T data=get_default_data()))、uvm_event.svh:370/uvm_event.svh:375get/set_default_data)、uvm_event.svh:297reset()trigger_data 重置为 default 后调 super.reset

    标准依据:IEEE 1800.2-2020 §10.1.2.2.4(trigger)

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

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

    src/vcs-uvm-1.2/base/uvm_event.svh
        // An optional ~data~ argument can be supplied with the enable to provide
        // trigger-specific information.
    
        virtual function void trigger (T data=null);
            int skip;
            skip=0;
            if (callbacks.size()) begin
                for (int i=0;i<callbacks.size();i++) begin
                    uvm_event_callback#(T) tmp=callbacks[i];
                    skip = skip + tmp.pre_trigger(this,data);
                end
            end
            if (skip==0) begin
                ->m_event;
                if (callbacks.size()) begin
                    for (int i=0;i<callbacks.size();i++) begin
                        uvm_event_callback#(T) tmp=callbacks[i];
                        tmp.post_trigger(this,data);
                    end
    

    完整源码 · SHA256:c12a1067eb864f11ddc75556f783609622b4f331f5b22a488b5c9bea88ae691a

    src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh
        //
        // Resets the event to its off state and clears trigger data to its default state.
    
        virtual function void reset (bit wakeup = 0);
            trigger_data = get_default_data();
              super.reset(wakeup);
            endfunction : reset
    
        // Task -- NODOCS -- wait_trigger_data
        //
        // This method calls <uvm_event_base::wait_trigger> followed by <get_trigger_data>.
    
        // @uvm-ieee 1800.2-2020 auto 10.1.2.2.2
        virtual task wait_trigger_data (output T data);
            wait_trigger();
            data = get_trigger_data();
        endtask
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh
        // trigger-specific information.
    
        // @uvm-ieee 1800.2-2020 auto 10.1.2.2.4
        virtual function void trigger (T data=get_default_data());
          int   skip;
          cb_type cb_q[$];
          skip=0;
          cbs_type::get_all(cb_q, this);
    
          // Call all pre_trigger, bail out after
          // if any return !0
          foreach (cb_q[i])
            skip += cb_q[i].pre_trigger(this, data);
          if (skip==0) begin
            on = 1;
            trigger_time = $realtime;
            trigger_data = data;
            ->m_event;
            foreach (cb_q[i])
    

    src/vcs-uvm-ieee-2020-2.0/base/uvm_event.svh
            // Function -- NODOCS -- default data
    
            // @uvm-ieee 1800.2-2020 auto 10.1.2.2.6
            virtual function T get_default_data();
           return default_data;
        endfunction : get_default_data
    
            // @uvm-ieee 1800.2-2020 auto 10.1.2.2.6
            virtual function void set_default_data(T data);
           default_data = data;
        endfunction : set_default_data
    
        virtual function void do_print (uvm_printer printer);
           uvm_event#(uvm_object) oe;
           cb_type cb_q[$];
    
           super.do_print(printer);
    
           // Printing the callbacks
           cbs_type::get_all(cb_q, this);
               printer.print_array_header("callbacks", cb_q.size(), "queue");
           foreach(cb_q[e])
             printer.print_object($sformatf("[%0d]", e), cb_q[e], "[");
               printer.print_array_footer(cb_q.size());
    

    完整源码 · SHA256:69083cec211fdace8c2839987abc413ecad3fec1fbe13cbf7ba1c720ec170181

    术语解释 · 兼容配置

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

    版本适用范围