[dv] Update csr_wr to support field write

for field write, use `csr_wr(.ptr(ral.csr.fld), ...)`, same for `csr_poke`
Using `csr_wr(.csr(...)) will have compile error, it's now `ptr`

Signed-off-by: Weicai Yang <weicai@google.com>
diff --git a/hw/dv/sv/cip_lib/cip_base_vseq.sv b/hw/dv/sv/cip_lib/cip_base_vseq.sv
index 147f951..47f061a 100644
--- a/hw/dv/sv/cip_lib/cip_base_vseq.sv
+++ b/hw/dv/sv/cip_lib/cip_base_vseq.sv
@@ -288,7 +288,7 @@
     csr_rd_check(.ptr(csr_intr_state), .compare_value(exp_intr_state), .compare_mask(interrupts));
 
     if (check_set && |(interrupts & clear)) begin
-      csr_wr(.csr(csr_intr_state), .value(interrupts & clear));
+      csr_wr(.ptr(csr_intr_state), .value(interrupts & clear));
     end
   endtask
 
@@ -335,7 +335,7 @@
         uvm_reg_data_t data = $urandom;
         `uvm_info(`gfn, $sformatf("Write intr CSR %s: 0x%0h", all_intr_csrs[i].get_name(), data),
                   UVM_MEDIUM)
-        csr_wr(.csr(all_intr_csrs[i]), .value(data));
+        csr_wr(.ptr(all_intr_csrs[i]), .value(data));
       end
 
       // Read all intr related csr and check interrupt pins
@@ -373,7 +373,7 @@
       csr_rd(.ptr(intr_state_csrs[i]), .value(data));
       if (data != 0) begin
         `uvm_info(`gtn, $sformatf("Clearing %0s", intr_state_csrs[i].get_name()), UVM_HIGH)
-        csr_wr(.csr(intr_state_csrs[i]), .value(data));
+        csr_wr(.ptr(intr_state_csrs[i]), .value(data));
         csr_rd(.ptr(intr_state_csrs[i]), .value(data));
         if (!cfg.under_reset) `DV_CHECK_EQ(data, 0)
         else break;
@@ -391,7 +391,7 @@
 
       repeat ($urandom_range(num_alerts, num_alerts * 10)) begin
         bit [BUS_DW-1:0] alert_req = $urandom_range(0, (1'b1 << num_alerts) - 1);
-        csr_wr(.csr(alert_test_csr), .value(alert_req));
+        csr_wr(.ptr(alert_test_csr), .value(alert_req));
         `uvm_info(`gfn, $sformatf("Write alert_test with val %0h", alert_req), UVM_HIGH)
         fork
           begin
@@ -410,7 +410,7 @@
 
                     // write alert_test during alert handshake will be ignored
                     if ($urandom_range(1, 10) == 10) begin
-                      csr_wr(.csr(alert_test_csr), .value(1'b1 << index));
+                      csr_wr(.ptr(alert_test_csr), .value(1'b1 << index));
                       `uvm_info(`gfn, "Write alert_test again during alert handshake", UVM_HIGH)
                     end
 
@@ -430,7 +430,7 @@
                       `uvm_info(`gfn,
                                 $sformatf("Write alert_test with val %0h during alert_handshake",
                                 1'b1 << index), UVM_HIGH)
-                      csr_wr(.csr(alert_test_csr), .value(1'b1 << index));
+                      csr_wr(.ptr(alert_test_csr), .value(1'b1 << index));
                       `DV_SPINWAIT_EXIT(while (!cfg.m_alert_agent_cfg[alert_name].vif.get_alert())
                                         cfg.clk_rst_vif.wait_clks(1);,
                                         cfg.clk_rst_vif.wait_clks(2);,
@@ -616,7 +616,7 @@
       begin
         fork
           begin
-            csr_wr(.csr(csr), .value(wdata), .en_shadow_wr(0), .predict(1));
+            csr_wr(.ptr(csr), .value(wdata), .en_shadow_wr(0), .predict(1));
           end
           begin
             string alert_name = csr.get_update_err_alert_name();
@@ -703,7 +703,7 @@
             if ($urandom_range(0, 1)) wdata = test_csrs[i].get_staged_shadow_val();
           end
           if (test_csrs[i].get_is_shadowed()) shadow_reg_wr(test_csrs[i], wdata, alert_triggered);
-          else csr_wr(.csr(test_csrs[i]), .value(wdata), .en_shadow_wr(0), .predict(1));
+          else csr_wr(.ptr(test_csrs[i]), .value(wdata), .en_shadow_wr(0), .predict(1));
 
           // check shadow_reg update error
           if (test_csrs[i].get_shadow_update_err()) begin
@@ -735,7 +735,7 @@
               csr_peek(.ptr(shadowed_csrs[index]), .value(origin_val), .kind(kind));
               rand_val = gen_storage_err_val(shadowed_csrs[index], origin_val);
 
-              csr_poke(.csr(shadowed_csrs[index]), .value(rand_val), .kind(kind), .predict(1));
+              csr_poke(.ptr(shadowed_csrs[index]), .value(rand_val), .kind(kind), .predict(1));
               `uvm_info(`gfn, $sformatf("backdoor write %0s with value %0h", kind.name, rand_val),
                         UVM_HIGH);
 
@@ -753,7 +753,7 @@
                   // Wait two clock cycles then backdoor write back original value.
                   // This won't stop fatal alert from firing.
                   cfg.clk_rst_vif.wait_clks(2);
-                  csr_poke(.csr(shadowed_csrs[index]), .value(origin_val), .kind(kind), .predict(1));
+                  csr_poke(.ptr(shadowed_csrs[index]), .value(origin_val), .kind(kind), .predict(1));
                 end else begin
                   `DV_CHECK_EQ(has_storage_error, 1,
                                "dv_base_reg did not predict shadow storage error");
@@ -763,7 +763,7 @@
                                          shadowed_csrs[index].get_name()));
 
                   // backdoor write back original value to avoid alert keep firing
-                  csr_poke(.csr(shadowed_csrs[index]), .value(origin_val), .kind(kind), .predict(1));
+                  csr_poke(.ptr(shadowed_csrs[index]), .value(origin_val), .kind(kind), .predict(1));
                   `DV_SPINWAIT(cfg.m_alert_agent_cfg[alert_name].vif.wait_ack_complete();,
                                $sformatf("timeout for alert:%0s", alert_name))
 
diff --git a/hw/dv/sv/csr_utils/csr_seq_lib.sv b/hw/dv/sv/csr_utils/csr_seq_lib.sv
index 7343675..960647b 100644
--- a/hw/dv/sv/csr_utils/csr_seq_lib.sv
+++ b/hw/dv/sv/csr_utils/csr_seq_lib.sv
@@ -200,7 +200,7 @@
                                            backdoor dist {0 :/ 7, 1 :/ 3};)
       end
 
-      csr_wr(.csr(test_csrs[i]), .value(wdata), .blocking(0), .backdoor(backdoor));
+      csr_wr(.ptr(test_csrs[i]), .value(wdata), .blocking(0), .backdoor(backdoor));
     end
   endtask
 
@@ -243,7 +243,7 @@
       // might pick up stale mirrored value
       // the pre-predict also needs to happen after the register is being written, to make sure the
       // register is getting the updated access information.
-      csr_wr(.csr(test_csrs[i]), .value(wdata), .blocking(0), .predict(!external_checker));
+      csr_wr(.ptr(test_csrs[i]), .value(wdata), .blocking(0), .predict(!external_checker));
 
       do_check_csr_or_field_rd(.csr(test_csrs[i]),
                               .blocking(0),
@@ -364,7 +364,7 @@
       val = rg.get();
       val[k]  = ~val[k];
       err_msg = $sformatf("Wrote %0s[%0d]: %0b", rg.get_full_name(), k, val[k]);
-      csr_wr(.csr(rg), .value(val), .blocking(1), .predict(!external_checker));
+      csr_wr(.ptr(rg), .value(val), .blocking(1), .predict(!external_checker));
 
       // TODO, outstanding access to same reg isn't supported in uvm_reg. Need to add another seq
       // uvm_reg waits until transaction is completed, before start another read/write in same reg
@@ -407,7 +407,7 @@
 
       `DV_CHECK_STD_RANDOMIZE_FATAL(wdata)
       wdata &= get_mask_excl_fields(test_csrs[i], CsrExclWrite, CsrAliasingTest, m_csr_excl_item);
-      csr_wr(.csr(test_csrs[i]), .value(wdata), .blocking(0), .predict(!external_checker));
+      csr_wr(.ptr(test_csrs[i]), .value(wdata), .blocking(0), .predict(!external_checker));
 
       all_csrs.shuffle();
       foreach (all_csrs[j]) begin
diff --git a/hw/dv/sv/csr_utils/csr_utils_pkg.sv b/hw/dv/sv/csr_utils/csr_utils_pkg.sv
index d3ee3c7..292c123 100644
--- a/hw/dv/sv/csr_utils/csr_utils_pkg.sv
+++ b/hw/dv/sv/csr_utils/csr_utils_pkg.sv
@@ -230,7 +230,7 @@
     join
   endtask
 
-  task automatic csr_wr(input uvm_reg        csr,
+  task automatic csr_wr(input uvm_object     ptr,
                         input uvm_reg_data_t value,
                         input uvm_check_e    check = default_csr_check,
                         input uvm_path_e     path = UVM_DEFAULT_PATH,
@@ -241,17 +241,27 @@
                         input uvm_reg_map    map = null,
                         input bit            en_shadow_wr = 1);
     if (backdoor) begin
-      csr_poke(csr, value, check, predict);
-    end else if (blocking) begin
-      csr_wr_sub(csr, value, check, path, timeout_ns, predict, map, en_shadow_wr);
+      csr_poke(ptr, value, check, predict);
     end else begin
-      fork
-        begin
-          csr_wr_sub(csr, value, check, path, timeout_ns, predict, map, en_shadow_wr);
-        end
-      join_none
-      // Add #0 to ensure that this thread starts executing before any subsequent call
-      #0;
+      csr_field_t csr_or_fld = decode_csr_or_field(ptr);
+
+      // if it's a field write, still do full CSR write and use mirrored value for the other fields
+      if (csr_or_fld.field != null) begin
+        // get full CSR value
+        value = get_csr_val_with_updated_field(csr_or_fld.field, `gmv(csr_or_fld.csr), value);
+      end
+
+      if (blocking) begin
+        csr_wr_sub(csr_or_fld.csr, value, check, path, timeout_ns, predict, map, en_shadow_wr);
+      end else begin
+        fork
+          begin
+            csr_wr_sub(csr_or_fld.csr, value, check, path, timeout_ns, predict, map, en_shadow_wr);
+          end
+        join_none
+        // Add #0 to ensure that this thread starts executing before any subsequent call
+        #0;
+      end
     end
   endtask
 
@@ -323,27 +333,40 @@
   endtask
 
   // backdoor write csr
-  task automatic csr_poke(input uvm_reg         csr,
+  task automatic csr_poke(input uvm_object      ptr,
                           input uvm_reg_data_t  value,
                           input uvm_check_e     check = default_csr_check,
                           input bit             predict = 0,
                           input bkdr_reg_path_e kind = BkdrRegPathRtl);
+    csr_field_t   csr_or_fld = decode_csr_or_field(ptr);
     uvm_status_e  status;
     string        msg_id = {csr_utils_pkg::msg_id, "::csr_poke"};
-    uvm_reg_data_t old_mirrored_val = csr.get_mirrored_value();
+    uvm_reg_data_t old_mirrored_val;
 
-    csr.poke(.status(status), .value(value), .kind(kind.name));
+    if (csr_or_fld.field != null) begin
+      old_mirrored_val = csr_or_fld.field.get_mirrored_value();
+      csr_or_fld.field.poke(.status(status), .value(value), .kind(kind.name));
+    end else begin
+      old_mirrored_val = csr_or_fld.csr.get_mirrored_value();
+      csr_or_fld.csr.poke(.status(status), .value(value), .kind(kind.name));
+    end
     if (check == UVM_CHECK && status != UVM_IS_OK) begin
       string str;
       uvm_hdl_path_concat paths[$];
-      csr.get_full_hdl_path(paths);
+      csr_or_fld.csr.get_full_hdl_path(paths);
       foreach (paths[0].slices[i]) str = $sformatf("%0s\n%0s", str, paths[0].slices[i].path);
       `uvm_fatal(msg_id, $sformatf("poke failed for %0s, check below paths %0s",
-                                   csr.get_full_name(), str))
+                                   ptr.get_full_name(), str))
     end
     // poke always updates predict value, if predict == 0, revert back to old mirrored value
     if (!predict || kind == BkdrRegPathRtlShadow) begin
-      void'(csr.predict(.value(old_mirrored_val), .kind(UVM_PREDICT_DIRECT), .path(UVM_BACKDOOR)));
+      if (csr_or_fld.field != null) begin
+        void'(csr_or_fld.field.predict(.value(old_mirrored_val), .kind(UVM_PREDICT_DIRECT),
+                                       .path(UVM_BACKDOOR)));
+      end else begin
+        void'(csr_or_fld.csr.predict(.value(old_mirrored_val), .kind(UVM_PREDICT_DIRECT),
+                                     .path(UVM_BACKDOOR)));
+      end
     end
   endtask
 
diff --git a/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv b/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv
index 8f1d797..65e3002 100644
--- a/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv
+++ b/hw/ip/aes/dv/env/seq_lib/aes_base_vseq.sv
@@ -50,12 +50,12 @@
     aes_ctrl[0]    = 0;                  // set to encryption
     aes_ctrl[6:1]  = aes_pkg::AES_ECB;   // 6'b00_0001
     aes_ctrl[9:7]  = aes_pkg::AES_128;   // set to 128b key
-    csr_wr(.csr(ral.ctrl_shadowed), .value(aes_ctrl), .en_shadow_wr(1'b1), .blocking(1));
+    csr_wr(.ptr(ral.ctrl_shadowed), .value(aes_ctrl), .en_shadow_wr(1'b1), .blocking(1));
   endtask // aes_init
 
 
   virtual task trigger();
-      csr_wr(.csr(ral.trigger), .value(32'h00000001));
+      csr_wr(.ptr(ral.trigger), .value(32'h00000001));
   endtask // trigger
 
 
@@ -77,7 +77,7 @@
   virtual task prng_reseed();
     bit [TL_DW:0] reg_val = '0;
     reg_val[5] = 1'b1;
-    csr_wr(.csr(ral.trigger), .value(reg_val));
+    csr_wr(.ptr(ral.trigger), .value(reg_val));
   endtask // prng_reseed
 
 
@@ -116,31 +116,31 @@
   virtual task write_key(bit [7:0][31:0] key [2], bit do_b2b);
     `uvm_info(`gfn, $sformatf("\n\t --- back to back transactions : %b", do_b2b), UVM_MEDIUM)
     // Share 0 (the masked key share = key ^ mask)
-    csr_wr(.csr(ral.key_share0_0), .value(key[0][0]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_1), .value(key[0][1]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_2), .value(key[0][2]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_3), .value(key[0][3]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_4), .value(key[0][4]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_5), .value(key[0][5]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_6), .value(key[0][6]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share0_7), .value(key[0][7]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_0), .value(key[0][0]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_1), .value(key[0][1]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_2), .value(key[0][2]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_3), .value(key[0][3]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_4), .value(key[0][4]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_5), .value(key[0][5]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_6), .value(key[0][6]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share0_7), .value(key[0][7]), .blocking(~do_b2b));
     // Share 1 (the mask share)
-    csr_wr(.csr(ral.key_share1_0), .value(key[1][0]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_1), .value(key[1][1]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_2), .value(key[1][2]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_3), .value(key[1][3]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_4), .value(key[1][4]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_5), .value(key[1][5]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_6), .value(key[1][6]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.key_share1_7), .value(key[1][7]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_0), .value(key[1][0]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_1), .value(key[1][1]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_2), .value(key[1][2]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_3), .value(key[1][3]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_4), .value(key[1][4]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_5), .value(key[1][5]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_6), .value(key[1][6]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.key_share1_7), .value(key[1][7]), .blocking(~do_b2b));
   endtask // write_key
 
 
   virtual task write_iv(bit  [3:0][31:0] iv, bit do_b2b);
-    csr_wr(.csr(ral.iv_0), .value(iv[0]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.iv_1), .value(iv[1]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.iv_2), .value(iv[2]), .blocking(~do_b2b));
-    csr_wr(.csr(ral.iv_3), .value(iv[3]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.iv_0), .value(iv[0]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.iv_1), .value(iv[1]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.iv_2), .value(iv[2]), .blocking(~do_b2b));
+    csr_wr(.ptr(ral.iv_3), .value(iv[3]), .blocking(~do_b2b));
   endtask
 
 
@@ -156,10 +156,10 @@
     write_order.shuffle();
     foreach (write_order[i]) begin
       case (write_order[i])
-        0: csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]), .blocking(~do_b2b));
-        1: csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]), .blocking(~do_b2b));
-        2: csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]), .blocking(~do_b2b));
-        3: csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]), .blocking(~do_b2b));
+        0: csr_wr(.ptr(ral.data_in_0), .value(data[0][31:0]), .blocking(~do_b2b));
+        1: csr_wr(.ptr(ral.data_in_1), .value(data[1][31:0]), .blocking(~do_b2b));
+        2: csr_wr(.ptr(ral.data_in_2), .value(data[2][31:0]), .blocking(~do_b2b));
+        3: csr_wr(.ptr(ral.data_in_3), .value(data[3][31:0]), .blocking(~do_b2b));
       endcase
     end
   endtask
@@ -298,33 +298,33 @@
       txt = {txt, $sformatf("\n\t ----| \t %s", interleave_queue[i]) };
 
       case (interleave_queue[i])
-        "key_share0_0": csr_wr(.csr(ral.key_share0_0), .value(item.key[0][0]), .blocking(is_blocking));
-        "key_share0_1": csr_wr(.csr(ral.key_share0_1), .value(item.key[0][1]), .blocking(is_blocking));
-        "key_share0_2": csr_wr(.csr(ral.key_share0_2), .value(item.key[0][2]), .blocking(is_blocking));
-        "key_share0_3": csr_wr(.csr(ral.key_share0_3), .value(item.key[0][3]), .blocking(is_blocking));
-        "key_share0_4": csr_wr(.csr(ral.key_share0_4), .value(item.key[0][4]), .blocking(is_blocking));
-        "key_share0_5": csr_wr(.csr(ral.key_share0_5), .value(item.key[0][5]), .blocking(is_blocking));
-        "key_share0_6": csr_wr(.csr(ral.key_share0_6), .value(item.key[0][6]), .blocking(is_blocking));
-        "key_share0_7": csr_wr(.csr(ral.key_share0_7), .value(item.key[0][7]), .blocking(is_blocking));
+        "key_share0_0": csr_wr(.ptr(ral.key_share0_0), .value(item.key[0][0]), .blocking(is_blocking));
+        "key_share0_1": csr_wr(.ptr(ral.key_share0_1), .value(item.key[0][1]), .blocking(is_blocking));
+        "key_share0_2": csr_wr(.ptr(ral.key_share0_2), .value(item.key[0][2]), .blocking(is_blocking));
+        "key_share0_3": csr_wr(.ptr(ral.key_share0_3), .value(item.key[0][3]), .blocking(is_blocking));
+        "key_share0_4": csr_wr(.ptr(ral.key_share0_4), .value(item.key[0][4]), .blocking(is_blocking));
+        "key_share0_5": csr_wr(.ptr(ral.key_share0_5), .value(item.key[0][5]), .blocking(is_blocking));
+        "key_share0_6": csr_wr(.ptr(ral.key_share0_6), .value(item.key[0][6]), .blocking(is_blocking));
+        "key_share0_7": csr_wr(.ptr(ral.key_share0_7), .value(item.key[0][7]), .blocking(is_blocking));
 
-        "key_share1_0": csr_wr(.csr(ral.key_share1_0), .value(item.key[1][0]), .blocking(is_blocking));
-        "key_share1_1": csr_wr(.csr(ral.key_share1_1), .value(item.key[1][1]), .blocking(is_blocking));
-        "key_share1_2": csr_wr(.csr(ral.key_share1_2), .value(item.key[1][2]), .blocking(is_blocking));
-        "key_share1_3": csr_wr(.csr(ral.key_share1_3), .value(item.key[1][3]), .blocking(is_blocking));
-        "key_share1_4": csr_wr(.csr(ral.key_share1_4), .value(item.key[1][4]), .blocking(is_blocking));
-        "key_share1_5": csr_wr(.csr(ral.key_share1_5), .value(item.key[1][5]), .blocking(is_blocking));
-        "key_share1_6": csr_wr(.csr(ral.key_share1_6), .value(item.key[1][6]), .blocking(is_blocking));
-        "key_share1_7": csr_wr(.csr(ral.key_share1_7), .value(item.key[1][7]), .blocking(is_blocking));
+        "key_share1_0": csr_wr(.ptr(ral.key_share1_0), .value(item.key[1][0]), .blocking(is_blocking));
+        "key_share1_1": csr_wr(.ptr(ral.key_share1_1), .value(item.key[1][1]), .blocking(is_blocking));
+        "key_share1_2": csr_wr(.ptr(ral.key_share1_2), .value(item.key[1][2]), .blocking(is_blocking));
+        "key_share1_3": csr_wr(.ptr(ral.key_share1_3), .value(item.key[1][3]), .blocking(is_blocking));
+        "key_share1_4": csr_wr(.ptr(ral.key_share1_4), .value(item.key[1][4]), .blocking(is_blocking));
+        "key_share1_5": csr_wr(.ptr(ral.key_share1_5), .value(item.key[1][5]), .blocking(is_blocking));
+        "key_share1_6": csr_wr(.ptr(ral.key_share1_6), .value(item.key[1][6]), .blocking(is_blocking));
+        "key_share1_7": csr_wr(.ptr(ral.key_share1_7), .value(item.key[1][7]), .blocking(is_blocking));
 
-        "iv_0": csr_wr(.csr(ral.iv_0), .value(item.iv[0]), .blocking(is_blocking));
-        "iv_1": csr_wr(.csr(ral.iv_1), .value(item.iv[1]), .blocking(is_blocking));
-        "iv_2": csr_wr(.csr(ral.iv_2), .value(item.iv[2]), .blocking(is_blocking));
-        "iv_3": csr_wr(.csr(ral.iv_3), .value(item.iv[3]), .blocking(is_blocking));
+        "iv_0": csr_wr(.ptr(ral.iv_0), .value(item.iv[0]), .blocking(is_blocking));
+        "iv_1": csr_wr(.ptr(ral.iv_1), .value(item.iv[1]), .blocking(is_blocking));
+        "iv_2": csr_wr(.ptr(ral.iv_2), .value(item.iv[2]), .blocking(is_blocking));
+        "iv_3": csr_wr(.ptr(ral.iv_3), .value(item.iv[3]), .blocking(is_blocking));
 
-        "data_in_0": csr_wr(.csr(ral.data_in_0), .value(data[0][31:0]), .blocking(is_blocking));
-        "data_in_1": csr_wr(.csr(ral.data_in_1), .value(data[1][31:0]), .blocking(is_blocking));
-        "data_in_2": csr_wr(.csr(ral.data_in_2), .value(data[2][31:0]), .blocking(is_blocking));
-        "data_in_3": csr_wr(.csr(ral.data_in_3), .value(data[3][31:0]), .blocking(is_blocking));
+        "data_in_0": csr_wr(.ptr(ral.data_in_0), .value(data[0][31:0]), .blocking(is_blocking));
+        "data_in_1": csr_wr(.ptr(ral.data_in_1), .value(data[1][31:0]), .blocking(is_blocking));
+        "data_in_2": csr_wr(.ptr(ral.data_in_2), .value(data[2][31:0]), .blocking(is_blocking));
+        "data_in_3": csr_wr(.ptr(ral.data_in_3), .value(data[3][31:0]), .blocking(is_blocking));
 
         "clear_reg": begin
           clear_regs(item.clear_reg);
diff --git a/hw/ip/alert_handler/dv/env/seq_lib/alert_handler_base_vseq.sv b/hw/ip/alert_handler/dv/env/seq_lib/alert_handler_base_vseq.sv
index af89e2f..32c0b3e 100644
--- a/hw/ip/alert_handler/dv/env/seq_lib/alert_handler_base_vseq.sv
+++ b/hw/ip/alert_handler/dv/env/seq_lib/alert_handler_base_vseq.sv
@@ -18,7 +18,7 @@
 
 `define RAND_WRITE_CLASS_CTRL(i, lock_bit) \
   `DV_CHECK_RANDOMIZE_WITH_FATAL(ral.class``i``_ctrl, lock.value == lock_bit;) \
-  csr_wr(.csr(ral.class``i``_ctrl), .value(ral.class``i``_ctrl.get()));
+  csr_wr(.ptr(ral.class``i``_ctrl), .value(ral.class``i``_ctrl.get()));
 
 class alert_handler_base_vseq extends cip_base_vseq #(
     .CFG_T               (alert_handler_env_cfg),
@@ -51,16 +51,16 @@
                                   bit [TL_DW-1:0]                     alert_class = 'h0,
                                   bit [NUM_LOCAL_ALERT-1:0]           loc_alert_en = '1,
                                   bit [TL_DW-1:0]                     loc_alert_class = 'h0);
-    csr_wr(.csr(ral.intr_enable), .value(intr_en));
-    csr_wr(.csr(ral.alert_en), .value(alert_en));
-    csr_wr(.csr(ral.loc_alert_en), .value(loc_alert_en));
-    csr_wr(.csr(ral.loc_alert_class), .value(loc_alert_class));
+    csr_wr(.ptr(ral.intr_enable), .value(intr_en));
+    csr_wr(.ptr(ral.alert_en), .value(alert_en));
+    csr_wr(.ptr(ral.loc_alert_en), .value(loc_alert_en));
+    csr_wr(.ptr(ral.loc_alert_class), .value(loc_alert_class));
     for (int i = 0; i < $ceil(NUM_ALERTS * 2 / TL_DW); i++) begin
       string alert_name = (NUM_ALERTS <= TL_DW / 2) ? "alert_class" :
                                                       $sformatf("alert_class_%0d", i);
       uvm_reg alert_class_csr = ral.get_reg_by_name(alert_name);
       `DV_CHECK_NE_FATAL(alert_class_csr, null, alert_name)
-      csr_wr(.csr(alert_class_csr), .value(alert_class[i * TL_DW +: TL_DW]));
+      csr_wr(.ptr(alert_class_csr), .value(alert_class[i * TL_DW +: TL_DW]));
     end
 
   endtask
@@ -74,10 +74,10 @@
   endtask
 
   virtual task alert_handler_wr_regwen_regs(bit [NUM_ALERT_HANDLER_CLASSES-1:0] regwen);
-    if (!regwen[0]) csr_wr(.csr(ral.classa_regwen), .value($urandom_range(0, 1)));
-    if (!regwen[1]) csr_wr(.csr(ral.classb_regwen), .value($urandom_range(0, 1)));
-    if (!regwen[2]) csr_wr(.csr(ral.classc_regwen), .value($urandom_range(0, 1)));
-    if (!regwen[3]) csr_wr(.csr(ral.classd_regwen), .value($urandom_range(0, 1)));
+    if (!regwen[0]) csr_wr(.ptr(ral.classa_regwen), .value($urandom_range(0, 1)));
+    if (!regwen[1]) csr_wr(.ptr(ral.classb_regwen), .value($urandom_range(0, 1)));
+    if (!regwen[2]) csr_wr(.ptr(ral.classc_regwen), .value($urandom_range(0, 1)));
+    if (!regwen[3]) csr_wr(.ptr(ral.classd_regwen), .value($urandom_range(0, 1)));
   endtask
 
   // If do_lock_config is set, write value 0 to rewgen register.
@@ -85,7 +85,7 @@
   // Please note that writing 1 to regwen won't lock any lockable regs.
   virtual task lock_config(bit do_lock_config);
     if (do_lock_config || $urandom_range(0, 1)) begin
-      csr_wr(.csr(ral.regwen), .value(!do_lock_config));
+      csr_wr(.ptr(ral.regwen), .value(!do_lock_config));
     end
   endtask
 
@@ -139,14 +139,14 @@
   virtual task check_alert_interrupts();
     bit [TL_DW-1:0] intr;
     csr_rd(.ptr(ral.intr_state), .value(intr));
-    csr_wr(.csr(ral.intr_state), .value('1));
+    csr_wr(.ptr(ral.intr_state), .value('1));
   endtask
 
   virtual task clear_esc();
-    csr_wr(.csr(ral.classa_clr), .value(1));
-    csr_wr(.csr(ral.classb_clr), .value(1));
-    csr_wr(.csr(ral.classc_clr), .value(1));
-    csr_wr(.csr(ral.classd_clr), .value(1));
+    csr_wr(.ptr(ral.classa_clr), .value(1));
+    csr_wr(.ptr(ral.classb_clr), .value(1));
+    csr_wr(.ptr(ral.classc_clr), .value(1));
+    csr_wr(.ptr(ral.classd_clr), .value(1));
   endtask
 
   // checking for csr_rd is done in scb
@@ -239,21 +239,21 @@
   endtask
 
   virtual task wr_intr_timeout_cycle(bit[TL_DW-1:0] intr_timeout_cyc[NUM_ALERT_HANDLER_CLASSES]);
-    csr_wr(.csr(ral.classa_timeout_cyc), .value(intr_timeout_cyc[0]));
-    csr_wr(.csr(ral.classb_timeout_cyc), .value(intr_timeout_cyc[1]));
-    csr_wr(.csr(ral.classc_timeout_cyc), .value(intr_timeout_cyc[2]));
-    csr_wr(.csr(ral.classd_timeout_cyc), .value(intr_timeout_cyc[3]));
+    csr_wr(.ptr(ral.classa_timeout_cyc), .value(intr_timeout_cyc[0]));
+    csr_wr(.ptr(ral.classb_timeout_cyc), .value(intr_timeout_cyc[1]));
+    csr_wr(.ptr(ral.classc_timeout_cyc), .value(intr_timeout_cyc[2]));
+    csr_wr(.ptr(ral.classd_timeout_cyc), .value(intr_timeout_cyc[3]));
   endtask
 
   virtual task wr_class_accum_threshold(bit[TL_DW-1:0] accum_thresh[NUM_ALERT_HANDLER_CLASSES]);
-    csr_wr(.csr(ral.classa_accum_thresh), .value(accum_thresh[0]));
-    csr_wr(.csr(ral.classb_accum_thresh), .value(accum_thresh[1]));
-    csr_wr(.csr(ral.classc_accum_thresh), .value(accum_thresh[2]));
-    csr_wr(.csr(ral.classd_accum_thresh), .value(accum_thresh[3]));
+    csr_wr(.ptr(ral.classa_accum_thresh), .value(accum_thresh[0]));
+    csr_wr(.ptr(ral.classb_accum_thresh), .value(accum_thresh[1]));
+    csr_wr(.ptr(ral.classc_accum_thresh), .value(accum_thresh[2]));
+    csr_wr(.ptr(ral.classd_accum_thresh), .value(accum_thresh[3]));
   endtask
 
   virtual task wr_ping_timeout_cycle(bit[TL_DW-1:0] timeout_val);
-    csr_wr(.csr(ral.ping_timeout_cyc), .value(timeout_val));
+    csr_wr(.ptr(ral.ping_timeout_cyc), .value(timeout_val));
     if (!config_locked) begin
       if (timeout_val == 0) timeout_val = 1;
       foreach (cfg.alert_host_cfg[i]) cfg.alert_host_cfg[i].ping_timeout_cycle = timeout_val;
diff --git a/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv b/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv
index 830ad8b..893449a 100644
--- a/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv
+++ b/hw/ip/csrng/dv/env/seq_lib/csrng_base_vseq.sv
@@ -34,7 +34,7 @@
 
   // write csrng command request register
   virtual task wr_cmd_req(bit[3:0] acmd, bit[3:0] clen, bit[3:0] flags, bit[18:0] glen);
-    csr_wr(.csr(ral.cmd_req), .value({1'b0, glen, flags, clen, acmd}));
+    csr_wr(.ptr(ral.cmd_req), .value({1'b0, glen, flags, clen, acmd}));
   endtask
 
 endclass : csrng_base_vseq
diff --git a/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv b/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv
index b943f90..2dd99ca 100644
--- a/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv
+++ b/hw/ip/edn/dv/env/seq_lib/edn_smoke_vseq.sv
@@ -13,7 +13,7 @@
     super.body();
 
     // Enable edn
-    csr_wr(.csr(ral.ctrl), .value(1'b1));
+    csr_wr(.ptr(ral.ctrl), .value(1'b1));
 
     m_endpoint_pull_seq = push_pull_host_seq#(edn_pkg::FIPS_ENDPOINT_BUS_WIDTH)::type_id::
         create("m_endpoint_pull_seq");
diff --git a/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_rng_vseq.sv b/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_rng_vseq.sv
index 89305c8..743fa67 100644
--- a/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_rng_vseq.sv
+++ b/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_rng_vseq.sv
@@ -11,12 +11,12 @@
   task body();
     // TODO: Temporary for developing rng_agent
     // Enable/Disable rng
-    csr_wr(.csr(ral.conf), .value(5'h10));
-    csr_wr(.csr(ral.conf), .value(5'h00));
-    csr_wr(.csr(ral.conf), .value(5'h10));
-    csr_wr(.csr(ral.conf), .value(5'h00));
-    csr_wr(.csr(ral.conf), .value(5'h10));
-    csr_wr(.csr(ral.conf), .value(5'h00));
+    csr_wr(.ptr(ral.conf), .value(5'h10));
+    csr_wr(.ptr(ral.conf), .value(5'h00));
+    csr_wr(.ptr(ral.conf), .value(5'h10));
+    csr_wr(.ptr(ral.conf), .value(5'h00));
+    csr_wr(.ptr(ral.conf), .value(5'h10));
+    csr_wr(.ptr(ral.conf), .value(5'h00));
   endtask : body
 
 endclass : entropy_src_rng_vseq
diff --git a/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_smoke_vseq.sv b/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_smoke_vseq.sv
index c69b25a..da6e8f3 100644
--- a/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_smoke_vseq.sv
+++ b/hw/ip/entropy_src/dv/env/seq_lib/entropy_src_smoke_vseq.sv
@@ -12,13 +12,13 @@
     csr_rd_check(.ptr(ral.entropy_data), .compare_value(1'b0));
 
     // Change entropy rate
-    csr_wr(.csr(ral.rate), .value('h8));
+    csr_wr(.ptr(ral.rate), .value('h8));
 
     // Route to ENTROPY_DATA register
-    csr_wr(.csr(ral.entropy_control), .value(1'b1));
+    csr_wr(.ptr(ral.entropy_control), .value(1'b1));
 
     // Enable entropy_src - lfsr mode
-    csr_wr(.csr(ral.conf), .value(2'b10));
+    csr_wr(.ptr(ral.conf), .value(2'b10));
 
     // Wait for entropy_valid interrupt
     csr_spinwait(.ptr(ral.intr_state.es_entropy_valid), .exp_data(1'b1));
@@ -32,7 +32,7 @@
     csr_rd_check(.ptr(ral.intr_state), .compare_value(1'b1));
 
     // Clear entropy_valid interrupt bit
-    csr_wr(.csr(ral.intr_state), .value(1'b1));
+    csr_wr(.ptr(ral.intr_state), .value(1'b1));
 
     // Ensure entropy_valid interrupt bit cleared
     csr_rd_check(.ptr(ral.intr_state), .compare_value(1'b0));
diff --git a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv
index f050969..e033d70 100644
--- a/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv
+++ b/hw/ip/flash_ctrl/dv/env/seq_lib/flash_ctrl_base_vseq.sv
@@ -50,7 +50,7 @@
         get_csr_val_with_updated_field(ral.mp_region_cfg_0.base_0, data, region_cfg.start_page) |
         get_csr_val_with_updated_field(ral.mp_region_cfg_0.size_0, data, region_cfg.num_pages);
     csr = ral.get_reg_by_name($sformatf("mp_region_cfg_%0d", index));
-    csr_wr(.csr(csr), .value(data));
+    csr_wr(.ptr(csr), .value(data));
   endtask
 
   // Configure the protection for the "default" region (all pages that do not fall into one
@@ -61,12 +61,12 @@
     data = get_csr_val_with_updated_field(ral.default_region.rd_en, data, read_en) |
            get_csr_val_with_updated_field(ral.default_region.prog_en, data, program_en) |
            get_csr_val_with_updated_field(ral.default_region.erase_en, data, erase_en);
-    csr_wr(.csr(ral.default_region), .value(data));
+    csr_wr(.ptr(ral.default_region), .value(data));
   endtask
 
   // Configure bank erasability.
   virtual task flash_ctrl_bank_erase_cfg(bit [flash_ctrl_pkg::NumBanks-1:0] bank_erase_en);
-    csr_wr(.csr(ral.mp_bank_cfg), .value(bank_erase_en));
+    csr_wr(.ptr(ral.mp_bank_cfg), .value(bank_erase_en));
   endtask
 
   // Configure read and program fifo levels for interrupt.
@@ -76,12 +76,12 @@
 
     data = get_csr_val_with_updated_field(ral.fifo_lvl.prog, data, program_fifo_intr_level) |
            get_csr_val_with_updated_field(ral.fifo_lvl.rd, data, read_fifo_intr_level);
-    csr_wr(.csr(ral.fifo_lvl), .value(data));
+    csr_wr(.ptr(ral.fifo_lvl), .value(data));
   endtask
 
   // Reset the program and read fifos.
   virtual task flash_ctrl_fifo_reset(bit reset = 1'b1);
-    csr_wr(.csr(ral.fifo_rst), .value(reset));
+    csr_wr(.ptr(ral.fifo_rst), .value(reset));
   endtask
 
   // Wait for flash_ctrl op to finish.
@@ -99,7 +99,7 @@
     )
     if (clear_op_status) begin
       data = get_csr_val_with_updated_field(ral.op_status.done, data, 0);
-      csr_wr(.csr(ral.op_status), .value(data));
+      csr_wr(.ptr(ral.op_status), .value(data));
     end
   endtask
 
@@ -116,7 +116,7 @@
     )
     if (clear_op_status) begin
       data = get_csr_val_with_updated_field(ral.op_status.err, data, 0);
-      csr_wr(.csr(ral.op_status), .value(data));
+      csr_wr(.ptr(ral.op_status), .value(data));
     end
   endtask
 
@@ -150,7 +150,7 @@
     bit [InfoTypesWidth-1:0] info_sel;
 
 
-    csr_wr(.csr(ral.addr), .value(flash_op.addr));
+    csr_wr(.ptr(ral.addr), .value(flash_op.addr));
 
     // flash_op.partition -> partition_sel  ,    info_sel         |
     //  (flash_dv_part_e) | (flash_part_e)  | bit[InfoTypesWidth] |
@@ -169,7 +169,7 @@
         get_csr_val_with_updated_field(ral.control.partition_sel, data, partition_sel) |
         get_csr_val_with_updated_field(ral.control.info_sel, data, info_sel) |
         get_csr_val_with_updated_field(ral.control.num, data, flash_op.num_words - 1);
-    csr_wr(.csr(ral.control), .value(data));
+    csr_wr(.ptr(ral.control), .value(data));
   endtask
 
   // Program data into flash, stopping whenever full.
diff --git a/hw/ip/gpio/dv/env/seq_lib/gpio_dout_din_regs_random_rw_vseq.sv b/hw/ip/gpio/dv/env/seq_lib/gpio_dout_din_regs_random_rw_vseq.sv
index 949d026..288e019 100644
--- a/hw/ip/gpio/dv/env/seq_lib/gpio_dout_din_regs_random_rw_vseq.sv
+++ b/hw/ip/gpio/dv/env/seq_lib/gpio_dout_din_regs_random_rw_vseq.sv
@@ -55,14 +55,14 @@
               cfg.clk_rst_vif.wait_clks(1);
               // DATA_IN register is RO, but writing random value to it
               // should have no impact on gpio functionality
-              csr_wr(.csr(ral.data_in), .value(csr_val));
+              csr_wr(.ptr(ral.data_in), .value(csr_val));
             end
-            1: csr_wr(.csr(ral.direct_out      ), .value(csr_val));
-            1: csr_wr(.csr(ral.direct_oe       ), .value(csr_val));
-            1: csr_wr(.csr(ral.masked_out_lower), .value(csr_val));
-            1: csr_wr(.csr(ral.masked_oe_lower ), .value(csr_val));
-            1: csr_wr(.csr(ral.masked_out_upper), .value(csr_val));
-            1: csr_wr(.csr(ral.masked_oe_upper ), .value(csr_val));
+            1: csr_wr(.ptr(ral.direct_out      ), .value(csr_val));
+            1: csr_wr(.ptr(ral.direct_oe       ), .value(csr_val));
+            1: csr_wr(.ptr(ral.masked_out_lower), .value(csr_val));
+            1: csr_wr(.ptr(ral.masked_oe_lower ), .value(csr_val));
+            1: csr_wr(.ptr(ral.masked_out_upper), .value(csr_val));
+            1: csr_wr(.ptr(ral.masked_oe_upper ), .value(csr_val));
           endcase
         end
         // read any one of the gpio data registers
diff --git a/hw/ip/gpio/dv/env/seq_lib/gpio_full_random_vseq.sv b/hw/ip/gpio/dv/env/seq_lib/gpio_full_random_vseq.sv
index 711ef4d..94704f1 100644
--- a/hw/ip/gpio/dv/env/seq_lib/gpio_full_random_vseq.sv
+++ b/hw/ip/gpio/dv/env/seq_lib/gpio_full_random_vseq.sv
@@ -119,7 +119,7 @@
           csr_wr_value[pin] = gpio_if_pins_o_val[pin];
         end
       end
-      csr_wr(.csr(ral.direct_out), .value(csr_wr_value));
+      csr_wr(.ptr(ral.direct_out), .value(csr_wr_value));
       // Update value of data_out
       data_out = csr_wr_value;
       `uvm_info(`gfn, $sformatf("data_out updated to value %0h", data_out), UVM_HIGH)
@@ -142,7 +142,7 @@
       end
       // updated csr_wr_value
       csr_wr_value = {mask, data};
-      csr_wr(.csr(ral.masked_out_lower), .value(csr_wr_value));
+      csr_wr(.ptr(ral.masked_out_lower), .value(csr_wr_value));
       // Update data_out value
       for (uint pin = 0; pin < ral.masked_out_lower.mask.get_n_bits(); pin++) begin
         if (mask[pin] == 1'b1) begin
@@ -171,7 +171,7 @@
       end
       // updated csr_wr_value
       csr_wr_value = {mask, data};
-      csr_wr(.csr(ral.masked_out_upper), .value(csr_wr_value));
+      csr_wr(.ptr(ral.masked_out_upper), .value(csr_wr_value));
       // Update value of data_out
       for (uint pin = 0; pin < ral.masked_out_upper.mask.get_n_bits(); pin++) begin
         if (mask[pin] == 1'b1) begin
@@ -191,7 +191,7 @@
           csr_wr_value[pin] = 1'b0;
         end
       end
-      csr_wr(.csr(ral.direct_oe), .value(csr_wr_value));
+      csr_wr(.ptr(ral.direct_oe), .value(csr_wr_value));
       // Update data_oe value
       data_oe = csr_wr_value;
       `uvm_info(`gfn, $sformatf("data_oe updated to value %0h", data_oe), UVM_HIGH)
@@ -214,7 +214,7 @@
       end
       // updated csr_wr_value
       csr_wr_value = {mask, data};
-      csr_wr(.csr(ral.masked_oe_lower), .value(csr_wr_value));
+      csr_wr(.ptr(ral.masked_oe_lower), .value(csr_wr_value));
       // Update data_oe value
       for (uint pin = 0; pin < ral.masked_oe_lower.mask.get_n_bits(); pin++) begin
         if (mask[pin] == 1'b1) begin
@@ -242,7 +242,7 @@
       end
       // updated csr_wr_value
       csr_wr_value = {mask, data};
-      csr_wr(.csr(ral.masked_oe_upper), .value(csr_wr_value));
+      csr_wr(.ptr(ral.masked_oe_upper), .value(csr_wr_value));
       // Update data_oe value
       for (uint pin = 0; pin < ral.masked_oe_upper.mask.get_n_bits(); pin++) begin
         if (mask[pin] == 1'b1) begin
diff --git a/hw/ip/gpio/dv/env/seq_lib/gpio_random_long_reg_writes_reg_reads_vseq.sv b/hw/ip/gpio/dv/env/seq_lib/gpio_random_long_reg_writes_reg_reads_vseq.sv
index 7c35259..b692fc2 100644
--- a/hw/ip/gpio/dv/env/seq_lib/gpio_random_long_reg_writes_reg_reads_vseq.sv
+++ b/hw/ip/gpio/dv/env/seq_lib/gpio_random_long_reg_writes_reg_reads_vseq.sv
@@ -66,48 +66,48 @@
     randcase
       1: begin
         // Writing to DATA_IN reg
-        csr_wr(.csr(ral.data_in), .value(csr_wr_value));
+        csr_wr(.ptr(ral.data_in), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.direct_out), .value(csr_wr_value));
+        csr_wr(.ptr(ral.direct_out), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.masked_out_lower), .value(csr_wr_value));
+        csr_wr(.ptr(ral.masked_out_lower), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.masked_out_upper), .value(csr_wr_value));
+        csr_wr(.ptr(ral.masked_out_upper), .value(csr_wr_value));
       end
       1: begin
         undrive_gpio_in();
-        csr_wr(.csr(ral.direct_oe), .value(csr_wr_value));
+        csr_wr(.ptr(ral.direct_oe), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.masked_oe_lower), .value(csr_wr_value));
+        csr_wr(.ptr(ral.masked_oe_lower), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.masked_oe_upper), .value(csr_wr_value));
+        csr_wr(.ptr(ral.masked_oe_upper), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.intr_enable), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_enable), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.intr_test), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_test), .value(csr_wr_value));
         `uvm_info(`gfn, "Writing to intr_test", UVM_NONE)
       end
       1: begin
-        csr_wr(.csr(ral.intr_state), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_state), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.intr_ctrl_en_falling), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_ctrl_en_falling), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.intr_ctrl_en_rising), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_ctrl_en_rising), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.intr_ctrl_en_lvllow), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_ctrl_en_lvllow), .value(csr_wr_value));
       end
       1: begin
-        csr_wr(.csr(ral.intr_ctrl_en_lvlhigh), .value(csr_wr_value));
+        csr_wr(.ptr(ral.intr_ctrl_en_lvlhigh), .value(csr_wr_value));
       end
     endcase
   endtask : gpio_reg_wr
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 a077341..8b08185 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
@@ -98,13 +98,13 @@
 
   // trigger hash computation to start
   virtual task trigger_hash();
-    csr_wr(.csr(ral.cmd), .value(1'b1 << HashStart));
+    csr_wr(.ptr(ral.cmd), .value(1'b1 << HashStart));
     // if sha is not enabled, assert error interrupt and check error code
     if (!ral.cfg.sha_en.get_mirrored_value()) check_error_code();
   endtask
 
   virtual task trigger_process();
-    csr_wr(.csr(ral.cmd), .value(1'b1 << HashProcess));
+    csr_wr(.ptr(ral.cmd), .value(1'b1 << HashProcess));
   endtask
 
   virtual task trigger_hash_when_active();
@@ -241,7 +241,7 @@
     csr_utils_pkg::wait_no_outstanding_access();
     csr_rd(ral.status, rdata);
     csr_rd(ral.intr_state, rdata);
-    csr_wr(.csr(ral.intr_state), .value(rdata));
+    csr_wr(.ptr(ral.intr_state), .value(rdata));
   endtask
 
   // this task is called when sha_en=0 and sequence set hash_start, or streamed in msg
@@ -256,11 +256,11 @@
         check_interrupts(.interrupts((1 << HmacErr)), .check_set(1'b1));
       end else begin
         csr_rd_check(.ptr(ral.intr_state), .compare_value(1 << HmacErr));
-        csr_wr(.csr(ral.intr_state), .value(1 << HmacErr));
+        csr_wr(.ptr(ral.intr_state), .value(1 << HmacErr));
       end
     end else begin
       csr_rd(.ptr(ral.intr_state), .value(error_code));
-      csr_wr(.csr(ral.intr_state), .value(error_code));
+      csr_wr(.ptr(ral.intr_state), .value(error_code));
     end
     csr_rd(ral.err_code, error_code);
   endtask
diff --git a/hw/ip/hmac/dv/env/seq_lib/hmac_smoke_vseq.sv b/hw/ip/hmac/dv/env/seq_lib/hmac_smoke_vseq.sv
index 7877fca..a95d2bb 100644
--- a/hw/ip/hmac/dv/env/seq_lib/hmac_smoke_vseq.sv
+++ b/hw/ip/hmac/dv/env/seq_lib/hmac_smoke_vseq.sv
@@ -129,7 +129,7 @@
           end
         end
         csr_rd(.ptr(ral.intr_state), .value(intr_state_val));
-        csr_wr(.csr(ral.intr_state), .value(intr_state_val));
+        csr_wr(.ptr(ral.intr_state), .value(intr_state_val));
       end
 
       // if disable sha, digest should be cleared
diff --git a/hw/ip/hmac/dv/env/seq_lib/hmac_test_vectors_sha_vseq.sv b/hw/ip/hmac/dv/env/seq_lib/hmac_test_vectors_sha_vseq.sv
index 5008e28..1a117fb 100644
--- a/hw/ip/hmac/dv/env/seq_lib/hmac_test_vectors_sha_vseq.sv
+++ b/hw/ip/hmac/dv/env/seq_lib/hmac_test_vectors_sha_vseq.sv
@@ -62,7 +62,7 @@
 
         wait(cfg.intr_vif.pins[HmacDone] === 1'b1);
         csr_rd(.ptr(ral.intr_state), .value(intr_state_val));
-        csr_wr(.csr(ral.intr_state), .value(intr_state_val));
+        csr_wr(.ptr(ral.intr_state), .value(intr_state_val));
         // read digest and compare with the expected result, scb will calculate and check too
         compare_digest(parsed_vectors[j].exp_digest);
       end
diff --git a/hw/ip/i2c/dv/env/seq_lib/i2c_base_vseq.sv b/hw/ip/i2c/dv/env/seq_lib/i2c_base_vseq.sv
index 0759505..ee7ad83 100644
--- a/hw/ip/i2c/dv/env/seq_lib/i2c_base_vseq.sv
+++ b/hw/ip/i2c/dv/env/seq_lib/i2c_base_vseq.sv
@@ -224,7 +224,7 @@
     csr_update(ral.fifo_ctrl);
 
     //enable then clear interrupts
-    csr_wr(.csr(ral.intr_enable), .value({TL_DW{1'b1}}));
+    csr_wr(.ptr(ral.intr_enable), .value({TL_DW{1'b1}}));
     process_interrupts();
   endtask : host_init
 
@@ -373,11 +373,11 @@
 
     `DV_CHECK_MEMBER_RANDOMIZE_FATAL(clear_intr_dly)
     cfg.clk_rst_vif.wait_clks(clear_intr_dly);
-    csr_wr(.csr(ral.intr_state), .value(intr_clear));
+    csr_wr(.ptr(ral.intr_state), .value(intr_clear));
   endtask : process_interrupts
 
   virtual task clear_interrupt(i2c_intr_e intr, bit verify_clear = 1'b1);
-    csr_wr(.csr(ral.intr_state), .value(1 << intr));
+    csr_wr(.ptr(ral.intr_state), .value(1 << intr));
     if (verify_clear) wait(!cfg.intr_vif.pins[intr]);
   endtask : clear_interrupt
 
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv
index ef2eca9..7eed019 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_base_vseq.sv
@@ -175,7 +175,7 @@
     // check for chech in scb and clear err_code
     csr_rd(.ptr(ral.err_code), .value(rd_val));
     if (rd_val != 0) begin
-      csr_wr(.csr(ral.err_code), .value(rd_val));
+      csr_wr(.ptr(ral.err_code), .value(rd_val));
     end
   endtask : wait_op_done
 
diff --git a/hw/ip/kmac/dv/env/seq_lib/kmac_base_vseq.sv b/hw/ip/kmac/dv/env/seq_lib/kmac_base_vseq.sv
index b69ce95..6deabed 100644
--- a/hw/ip/kmac/dv/env/seq_lib/kmac_base_vseq.sv
+++ b/hw/ip/kmac/dv/env/seq_lib/kmac_base_vseq.sv
@@ -234,7 +234,7 @@
     csr_update(.csr(ral.cfg));
 
     // setup KEY_LEN csr
-    csr_wr(.csr(ral.key_len), .value(key_len));
+    csr_wr(.ptr(ral.key_len), .value(key_len));
 
     // print debug info
     `uvm_info(`gfn, $sformatf("KMAC INITIALIZATION INFO:\n%0s", convert2string()), UVM_HIGH)
@@ -364,13 +364,13 @@
     foreach (prefix_arr[i]) begin
       string csr_name = $sformatf("prefix_%0d", i);
       uvm_reg csr = ral.get_reg_by_name(csr_name);
-      csr_wr(.csr(csr), .value(prefix_arr[i]));
+      csr_wr(.ptr(csr), .value(prefix_arr[i]));
     end
   endtask
 
   // This task writes the given command to the CMD csr
   virtual task issue_cmd(kmac_cmd_e cmd);
-    csr_wr(.csr(ral.cmd), .value(cmd));
+    csr_wr(.ptr(ral.cmd), .value(cmd));
   endtask
 
   // This task commands KMAC to manually squeeze more output data,
@@ -387,7 +387,7 @@
       for (int j = 0; j < KMAC_NUM_KEYS_PER_SHARE; j++) begin
         string csr_name = $sformatf("key_share%0d_%0d", i, j);
         uvm_reg csr = ral.get_reg_by_name(csr_name);
-        csr_wr(.csr(csr), .value(key_share[i][j]));
+        csr_wr(.ptr(csr), .value(key_share[i][j]));
       end
     end
 
@@ -400,8 +400,8 @@
   endtask
 
   virtual task provide_sw_entropy();
-    csr_wr(.csr(ral.entropy_seed_lower), .value($urandom()));
-    csr_wr(.csr(ral.entropy_seed_upper), .value($urandom()));
+    csr_wr(.ptr(ral.entropy_seed_lower), .value($urandom()));
+    csr_wr(.ptr(ral.entropy_seed_upper), .value($urandom()));
   endtask
 
   // Call this task to initiate a KDF hashing operation
@@ -585,7 +585,7 @@
     //
     // TODO: might need a way to determine when to check fifo-related state in the scoreboard
     csr_rd(.ptr(ral.intr_state), .value(irq_data));
-    csr_wr(.csr(ral.intr_state), .value(irq_data));
+    csr_wr(.ptr(ral.intr_state), .value(irq_data));
 
     csr_spinwait(.ptr(ral.status.fifo_full), .exp_data(1'b0));
   endtask
@@ -603,7 +603,7 @@
     end
     // read and clear intr_state
     csr_rd(.ptr(ral.intr_state), .value(intr_state));
-    csr_wr(.csr(ral.intr_state), .value(intr_state));
+    csr_wr(.ptr(ral.intr_state), .value(intr_state));
   endtask
 
   // This task reads a chunk of data from the STATE window and appends it to the `digest`
diff --git a/hw/ip/pattgen/dv/env/seq_lib/pattgen_base_vseq.sv b/hw/ip/pattgen/dv/env/seq_lib/pattgen_base_vseq.sv
index 085cf52..d7039ea 100644
--- a/hw/ip/pattgen/dv/env/seq_lib/pattgen_base_vseq.sv
+++ b/hw/ip/pattgen/dv/env/seq_lib/pattgen_base_vseq.sv
@@ -73,7 +73,7 @@
 
   // setup basic pattgen features
   virtual task initialize_dut();
-    csr_wr(.csr(ral.intr_enable), .value({TL_DW{1'b1}}));
+    csr_wr(.ptr(ral.intr_enable), .value({TL_DW{1'b1}}));
     `uvm_info(`gfn, "\n  call pattgen_init", UVM_DEBUG)
   endtask : initialize_dut
 
@@ -109,9 +109,9 @@
       ral.size.len_ch0.set(channel_cfg[0].len);
       ral.size.reps_ch0.set(channel_cfg[0].reps);
       csr_update(ral.size);
-      csr_wr(.csr(ral.prediv_ch0), .value(channel_cfg[0].prediv));
-      csr_wr(.csr(ral.data_ch0_0), .value(channel_cfg[0].data[31:0]));
-      csr_wr(.csr(ral.data_ch0_1), .value(channel_cfg[0].data[63:32]));
+      csr_wr(.ptr(ral.prediv_ch0), .value(channel_cfg[0].prediv));
+      csr_wr(.ptr(ral.data_ch0_0), .value(channel_cfg[0].data[31:0]));
+      csr_wr(.ptr(ral.data_ch0_1), .value(channel_cfg[0].data[63:32]));
       ral.ctrl.polarity_ch0.set(channel_cfg[0].polarity);
       update_pattgen_agent_cfg(.channel(0));
       csr_update(ral.ctrl);
@@ -131,9 +131,9 @@
       ral.size.len_ch1.set(channel_cfg[1].len);
       ral.size.reps_ch1.set(channel_cfg[1].reps);
       csr_update(ral.size);
-      csr_wr(.csr(ral.prediv_ch1), .value(channel_cfg[1].prediv));
-      csr_wr(.csr(ral.data_ch1_0), .value(channel_cfg[1].data[31:0]));
-      csr_wr(.csr(ral.data_ch1_1), .value(channel_cfg[1].data[63:32]));
+      csr_wr(.ptr(ral.prediv_ch1), .value(channel_cfg[1].prediv));
+      csr_wr(.ptr(ral.data_ch1_0), .value(channel_cfg[1].data[31:0]));
+      csr_wr(.ptr(ral.data_ch1_1), .value(channel_cfg[1].data[63:32]));
       ral.ctrl.polarity_ch1.set(channel_cfg[1].polarity);
       update_pattgen_agent_cfg(.channel(1));
       csr_update(ral.ctrl);
@@ -329,7 +329,7 @@
       endcase
       `DV_CHECK_MEMBER_RANDOMIZE_FATAL(clear_intr_dly)
       cfg.clk_rst_vif.wait_clks(clear_intr_dly);
-      csr_wr(.csr(ral.intr_state), .value(intr_clear));
+      csr_wr(.ptr(ral.intr_state), .value(intr_clear));
     end else begin
       `uvm_info(`gfn, $sformatf("\n  channel error, no clear interrupts %b", intr_clear), UVM_DEBUG)
     end
diff --git a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_base_vseq.sv b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_base_vseq.sv
index 6584537..48f50e0 100644
--- a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_base_vseq.sv
+++ b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_base_vseq.sv
@@ -148,7 +148,7 @@
 
     if ($urandom_range(0, 1)) begin
       wr_value = 1 << timer;
-      csr_wr(.csr(intr_state_rg), .value(wr_value));
+      csr_wr(.ptr(intr_state_rg), .value(wr_value));
     end else begin
       wr_value = $urandom();
       set_compare_val(hart, timer, wr_value);
diff --git a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_cfg_update_on_fly_vseq.sv b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_cfg_update_on_fly_vseq.sv
index 677b418..11cb8b1 100644
--- a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_cfg_update_on_fly_vseq.sv
+++ b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_cfg_update_on_fly_vseq.sv
@@ -40,7 +40,7 @@
       `uvm_info(`gfn, $sformatf("Running test iteration %0d/%0d", trans, num_trans), UVM_LOW)
 
       // disable timers
-      csr_wr(.csr(ral.ctrl), .value(ral.ctrl.get_reset()));
+      csr_wr(.ptr(ral.ctrl), .value(ral.ctrl.get_reset()));
 
       for (int hart = 0; hart < NUM_HARTS; hart++) begin
         for (int timer = 0; timer < NUM_TIMERS; timer++) begin
diff --git a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_disabled_vseq.sv b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_disabled_vseq.sv
index 2960f56..8262934 100644
--- a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_disabled_vseq.sv
+++ b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_disabled_vseq.sv
@@ -17,7 +17,7 @@
       `DV_CHECK_RANDOMIZE_FATAL(this)
 
       // disable timers
-      csr_wr(.csr(ral.ctrl), .value(ral.ctrl.get_reset()));
+      csr_wr(.ptr(ral.ctrl), .value(ral.ctrl.get_reset()));
 
       // configure the timers and harts based on rand fields
       cfg_all_timers();
diff --git a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_random_vseq.sv b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_random_vseq.sv
index e73abb2..af4c8ef 100644
--- a/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_random_vseq.sv
+++ b/hw/ip/rv_timer/dv/env/seq_lib/rv_timer_random_vseq.sv
@@ -107,7 +107,7 @@
       if (trans > 1) `DV_CHECK_RANDOMIZE_FATAL(this)
 
       // disable timers first
-      csr_wr(.csr(ral.ctrl), .value(ral.ctrl.get_reset()));
+      csr_wr(.ptr(ral.ctrl), .value(ral.ctrl.get_reset()));
 
       // configure the timers and harts based on rand fields
       cfg_all_timers();
@@ -151,7 +151,7 @@
       join
 
       // Disable timers.
-      csr_wr(.csr(ral.ctrl), .value(ral.ctrl.get_reset()));
+      csr_wr(.ptr(ral.ctrl), .value(ral.ctrl.get_reset()));
 
       // Write one to clear the interrupt status.
       for (int i = 0; i < NUM_HARTS; i++) begin
diff --git a/hw/ip/spi_device/dv/env/seq_lib/spi_device_base_vseq.sv b/hw/ip/spi_device/dv/env/seq_lib/spi_device_base_vseq.sv
index a849fe5..ccb4179 100644
--- a/hw/ip/spi_device/dv/env/seq_lib/spi_device_base_vseq.sv
+++ b/hw/ip/spi_device/dv/env/seq_lib/spi_device_base_vseq.sv
@@ -237,7 +237,7 @@
 
     // update txf_ptr.wptr
     tx_wptr = get_csr_val_with_updated_field(ral.txf_ptr.wptr, ral.txf_ptr.get(), tx_wptr);
-    csr_wr(.csr(ral.txf_ptr), .value(tx_wptr));
+    csr_wr(.ptr(ral.txf_ptr), .value(tx_wptr));
   endtask
 
   // read spi host data received from the host
@@ -267,7 +267,7 @@
     end
 
     // update rxf_ptr.rptr
-    csr_wr(.csr(ral.rxf_ptr), .value(rx_rptr));
+    csr_wr(.ptr(ral.rxf_ptr), .value(rx_rptr));
   endtask
 
   virtual task read_tx_avail_bytes(sram_avail_type_e avail_type, ref uint avail_bytes);
diff --git a/hw/ip/spi_device/dv/env/seq_lib/spi_device_intr_vseq.sv b/hw/ip/spi_device/dv/env/seq_lib/spi_device_intr_vseq.sv
index 0d7ac57..58123a9 100644
--- a/hw/ip/spi_device/dv/env/seq_lib/spi_device_intr_vseq.sv
+++ b/hw/ip/spi_device/dv/env/seq_lib/spi_device_intr_vseq.sv
@@ -26,7 +26,7 @@
         // clean up rx fifo
         process_rx_read(ASYNC_FIFO_SIZE);
         // clean interrupts
-        csr_wr(.csr(ral.intr_state), .value('1));
+        csr_wr(.ptr(ral.intr_state), .value('1));
       end
 
       repeat (NumSpiDevIntr) begin
@@ -35,7 +35,7 @@
         `uvm_info(`gfn, $sformatf("\nTesting %0s", spi_dev_intr.name), UVM_LOW)
         drive_and_check_one_intr(spi_dev_intr);
 
-        csr_wr(.csr(ral.intr_state), .value('1));
+        csr_wr(.ptr(ral.intr_state), .value('1));
         check_for_tx_rx_idle();
       end
       `uvm_info(`gfn, $sformatf("finished run %0d/%0d", i, num_trans), UVM_LOW)
@@ -93,7 +93,7 @@
 
           // clean interrupts and test it's edge triggered
           filled_bytes = aligned_watermark + SRAM_WORD_SIZE;
-          csr_wr(.csr(ral.intr_state), .value('1));
+          csr_wr(.ptr(ral.intr_state), .value('1));
           spi_host_xfer_bytes(SRAM_WORD_SIZE, device_bytes_q);
           wait_for_rx_avail_bytes(filled_bytes, SramDataAvail, avail_bytes);
           check_interrupts(.interrupts(1 << RxFifoGeLevel), .check_set(0));
diff --git a/hw/ip/sram_ctrl/dv/env/seq_lib/sram_ctrl_base_vseq.sv b/hw/ip/sram_ctrl/dv/env/seq_lib/sram_ctrl_base_vseq.sv
index 0091296..3773369 100644
--- a/hw/ip/sram_ctrl/dv/env/seq_lib/sram_ctrl_base_vseq.sv
+++ b/hw/ip/sram_ctrl/dv/env/seq_lib/sram_ctrl_base_vseq.sv
@@ -42,7 +42,7 @@
   //
   // Will trigger a request to the KDI push_pull agent.
   virtual task req_scr_key();
-    csr_wr(.csr(ral.ctrl), .value(1'b1));
+    csr_wr(.ptr(ral.ctrl), .value(1'b1));
   endtask
 
   // Task to perform a single SRAM read at the specified location
diff --git a/hw/ip/uart/dv/env/seq_lib/uart_base_vseq.sv b/hw/ip/uart/dv/env/seq_lib/uart_base_vseq.sv
index 8e5dd67..858353f 100644
--- a/hw/ip/uart/dv/env/seq_lib/uart_base_vseq.sv
+++ b/hw/ip/uart/dv/env/seq_lib/uart_base_vseq.sv
@@ -152,7 +152,7 @@
 
   // task to send a byte of data out of dut
   virtual task send_tx_byte(byte data);
-    csr_wr(.csr(ral.wdata), .value(data));
+    csr_wr(.ptr(ral.wdata), .value(data));
   endtask
 
   // task to send a byte of data into dut, can override it to test error cases
diff --git a/hw/ip/uart/dv/env/seq_lib/uart_intr_vseq.sv b/hw/ip/uart/dv/env/seq_lib/uart_intr_vseq.sv
index 0145ef0..929a3ee 100644
--- a/hw/ip/uart/dv/env/seq_lib/uart_intr_vseq.sv
+++ b/hw/ip/uart/dv/env/seq_lib/uart_intr_vseq.sv
@@ -37,7 +37,7 @@
         // tx may have unfinished transaction
         spinwait_txidle();
         dut_shutdown();
-        csr_wr(.csr(ral.intr_state), .value('hff));
+        csr_wr(.ptr(ral.intr_state), .value('hff));
       end
       `uvm_info(`gfn, $sformatf("finished run %0d/%0d", i, num_trans), UVM_LOW)
     end
@@ -68,7 +68,7 @@
         check_one_intr(.uart_intr(uart_intr), .exp(1));
         cfg.m_uart_agent_cfg.vif.wait_for_tx_idle();
         // check interrupt is non-sticky
-        csr_wr(.csr(ral.intr_state), .value(1 << uart_intr));
+        csr_wr(.ptr(ral.intr_state), .value(1 << uart_intr));
         drive_tx_bytes(.num_bytes(watermark_bytes - 1));
         check_one_intr(.uart_intr(uart_intr), .exp(0));
         cfg.m_uart_agent_cfg.vif.wait_for_tx_idle();
@@ -82,7 +82,7 @@
         drive_rx_bytes(.num_bytes(1));
         check_one_intr(.uart_intr(uart_intr), .exp(en_rx));
         // check interrupt is non-sticky
-        csr_wr(.csr(ral.intr_state), .value(1 << uart_intr));
+        csr_wr(.ptr(ral.intr_state), .value(1 << uart_intr));
         drive_rx_bytes(.num_bytes(1));
         check_one_intr(.uart_intr(uart_intr), .exp(0));
       end
@@ -95,7 +95,7 @@
           spinwait_txidle();
           check_one_intr(.uart_intr(uart_intr), .exp(1));
           // check interrupt is non-sticky
-          csr_wr(.csr(ral.intr_state), .value(1 << uart_intr));
+          csr_wr(.ptr(ral.intr_state), .value(1 << uart_intr));
           check_one_intr(.uart_intr(uart_intr), .exp(0));
         end
       end
@@ -130,7 +130,7 @@
         drive_rx_bytes(.num_bytes(1));
         // clear rx fifo and interrupts triggered by above driving
         clear_fifos(.clear_tx_fifo(0), .clear_rx_fifo(1));
-        csr_wr(.csr(ral.intr_state), .value('hff));
+        csr_wr(.ptr(ral.intr_state), .value('hff));
 
         fork
           begin
@@ -192,11 +192,11 @@
         check_one_intr(.uart_intr(uart_intr), .exp(0));
         wait_for_baud_clock_cycles(2);
         check_one_intr(.uart_intr(uart_intr), .exp(en_rx & en_timeout));
-        csr_wr(.csr(ral.intr_state), .value('hff));
+        csr_wr(.ptr(ral.intr_state), .value('hff));
         // expect timeout again since no fifo activity
         wait_for_baud_clock_cycles(timeout_val);
         check_one_intr(.uart_intr(uart_intr), .exp(en_rx & en_timeout));
-        csr_wr(.csr(ral.intr_state), .value('hff));
+        csr_wr(.ptr(ral.intr_state), .value('hff));
 
         if (!en_rx) return;
         // reset timeout timer by issuing a rdata read
@@ -267,7 +267,7 @@
         "uart_intr val: %0h, en_intr: %0h", exp, en_intr))
 
     if (do_clear) begin
-      csr_wr(.csr(ral.intr_state), .value(exp));
+      csr_wr(.ptr(ral.intr_state), .value(exp));
     end
   endtask : check_all_intr
 
diff --git a/hw/ip/uart/dv/env/seq_lib/uart_loopback_vseq.sv b/hw/ip/uart/dv/env/seq_lib/uart_loopback_vseq.sv
index 52d67fa..566e6a8 100644
--- a/hw/ip/uart/dv/env/seq_lib/uart_loopback_vseq.sv
+++ b/hw/ip/uart/dv/env/seq_lib/uart_loopback_vseq.sv
@@ -49,7 +49,7 @@
     spinwait_rxidle();
     csr_rd_check(.ptr(ral.rdata), .compare_value(tx_byte));
     // clear TxEmpty interrupt
-    csr_wr(.csr(ral.intr_state), .value(1 << TxEmpty));
+    csr_wr(.ptr(ral.intr_state), .value(1 << TxEmpty));
     // check status is default value
     csr_rd_check(.ptr(ral.status), .compare_value(ral.status.get_reset()));
 
diff --git a/hw/ip/uart/dv/env/seq_lib/uart_rx_oversample_vseq.sv b/hw/ip/uart/dv/env/seq_lib/uart_rx_oversample_vseq.sv
index 9231a54..869d736 100644
--- a/hw/ip/uart/dv/env/seq_lib/uart_rx_oversample_vseq.sv
+++ b/hw/ip/uart/dv/env/seq_lib/uart_rx_oversample_vseq.sv
@@ -45,7 +45,7 @@
     clear_fifos(.clear_rx_fifo(1), .clear_tx_fifo(0));
     // clear all interrupts as the driving of rx value in seq may trigger interrupt that scb
     // doesn't expect
-    csr_wr(.csr(ral.intr_state), .value('1));
+    csr_wr(.ptr(ral.intr_state), .value('1));
   endtask : body
 
   // find the center of oversampled clk
diff --git a/hw/ip/uart/dv/env/seq_lib/uart_tx_ovrd_vseq.sv b/hw/ip/uart/dv/env/seq_lib/uart_tx_ovrd_vseq.sv
index 43097b0..42202d5 100644
--- a/hw/ip/uart/dv/env/seq_lib/uart_tx_ovrd_vseq.sv
+++ b/hw/ip/uart/dv/env/seq_lib/uart_tx_ovrd_vseq.sv
@@ -26,13 +26,13 @@
 
       if (en_ovrd) exp = txval;
       else         exp = 1;
-      csr_wr(.csr(ral.ovrd), .value({txval, en_ovrd}));
+      csr_wr(.ptr(ral.ovrd), .value({txval, en_ovrd}));
       cfg.clk_rst_vif.wait_clks(1);
       if (!cfg.under_reset) `DV_CHECK_EQ(cfg.m_uart_agent_cfg.vif.uart_tx, exp)
       cfg.clk_rst_vif.wait_clks(dly_to_next_trans);
     end
     // disable ovrd
-    csr_wr(.csr(ral.ovrd), .value(0));
+    csr_wr(.ptr(ral.ovrd), .value(0));
     cfg.clk_rst_vif.wait_clks(1);
     cfg.m_uart_agent_cfg.en_tx_monitor = 1;
 
diff --git a/hw/ip/uart/dv/env/seq_lib/uart_tx_rx_vseq.sv b/hw/ip/uart/dv/env/seq_lib/uart_tx_rx_vseq.sv
index b2f4aa0..eac48f1 100644
--- a/hw/ip/uart/dv/env/seq_lib/uart_tx_rx_vseq.sv
+++ b/hw/ip/uart/dv/env/seq_lib/uart_tx_rx_vseq.sv
@@ -158,7 +158,7 @@
     clear_rx_intr = clear_intr[RxWatermark] | clear_intr[RxOverflow] | clear_intr[RxFrameErr] |
                     clear_intr[RxParityErr];
     wait_when_in_ignored_period(clear_tx_intr, clear_rx_intr);
-    csr_wr(.csr(ral.intr_state), .value(clear_intr));
+    csr_wr(.ptr(ral.intr_state), .value(clear_intr));
   endtask
 
   virtual task process_tx();
diff --git a/hw/top_earlgrey/dv/env/seq_lib/chip_shadow_reg_errors_vseq.sv b/hw/top_earlgrey/dv/env/seq_lib/chip_shadow_reg_errors_vseq.sv
index 432cfc6..be470d3 100644
--- a/hw/top_earlgrey/dv/env/seq_lib/chip_shadow_reg_errors_vseq.sv
+++ b/hw/top_earlgrey/dv/env/seq_lib/chip_shadow_reg_errors_vseq.sv
@@ -42,14 +42,14 @@
                                          {BkdrRegPathRtlCommitted, BkdrRegPathRtlShadow};)
       csr_peek(.ptr(shadowed_csrs[i]), .value(origin_val), .kind(kind));
       poke_val = gen_storage_err_val(shadowed_csrs[i], origin_val, 0);
-      csr_poke(.csr(shadowed_csrs[i]), .value(poke_val), .kind(kind), .predict(1));
+      csr_poke(.ptr(shadowed_csrs[i]), .value(poke_val), .kind(kind), .predict(1));
 
       // Check storage error alerts
       alert_name = shadowed_csrs[i].get_storage_err_alert_name();
       `DV_SPINWAIT(while (!cfg.m_alert_agent_cfg[alert_name].vif.get_alert())
                    cfg.clk_rst_vif.wait_clks(1);,
                    $sformatf("%0s storage_err alert not detected", shadowed_csrs[i].get_name()));
-      csr_poke(.csr(shadowed_csrs[i]), .value(origin_val), .kind(kind), .predict(1));
+      csr_poke(.ptr(shadowed_csrs[i]), .value(origin_val), .kind(kind), .predict(1));
       `DV_SPINWAIT(cfg.m_alert_agent_cfg[alert_name].vif.wait_ack_complete();,
                    $sformatf("timeout for alert:%0s", alert_name))
     end
@@ -59,7 +59,7 @@
   // and the second write is 'haaaa_aaaa
   // If any shadow reg does not follow this, can add additional requirements to this task
   virtual task wr_shadowed_reg_update_err(dv_base_reg csr, output bit alert_triggered);
-    csr_wr(.csr(csr), .value('h5555_5555), .en_shadow_wr(0), .predict(1));
+    csr_wr(.ptr(csr), .value('h5555_5555), .en_shadow_wr(0), .predict(1));
     shadow_reg_wr(.csr(csr), .wdata('haaaa_aaaa), .alert_triggered(alert_triggered));
   endtask : wr_shadowed_reg_update_err