`timescale 1ns/1ps
`include "uvm_macros.svh"
import uvm_pkg::*;
class value_codec extends uvm_reg_cbs;
  function new(); super.new("codec"); endfunction
  virtual function void encode(ref uvm_reg_data_t data[]);
    if (!$test$plusargs("MIGRATED")) foreach(data[i]) data[i] ^= 'h55;
  endfunction
  virtual function void decode(ref uvm_reg_data_t data[]);
    if (!$test$plusargs("MIGRATED")) foreach(data[i]) data[i] ^= 'h55;
  endfunction
  virtual task pre_write(uvm_reg_item rw);
    if ($test$plusargs("MIGRATED")) foreach(rw.value[i]) rw.value[i] ^= 'h55;
  endtask
  virtual task post_read(uvm_reg_item rw);
    if ($test$plusargs("MIGRATED")) foreach(rw.value[i]) rw.value[i] ^= 'h55;
  endtask
endclass
class observed_backdoor extends uvm_reg_backdoor;
  uvm_reg_data_t hardware;
  function new(); super.new("backdoor"); endfunction
  virtual task write(uvm_reg_item rw);
    do_pre_write(rw);
    hardware = rw.value[0];
    rw.status = UVM_IS_OK;
    do_post_write(rw);
  endtask
  virtual function void read_func(uvm_reg_item rw);
    rw.value[0] = hardware;
    rw.status = UVM_IS_OK;
  endfunction
endclass
module backdoor_probe;
  initial begin
    observed_backdoor bd = new();
    value_codec codec = new();
    uvm_reg_item rw = new("rw");
    uvm_callbacks#(uvm_reg_backdoor,uvm_reg_cbs)::add(bd,codec);
    rw.value[0] = 1;
    bd.write(rw);
    $display("REVIEW|encoded_hardware|%0h", bd.hardware);
    bd.hardware = 'h54;
    bd.read(rw);
    $display("REVIEW|decoded_value|%0h", rw.value[0]);
    $display("REVIEW|done|1");
    $finish;
  end
endmodule
