[keymgr/dv] Enable cfgen sequence and scb

Steal some good ideals from Cindy's PR #5005 to improve cfgen

Signed-off-by: Weicai Yang <weicai@google.com>
diff --git a/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv b/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv
index 7e3652a..aebba86 100644
--- a/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_env_pkg.sv
@@ -10,6 +10,7 @@
   import dv_lib_pkg::*;
   import tl_agent_pkg::*;
   import cip_base_pkg::*;
+  import dv_base_reg_pkg::*;
   import csr_utils_pkg::*;
   import keymgr_ral_pkg::*;
   import keymgr_kmac_agent_pkg::*;
diff --git a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
index 54de944..9741302 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -274,6 +274,7 @@
   endfunction
 
   virtual task process_tl_access(tl_seq_item item, tl_channels_e channel = DataChannel);
+    dv_base_reg dv_reg;
     uvm_reg csr;
     bit     do_read_check   = 1'b1;
     bit     write           = item.is_write();
@@ -288,6 +289,7 @@
     if (csr_addr inside {cfg.csr_addrs}) begin
       csr = ral.default_map.get_reg_by_offset(csr_addr);
       `DV_CHECK_NE_FATAL(csr, null)
+      `downcast(dv_reg, csr)
     end
     else begin
       `uvm_fatal(`gfn, $sformatf("Access unexpected addr 0x%0h", csr_addr))
@@ -297,9 +299,7 @@
     if (addr_phase_write) begin
       // if OP WIP or keymgr_en=0, will clear cfgen and below csr can't be written
       if ((current_op_status == keymgr_pkg::OpWip || cfg.keymgr_vif.keymgr_en != lc_ctrl_pkg::On) &&
-          csr.get_name() inside {"control", "key_version",
-          "sw_binding_0", "sw_binding_1", "sw_binding_2", "sw_binding_3",
-          "salt_0", "salt_1", "salt_2", "salt_3"}) begin
+          ral.cfgen.is_inside_locked_regs(dv_reg)) begin
         `uvm_info(`gfn, $sformatf("Reg write to %0s is ignored due to cfgen=0", csr.get_name()),
                   UVM_MEDIUM)
         return;
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv
index 6a1b76e..ed9b172 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfgen_vseq.sv
@@ -54,27 +54,25 @@
       wait_no_outstanding_access();
       csr_rd(ral.op_status, op_status_val, .backdoor(1));
       if (op_status_val == keymgr_pkg::OpWip && cfg.keymgr_vif.kmac_data_rsp.done) begin
-        write_cfgen_gated_reg();
+        write_and_check_regwen_locked_reg();
       end
     end
   endtask
 
-  virtual task write_cfgen_gated_reg();
+  virtual task write_and_check_regwen_locked_reg();
     bit [TL_DW-1:0] val = $urandom;
-
-    `uvm_info(`gfn, "Write cfgen gated reg, and this write should be ignored", UVM_HIGH)
     // since it's timing sensitive, only write one of these reg
-    randcase
-      1: csr_wr(ral.control,            val);
-      1: csr_wr(ral.key_version,        val);
-      1: csr_wr(ral.sw_binding_0,       val);
-      1: csr_wr(ral.sw_binding_1,       val);
-      1: csr_wr(ral.sw_binding_2,       val);
-      1: csr_wr(ral.sw_binding_3,       val);
-      1: csr_wr(ral.salt_0,             val);
-      1: csr_wr(ral.salt_1,             val);
-      1: csr_wr(ral.salt_2,             val);
-      1: csr_wr(ral.salt_3,             val);
-    endcase
-  endtask : write_cfgen_gated_reg
+    dv_base_reg     locked_reg;
+    dv_base_reg     locked_regs[$];
+
+    ral.cfgen.get_locked_regs(locked_regs);
+    locked_regs.shuffle();
+    locked_reg = locked_regs[0];
+
+    `uvm_info(`gfn, $sformatf("Write regwen locked reg %0s, and this write should be ignored",
+                              locked_reg.get_name()), UVM_MEDIUM)
+    csr_wr(locked_reg, val);
+    csr_rd(locked_reg, val); // checking is done with scb
+  endtask : write_and_check_regwen_locked_reg
+
 endclass : keymgr_cfgen_vseq