跳转至

输入查询内容

    本页内容

    uvm_reg_block 新增 unlock_model/wait_for_lock/set_lock/unregister/get_block_by_full_name,lock_model 行为增强

    新增功能:目标库新增的 API 和可选替代接口;已有用法的迁移要求列在用户接口与行为中。

    具体差异

    新增解锁/锁定和全名查找接口。wait_for_lock 的实现是等待事件,并非检查 is_locked 后立即返回;若在锁定事件之后才调用,会等待下一次事件。set_lock 只是递归设置锁位,不等价于 lock_model 构建地址缓存或 unlock_model 清理缓存,动态修改模型须使用完整流程。

    修改方案

    无(纯新增)。

    兼容措施与范围:本条是新增能力或实现说明,无需恢复旧接口;按使用条件核对行为。

    补充查阅

    扫描定位与记录结果

    无对应规则。当前脚本没有针对本条的直接检测规则。

    本条处理级别为“可选采用”,按修改方案评估;缺少扫描规则本身不增加迁移改造要求。

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

    源码与标准依据

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

    VCS 内置 UVM-1.2uvm_reg_block.svh:1118lock_model 实现,无对应新 API)

    VCS 内置 uvm-ieee-2020-2.0uvm_reg_block.svh:241unlock_model)、uvm_reg_block.svh:261wait_for_lock)、uvm_reg_block.svh:1064set_lock)、uvm_reg_block.svh:1073unregister)、uvm_reg_block.svh:470get_block_by_full_name);lock_model 实现 uvm_reg_block.svh:1285(新增全名注册表缓存、m_do_cmdline_settings()m_uvm_lock_model_complete 事件触发、根 map Xinit_address_mapX

    标准依据:IEEE 1800.2-2020 §18.1.2.6–18.1.2.9

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

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

    src/vcs-uvm-1.2/reg/uvm_reg_block.svh
    // lock_model
    
    function void uvm_reg_block::lock_model();
    
       if (is_locked())
         return;
    
       locked = 1;
    
       foreach (regs[rg_]) begin
          uvm_reg rg = rg_;
          rg.Xlock_modelX();
       end
    
       `ifdef UVM_SPARSE_ARRAY
       foreach (regarrays[rga_]) begin
          uvm_reg_file rga = rga_;
          rga.Xlock_modelX();
    

    完整源码 · SHA256:6ca6f50282876b0cf52951223df74e4f721ad7443e194ec27b1e6dd995da8d43

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh
        // brings back the register mode to a state before lock_model() so that a subsequent lock_model() can be issued
    
       // @uvm-ieee 1800.2-2020 manual 18.1.2.7
       virtual function void unlock_model();
           bit s[uvm_reg_block]=m_roots;
           m_roots.delete();
    
            foreach (blks[blk_]) 
                blks[blk_].unlock_model();
    
            foreach (regs[rg_])
                regs[rg_].Xunlock_modelX();
    
            m_roots=s;
            foreach(m_roots[b])
                m_roots[b]=0;
    
            uvm_reg_block::m_reg_block_registry.delete(this.get_full_name()); //Clear block pointer cache
            m_name = ""; //Clear cached full name
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh
       endfunction
    
       // @uvm-ieee 1800.2-2020 manual 18.1.2.9
       virtual task wait_for_lock();
           @m_uvm_lock_model_complete;
       endtask
    
    
       // Function -- NODOCS -- is_locked
       //
       // Return TRUE if the model is locked.
    
       // @uvm-ieee 1800.2-2020 manual 18.1.2.10
       extern function bit is_locked();
    
    
       //---------------------
       // Group -- NODOCS -- Introspection
       //---------------------
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh
       //
       // If no blocks are found, returns ~null~.
    
       extern static function uvm_reg_block get_block_by_full_name(string name);
    
    
       // Function -- NODOCS -- get_map_by_name
       //
       // Finds an address map with the specified simple name.
       //
       // The name is the simple name of the address map, not a hierarchical name.
       // relative to this block.
       // If no map with that name is found in this block, the sub-blocks
       // are searched for a map of that name and the first one to be found
       // is returned.
       //
       // If no address maps are found, returns ~null~.
    
       // @uvm-ieee 1800.2-2020 manual 18.1.3.13
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh
       // @uvm-ieee 1800.2-2020 manual 18.1.2.8
       virtual function void set_lock(bit v);
           locked=v;
           foreach(blks[idx])
               blks[idx].set_lock(v);
       endfunction
    
       // remove all knowledge of map m and all regs|mems|vregs contained in m from the block
    
       // @uvm-ieee 1800.2-2020 manual 18.1.6.11
       virtual function void unregister(uvm_reg_map m);
           foreach(regs[idx]) begin
                if(regs[idx].is_in_map(m))
                    regs.delete(idx);
           end  
           foreach(mems[idx]) begin
               if(mems[idx].is_in_map(m))
                   mems.delete(idx);
           end  
           foreach(vregs[idx]) begin
               if(vregs[idx].is_in_map(m))
                   vregs.delete(idx);
           end
           maps.delete(m);
       endfunction
    

    src/vcs-uvm-ieee-2020-2.0/reg/uvm_reg_block.svh
    // lock_model
    
    function void uvm_reg_block::lock_model();
    
       if (is_locked())
         return;
    
       locked = 1;
       m_name = get_full_name();          //Cache the full name of block
       m_reg_block_registry[m_name]=this; //Cache this block pointer in full_name registry
    
       foreach (regs[rg_]) begin
          regs[rg_].Xlock_modelX();
       end
    
       `ifdef UVM_SPARSE_ARRAY
       foreach (regarrays[rga_]) begin
          uvm_reg_file rga = rga_;
    

    完整源码 · SHA256:8ddc84d53bbce80c641eb7a6c02b0fef630ee9244c536d195d3dc93c068e2915

    术语解释 · 兼容配置

    返回RAL(寄存器模型) · 迁移清单

    版本适用范围