[dv common] Minor enhancements to dv_reg_block

- These address few of the suggestions made in #3971.
- It updates some of the dv_base_reg_block methods to be free from reg
map assumptions.

Signed-off-by: Srikrishna Iyer <sriyer@google.com>
diff --git a/hw/dv/sv/cip_lib/cip_base_scoreboard.sv b/hw/dv/sv/cip_lib/cip_base_scoreboard.sv
index 8398e38..16bffc3 100644
--- a/hw/dv/sv/cip_lib/cip_base_scoreboard.sv
+++ b/hw/dv/sv/cip_lib/cip_base_scoreboard.sv
@@ -107,12 +107,12 @@
   endtask
 
   virtual task process_mem_write(tl_seq_item item);
-    uvm_reg_addr_t addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t addr = ral.get_word_aligned_addr(item.a_addr);
     if (!cfg.under_reset)  exp_mem.write(addr, item.a_data, item.a_mask);
   endtask
 
   virtual task process_mem_read(tl_seq_item item);
-    uvm_reg_addr_t addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t addr = ral.get_word_aligned_addr(item.a_addr);
     if (!cfg.under_reset && get_mem_access_by_addr(ral, addr) == "RW") begin
       exp_mem.compare(addr, item.d_data, item.a_mask);
     end
@@ -120,7 +120,7 @@
 
   // check if it's mem addr
   virtual function bit is_mem_addr(tl_seq_item item);
-    uvm_reg_addr_t addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t addr = ral.get_word_aligned_addr(item.a_addr);
     foreach (cfg.mem_ranges[i]) begin
       if (addr inside {[cfg.mem_ranges[i].start_addr : cfg.mem_ranges[i].end_addr]}) begin
         return 1;
@@ -166,7 +166,7 @@
 
   // check if address is mapped
   virtual function bit is_tl_access_mapped_addr(tl_seq_item item);
-    uvm_reg_addr_t addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t addr = ral.get_word_aligned_addr(item.a_addr);
     // check if it's mem addr or reg addr
     if (is_mem_addr(item) || addr inside {cfg.csr_addrs}) return 1;
     else                                                  return 0;
@@ -177,7 +177,7 @@
     if (is_mem_addr(item)) begin
       bit mem_partial_write_support;
       dv_base_mem mem;
-      uvm_reg_addr_t addr = ral.align_to_word_addr(item.a_addr);
+      uvm_reg_addr_t addr = ral.get_word_aligned_addr(item.a_addr);
       string mem_access = get_mem_access_by_addr(ral, addr);
 
       `downcast(mem, get_mem_by_addr(ral, addr))
@@ -205,7 +205,7 @@
     if (!is_tl_access_mapped_addr(item) || is_mem_addr(item)) return 1;
     if (item.is_write()) begin
       dv_base_reg    csr;
-      uvm_reg_addr_t addr = ral.align_to_word_addr(item.a_addr);
+      uvm_reg_addr_t addr = ral.get_word_aligned_addr(item.a_addr);
       `DV_CHECK_FATAL($cast(csr,
                             ral.default_map.get_reg_by_offset(addr)))
       if (csr.get_msb_pos >= 24 && item.a_mask[3:0] != 'b1111 ||
diff --git a/hw/dv/sv/dv_base_reg/dv_base_reg_block.sv b/hw/dv/sv/dv_base_reg/dv_base_reg_block.sv
index 93230a3..20702b5 100644
--- a/hw/dv/sv/dv_base_reg/dv_base_reg_block.sv
+++ b/hw/dv/sv/dv_base_reg/dv_base_reg_block.sv
@@ -8,14 +8,13 @@
 
   csr_excl_item csr_excl;
 
-  // The address mask for the register block. This will be (1 << K) - 1 for some K. All relative
-  // offsets in the register block have addresses less than (1 << K), so an address decoder that
-  // starts by discarding all higher bits will work correctly so long as the chosen base address of
-  // the register block has no bits in common with this mask.
+  // The address mask for the register block specific to a map. This will be (1 << K) - 1 for some
+  // K. All relative offsets in the register block have addresses less than (1 << K), so an address
+  // decoder that starts by discarding all higher bits will work correctly so long as the chosen
+  // base address of the register block has no bits in common with this mask.
   //
-  // This is initialized to zero (which means "unset") and then set by compute_mask(), which must
-  // run after locking the model.
-  protected uvm_reg_addr_t addr_mask = 0;
+  // This is set by compute_addr_mask(), which must run after locking the model.
+  protected uvm_reg_addr_t addr_mask[uvm_reg_map];
 
   function new (string name = "", int has_coverage = UVM_NO_COVERAGE);
     super.new(name, has_coverage);
@@ -27,17 +26,6 @@
     `uvm_fatal(`gfn, "this method is not supposed to be called directly!")
   endfunction
 
-  // Get the address mask. This should only be called after locking the model (because it depends on
-  // the layout of registers and memories in the block).
-  function uvm_reg_addr_t get_addr_mask();
-    `DV_CHECK_FATAL(is_locked())
-    if (this.addr_mask == 0) begin
-      this.compute_mask();
-      `DV_CHECK_FATAL(this.addr_mask != 0)
-    end
-    return addr_mask;
-  endfunction
-
   function void get_dv_base_reg_blocks(ref dv_base_reg_block blks[$]);
     uvm_reg_block uvm_blks[$];
     this.get_blocks(uvm_blks);
@@ -52,7 +40,7 @@
 
   function void get_enable_regs(ref dv_base_reg enable_regs[$]);
     dv_base_reg_block blks[$];
-    this.get_dv_base_reg_blocks(blks);
+    get_dv_base_reg_blocks(blks);
     if (blks.size() == 0) begin
       dv_base_reg all_regs[$];
       this.get_dv_base_regs(all_regs);
@@ -77,11 +65,10 @@
 
   // Internal function, used to compute the address mask for this register block.
   //
-  // This is quite an expensive computation, so we memoize the results in addr_mask
-  //
-  // use below to get the addr map size #3317
+  // This is quite an expensive computation, so we memoize the results in addr_mask[map].
+  // Use below to get the addr map size #3317
   // max2(biggest_reg_offset+reg_size, biggest_mem_offset+mem_size) and then round up to 2**N
-  protected function void compute_mask();
+  protected function void compute_addr_mask(uvm_reg_map map);
     uvm_reg_addr_t max_addr, max_offset;
     uvm_reg_block  blocks[$];
     uvm_reg        regs[$];
@@ -90,31 +77,32 @@
 
     // TODO: assume IP only contains 1 reg block, find a better way to handle chip-level and IP
     // with multiple reg blocks
-    this.get_blocks(blocks);
+    get_blocks(blocks);
     if (blocks.size > 0) begin
-      this.addr_mask = '1;
+      addr_mask[map] = '1;
       return;
     end
 
-    this.get_registers(regs);
-    this.get_memories(mems);
-    `DV_CHECK_GT_FATAL(regs.size + mems.size, 0)
+    get_registers(regs);
+    get_memories(mems);
+    `DV_CHECK_GT_FATAL(regs.size() + mems.size(), 0)
 
     // Walk the known registers and memories, calculating the largest byte address visible. Note
     // that the get_offset() calls will return absolute addresses, including any base address in the
     // default register map.
     max_addr = 0;
     foreach (regs[i]) begin
-      max_addr = max2(regs[i].get_offset() + regs[i].get_n_bytes() - 1, max_addr);
+      max_addr = max2(regs[i].get_offset(map) + regs[i].get_n_bytes() - 1, max_addr);
     end
 
     foreach (mems[i]) begin
-      max_addr = max2(mems[i].get_offset() + mems[i].get_size() * mems[i].get_n_bytes() - 1,
-                      max_addr);
+      uvm_reg_addr_t mem_size;
+      mem_size = mems[i].get_offset(.map(map)) + mems[i].get_size() * mems[i].get_n_bytes() - 1;
+      max_addr = max2(mem_size, max_addr);
     end
 
     // Subtract the base address in the default register map to get the maximum relative offset.
-    max_offset = max_addr - this.default_map.get_base_addr();
+    max_offset = max_addr - map.get_base_addr();
 
     // Set alignment to be ceil(log2(biggest_offset))
     alignment = 0;
@@ -128,17 +116,31 @@
     `DV_CHECK_GT_FATAL(alignment, 0)
 
     // Finally, extract a mask corresponding to the alignment
-    this.addr_mask = (1 << alignment) - 1;
+    addr_mask[map] = (1 << alignment) - 1;
 
+    // Computed mask must be non-zero.
+    `DV_CHECK_FATAL(addr_mask[map])
   endfunction
 
-  // Pick or check a base address for the given register map
+  // Get the address mask. This should only be called after locking the model (because it depends on
+  // the layout of registers and memories in the block).
+  function uvm_reg_addr_t get_addr_mask(uvm_reg_map map = null);
+    `DV_CHECK_FATAL(is_locked())
+    if (map == null) map = get_default_map();
+    if (!addr_mask.exists(map)) compute_addr_mask(map);
+    return addr_mask[map];
+  endfunction
+
+  // Set the base address for the given register map
   //
-  // Check that base_addr is aligned as required by the register block and return it again. If
-  // base_addr is the "magic" address '1, randomly pick an appropriately aligned base address and
-  // return it.
-  function uvm_reg_addr_t pick_base_addr(uvm_reg_addr_t base_addr);
-    uvm_reg_addr_t mask = this.get_addr_mask();
+  // Check that base_addr is aligned as required by the register block. If the supplied base_addr is
+  // the "magic" address '1, randomly pick an appropriately aligned base address and set it for the
+  // specified map.
+  function void set_base_addr(uvm_reg_addr_t base_addr = '1, uvm_reg_map map = null);
+    uvm_reg_addr_t mask;
+
+    if (map == null) map = get_default_map();
+    mask = get_addr_mask(map);
 
     // If base_addr is '1, randomly pick an aligned base address
     if (base_addr == '1) begin
@@ -148,8 +150,8 @@
     // Check base addr alignment (which should be guaranteed if we just picked it, but needs
     // checking if not).
     `DV_CHECK_FATAL((base_addr & mask) == '0)
-
-    return base_addr;
+    `uvm_info(`gfn, $sformatf("Setting register base address to 0x%0h", base_addr), UVM_HIGH)
+    map.set_base_addr(base_addr);
   endfunction
 
   // Round the given address down to the start of the containing word. For example, if the address
@@ -157,15 +159,19 @@
   //
   // This is useful if you have a possibly misaligned address and you want to know whether it hits a
   // register (since get_reg_by_offset needs the aligned address for the start of the register).
-  function uvm_reg_addr_t align_to_word_addr(uvm_reg_addr_t byte_addr);
-    return (byte_addr >> 2) << 2;
+  function uvm_reg_addr_t get_word_aligned_addr(uvm_reg_addr_t byte_addr);
+    uvm_reg_addr_t shift = $clog2(`UVM_REG_BYTENABLE_WIDTH);
+    return (byte_addr >> shift) << shift;
   endfunction
 
   // Get the absolute address (in the default register map) for the given offset. For example, if
-  // the base address is 'h100 and offset is 'h13, this will return 'h113.
-  function uvm_reg_addr_t offset_to_addr(uvm_reg_addr_t byte_offset);
-    uvm_reg_addr_t word_offset = byte_offset >> 2;
-    return (word_offset << 2) + this.default_map.get_base_addr();
+  // the base address is 'h100 and offset is 'h13, this will return 'h113 ('h110 if word_aligned is
+  // set).
+  function uvm_reg_addr_t get_addr_from_offset(uvm_reg_addr_t byte_offset,
+                                               bit word_aligned = 1'b1,
+                                               uvm_reg_map map = null);
+    if (map == null) map = get_default_map();
+    return (word_aligned ? get_word_aligned_addr(byte_offset) : byte_offset) + map.get_base_addr();
   endfunction
 
 endclass
diff --git a/hw/dv/sv/dv_lib/dv_base_env_cfg.sv b/hw/dv/sv/dv_lib/dv_base_env_cfg.sv
index 851776a..233937e 100644
--- a/hw/dv/sv/dv_lib/dv_base_env_cfg.sv
+++ b/hw/dv/sv/dv_lib/dv_base_env_cfg.sv
@@ -53,12 +53,10 @@
       apply_ral_fixes();
       ral.lock_model();
 
-      // Now the model is locked, we know its layout. Ask the register block to sanity-check
-      // csr_base_addr (if it's not '1) or pick a sensible one otherwise. Then install that base
-      // address in the default map.
-      base_addr = ral.pick_base_addr(csr_base_addr);
-      `uvm_info(`gfn, $sformatf("Setting register base address to 0x%0h", base_addr), UVM_HIGH)
-      ral.default_map.set_base_addr(base_addr);
+      // Now the model is locked, we know its layout. Set the base address for the register block.
+      // The function internally picks a random one if we pass '1 to it, and performs an integrity
+      // check on the set address.
+      ral.set_base_addr(csr_base_addr);
 
       // Get list of valid csr addresses (useful in seq to randomize addr as well as in scb checks)
       get_csr_addrs(ral, csr_addrs);
diff --git a/hw/ip/aes/dv/env/aes_scoreboard.sv b/hw/ip/aes/dv/env/aes_scoreboard.sv
index d897332..3efd7fd 100644
--- a/hw/ip/aes/dv/env/aes_scoreboard.sv
+++ b/hw/ip/aes/dv/env/aes_scoreboard.sv
@@ -69,7 +69,7 @@
     aes_seq_item   complete_clone;
     bit            do_read_check = 1'b0;
     bit            write         = item.is_write();
-    uvm_reg_addr_t csr_addr      = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr      = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/entropy_src/dv/env/entropy_src_scoreboard.sv b/hw/ip/entropy_src/dv/env/entropy_src_scoreboard.sv
index eb5bf75..24f78e8 100644
--- a/hw/ip/entropy_src/dv/env/entropy_src_scoreboard.sv
+++ b/hw/ip/entropy_src/dv/env/entropy_src_scoreboard.sv
@@ -36,7 +36,7 @@
     // TODO Turned off do_read_check for polling, add prediction
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
index fafeea1..ebcc55a 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_scoreboard.sv
@@ -60,7 +60,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     bit addr_phase_read   = (!write && channel == AddrChannel);
     bit addr_phase_write  = (write && channel == AddrChannel);
diff --git a/hw/ip/gpio/dv/env/gpio_scoreboard.sv b/hw/ip/gpio/dv/env/gpio_scoreboard.sv
index 0b02e20..d1417cd 100644
--- a/hw/ip/gpio/dv/env/gpio_scoreboard.sv
+++ b/hw/ip/gpio/dv/env/gpio_scoreboard.sv
@@ -60,7 +60,7 @@
     uvm_reg csr;
     bit do_read_check       = 1'b1;
     bit write               = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/hmac/dv/env/hmac_env.sv b/hw/ip/hmac/dv/env/hmac_env.sv
index 35490dc..e6ff21c 100644
--- a/hw/ip/hmac/dv/env/hmac_env.sv
+++ b/hw/ip/hmac/dv/env/hmac_env.sv
@@ -17,7 +17,7 @@
     dv_base_mem mem;
     super.end_of_elaboration_phase(phase);
     // hmac mem supports partial write, set it after ral model is locked
-    `downcast(mem, get_mem_by_addr(cfg.ral, cfg.ral.offset_to_addr(HMAC_MSG_FIFO_BASE)))
+    `downcast(mem, get_mem_by_addr(cfg.ral, cfg.ral.get_addr_from_offset(HMAC_MSG_FIFO_BASE)))
     mem.set_mem_partial_write_support(1);
   endfunction
 
diff --git a/hw/ip/hmac/dv/env/hmac_scoreboard.sv b/hw/ip/hmac/dv/env/hmac_scoreboard.sv
index d55fc76..822a141 100644
--- a/hw/ip/hmac/dv/env/hmac_scoreboard.sv
+++ b/hw/ip/hmac/dv/env/hmac_scoreboard.sv
@@ -35,7 +35,7 @@
     bit     write                   = item.is_write();
     string  csr_name;
     bit [TL_AW-1:0] addr_mask       = ral.get_addr_mask();
-    uvm_reg_addr_t  csr_addr        = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t  csr_addr        = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/hmac/dv/env/seq_lib/hmac_base_vseq.sv b/hw/ip/hmac/dv/env/seq_lib/hmac_base_vseq.sv
index 8ad99f2..8650691 100644
--- a/hw/ip/hmac/dv/env/seq_lib/hmac_base_vseq.sv
+++ b/hw/ip/hmac/dv/env/seq_lib/hmac_base_vseq.sv
@@ -171,7 +171,7 @@
       word = {>>byte{word_unpack}};
       `uvm_info(`gfn, $sformatf("wr_addr = %0h, wr_mask = %0h, words = 0x%0h",
                                 wr_addr, wr_mask, word), UVM_HIGH)
-      tl_access(.addr(cfg.ral.offset_to_addr(wr_addr)),
+      tl_access(.addr(cfg.ral.get_addr_from_offset(wr_addr)),
                 .write(1'b1), .data(word), .mask(wr_mask), .blocking(non_blocking));
 
       if (ral.cfg.sha_en.get_mirrored_value()) begin
@@ -207,7 +207,7 @@
           `uvm_info(`gfn, $sformatf("wr_addr = %0h, wr_mask = %0h, words = 0x%0h",
                                     wr_addr, wr_mask, word), UVM_HIGH)
           `DV_CHECK_FATAL(randomize(wr_addr, wr_mask) with {wr_mask == '1;})
-          tl_access(.addr(cfg.ral.offset_to_addr(wr_addr)),
+          tl_access(.addr(cfg.ral.get_addr_from_offset(wr_addr)),
                     .write(1'b1), .data(word), .mask(wr_mask), .blocking($urandom_range(0, 1)));
         end
         if (ral.cfg.sha_en.get_mirrored_value()) begin
diff --git a/hw/ip/i2c/dv/env/i2c_scoreboard.sv b/hw/ip/i2c/dv/env/i2c_scoreboard.sv
index 69300bf..d5f27d8 100644
--- a/hw/ip/i2c/dv/env/i2c_scoreboard.sv
+++ b/hw/ip/i2c/dv/env/i2c_scoreboard.sv
@@ -61,7 +61,7 @@
     bit       do_read_check = 1'b0;    // TODO: Enable this bit later
     bit       write = item.is_write();
 
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
       csr = ral.default_map.get_reg_by_offset(csr_addr);
diff --git a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
index ea4aaf5..5a80b0e 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -35,7 +35,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     bit addr_phase_read   = (!write && channel == AddrChannel);
     bit addr_phase_write  = (write && channel == AddrChannel);
diff --git a/hw/ip/kmac/dv/env/kmac_scoreboard.sv b/hw/ip/kmac/dv/env/kmac_scoreboard.sv
index f581e6f..89b48bb 100644
--- a/hw/ip/kmac/dv/env/kmac_scoreboard.sv
+++ b/hw/ip/kmac/dv/env/kmac_scoreboard.sv
@@ -35,7 +35,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     bit addr_phase_read   = (!write && channel == AddrChannel);
     bit addr_phase_write  = (write && channel == AddrChannel);
diff --git a/hw/ip/otbn/dv/uvm/env/otbn_scoreboard.sv b/hw/ip/otbn/dv/uvm/env/otbn_scoreboard.sv
index a4635a0..dc74dac 100644
--- a/hw/ip/otbn/dv/uvm/env/otbn_scoreboard.sv
+++ b/hw/ip/otbn/dv/uvm/env/otbn_scoreboard.sv
@@ -63,7 +63,7 @@
     // the DUT internals. Of course, we need to check this is true exactly when we expect it to be.
     // Here, we set a flag to say that we expect the "start" signal to be high. See the
     // check_start() task, which checks it's true at the right time.
-    csr_addr = ral.align_to_word_addr(item.a_addr);
+    csr_addr = ral.get_word_aligned_addr(item.a_addr);
     csr = ral.default_map.get_reg_by_offset(csr_addr);
 
     // csr might be null and that's ok (it's probably a write to memory).
diff --git a/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv b/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv
index f2ae0aa..0eb9675 100644
--- a/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv
+++ b/hw/ip/otp_ctrl/dv/env/otp_ctrl_scoreboard.sv
@@ -47,7 +47,7 @@
     uvm_reg csr;
     bit     do_read_check     = 1'b0;
     bit     write             = item.is_write();
-    uvm_reg_addr_t csr_addr   = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr   = ral.get_word_aligned_addr(item.a_addr);
     bit [TL_AW-1:0] addr_mask = ral.get_addr_mask();
 
     bit addr_phase_read   = (!write && channel == AddrChannel);
diff --git a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_sanity_vseq.sv b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_sanity_vseq.sv
index 99da49c..4fe7691 100644
--- a/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_sanity_vseq.sv
+++ b/hw/ip/otp_ctrl/dv/env/seq_lib/otp_ctrl_sanity_vseq.sv
@@ -87,7 +87,7 @@
 
         // if write sw partitions, check tlul window
         if (part_idx inside {CreatorSwCfgIdx, OwnerSwCfgIdx}) begin
-          uvm_reg_addr_t tlul_addr = cfg.ral.offset_to_addr(get_sw_window_offset(dai_addr));
+          uvm_reg_addr_t tlul_addr = cfg.ral.get_addr_from_offset(get_sw_window_offset(dai_addr));
 
           // random issue reset, OTP content should not be cleared
           if ($urandom_range(0, 1)) dut_init();
diff --git a/hw/ip/pattgen/dv/env/pattgen_scoreboard.sv b/hw/ip/pattgen/dv/env/pattgen_scoreboard.sv
index 7ecaf7e..311daa1 100644
--- a/hw/ip/pattgen/dv/env/pattgen_scoreboard.sv
+++ b/hw/ip/pattgen/dv/env/pattgen_scoreboard.sv
@@ -48,7 +48,7 @@
     bit             do_read_check = 1'b0;  // TODO: temporaly disable
     bit             write = item.is_write();
 
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
       csr = ral.default_map.get_reg_by_offset(csr_addr);
diff --git a/hw/ip/rv_timer/dv/env/rv_timer_scoreboard.sv b/hw/ip/rv_timer/dv/env/rv_timer_scoreboard.sv
index 681dad1..f36320f 100644
--- a/hw/ip/rv_timer/dv/env/rv_timer_scoreboard.sv
+++ b/hw/ip/rv_timer/dv/env/rv_timer_scoreboard.sv
@@ -39,7 +39,7 @@
     string  csr_name;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/spi_device/dv/env/spi_device_env_cfg.sv b/hw/ip/spi_device/dv/env/spi_device_env_cfg.sv
index 03e2a2b..1e508cb 100644
--- a/hw/ip/spi_device/dv/env/spi_device_env_cfg.sv
+++ b/hw/ip/spi_device/dv/env/spi_device_env_cfg.sv
@@ -20,7 +20,7 @@
     // set num_interrupts & num_alerts which will be used to create coverage and more
     num_interrupts = ral.intr_state.get_n_used_bits();
 
-    sram_start_addr = ral.offset_to_addr(SRAM_OFFSET);
+    sram_start_addr = ral.get_addr_from_offset(SRAM_OFFSET);
     sram_end_addr   = sram_start_addr + SRAM_SIZE - 1;
   endfunction
 
diff --git a/hw/ip/spi_device/dv/env/spi_device_scoreboard.sv b/hw/ip/spi_device/dv/env/spi_device_scoreboard.sv
index d0e2930..226f6e1 100644
--- a/hw/ip/spi_device/dv/env/spi_device_scoreboard.sv
+++ b/hw/ip/spi_device/dv/env/spi_device_scoreboard.sv
@@ -68,7 +68,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b0; // TODO: fixme
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/uart/dv/env/uart_scoreboard.sv b/hw/ip/uart/dv/env/uart_scoreboard.sv
index ae071b3..5cf8eed 100644
--- a/hw/ip/uart/dv/env/uart_scoreboard.sv
+++ b/hw/ip/uart/dv/env/uart_scoreboard.sv
@@ -163,7 +163,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/hw/ip/usbdev/dv/env/usbdev_scoreboard.sv b/hw/ip/usbdev/dv/env/usbdev_scoreboard.sv
index 85eb877..346b0ee 100644
--- a/hw/ip/usbdev/dv/env/usbdev_scoreboard.sv
+++ b/hw/ip/usbdev/dv/env/usbdev_scoreboard.sv
@@ -51,7 +51,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     // if access was to a valid csr, get the csr handle
     if (csr_addr inside {cfg.csr_addrs}) begin
diff --git a/util/uvmdvgen/scoreboard.sv.tpl b/util/uvmdvgen/scoreboard.sv.tpl
index 13098b0..f3cdf5c 100644
--- a/util/uvmdvgen/scoreboard.sv.tpl
+++ b/util/uvmdvgen/scoreboard.sv.tpl
@@ -64,7 +64,7 @@
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
-    uvm_reg_addr_t csr_addr = ral.align_to_word_addr(item.a_addr);
+    uvm_reg_addr_t csr_addr = ral.get_word_aligned_addr(item.a_addr);
 
     bit addr_phase_read   = (!write && channel == AddrChannel);
     bit addr_phase_write  = (write && channel == AddrChannel);