3. 按实例路径覆盖

按实例路径覆盖 学习卡片

任务目标

在UVM验证环境中,通过set_inst_override_by_name仅对指定实例路径的组件进行类型覆盖,同时验证同一父组件下其他兄弟实例保持原类型不变。本案例使用最小可复现的UVM环境演示实例级覆盖的精确性。

环境依赖

需要标准UVM库(UVM-1.2或IEEE 1800.2),仿真器支持UVM(如VCS、QuestaSim、Xcelium)。无需额外IP。

核心实现

定义两个组件类型base_comp和ext_comp(扩展自base),在env中创建两个base实例agent[0]和agent[1],通过set_inst_override_by_name仅将agent[1]覆盖为ext类型,然后打印各实例的实际类型以验证覆盖效果。

// file: inst_override_test.sv
`include "uvm_macros.svh"
import uvm_pkg::*;

class base_comp extends uvm_component;
    `uvm_component_utils(base_comp)
    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction
    virtual function void print_type();
        $display("%s: base_comp", get_full_name());
    endfunction
endclass

class ext_comp extends base_comp;
    `uvm_component_utils(ext_comp)
    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction
    virtual function void print_type();
        $display("%s: ext_comp", get_full_name());
    endfunction
endclass

class test_env extends uvm_env;
    `uvm_component_utils(test_env)
    base_comp agent[2];
    
    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction
    
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        for (int i = 0; i < 2; i++) begin
            agent[i] = base_comp::type_id::create($sformatf("agent[%0d]", i), this);
        end
    endfunction
    
    function void end_of_elaboration_phase(uvm_phase phase);
        super.end_of_elaboration_phase(phase);
        foreach (agent[i]) agent[i].print_type();
    endfunction
endclass

class test_base extends uvm_test;
    `uvm_component_utils(test_base)
    test_env env;
    
    function new(string name, uvm_component parent);
        super.new(name, parent);
    endfunction
    
    function void build_phase(uvm_phase phase);
        super.build_phase(phase);
        // 仅覆盖路径 uvm_test_top.env.agent[1]
        set_inst_override_by_name("base_comp", "ext_comp", 
                                   "uvm_test_top.env.agent[1]");
        env = test_env::type_id::create("env", this);
    endfunction
endclass

module top;
    initial begin
        run_test("test_base");
    end
endmodule

运行方式

# 使用QuestaSim示例
vlib work
vlog +incdir+$UVM_HOME/src $UVM_HOME/src/uvm_pkg.sv inst_override_test.sv
vsim -c -do "run -all; quit" work.top

验证方法与判定标准

仿真运行后,观察标准输出。预期打印结果必须严格为:

uvm_test_top.env.agent[0]: base_comp
uvm_test_top.env.agent[1]: ext_comp

判定通过条件:agent[0]仍为base_comp,agent[1]被覆盖为ext_comp。若两者均为base或均为ext,则说明覆盖路径设置错误或覆盖范围过广,需检查路径字符串是否与get_full_name()输出完全一致。

关键说明

  • 覆盖路径必须使用组件在层次结构中的完整路径,且区分大小写;路径中索引格式需与创建时$sformatf生成的名称完全匹配(如agent[1]而非agent_1)。
  • 覆盖调用必须在目标组件创建之前执行,因此放在test_base::build_phase中创建env之前。
  • 本案例仅演示实例级覆盖,不涉及类型级覆盖(set_type_override_by_name),两者作用域不同,不可混用。