跳转至

输入查询内容

    本页内容

    旧 FGP 类与集成文件已删除

    影响范围

    显式引用 uvm_fgp_* 类或依赖旧 FGP 集成。

    具体差异

    1.2 中 uvm_pkg 编译时自动带入 VCS FGP(fine-grained parallelism)支持类;2.0 移除。显式使用 uvm_fgp_* 类或依赖旧集成文件的环境需要核对;仅凭这些文件删除不能推断全部 VCS 并行功能被移除。

    修改方案

    若环境引用 uvm_fgp_thread_object/uvm_fgpinit_phase,需联系 Synopsys 确认替代方案;否则无

    兼容措施与范围:旧 FGP 文件和类不恢复;目标替代流程仍待产品确认,不能据此推断全部并行能力被移除。

    已知限制KI-014

    迁移后验证

    整理最小类引用、完整工具版本和并行编译参数,先确认目标支持路径;替代方案确定后检查编译、功能结果和实际并行配置。本项目尚无该路径的实测替代。

    记录本条结果M10-007 · 状态与证据

    补充查阅

    扫描定位与记录结果

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

    • D8 · 文本匹配:VCS FGP / native_dumping 相关(uvm_fgp_*/vcs_uvm_alt/native_dumping)。
    uv run tools/uvm_migration_scan.py <SoC代码目录> --rules D8
    

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

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

    源码与标准依据

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

    VCS 内置 UVM-1.2vcs_uvm_alt.sv:3–165uvm_fgp_thread_objectuvm_fgpinit_phase 等细粒度并行支持类),由 uvm_pkg.sv:43`ifdef VCS 下 include

    VCS 内置 uvm-ieee-2020-2.0src/vcs-uvm-ieee-2020-2.0/uvm_pkg.sv(全文无 vcs/ include,文件已删除)

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

    src/vcs-uvm-1.2/vcs/vcs_uvm_alt.sv
    `protect
    
    class uvm_fgp_thread_object_base;
        static uvm_fgp_thread_object_base registeredObjs[$];
        static function void initObjs();
            foreach (registeredObjs[i]) begin
                registeredObjs[i].initDynamicArray();
            end
        endfunction
    
        virtual function void initDynamicArray();
        endfunction
    endclass
    
    class uvm_fgp_thread_object#(type T = uvm_object) extends uvm_fgp_thread_object_base;
    `define MAX_FIXED_FGP_UVM_T_SIZE 16
        T faObjs[`MAX_FIXED_FGP_UVM_T_SIZE];
        T daObjs[];
    
        function new();
            for (int i = 0; i < `MAX_FIXED_FGP_UVM_T_SIZE; i++) begin
                faObjs[i] = null;
            end
            uvm_fgp_thread_object_base::registeredObjs.push_back(this);
        endfunction
    
        function int unsigned get_thread_index();
            return 0;
        endfunction
    
        function int unsigned get_max_thread();
            return 0;
        endfunction
    
    
        // this function is only be available after fgp initialization phase 
        virtual function void initDynamicArray();
            int unsigned size = get_max_thread();
            if (size <= `MAX_FIXED_FGP_UVM_T_SIZE) begin
                return;
            end
    
            size = size - `MAX_FIXED_FGP_UVM_T_SIZE;
            daObjs = new [size];
            for (int i = 0; i < size; i++) begin
                daObjs[i] = null;
            end
        endfunction
    
        function T get_wrapper();
            T obj = null;
            int unsigned index = get_thread_index();
            if (index < `MAX_FIXED_FGP_UVM_T_SIZE) begin
                if (faObjs[index] == null) begin
                    faObjs[index] = new;
                end
                obj = faObjs[index];
            end
            else begin
                index = index - `MAX_FIXED_FGP_UVM_T_SIZE;
                if (daObjs[index] == null) begin
                    daObjs[index] = new;
                end
                obj = daObjs[index];
            end
            return obj;
        endfunction
    endclass
    
    class uvm_fgpinit_phase extends uvm_topdown_phase;
       local static uvm_fgpinit_phase m_inst;
       int flag;
       static const string type_name = "uvm_fgpinit_phase";
       static function uvm_fgpinit_phase get();
          if(m_inst == null) begin
             m_inst = new;
             m_inst.flag = 0;
          end
          return m_inst;
       endfunction
       protected function new(string name="vcs_fgp_init");
          super.new(name);
       endfunction
       virtual function string get_type_name();
          return type_name;
       endfunction
    
       function void fgp_uvm_component_info(uvm_component c1, uvm_component c2, string name, int flag);
    
       endfunction
    
       virtual function void execute (uvm_component comp, uvm_phase phase); 
            uvm_agent isAgent;
            uvm_env isEnv;
            uvm_component empty;
            string name;
            int type_flag;
            if (!flag) begin
                flag = 1;
                if ($test$plusargs("VCS_UVM_FGP_DIAG")) begin
                    $display("FGP before running phase");
                end
                traverse_all_component(comp);
    
                fgp_uvm_component_info(empty,empty,name,type_flag);    
    
                uvm_fgp_thread_object_base::initObjs();
            end
       endfunction
    
        function void traverse_all_component(uvm_component comp);
        string name;
        int type_flag;
        uvm_agent isAgent;
        uvm_env isEnv;
        uvm_monitor isMon;
        uvm_driver isDrv;
        uvm_test isTest;
        uvm_sequencer isSeqr;
        uvm_component parent;
        begin
            name = comp.get_name();
            parent = comp.get_parent();
            type_flag = 0;
            if ($cast(isAgent,comp)) begin
                type_flag = 1;
            end
            else if ($cast(isDrv,comp)) begin
                type_flag = 2;
            end
            else if ($cast(isMon,comp)) begin
                type_flag = 3;
            end
            else if ($cast(isSeqr,comp)) begin
                type_flag = 4;
            end
            else if ($cast(isEnv,comp) || $cast(isTest,comp)) begin
                type_flag = 5;
            end
            fgp_uvm_component_info(parent,comp,name,type_flag);
            if ($test$plusargs("VCS_UVM_FGP_DIAG")) begin
                $display("fgpUvmComponentInfo: %s, %d ",comp.get_full_name(),type_flag);
            end
            if (comp.get_first_child(name)) begin
                do
                    this.traverse_all_component(comp.get_child(name));
                while (comp.get_next_child(name));
            end
    
        end
       endfunction
    
    endclass 
    
    
    class uvm_fgpinit_obj;
        function new();
            uvm_domain dm = uvm_domain::get_common_domain();
            uvm_phase run = dm.find (uvm_run_phase::get());
            dm.add (uvm_fgpinit_phase::get(),null, null, run);   
        endfunction
    endclass
    
    `endprotect
    

    完整源码 · SHA256:e5bcc8ce0dc884eb2742ffdd471ef8c267ec72a391b99436eea252fc188a1a73

    src/vcs-uvm-1.2/uvm_pkg.sv
      `include "reg/uvm_reg_model.svh"
    
      `ifdef VCS
      `include "vcs/vcs_uvm_alt.sv"
      `endif
    endpackage
    
    `endif
    

    完整源码 · SHA256:0b1a5e113a06b3f2510e1a7fa7c533ae0da668cc3b825bf9edffae86acbb8a6f

    术语解释 · 兼容配置

    返回Component / VCS 集成 · 迁移清单

    版本适用范围