`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
