跳转至

输入查询内容

    本页内容

    最小实验:field 后门告警与父寄存器读取对照

    环境:VCS W-2024.09-SP2-8。1.2 使用 uvm-1.2,2.0 使用 uvm-ieee-2020-2.0

    实验检查观察值是否符合预期;成功复现问题不代表问题已修复。

    结果对比

    观察内容 UVM 1.2 UVM 2.0
    field 后门读取的 Backdoor map 归属告警次数 field_read_map_warnings 0 2
    field 后门读取的 status 和固定返回值符合预期(1=是) field_read_data_ok 1 1
    父寄存器后门读取的 Backdoor map 归属告警次数 parent_read_map_warnings 0 0
    父寄存器后门读取的 status 和固定返回值符合预期(1=是) parent_read_data_ok 1 1

    运行命令

    目录与环境准备;从解包根目录执行:

    uv run tools/run_uvm_review.py --case backdoor_map_minimal_probe --variants 12,20
    

    最小源码

    backdoor_map_minimal_probe.sv

    backdoor_map_minimal_probe.sv
    `timescale 1ns/1ps
    `include "uvm_macros.svh"
    import uvm_pkg::*;
    
    class minimal_map_backdoor extends uvm_reg_backdoor;
      function new(); super.new("bd"); endfunction
      virtual function void read_func(uvm_reg_item rw);
        rw.value[0] = 'h12345678;
        rw.status = UVM_IS_OK;
      endfunction
    endclass
    
    class minimal_map_reg extends uvm_reg;
      uvm_reg_field f;
      function new(); super.new("rg", 32, UVM_NO_COVERAGE); endfunction
      function void build();
        f = new("f");
        f.configure(this, 32, 0, "RW", 0, 0, 1, 0, 1);
      endfunction
    endclass
    
    class minimal_map_block extends uvm_reg_block;
      minimal_map_reg rg;
      function new(); super.new("model", UVM_NO_COVERAGE); endfunction
      function void build();
        rg = new(); rg.configure(this); rg.build();
        default_map = create_map("map", 0, 4, UVM_LITTLE_ENDIAN, 1);
        default_map.add_reg(rg, 0, "RW");
        lock_model();
      endfunction
    endclass
    
    class minimal_map_observer extends uvm_report_catcher;
      int warnings;
      function new(); super.new("observer"); endfunction
      virtual function action_e catch();
        if (get_severity() == UVM_WARNING && get_id() == "RegModel" &&
            uvm_is_match("*is not contained within map 'Backdoor'*", get_message()))
          warnings++;
        return THROW;
      endfunction
    endclass
    
    module backdoor_map_minimal_probe;
      initial begin
        minimal_map_block model = new();
        minimal_map_backdoor bd = new();
        minimal_map_observer observer = new();
        uvm_status_e status;
        uvm_reg_data_t value;
        model.build();
        model.rg.set_backdoor(bd);
        uvm_report_cb::add(null, observer);
    
        model.rg.f.read(status, value, UVM_BACKDOOR);
        if (status != UVM_IS_OK || value != 'h12345678)
          `uvm_fatal("BACKDOOR_MAP", "Field read failed")
        $display("REVIEW|field_read_map_warnings|%0d", observer.warnings);
        $display("REVIEW|field_read_data_ok|1");
    
        observer.warnings = 0;
        // The field spans the entire register; no bit extraction is needed here.
        model.rg.read(status, value, UVM_BACKDOOR);
        if (status != UVM_IS_OK || value != 'h12345678)
          `uvm_fatal("BACKDOOR_MAP", "Parent register read failed")
        $display("REVIEW|parent_read_map_warnings|%0d", observer.warnings);
        $display("REVIEW|parent_read_data_ok|1");
        $display("REVIEW|done|1");
        $finish;
      end
    endmodule
    

    全部用例 · 证据摘要

    版本适用范围