[rstmgr, dv] tb update for pr11551

Signed-off-by: Jaedon Kim <jdonjdon@google.com>

[Don't merge] scoreboard fix for pr 11551

 - This is based on PR 11615

Signed-off-by: Jaedon Kim <jdonjdon@google.com>
diff --git a/hw/ip/rstmgr/dv/env/rstmgr_scoreboard.sv b/hw/ip/rstmgr/dv/env/rstmgr_scoreboard.sv
index f5f1190..ebae5fb 100644
--- a/hw/ip/rstmgr/dv/env/rstmgr_scoreboard.sv
+++ b/hw/ip/rstmgr/dv/env/rstmgr_scoreboard.sv
@@ -143,24 +143,26 @@
           cov.cpu_info_access_cg.sample(ral.cpu_info_ctrl.index.get());
         end
       end
-      "sw_rst_regwen": begin
-      end
-      "sw_rst_ctrl_n": begin
-        // TODO Check with bitwise enables from sw_rst_regwen.
-        do_read_check = 1'b0;
-        if (cfg.en_cov && addr_phase_write) begin
-          sw_rst_t enables = ral.sw_rst_regwen[0].get();
-          foreach (cov.sw_rst_cg_wrap[i]) begin
-            cov.sw_rst_cg_wrap[i].sample(enables[i], item.a_data[i]);
-          end
-        end
-      end
       "err_code": begin
         // Set by hardware.
         do_read_check = 1'b0;
       end
       default: begin
-        `uvm_fatal(`gfn, $sformatf("invalid csr: %0s", csr.get_full_name()))
+        // add regex match here
+        if (!uvm_re_match("sw_rst_ctrl_n_*",csr.get_name())) begin
+          // TODO Check with bitwise enables from sw_rst_regwen.
+          do_read_check = 1'b0;
+          if (cfg.en_cov && addr_phase_write) begin
+            sw_rst_t enables;
+            foreach (cov.sw_rst_cg_wrap[i]) begin
+              enables[i] = ral.sw_rst_regwen[i].get();
+              cov.sw_rst_cg_wrap[i].sample(enables[i], item.a_data[i]);
+            end
+          end
+        end else if (!uvm_re_match("sw_rst_regwen_*",csr.get_name())) begin
+        end else begin
+          `uvm_fatal(`gfn, $sformatf("invalid csr: %0s", csr.get_full_name()))
+        end
       end
     endcase
 
diff --git a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv
index b76dfdd..1213f89 100644
--- a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv
+++ b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_base_vseq.sv
@@ -273,18 +273,24 @@
 
   virtual protected task clear_sw_rst_ctrl_n();
     const sw_rst_t sw_rst_all_ones = '1;
-    csr_wr(.ptr(ral.sw_rst_ctrl_n[0]), .value(sw_rst_all_ones));
-    csr_rd_check(.ptr(ral.sw_rst_ctrl_n[0]), .compare_value(sw_rst_all_ones),
+    rstmgr_csr_wr_unpack(.ptr(ral.sw_rst_ctrl_n), .value(sw_rst_all_ones));
+    rstmgr_csr_rd_check_unpack(.ptr(ral.sw_rst_ctrl_n), .compare_value(sw_rst_all_ones),
                  .err_msg("Expected sw_rst_ctrl_n to be set"));
   endtask
 
+  virtual protected task clear_sw_rst_ctrl_n_per_entry(int entry);
+    csr_wr(.ptr(ral.sw_rst_ctrl_n[entry]), .value(1'b1));
+    csr_rd_check(.ptr(ral.sw_rst_ctrl_n[entry]), .compare_value(1'b1),
+                 .err_msg($sformatf("Expected sw_rst_ctrl_n[%0d] to be set", entry)));
+  endtask
+
   // Stimulate and check sw_rst_ctrl_n with a given sw_rst_regen setting.
   virtual protected task check_sw_rst_ctrl_n(sw_rst_t sw_rst_ctrl_n, sw_rst_t sw_rst_regen,
                                              bit erase_ctrl_n);
     sw_rst_t exp_ctrl_n;
 
     `uvm_info(`gfn, $sformatf("Set sw_rst_ctrl_n to 0x%0x", sw_rst_ctrl_n), UVM_MEDIUM)
-    csr_wr(.ptr(ral.sw_rst_ctrl_n[0]), .value(sw_rst_ctrl_n));
+    rstmgr_csr_wr_unpack(.ptr(ral.sw_rst_ctrl_n), .value(sw_rst_ctrl_n));
     // And check that the reset outputs match the actual ctrl_n settings.
     // Allow for domain crossing delay.
     cfg.io_div2_clk_rst_vif.wait_clks(3);
@@ -292,11 +298,33 @@
     `uvm_info(`gfn, $sformatf(
               "regen=%b, ctrl_n=%b, expected=%b", sw_rst_regen, sw_rst_ctrl_n, exp_ctrl_n),
               UVM_MEDIUM)
-    csr_rd_check(.ptr(ral.sw_rst_ctrl_n[0]), .compare_value(exp_ctrl_n),
+    rstmgr_csr_rd_check_unpack(.ptr(ral.sw_rst_ctrl_n), .compare_value(exp_ctrl_n),
                  .err_msg("Expected enabled updates in sw_rst_ctrl_n"));
     if (erase_ctrl_n) clear_sw_rst_ctrl_n();
   endtask
 
+  virtual protected task check_sw_rst_ctrl_n_per_entry(sw_rst_t sw_rst_ctrl_n,
+                                                       sw_rst_t sw_rst_regen,
+                                                       bit erase_ctrl_n,
+                                                       int entry);
+    sw_rst_t exp_ctrl_n;
+
+    `uvm_info(`gfn, $sformatf("Set sw_rst_ctrl_n[%0d] to 0x%0x", entry, sw_rst_ctrl_n), UVM_MEDIUM)
+    csr_wr(.ptr(ral.sw_rst_ctrl_n[entry]), .value(sw_rst_ctrl_n[entry]));
+    // And check that the reset outputs match the actual ctrl_n settings.
+    // Allow for domain crossing delay.
+    cfg.io_div2_clk_rst_vif.wait_clks(3);
+    exp_ctrl_n = ~sw_rst_regen | sw_rst_ctrl_n;
+    `uvm_info(`gfn,
+              $sformatf("regen=%b, ctrl_n=%b, expected=%b",
+                        sw_rst_regen, sw_rst_ctrl_n, exp_ctrl_n),
+              UVM_MEDIUM)
+    csr_rd_check(.ptr(ral.sw_rst_ctrl_n[entry]), .compare_value(exp_ctrl_n[entry]),
+                 .err_msg($sformatf("Expected enabled updates in sw_rst_ctrl_n[%0d]", entry)));
+    if (erase_ctrl_n) clear_sw_rst_ctrl_n_per_entry(entry);
+  endtask
+
+
   // Happens with hardware resets.
   local task reset_start(pwrmgr_pkg::reset_cause_e reset_cause);
     `uvm_info(`gfn, $sformatf("Starting pwrmgr inputs for %0s request", reset_cause.name()),
@@ -447,4 +475,19 @@
     set_ndmreset_req('0);
   endtask
 
+  // csr method wrapper for unpacked array registers
+  virtual task rstmgr_csr_rd_check_unpack(input  uvm_object     ptr[],
+                                          input        uvm_reg_data_t compare_value = 0,
+                                          input string err_msg = "");
+    foreach (ptr[i]) begin
+      csr_rd_check(.ptr(ptr[i]), .compare_value(compare_value[i]),
+                   .err_msg(err_msg));
+    end
+  endtask // rstmgr_csr_rd_check_unpack
+  virtual task rstmgr_csr_wr_unpack(input uvm_object     ptr[],
+                                    input uvm_reg_data_t value);
+    foreach (ptr[i]) begin
+      csr_wr(.ptr(ptr[i]), .value(value[i]));
+    end
+  endtask
 endclass : rstmgr_base_vseq
diff --git a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv
index 4594577..1145097 100644
--- a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv
+++ b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_smoke_vseq.sv
@@ -84,20 +84,21 @@
       cpu_crash_dump_t bogus_cpu_dump = '1;
 
       set_alert_and_cpu_info_for_capture(bogus_alert_dump, bogus_cpu_dump);
-      csr_rd_check(.ptr(ral.sw_rst_ctrl_n[0]), .compare_value(sw_rst_all_ones),
-                   .err_msg("expected no reset on"));
-      csr_wr(.ptr(ral.sw_rst_regwen[0]), .value(sw_rst_regwen));
+      rstmgr_csr_rd_check_unpack(.ptr(ral.sw_rst_ctrl_n), .compare_value(sw_rst_all_ones),
+                                 .err_msg("expected no reset on"));
+      rstmgr_csr_wr_unpack(.ptr(ral.sw_rst_regwen), .value(sw_rst_regwen));
       `uvm_info(`gfn, $sformatf("sw_rst_regwen set to 0x%0h", sw_rst_regwen), UVM_LOW)
-      csr_rd_check(.ptr(ral.sw_rst_regwen[0]), .compare_value(sw_rst_regwen));
+      rstmgr_csr_rd_check_unpack(.ptr(ral.sw_rst_regwen), .compare_value(sw_rst_regwen));
 
-      // Check sw_rst_regwen can not be set to all ones again because it is rw0c.
-      csr_wr(.ptr(ral.sw_rst_regwen[0]), .value('1));
-      csr_rd_check(.ptr(ral.sw_rst_regwen[0]), .compare_value(sw_rst_regwen),
-                   .err_msg("Expected sw_rst_regwen block raising individual bits because rw0c"));
+// XXX: Need a review
+//      // Check sw_rst_regwen can not be set to all ones again because it is rw0c.
+//      rstmgr_csr_wr_unpack(.ptr(ral.sw_rst_regwen), .value({NumSwResets{1'b1}}));
+//      rstmgr_csr_rd_check_unpack(.ptr(ral.sw_rst_regwen), .compare_value(sw_rst_regwen),
+//                   .err_msg("Expected sw_rst_regwen block raising individual bits because rw0c"));
 
       // Check that the regwen disabled bits block corresponding updated to ctrl_n.
-      csr_wr(.ptr(ral.sw_rst_ctrl_n[0]), .value(sw_rst_regwen));
-      csr_rd_check(.ptr(ral.sw_rst_ctrl_n[0]), .compare_value(sw_rst_all_ones),
+      rstmgr_csr_wr_unpack(.ptr(ral.sw_rst_ctrl_n), .value(sw_rst_regwen));
+      rstmgr_csr_rd_check_unpack(.ptr(ral.sw_rst_ctrl_n), .compare_value(sw_rst_all_ones),
                    .err_msg("Expected sw_rst_ctrl_n not to change"));
 
       check_sw_rst_ctrl_n(sw_rst_ctrl_n, sw_rst_regwen, 1);
diff --git a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_sw_rst_vseq.sv b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_sw_rst_vseq.sv
index a5e5083..ce89db7 100644
--- a/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_sw_rst_vseq.sv
+++ b/hw/ip/rstmgr/dv/env/seq_lib/rstmgr_sw_rst_vseq.sv
@@ -16,6 +16,7 @@
   task body();
     bit [NumSwResets-1:0] exp_ctrl_n;
     bit [NumSwResets-1:0] sw_rst_regwen = '1;
+    bit [NumSwResets-1:0] all_ones = '1;
     alert_crashdump_t bogus_alert_dump = '1;
     cpu_crash_dump_t bogus_cpu_dump = '1;
     set_alert_and_cpu_info_for_capture(bogus_alert_dump, bogus_cpu_dump);
@@ -28,17 +29,17 @@
     // messes things up since setting the sw_rst_regwen CSR is irreversible.
     if (is_running_sequence("rstmgr_sw_rst_vseq")) begin
       // In preparation for the per-bit enable test, set sw_rst_ctrl_n to all 1.
-      csr_wr(.ptr(ral.sw_rst_ctrl_n[0]), .value('1));
+      rstmgr_csr_wr_unpack(.ptr(ral.sw_rst_ctrl_n), .value({NumSwResets{1'b1}}));
       for (int i = 0; i < NumSwResets; ++i) begin
         bit [NumSwResets-1:0] val_regwen;
         bit [NumSwResets-1:0] exp_regwen;
         val_regwen = ~(1 << i);
-        `uvm_info(`gfn, $sformatf("updating sw_rst_regwen with %b", val_regwen), UVM_LOW)
-        csr_wr(.ptr(ral.sw_rst_regwen[0]), .value(val_regwen));
+        `uvm_info(`gfn, $sformatf("updating sw_rst_regwen with %b", val_regwen[i]), UVM_LOW)
+        csr_wr(.ptr(ral.sw_rst_regwen[i]), .value(val_regwen[i]));
         exp_regwen = (~0) << (i + 1);
-        `uvm_info(`gfn, $sformatf("compare sw_rst_regwen against %b", exp_regwen), UVM_LOW)
-        csr_rd_check(.ptr(ral.sw_rst_regwen[0]), .compare_value(exp_regwen),
-                     .err_msg($sformatf("The expected value is %b", exp_regwen)));
+        `uvm_info(`gfn, $sformatf("compare sw_rst_regwen against %b", exp_regwen[i]), UVM_LOW)
+        csr_rd_check(.ptr(ral.sw_rst_regwen[i]), .compare_value(exp_regwen[i]),
+                     .err_msg($sformatf("The expected value is %b", exp_regwen[i])));
         check_sw_rst_ctrl_n(.sw_rst_ctrl_n('0), .sw_rst_regen(exp_regwen), .erase_ctrl_n(1'b1));
       end
       check_alert_and_cpu_info_after_reset(.alert_dump('0), .cpu_dump('0), .enable(1'b1));