[keymgr] Convert configuration to shadow register

- split start from configuration since shadow registers do now support hrw
- this is part of keymgr d2s likely review items

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/keymgr/data/keymgr.hjson b/hw/ip/keymgr/data/keymgr.hjson
index c978b0f..f9626e0 100644
--- a/hw/ip/keymgr/data/keymgr.hjson
+++ b/hw/ip/keymgr/data/keymgr.hjson
@@ -240,23 +240,20 @@
             key manager configuration enable.
             When key manager operation is started (see CONTROL), registers protected by this EN are no longer
             modifiable until the operation completes.
-
-            TBD
-            This should be enhanced to support multi-bit values in the future. Should be another script change.
           '''
         },
       ]
     },
 
-    { name: "CONTROL",
-      desc: "Key manager operation controls",
-      regwen: "CFG_REGWEN",
+    { name: "START",
+      desc: "Key manager operation start",
       swaccess: "rw",
-      hwaccess: "hro",
+      hwaccess: "hrw",
+      regwen: "CFG_REGWEN",
       fields: [
         { bits: "0",
           hwaccess: "hrw",
-          name: "START",
+          name: "EN",
           desc: "Start key manager operations",
           resval: "0"
           enum: [
@@ -269,8 +266,19 @@
           ]
           tags: [// bit self clears, handle in directed test
             "excl:CsrNonInitTests:CsrExclWrite"]
-        },
+        }
+      ]
+    },
 
+    { name: "CONTROL_SHADOWED",
+      desc: "Key manager operation controls",
+      regwen: "CFG_REGWEN",
+      swaccess: "rw",
+      hwaccess: "hro",
+      shadowed: "true",
+      update_err_alert: "recov_operation_err",
+      storage_err_alert: "fatal_fault_err",
+      fields: [
         { bits: "6:4",
           name: "OPERATION",
           desc: "Key manager operation selection. All values not enumerated below behave the same as disable",
diff --git a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
index 6360662..c1e29f7 100644
--- a/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
+++ b/hw/ip/keymgr/dv/env/keymgr_scoreboard.sv
@@ -219,7 +219,7 @@
       UpdateHwOut: begin
         kmac_digests_t key_shares = {item.rsp_digest_share1, item.rsp_digest_share0};
         keymgr_pkg::keymgr_key_dest_e dest = keymgr_pkg::keymgr_key_dest_e'(
-            `gmv(ral.control.dest_sel));
+            `gmv(ral.control_shadowed.dest_sel));
 
         if (dest != keymgr_pkg::None && !get_fault_err()) begin
           cfg.keymgr_vif.update_sideload_key(key_shares, current_state, current_cdi, dest);
@@ -271,7 +271,7 @@
 
           if (cfg.en_cov && cfg.keymgr_vif.get_keymgr_en() && is_final_kdf) begin
             keymgr_pkg::keymgr_key_dest_e dest = keymgr_pkg::keymgr_key_dest_e'(
-                `gmv(ral.control.dest_sel));
+                `gmv(ral.control_shadowed.dest_sel));
             cov.state_and_op_cg.sample(current_state, op, current_op_status, current_cdi, dest);
           end
         end
@@ -410,7 +410,7 @@
       if (cfg.en_cov && ral.cfg_regwen.locks_reg_or_fld(dv_reg) &&
           cfg.keymgr_vif.get_keymgr_en()) begin
         bit cfg_regwen = (current_op_status == keymgr_pkg::OpWip);
-        if (csr.get_name() == "control") begin
+        if (csr.get_name() == "control_shadowed") begin
           cov.control_w_regwen_cg.sample(item.a_data, cfg_regwen);
         end else if (csr.get_name() == "sideload_clear") begin
           cov.sideload_clear_cg.sample(`gmv(ral.sideload_clear.val),
@@ -538,9 +538,9 @@
           end
         end
       end
-      "control": begin
+      "start": begin
         if (addr_phase_write) begin
-          bit start = `gmv(ral.control.start);
+          bit start = `gmv(ral.start.en);
 
           if (start) begin
             keymgr_pkg::keymgr_ops_e op = get_operation();
@@ -581,7 +581,7 @@
 
                       if (cfg.en_cov) begin
                         keymgr_pkg::keymgr_key_dest_e dest = keymgr_pkg::keymgr_key_dest_e'(
-                            `gmv(ral.control.dest_sel));
+                            `gmv(ral.control_shadowed.dest_sel));
 
                         cov.state_and_op_cg.sample(current_state, op, current_op_status,
                             current_cdi, dest);
@@ -605,7 +605,7 @@
                 if (op == keymgr_pkg::OpAdvance) begin
                   current_cdi = get_adv_cdi_type();
                 end else begin
-                  int cdi_sel = `gmv(ral.control.cdi_sel);
+                  int cdi_sel = `gmv(ral.control_shadowed.cdi_sel);
                   `downcast(current_cdi, cdi_sel)
                 end
                 // update kmac key for check
@@ -616,7 +616,7 @@
               end
             endcase
             // start will be clear after OP is done
-            void'(ral.control.start.predict(.value(0), .kind(UVM_PREDICT_WRITE)));
+            void'(ral.start.en.predict(.value(0), .kind(UVM_PREDICT_WRITE)));
           end // start
         end // addr_phase_write
       end
@@ -660,7 +660,7 @@
 
               if (cfg.en_cov) begin
                 keymgr_pkg::keymgr_key_dest_e dest = keymgr_pkg::keymgr_key_dest_e'(
-                    `gmv(ral.control.dest_sel));
+                    `gmv(ral.control_shadowed.dest_sel));
 
                 cov.state_and_op_cg.sample(current_state, get_operation(), current_op_status,
                     current_cdi, dest);
@@ -1082,7 +1082,7 @@
     gen_out_data_t exp, act;
     keymgr_pkg::keymgr_ops_e op = get_operation();
     keymgr_pkg::keymgr_key_dest_e dest = keymgr_pkg::keymgr_key_dest_e'(
-            `gmv(ral.control.dest_sel));
+            `gmv(ral.control_shadowed.dest_sel));
     string str;
 
     act = {<<8{byte_data_q}};
@@ -1141,7 +1141,7 @@
   // if it's not defined operation, treat as OpDisable
   virtual function keymgr_pkg::keymgr_ops_e get_operation();
     keymgr_pkg::keymgr_ops_e op;
-    int op_int_val = `gmv(ral.control.operation);
+    int op_int_val = `gmv(ral.control_shadowed.operation);
 
     if (!$cast(op, op_int_val)) op = keymgr_pkg::OpDisable;
     return op;
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 a44d1fe..272a967 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
@@ -141,7 +141,7 @@
     keymgr_pkg::keymgr_op_status_e exp_status;
     bit is_good_op = 1;
     int key_verion = `gmv(ral.key_version[0]);
-    keymgr_pkg::keymgr_ops_e operation = `gmv(ral.control.operation);
+    keymgr_pkg::keymgr_ops_e operation = `gmv(ral.control_shadowed.operation);
     bit[TL_DW-1:0] rd_val;
 
     if (operation inside {keymgr_pkg::OpGenSwOut, keymgr_pkg::OpGenHwOut}) begin
@@ -216,9 +216,10 @@
   virtual task keymgr_advance(bit wait_done = 1);
     keymgr_pkg::keymgr_working_state_e exp_next_state = get_next_state(current_state);
     `uvm_info(`gfn, $sformatf("Advance key manager state from %0s", current_state.name), UVM_MEDIUM)
-    ral.control.start.set(1'b1);
-    ral.control.operation.set(keymgr_pkg::OpAdvance);
-    csr_update(.csr(ral.control));
+    ral.control_shadowed.operation.set(keymgr_pkg::OpAdvance);
+    csr_update(.csr(ral.control_shadowed));
+    ral.start.en.set(1'b1);
+    csr_update(.csr(ral.start));
 
     if (wait_done) begin
       wait_op_done();
@@ -232,12 +233,13 @@
                                bit wait_done = 1);
     `uvm_info(`gfn, "Generate key manager output", UVM_MEDIUM)
 
-    ral.control.start.set(1'b1);
-    ral.control.operation.set(int'(operation));
-    `DV_CHECK_RANDOMIZE_FATAL(ral.control.cdi_sel)
-    ral.control.dest_sel.set(int'(key_dest));
-    csr_update(.csr(ral.control));
-    ral.control.start.set(1'b0);
+    ral.control_shadowed.operation.set(int'(operation));
+    `DV_CHECK_RANDOMIZE_FATAL(ral.control_shadowed.cdi_sel)
+    ral.control_shadowed.dest_sel.set(int'(key_dest));
+    csr_update(.csr(ral.control_shadowed));
+    ral.start.en.set(1'b1);
+    csr_update(.csr(ral.start));
+    ral.start.en.set(1'b0);
 
     if (wait_done) wait_op_done();
   endtask : keymgr_generate
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfg_regwen_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfg_regwen_vseq.sv
index c0ed043..ffec5a0 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfg_regwen_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_cfg_regwen_vseq.sv
@@ -72,8 +72,8 @@
     `uvm_info(`gfn, $sformatf("Write regwen lockable reg %0s, and this write should be ignored",
                               lockable_reg.get_name()), UVM_MEDIUM)
     csr_wr(lockable_reg, val);
-    // if it's control, wait until OP is done, so that control.start is clear
-    if (lockable_reg.get_name() == "control") begin
+    // if it's control, wait until OP is done, so that start.en is clear
+    if (lockable_reg.get_name() == "control_shadowed") begin
       csr_spinwait(.ptr(ral.op_status.status), .exp_data(keymgr_pkg::OpWip),
                    .compare_op(CompareOpNe));
     end
diff --git a/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv b/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv
index 4fde772..12c5baa 100644
--- a/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv
+++ b/hw/ip/keymgr/dv/env/seq_lib/keymgr_direct_to_disabled_vseq.sv
@@ -16,14 +16,14 @@
     end
 
     `uvm_info(`gfn, $sformatf("Directly go to Disabled from %0s", current_state.name), UVM_MEDIUM)
-    ral.control.start.set(1'b1);
-    `DV_CHECK_RANDOMIZE_WITH_FATAL(ral.control.operation,
+    ral.start.en.set(1'b1);
+    `DV_CHECK_RANDOMIZE_WITH_FATAL(ral.control_shadowed.operation,
                                    // All values not enumerated below behave the same as disable
                                    !(value inside {keymgr_pkg::OpAdvance,
                                                    keymgr_pkg::OpGenId,
                                                    keymgr_pkg::OpGenSwOut,
                                                    keymgr_pkg::OpGenHwOut});)
-    csr_update(.csr(ral.control));
+    csr_update(.csr(ral.start));
 
     wait_op_done();
     if (get_check_en()) `DV_CHECK_EQ(current_state, keymgr_pkg::StDisabled)
diff --git a/hw/ip/keymgr/rtl/keymgr.sv b/hw/ip/keymgr/rtl/keymgr.sv
index 3da9246..a6bb0c4 100644
--- a/hw/ip/keymgr/rtl/keymgr.sv
+++ b/hw/ip/keymgr/rtl/keymgr.sv
@@ -136,12 +136,18 @@
     .devmode_i  (1'b1) // connect to real devmode signal in the future
   );
 
-  assign shadowed_storage_err = reg2hw.reseed_interval_shadowed.err_storage |
+  assign shadowed_storage_err = reg2hw.control_shadowed.cdi_sel.err_storage |
+                                reg2hw.control_shadowed.dest_sel.err_storage |
+                                reg2hw.control_shadowed.operation.err_storage |
+                                reg2hw.reseed_interval_shadowed.err_storage |
                                 reg2hw.max_creator_key_ver_shadowed.err_storage |
                                 reg2hw.max_owner_int_key_ver_shadowed.err_storage |
                                 reg2hw.max_owner_key_ver_shadowed.err_storage;
 
-  assign shadowed_update_err  = reg2hw.reseed_interval_shadowed.err_update |
+  assign shadowed_update_err  = reg2hw.control_shadowed.cdi_sel.err_update |
+                                reg2hw.control_shadowed.dest_sel.err_update |
+                                reg2hw.control_shadowed.operation.err_update |
+                                reg2hw.reseed_interval_shadowed.err_update |
                                 reg2hw.max_creator_key_ver_shadowed.err_update |
                                 reg2hw.max_owner_int_key_ver_shadowed.err_update |
                                 reg2hw.max_owner_key_ver_shadowed.err_update;
@@ -215,7 +221,7 @@
     // DV. When an invalid operation is selected, the keymgr just starts transmitting
     // whatever is at the prng output, however, this may cause a dv protocol violation
     // if a reseed happens to coincide.
-    .seed_en_i(seed_en & ~reg2hw.control.start.q),
+    .seed_en_i(seed_en & ~reg2hw.start.q),
     .seed_i(seed),
     .entropy_i('0),
     .state_o(lfsr)
@@ -277,9 +283,9 @@
     .prng_reseed_ack_i(reseed_ack),
     .prng_en_o(ctrl_lfsr_en),
     .entropy_i(ctrl_rand),
-    .op_i(keymgr_ops_e'(reg2hw.control.operation.q)),
-    .op_start_i(reg2hw.control.start.q),
-    .op_cdi_sel_i(reg2hw.control.cdi_sel.q),
+    .op_i(keymgr_ops_e'(reg2hw.control_shadowed.operation.q)),
+    .op_start_i(reg2hw.start.q),
+    .op_cdi_sel_i(reg2hw.control_shadowed.cdi_sel.q),
     .op_done_o(op_done),
     .init_o(init),
     .sw_binding_unlock_o(sw_binding_unlock),
@@ -307,10 +313,10 @@
     .kmac_data_i(kmac_data_truncated)
   );
 
-  assign hw2reg.control.start.d  = '0;
-  assign hw2reg.control.start.de = op_done;
+  assign hw2reg.start.d  = '0;
+  assign hw2reg.start.de = op_done;
   // as long as operation is ongoing, capture status
-  assign hw2reg.op_status.de = reg2hw.control.start.q;
+  assign hw2reg.op_status.de = reg2hw.start.q;
 
   // working state is always visible
   assign hw2reg.working_state.de = 1'b1;
@@ -323,8 +329,8 @@
     .rst_ni,
     .init_i(1'b1), // cfg_regwen does not care about init
     .en_i(lc_keymgr_en[KeyMgrEnCfgEn] == lc_ctrl_pkg::On),
-    .set_i(reg2hw.control.start.q & op_done),
-    .clr_i(reg2hw.control.start.q),
+    .set_i(reg2hw.start.q & op_done),
+    .clr_i(reg2hw.start.q),
     .out_o(cfg_regwen)
   );
 
@@ -431,7 +437,7 @@
   keymgr_key_dest_e cipher_sel;
   logic [KeyWidth-1:0] cipher_seed;
 
-  assign cipher_sel = keymgr_key_dest_e'(reg2hw.control.dest_sel);
+  assign cipher_sel = keymgr_key_dest_e'(reg2hw.control_shadowed.dest_sel.q);
   assign cipher_seed = cipher_sel == Aes  ? aes_seed  :
                        cipher_sel == Kmac ? kmac_seed :
                        cipher_sel == Otbn ? otbn_seed : RndCnstNoneSeed;
@@ -684,11 +690,9 @@
   `ASSERT_KNOWN(IntrKnownO_A, intr_op_done_o)
   `ASSERT_KNOWN(AlertKnownO_A, alert_tx_o)
 
-  // the keys are not reset to any specific values
-  // TBD this may be changed depending on whether we want to support this
-  // mode of operation going forward.
-  `ASSERT_KNOWN(AesKeyKnownO_A,  aes_key_o.valid)
-  `ASSERT_KNOWN(KmacKeyKnownO_A, kmac_key_o.valid)
+  `ASSERT_KNOWN(AesKeyKnownO_A,  aes_key_o)
+  `ASSERT_KNOWN(KmacKeyKnownO_A, kmac_key_o)
+  `ASSERT_KNOWN(OtbnKeyKnownO_A, otbn_key_o)
   `ASSERT_KNOWN(KmacDataKnownO_A, kmac_data_o)
 
   // kmac parameter consistency
diff --git a/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv b/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv
index 92b5a79..a9a0003 100644
--- a/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reg_pkg.sv
@@ -45,19 +45,26 @@
   } keymgr_reg2hw_alert_test_reg_t;
 
   typedef struct packed {
-    struct packed {
-      logic        q;
-    } start;
+    logic        q;
+  } keymgr_reg2hw_start_reg_t;
+
+  typedef struct packed {
     struct packed {
       logic [2:0]  q;
+      logic        err_update;
+      logic        err_storage;
     } operation;
     struct packed {
       logic        q;
+      logic        err_update;
+      logic        err_storage;
     } cdi_sel;
     struct packed {
       logic [2:0]  q;
+      logic        err_update;
+      logic        err_storage;
     } dest_sel;
-  } keymgr_reg2hw_control_reg_t;
+  } keymgr_reg2hw_control_shadowed_reg_t;
 
   typedef struct packed {
     logic [2:0]  q;
@@ -151,11 +158,9 @@
   } keymgr_hw2reg_cfg_regwen_reg_t;
 
   typedef struct packed {
-    struct packed {
-      logic        d;
-      logic        de;
-    } start;
-  } keymgr_hw2reg_control_reg_t;
+    logic        d;
+    logic        de;
+  } keymgr_hw2reg_start_reg_t;
 
   typedef struct packed {
     logic        d;
@@ -245,7 +250,8 @@
     keymgr_reg2hw_intr_enable_reg_t intr_enable; // [941:941]
     keymgr_reg2hw_intr_test_reg_t intr_test; // [940:939]
     keymgr_reg2hw_alert_test_reg_t alert_test; // [938:935]
-    keymgr_reg2hw_control_reg_t control; // [934:927]
+    keymgr_reg2hw_start_reg_t start; // [934:934]
+    keymgr_reg2hw_control_shadowed_reg_t control_shadowed; // [933:927]
     keymgr_reg2hw_sideload_clear_reg_t sideload_clear; // [926:924]
     keymgr_reg2hw_reseed_interval_shadowed_reg_t reseed_interval_shadowed; // [923:908]
     keymgr_reg2hw_sw_binding_regwen_reg_t sw_binding_regwen; // [907:906]
@@ -263,7 +269,7 @@
   typedef struct packed {
     keymgr_hw2reg_intr_state_reg_t intr_state; // [566:565]
     keymgr_hw2reg_cfg_regwen_reg_t cfg_regwen; // [564:564]
-    keymgr_hw2reg_control_reg_t control; // [563:562]
+    keymgr_hw2reg_start_reg_t start; // [563:562]
     keymgr_hw2reg_sw_binding_regwen_reg_t sw_binding_regwen; // [561:561]
     keymgr_hw2reg_sw_share0_output_mreg_t [7:0] sw_share0_output; // [560:297]
     keymgr_hw2reg_sw_share1_output_mreg_t [7:0] sw_share1_output; // [296:33]
@@ -279,62 +285,63 @@
   parameter logic [BlockAw-1:0] KEYMGR_INTR_TEST_OFFSET = 8'h 8;
   parameter logic [BlockAw-1:0] KEYMGR_ALERT_TEST_OFFSET = 8'h c;
   parameter logic [BlockAw-1:0] KEYMGR_CFG_REGWEN_OFFSET = 8'h 10;
-  parameter logic [BlockAw-1:0] KEYMGR_CONTROL_OFFSET = 8'h 14;
-  parameter logic [BlockAw-1:0] KEYMGR_SIDELOAD_CLEAR_OFFSET = 8'h 18;
-  parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_REGWEN_OFFSET = 8'h 1c;
-  parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET = 8'h 20;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_BINDING_REGWEN_OFFSET = 8'h 24;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_0_OFFSET = 8'h 28;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_1_OFFSET = 8'h 2c;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_2_OFFSET = 8'h 30;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_3_OFFSET = 8'h 34;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_4_OFFSET = 8'h 38;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_5_OFFSET = 8'h 3c;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_6_OFFSET = 8'h 40;
-  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_7_OFFSET = 8'h 44;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_0_OFFSET = 8'h 48;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_1_OFFSET = 8'h 4c;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_2_OFFSET = 8'h 50;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_3_OFFSET = 8'h 54;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_4_OFFSET = 8'h 58;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_5_OFFSET = 8'h 5c;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_6_OFFSET = 8'h 60;
-  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_7_OFFSET = 8'h 64;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_0_OFFSET = 8'h 68;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_1_OFFSET = 8'h 6c;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_2_OFFSET = 8'h 70;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_3_OFFSET = 8'h 74;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_4_OFFSET = 8'h 78;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_5_OFFSET = 8'h 7c;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_6_OFFSET = 8'h 80;
-  parameter logic [BlockAw-1:0] KEYMGR_SALT_7_OFFSET = 8'h 84;
-  parameter logic [BlockAw-1:0] KEYMGR_KEY_VERSION_OFFSET = 8'h 88;
-  parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET = 8'h 8c;
-  parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET = 8'h 90;
-  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET = 8'h 94;
-  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET = 8'h 98;
-  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET = 8'h 9c;
-  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET = 8'h a0;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET = 8'h a4;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET = 8'h a8;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET = 8'h ac;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET = 8'h b0;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET = 8'h b4;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET = 8'h b8;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET = 8'h bc;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET = 8'h c0;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET = 8'h c4;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET = 8'h c8;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET = 8'h cc;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET = 8'h d0;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET = 8'h d4;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET = 8'h d8;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET = 8'h dc;
-  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET = 8'h e0;
-  parameter logic [BlockAw-1:0] KEYMGR_WORKING_STATE_OFFSET = 8'h e4;
-  parameter logic [BlockAw-1:0] KEYMGR_OP_STATUS_OFFSET = 8'h e8;
-  parameter logic [BlockAw-1:0] KEYMGR_ERR_CODE_OFFSET = 8'h ec;
-  parameter logic [BlockAw-1:0] KEYMGR_FAULT_STATUS_OFFSET = 8'h f0;
+  parameter logic [BlockAw-1:0] KEYMGR_START_OFFSET = 8'h 14;
+  parameter logic [BlockAw-1:0] KEYMGR_CONTROL_SHADOWED_OFFSET = 8'h 18;
+  parameter logic [BlockAw-1:0] KEYMGR_SIDELOAD_CLEAR_OFFSET = 8'h 1c;
+  parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_REGWEN_OFFSET = 8'h 20;
+  parameter logic [BlockAw-1:0] KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET = 8'h 24;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_BINDING_REGWEN_OFFSET = 8'h 28;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_0_OFFSET = 8'h 2c;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_1_OFFSET = 8'h 30;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_2_OFFSET = 8'h 34;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_3_OFFSET = 8'h 38;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_4_OFFSET = 8'h 3c;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_5_OFFSET = 8'h 40;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_6_OFFSET = 8'h 44;
+  parameter logic [BlockAw-1:0] KEYMGR_SEALING_SW_BINDING_7_OFFSET = 8'h 48;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_0_OFFSET = 8'h 4c;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_1_OFFSET = 8'h 50;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_2_OFFSET = 8'h 54;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_3_OFFSET = 8'h 58;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_4_OFFSET = 8'h 5c;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_5_OFFSET = 8'h 60;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_6_OFFSET = 8'h 64;
+  parameter logic [BlockAw-1:0] KEYMGR_ATTEST_SW_BINDING_7_OFFSET = 8'h 68;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_0_OFFSET = 8'h 6c;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_1_OFFSET = 8'h 70;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_2_OFFSET = 8'h 74;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_3_OFFSET = 8'h 78;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_4_OFFSET = 8'h 7c;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_5_OFFSET = 8'h 80;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_6_OFFSET = 8'h 84;
+  parameter logic [BlockAw-1:0] KEYMGR_SALT_7_OFFSET = 8'h 88;
+  parameter logic [BlockAw-1:0] KEYMGR_KEY_VERSION_OFFSET = 8'h 8c;
+  parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET = 8'h 90;
+  parameter logic [BlockAw-1:0] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET = 8'h 94;
+  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET = 8'h 98;
+  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET = 8'h 9c;
+  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET = 8'h a0;
+  parameter logic [BlockAw-1:0] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET = 8'h a4;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET = 8'h a8;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET = 8'h ac;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET = 8'h b0;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET = 8'h b4;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET = 8'h b8;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET = 8'h bc;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET = 8'h c0;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET = 8'h c4;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET = 8'h c8;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET = 8'h cc;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET = 8'h d0;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET = 8'h d4;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET = 8'h d8;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET = 8'h dc;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET = 8'h e0;
+  parameter logic [BlockAw-1:0] KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET = 8'h e4;
+  parameter logic [BlockAw-1:0] KEYMGR_WORKING_STATE_OFFSET = 8'h e8;
+  parameter logic [BlockAw-1:0] KEYMGR_OP_STATUS_OFFSET = 8'h ec;
+  parameter logic [BlockAw-1:0] KEYMGR_ERR_CODE_OFFSET = 8'h f0;
+  parameter logic [BlockAw-1:0] KEYMGR_FAULT_STATUS_OFFSET = 8'h f4;
 
   // Reset values for hwext registers and their fields
   parameter logic [0:0] KEYMGR_INTR_TEST_RESVAL = 1'h 0;
@@ -354,7 +361,8 @@
     KEYMGR_INTR_TEST,
     KEYMGR_ALERT_TEST,
     KEYMGR_CFG_REGWEN,
-    KEYMGR_CONTROL,
+    KEYMGR_START,
+    KEYMGR_CONTROL_SHADOWED,
     KEYMGR_SIDELOAD_CLEAR,
     KEYMGR_RESEED_INTERVAL_REGWEN,
     KEYMGR_RESEED_INTERVAL_SHADOWED,
@@ -413,68 +421,69 @@
   } keymgr_id_e;
 
   // Register width information to check illegal writes
-  parameter logic [3:0] KEYMGR_PERMIT [61] = '{
+  parameter logic [3:0] KEYMGR_PERMIT [62] = '{
     4'b 0001, // index[ 0] KEYMGR_INTR_STATE
     4'b 0001, // index[ 1] KEYMGR_INTR_ENABLE
     4'b 0001, // index[ 2] KEYMGR_INTR_TEST
     4'b 0001, // index[ 3] KEYMGR_ALERT_TEST
     4'b 0001, // index[ 4] KEYMGR_CFG_REGWEN
-    4'b 0011, // index[ 5] KEYMGR_CONTROL
-    4'b 0001, // index[ 6] KEYMGR_SIDELOAD_CLEAR
-    4'b 0001, // index[ 7] KEYMGR_RESEED_INTERVAL_REGWEN
-    4'b 0011, // index[ 8] KEYMGR_RESEED_INTERVAL_SHADOWED
-    4'b 0001, // index[ 9] KEYMGR_SW_BINDING_REGWEN
-    4'b 1111, // index[10] KEYMGR_SEALING_SW_BINDING_0
-    4'b 1111, // index[11] KEYMGR_SEALING_SW_BINDING_1
-    4'b 1111, // index[12] KEYMGR_SEALING_SW_BINDING_2
-    4'b 1111, // index[13] KEYMGR_SEALING_SW_BINDING_3
-    4'b 1111, // index[14] KEYMGR_SEALING_SW_BINDING_4
-    4'b 1111, // index[15] KEYMGR_SEALING_SW_BINDING_5
-    4'b 1111, // index[16] KEYMGR_SEALING_SW_BINDING_6
-    4'b 1111, // index[17] KEYMGR_SEALING_SW_BINDING_7
-    4'b 1111, // index[18] KEYMGR_ATTEST_SW_BINDING_0
-    4'b 1111, // index[19] KEYMGR_ATTEST_SW_BINDING_1
-    4'b 1111, // index[20] KEYMGR_ATTEST_SW_BINDING_2
-    4'b 1111, // index[21] KEYMGR_ATTEST_SW_BINDING_3
-    4'b 1111, // index[22] KEYMGR_ATTEST_SW_BINDING_4
-    4'b 1111, // index[23] KEYMGR_ATTEST_SW_BINDING_5
-    4'b 1111, // index[24] KEYMGR_ATTEST_SW_BINDING_6
-    4'b 1111, // index[25] KEYMGR_ATTEST_SW_BINDING_7
-    4'b 1111, // index[26] KEYMGR_SALT_0
-    4'b 1111, // index[27] KEYMGR_SALT_1
-    4'b 1111, // index[28] KEYMGR_SALT_2
-    4'b 1111, // index[29] KEYMGR_SALT_3
-    4'b 1111, // index[30] KEYMGR_SALT_4
-    4'b 1111, // index[31] KEYMGR_SALT_5
-    4'b 1111, // index[32] KEYMGR_SALT_6
-    4'b 1111, // index[33] KEYMGR_SALT_7
-    4'b 1111, // index[34] KEYMGR_KEY_VERSION
-    4'b 0001, // index[35] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN
-    4'b 1111, // index[36] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED
-    4'b 0001, // index[37] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN
-    4'b 1111, // index[38] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED
-    4'b 0001, // index[39] KEYMGR_MAX_OWNER_KEY_VER_REGWEN
-    4'b 1111, // index[40] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED
-    4'b 1111, // index[41] KEYMGR_SW_SHARE0_OUTPUT_0
-    4'b 1111, // index[42] KEYMGR_SW_SHARE0_OUTPUT_1
-    4'b 1111, // index[43] KEYMGR_SW_SHARE0_OUTPUT_2
-    4'b 1111, // index[44] KEYMGR_SW_SHARE0_OUTPUT_3
-    4'b 1111, // index[45] KEYMGR_SW_SHARE0_OUTPUT_4
-    4'b 1111, // index[46] KEYMGR_SW_SHARE0_OUTPUT_5
-    4'b 1111, // index[47] KEYMGR_SW_SHARE0_OUTPUT_6
-    4'b 1111, // index[48] KEYMGR_SW_SHARE0_OUTPUT_7
-    4'b 1111, // index[49] KEYMGR_SW_SHARE1_OUTPUT_0
-    4'b 1111, // index[50] KEYMGR_SW_SHARE1_OUTPUT_1
-    4'b 1111, // index[51] KEYMGR_SW_SHARE1_OUTPUT_2
-    4'b 1111, // index[52] KEYMGR_SW_SHARE1_OUTPUT_3
-    4'b 1111, // index[53] KEYMGR_SW_SHARE1_OUTPUT_4
-    4'b 1111, // index[54] KEYMGR_SW_SHARE1_OUTPUT_5
-    4'b 1111, // index[55] KEYMGR_SW_SHARE1_OUTPUT_6
-    4'b 1111, // index[56] KEYMGR_SW_SHARE1_OUTPUT_7
-    4'b 0001, // index[57] KEYMGR_WORKING_STATE
-    4'b 0001, // index[58] KEYMGR_OP_STATUS
-    4'b 0001, // index[59] KEYMGR_ERR_CODE
-    4'b 0011  // index[60] KEYMGR_FAULT_STATUS
+    4'b 0001, // index[ 5] KEYMGR_START
+    4'b 0011, // index[ 6] KEYMGR_CONTROL_SHADOWED
+    4'b 0001, // index[ 7] KEYMGR_SIDELOAD_CLEAR
+    4'b 0001, // index[ 8] KEYMGR_RESEED_INTERVAL_REGWEN
+    4'b 0011, // index[ 9] KEYMGR_RESEED_INTERVAL_SHADOWED
+    4'b 0001, // index[10] KEYMGR_SW_BINDING_REGWEN
+    4'b 1111, // index[11] KEYMGR_SEALING_SW_BINDING_0
+    4'b 1111, // index[12] KEYMGR_SEALING_SW_BINDING_1
+    4'b 1111, // index[13] KEYMGR_SEALING_SW_BINDING_2
+    4'b 1111, // index[14] KEYMGR_SEALING_SW_BINDING_3
+    4'b 1111, // index[15] KEYMGR_SEALING_SW_BINDING_4
+    4'b 1111, // index[16] KEYMGR_SEALING_SW_BINDING_5
+    4'b 1111, // index[17] KEYMGR_SEALING_SW_BINDING_6
+    4'b 1111, // index[18] KEYMGR_SEALING_SW_BINDING_7
+    4'b 1111, // index[19] KEYMGR_ATTEST_SW_BINDING_0
+    4'b 1111, // index[20] KEYMGR_ATTEST_SW_BINDING_1
+    4'b 1111, // index[21] KEYMGR_ATTEST_SW_BINDING_2
+    4'b 1111, // index[22] KEYMGR_ATTEST_SW_BINDING_3
+    4'b 1111, // index[23] KEYMGR_ATTEST_SW_BINDING_4
+    4'b 1111, // index[24] KEYMGR_ATTEST_SW_BINDING_5
+    4'b 1111, // index[25] KEYMGR_ATTEST_SW_BINDING_6
+    4'b 1111, // index[26] KEYMGR_ATTEST_SW_BINDING_7
+    4'b 1111, // index[27] KEYMGR_SALT_0
+    4'b 1111, // index[28] KEYMGR_SALT_1
+    4'b 1111, // index[29] KEYMGR_SALT_2
+    4'b 1111, // index[30] KEYMGR_SALT_3
+    4'b 1111, // index[31] KEYMGR_SALT_4
+    4'b 1111, // index[32] KEYMGR_SALT_5
+    4'b 1111, // index[33] KEYMGR_SALT_6
+    4'b 1111, // index[34] KEYMGR_SALT_7
+    4'b 1111, // index[35] KEYMGR_KEY_VERSION
+    4'b 0001, // index[36] KEYMGR_MAX_CREATOR_KEY_VER_REGWEN
+    4'b 1111, // index[37] KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED
+    4'b 0001, // index[38] KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN
+    4'b 1111, // index[39] KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED
+    4'b 0001, // index[40] KEYMGR_MAX_OWNER_KEY_VER_REGWEN
+    4'b 1111, // index[41] KEYMGR_MAX_OWNER_KEY_VER_SHADOWED
+    4'b 1111, // index[42] KEYMGR_SW_SHARE0_OUTPUT_0
+    4'b 1111, // index[43] KEYMGR_SW_SHARE0_OUTPUT_1
+    4'b 1111, // index[44] KEYMGR_SW_SHARE0_OUTPUT_2
+    4'b 1111, // index[45] KEYMGR_SW_SHARE0_OUTPUT_3
+    4'b 1111, // index[46] KEYMGR_SW_SHARE0_OUTPUT_4
+    4'b 1111, // index[47] KEYMGR_SW_SHARE0_OUTPUT_5
+    4'b 1111, // index[48] KEYMGR_SW_SHARE0_OUTPUT_6
+    4'b 1111, // index[49] KEYMGR_SW_SHARE0_OUTPUT_7
+    4'b 1111, // index[50] KEYMGR_SW_SHARE1_OUTPUT_0
+    4'b 1111, // index[51] KEYMGR_SW_SHARE1_OUTPUT_1
+    4'b 1111, // index[52] KEYMGR_SW_SHARE1_OUTPUT_2
+    4'b 1111, // index[53] KEYMGR_SW_SHARE1_OUTPUT_3
+    4'b 1111, // index[54] KEYMGR_SW_SHARE1_OUTPUT_4
+    4'b 1111, // index[55] KEYMGR_SW_SHARE1_OUTPUT_5
+    4'b 1111, // index[56] KEYMGR_SW_SHARE1_OUTPUT_6
+    4'b 1111, // index[57] KEYMGR_SW_SHARE1_OUTPUT_7
+    4'b 0001, // index[58] KEYMGR_WORKING_STATE
+    4'b 0001, // index[59] KEYMGR_OP_STATUS
+    4'b 0001, // index[60] KEYMGR_ERR_CODE
+    4'b 0011  // index[61] KEYMGR_FAULT_STATUS
   };
 
 endpackage
diff --git a/hw/ip/keymgr/rtl/keymgr_reg_top.sv b/hw/ip/keymgr/rtl/keymgr_reg_top.sv
index cb498e1..2939eea 100644
--- a/hw/ip/keymgr/rtl/keymgr_reg_top.sv
+++ b/hw/ip/keymgr/rtl/keymgr_reg_top.sv
@@ -122,15 +122,17 @@
   logic alert_test_recov_operation_err_wd;
   logic cfg_regwen_re;
   logic cfg_regwen_qs;
-  logic control_we;
-  logic control_start_qs;
-  logic control_start_wd;
-  logic [2:0] control_operation_qs;
-  logic [2:0] control_operation_wd;
-  logic control_cdi_sel_qs;
-  logic control_cdi_sel_wd;
-  logic [2:0] control_dest_sel_qs;
-  logic [2:0] control_dest_sel_wd;
+  logic start_we;
+  logic start_qs;
+  logic start_wd;
+  logic control_shadowed_re;
+  logic control_shadowed_we;
+  logic [2:0] control_shadowed_operation_qs;
+  logic [2:0] control_shadowed_operation_wd;
+  logic control_shadowed_cdi_sel_qs;
+  logic control_shadowed_cdi_sel_wd;
+  logic [2:0] control_shadowed_dest_sel_qs;
+  logic [2:0] control_shadowed_dest_sel_wd;
   logic sideload_clear_we;
   logic [2:0] sideload_clear_qs;
   logic [2:0] sideload_clear_wd;
@@ -424,44 +426,47 @@
   );
 
 
-  // R[control]: V(False)
-  //   F[start]: 0:0
+  // R[start]: V(False)
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRW),
     .RESVAL  (1'h0)
-  ) u_control_start (
+  ) u_start (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
     // from register interface
-    .we     (control_we & cfg_regwen_qs),
-    .wd     (control_start_wd),
+    .we     (start_we & cfg_regwen_qs),
+    .wd     (start_wd),
 
     // from internal hardware
-    .de     (hw2reg.control.start.de),
-    .d      (hw2reg.control.start.d),
+    .de     (hw2reg.start.de),
+    .d      (hw2reg.start.d),
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.control.start.q),
+    .q      (reg2hw.start.q),
 
     // to register interface (read)
-    .qs     (control_start_qs)
+    .qs     (start_qs)
   );
 
+
+  // R[control_shadowed]: V(False)
   //   F[operation]: 6:4
-  prim_subreg #(
+  prim_subreg_shadow #(
     .DW      (3),
     .SwAccess(prim_subreg_pkg::SwAccessRW),
     .RESVAL  (3'h1)
-  ) u_control_operation (
+  ) u_control_shadowed_operation (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
+    .rst_shadowed_ni (rst_shadowed_ni),
 
     // from register interface
-    .we     (control_we & cfg_regwen_qs),
-    .wd     (control_operation_wd),
+    .re     (control_shadowed_re),
+    .we     (control_shadowed_we & cfg_regwen_qs),
+    .wd     (control_shadowed_operation_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -469,24 +474,30 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.control.operation.q),
+    .q      (reg2hw.control_shadowed.operation.q),
 
     // to register interface (read)
-    .qs     (control_operation_qs)
+    .qs     (control_shadowed_operation_qs),
+
+    // Shadow register error conditions
+    .err_update  (reg2hw.control_shadowed.operation.err_update),
+    .err_storage (reg2hw.control_shadowed.operation.err_storage)
   );
 
   //   F[cdi_sel]: 7:7
-  prim_subreg #(
+  prim_subreg_shadow #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRW),
     .RESVAL  (1'h0)
-  ) u_control_cdi_sel (
+  ) u_control_shadowed_cdi_sel (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
+    .rst_shadowed_ni (rst_shadowed_ni),
 
     // from register interface
-    .we     (control_we & cfg_regwen_qs),
-    .wd     (control_cdi_sel_wd),
+    .re     (control_shadowed_re),
+    .we     (control_shadowed_we & cfg_regwen_qs),
+    .wd     (control_shadowed_cdi_sel_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -494,24 +505,30 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.control.cdi_sel.q),
+    .q      (reg2hw.control_shadowed.cdi_sel.q),
 
     // to register interface (read)
-    .qs     (control_cdi_sel_qs)
+    .qs     (control_shadowed_cdi_sel_qs),
+
+    // Shadow register error conditions
+    .err_update  (reg2hw.control_shadowed.cdi_sel.err_update),
+    .err_storage (reg2hw.control_shadowed.cdi_sel.err_storage)
   );
 
   //   F[dest_sel]: 14:12
-  prim_subreg #(
+  prim_subreg_shadow #(
     .DW      (3),
     .SwAccess(prim_subreg_pkg::SwAccessRW),
     .RESVAL  (3'h0)
-  ) u_control_dest_sel (
+  ) u_control_shadowed_dest_sel (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
+    .rst_shadowed_ni (rst_shadowed_ni),
 
     // from register interface
-    .we     (control_we & cfg_regwen_qs),
-    .wd     (control_dest_sel_wd),
+    .re     (control_shadowed_re),
+    .we     (control_shadowed_we & cfg_regwen_qs),
+    .wd     (control_shadowed_dest_sel_wd),
 
     // from internal hardware
     .de     (1'b0),
@@ -519,10 +536,14 @@
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.control.dest_sel.q),
+    .q      (reg2hw.control_shadowed.dest_sel.q),
 
     // to register interface (read)
-    .qs     (control_dest_sel_qs)
+    .qs     (control_shadowed_dest_sel_qs),
+
+    // Shadow register error conditions
+    .err_update  (reg2hw.control_shadowed.dest_sel.err_update),
+    .err_storage (reg2hw.control_shadowed.dest_sel.err_storage)
   );
 
 
@@ -2288,7 +2309,7 @@
 
 
 
-  logic [60:0] addr_hit;
+  logic [61:0] addr_hit;
   always_comb begin
     addr_hit = '0;
     addr_hit[ 0] = (reg_addr == KEYMGR_INTR_STATE_OFFSET);
@@ -2296,62 +2317,63 @@
     addr_hit[ 2] = (reg_addr == KEYMGR_INTR_TEST_OFFSET);
     addr_hit[ 3] = (reg_addr == KEYMGR_ALERT_TEST_OFFSET);
     addr_hit[ 4] = (reg_addr == KEYMGR_CFG_REGWEN_OFFSET);
-    addr_hit[ 5] = (reg_addr == KEYMGR_CONTROL_OFFSET);
-    addr_hit[ 6] = (reg_addr == KEYMGR_SIDELOAD_CLEAR_OFFSET);
-    addr_hit[ 7] = (reg_addr == KEYMGR_RESEED_INTERVAL_REGWEN_OFFSET);
-    addr_hit[ 8] = (reg_addr == KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET);
-    addr_hit[ 9] = (reg_addr == KEYMGR_SW_BINDING_REGWEN_OFFSET);
-    addr_hit[10] = (reg_addr == KEYMGR_SEALING_SW_BINDING_0_OFFSET);
-    addr_hit[11] = (reg_addr == KEYMGR_SEALING_SW_BINDING_1_OFFSET);
-    addr_hit[12] = (reg_addr == KEYMGR_SEALING_SW_BINDING_2_OFFSET);
-    addr_hit[13] = (reg_addr == KEYMGR_SEALING_SW_BINDING_3_OFFSET);
-    addr_hit[14] = (reg_addr == KEYMGR_SEALING_SW_BINDING_4_OFFSET);
-    addr_hit[15] = (reg_addr == KEYMGR_SEALING_SW_BINDING_5_OFFSET);
-    addr_hit[16] = (reg_addr == KEYMGR_SEALING_SW_BINDING_6_OFFSET);
-    addr_hit[17] = (reg_addr == KEYMGR_SEALING_SW_BINDING_7_OFFSET);
-    addr_hit[18] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_0_OFFSET);
-    addr_hit[19] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_1_OFFSET);
-    addr_hit[20] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_2_OFFSET);
-    addr_hit[21] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_3_OFFSET);
-    addr_hit[22] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_4_OFFSET);
-    addr_hit[23] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_5_OFFSET);
-    addr_hit[24] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_6_OFFSET);
-    addr_hit[25] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_7_OFFSET);
-    addr_hit[26] = (reg_addr == KEYMGR_SALT_0_OFFSET);
-    addr_hit[27] = (reg_addr == KEYMGR_SALT_1_OFFSET);
-    addr_hit[28] = (reg_addr == KEYMGR_SALT_2_OFFSET);
-    addr_hit[29] = (reg_addr == KEYMGR_SALT_3_OFFSET);
-    addr_hit[30] = (reg_addr == KEYMGR_SALT_4_OFFSET);
-    addr_hit[31] = (reg_addr == KEYMGR_SALT_5_OFFSET);
-    addr_hit[32] = (reg_addr == KEYMGR_SALT_6_OFFSET);
-    addr_hit[33] = (reg_addr == KEYMGR_SALT_7_OFFSET);
-    addr_hit[34] = (reg_addr == KEYMGR_KEY_VERSION_OFFSET);
-    addr_hit[35] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET);
-    addr_hit[36] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET);
-    addr_hit[37] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET);
-    addr_hit[38] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET);
-    addr_hit[39] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET);
-    addr_hit[40] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET);
-    addr_hit[41] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET);
-    addr_hit[42] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET);
-    addr_hit[43] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET);
-    addr_hit[44] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET);
-    addr_hit[45] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET);
-    addr_hit[46] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET);
-    addr_hit[47] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET);
-    addr_hit[48] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET);
-    addr_hit[49] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET);
-    addr_hit[50] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET);
-    addr_hit[51] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET);
-    addr_hit[52] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET);
-    addr_hit[53] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET);
-    addr_hit[54] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET);
-    addr_hit[55] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET);
-    addr_hit[56] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET);
-    addr_hit[57] = (reg_addr == KEYMGR_WORKING_STATE_OFFSET);
-    addr_hit[58] = (reg_addr == KEYMGR_OP_STATUS_OFFSET);
-    addr_hit[59] = (reg_addr == KEYMGR_ERR_CODE_OFFSET);
-    addr_hit[60] = (reg_addr == KEYMGR_FAULT_STATUS_OFFSET);
+    addr_hit[ 5] = (reg_addr == KEYMGR_START_OFFSET);
+    addr_hit[ 6] = (reg_addr == KEYMGR_CONTROL_SHADOWED_OFFSET);
+    addr_hit[ 7] = (reg_addr == KEYMGR_SIDELOAD_CLEAR_OFFSET);
+    addr_hit[ 8] = (reg_addr == KEYMGR_RESEED_INTERVAL_REGWEN_OFFSET);
+    addr_hit[ 9] = (reg_addr == KEYMGR_RESEED_INTERVAL_SHADOWED_OFFSET);
+    addr_hit[10] = (reg_addr == KEYMGR_SW_BINDING_REGWEN_OFFSET);
+    addr_hit[11] = (reg_addr == KEYMGR_SEALING_SW_BINDING_0_OFFSET);
+    addr_hit[12] = (reg_addr == KEYMGR_SEALING_SW_BINDING_1_OFFSET);
+    addr_hit[13] = (reg_addr == KEYMGR_SEALING_SW_BINDING_2_OFFSET);
+    addr_hit[14] = (reg_addr == KEYMGR_SEALING_SW_BINDING_3_OFFSET);
+    addr_hit[15] = (reg_addr == KEYMGR_SEALING_SW_BINDING_4_OFFSET);
+    addr_hit[16] = (reg_addr == KEYMGR_SEALING_SW_BINDING_5_OFFSET);
+    addr_hit[17] = (reg_addr == KEYMGR_SEALING_SW_BINDING_6_OFFSET);
+    addr_hit[18] = (reg_addr == KEYMGR_SEALING_SW_BINDING_7_OFFSET);
+    addr_hit[19] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_0_OFFSET);
+    addr_hit[20] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_1_OFFSET);
+    addr_hit[21] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_2_OFFSET);
+    addr_hit[22] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_3_OFFSET);
+    addr_hit[23] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_4_OFFSET);
+    addr_hit[24] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_5_OFFSET);
+    addr_hit[25] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_6_OFFSET);
+    addr_hit[26] = (reg_addr == KEYMGR_ATTEST_SW_BINDING_7_OFFSET);
+    addr_hit[27] = (reg_addr == KEYMGR_SALT_0_OFFSET);
+    addr_hit[28] = (reg_addr == KEYMGR_SALT_1_OFFSET);
+    addr_hit[29] = (reg_addr == KEYMGR_SALT_2_OFFSET);
+    addr_hit[30] = (reg_addr == KEYMGR_SALT_3_OFFSET);
+    addr_hit[31] = (reg_addr == KEYMGR_SALT_4_OFFSET);
+    addr_hit[32] = (reg_addr == KEYMGR_SALT_5_OFFSET);
+    addr_hit[33] = (reg_addr == KEYMGR_SALT_6_OFFSET);
+    addr_hit[34] = (reg_addr == KEYMGR_SALT_7_OFFSET);
+    addr_hit[35] = (reg_addr == KEYMGR_KEY_VERSION_OFFSET);
+    addr_hit[36] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_REGWEN_OFFSET);
+    addr_hit[37] = (reg_addr == KEYMGR_MAX_CREATOR_KEY_VER_SHADOWED_OFFSET);
+    addr_hit[38] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_REGWEN_OFFSET);
+    addr_hit[39] = (reg_addr == KEYMGR_MAX_OWNER_INT_KEY_VER_SHADOWED_OFFSET);
+    addr_hit[40] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_REGWEN_OFFSET);
+    addr_hit[41] = (reg_addr == KEYMGR_MAX_OWNER_KEY_VER_SHADOWED_OFFSET);
+    addr_hit[42] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_0_OFFSET);
+    addr_hit[43] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_1_OFFSET);
+    addr_hit[44] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_2_OFFSET);
+    addr_hit[45] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_3_OFFSET);
+    addr_hit[46] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_4_OFFSET);
+    addr_hit[47] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_5_OFFSET);
+    addr_hit[48] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_6_OFFSET);
+    addr_hit[49] = (reg_addr == KEYMGR_SW_SHARE0_OUTPUT_7_OFFSET);
+    addr_hit[50] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_0_OFFSET);
+    addr_hit[51] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_1_OFFSET);
+    addr_hit[52] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_2_OFFSET);
+    addr_hit[53] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_3_OFFSET);
+    addr_hit[54] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_4_OFFSET);
+    addr_hit[55] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_5_OFFSET);
+    addr_hit[56] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_6_OFFSET);
+    addr_hit[57] = (reg_addr == KEYMGR_SW_SHARE1_OUTPUT_7_OFFSET);
+    addr_hit[58] = (reg_addr == KEYMGR_WORKING_STATE_OFFSET);
+    addr_hit[59] = (reg_addr == KEYMGR_OP_STATUS_OFFSET);
+    addr_hit[60] = (reg_addr == KEYMGR_ERR_CODE_OFFSET);
+    addr_hit[61] = (reg_addr == KEYMGR_FAULT_STATUS_OFFSET);
   end
 
   assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -2419,7 +2441,8 @@
                (addr_hit[57] & (|(KEYMGR_PERMIT[57] & ~reg_be))) |
                (addr_hit[58] & (|(KEYMGR_PERMIT[58] & ~reg_be))) |
                (addr_hit[59] & (|(KEYMGR_PERMIT[59] & ~reg_be))) |
-               (addr_hit[60] & (|(KEYMGR_PERMIT[60] & ~reg_be)))));
+               (addr_hit[60] & (|(KEYMGR_PERMIT[60] & ~reg_be))) |
+               (addr_hit[61] & (|(KEYMGR_PERMIT[61] & ~reg_be)))));
   end
   assign intr_state_we = addr_hit[0] & reg_we & !reg_error;
 
@@ -2436,177 +2459,179 @@
 
   assign alert_test_recov_operation_err_wd = reg_wdata[1];
   assign cfg_regwen_re = addr_hit[4] & reg_re & !reg_error;
-  assign control_we = addr_hit[5] & reg_we & !reg_error;
+  assign start_we = addr_hit[5] & reg_we & !reg_error;
 
-  assign control_start_wd = reg_wdata[0];
+  assign start_wd = reg_wdata[0];
+  assign control_shadowed_re = addr_hit[6] & reg_re & !reg_error;
+  assign control_shadowed_we = addr_hit[6] & reg_we & !reg_error;
 
-  assign control_operation_wd = reg_wdata[6:4];
+  assign control_shadowed_operation_wd = reg_wdata[6:4];
 
-  assign control_cdi_sel_wd = reg_wdata[7];
+  assign control_shadowed_cdi_sel_wd = reg_wdata[7];
 
-  assign control_dest_sel_wd = reg_wdata[14:12];
-  assign sideload_clear_we = addr_hit[6] & reg_we & !reg_error;
+  assign control_shadowed_dest_sel_wd = reg_wdata[14:12];
+  assign sideload_clear_we = addr_hit[7] & reg_we & !reg_error;
 
   assign sideload_clear_wd = reg_wdata[2:0];
-  assign reseed_interval_regwen_we = addr_hit[7] & reg_we & !reg_error;
+  assign reseed_interval_regwen_we = addr_hit[8] & reg_we & !reg_error;
 
   assign reseed_interval_regwen_wd = reg_wdata[0];
-  assign reseed_interval_shadowed_re = addr_hit[8] & reg_re & !reg_error;
-  assign reseed_interval_shadowed_we = addr_hit[8] & reg_we & !reg_error;
+  assign reseed_interval_shadowed_re = addr_hit[9] & reg_re & !reg_error;
+  assign reseed_interval_shadowed_we = addr_hit[9] & reg_we & !reg_error;
 
   assign reseed_interval_shadowed_wd = reg_wdata[15:0];
-  assign sw_binding_regwen_re = addr_hit[9] & reg_re & !reg_error;
-  assign sw_binding_regwen_we = addr_hit[9] & reg_we & !reg_error;
+  assign sw_binding_regwen_re = addr_hit[10] & reg_re & !reg_error;
+  assign sw_binding_regwen_we = addr_hit[10] & reg_we & !reg_error;
 
   assign sw_binding_regwen_wd = reg_wdata[0];
-  assign sealing_sw_binding_0_we = addr_hit[10] & reg_we & !reg_error;
+  assign sealing_sw_binding_0_we = addr_hit[11] & reg_we & !reg_error;
 
   assign sealing_sw_binding_0_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_1_we = addr_hit[11] & reg_we & !reg_error;
+  assign sealing_sw_binding_1_we = addr_hit[12] & reg_we & !reg_error;
 
   assign sealing_sw_binding_1_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_2_we = addr_hit[12] & reg_we & !reg_error;
+  assign sealing_sw_binding_2_we = addr_hit[13] & reg_we & !reg_error;
 
   assign sealing_sw_binding_2_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_3_we = addr_hit[13] & reg_we & !reg_error;
+  assign sealing_sw_binding_3_we = addr_hit[14] & reg_we & !reg_error;
 
   assign sealing_sw_binding_3_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_4_we = addr_hit[14] & reg_we & !reg_error;
+  assign sealing_sw_binding_4_we = addr_hit[15] & reg_we & !reg_error;
 
   assign sealing_sw_binding_4_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_5_we = addr_hit[15] & reg_we & !reg_error;
+  assign sealing_sw_binding_5_we = addr_hit[16] & reg_we & !reg_error;
 
   assign sealing_sw_binding_5_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_6_we = addr_hit[16] & reg_we & !reg_error;
+  assign sealing_sw_binding_6_we = addr_hit[17] & reg_we & !reg_error;
 
   assign sealing_sw_binding_6_wd = reg_wdata[31:0];
-  assign sealing_sw_binding_7_we = addr_hit[17] & reg_we & !reg_error;
+  assign sealing_sw_binding_7_we = addr_hit[18] & reg_we & !reg_error;
 
   assign sealing_sw_binding_7_wd = reg_wdata[31:0];
-  assign attest_sw_binding_0_we = addr_hit[18] & reg_we & !reg_error;
+  assign attest_sw_binding_0_we = addr_hit[19] & reg_we & !reg_error;
 
   assign attest_sw_binding_0_wd = reg_wdata[31:0];
-  assign attest_sw_binding_1_we = addr_hit[19] & reg_we & !reg_error;
+  assign attest_sw_binding_1_we = addr_hit[20] & reg_we & !reg_error;
 
   assign attest_sw_binding_1_wd = reg_wdata[31:0];
-  assign attest_sw_binding_2_we = addr_hit[20] & reg_we & !reg_error;
+  assign attest_sw_binding_2_we = addr_hit[21] & reg_we & !reg_error;
 
   assign attest_sw_binding_2_wd = reg_wdata[31:0];
-  assign attest_sw_binding_3_we = addr_hit[21] & reg_we & !reg_error;
+  assign attest_sw_binding_3_we = addr_hit[22] & reg_we & !reg_error;
 
   assign attest_sw_binding_3_wd = reg_wdata[31:0];
-  assign attest_sw_binding_4_we = addr_hit[22] & reg_we & !reg_error;
+  assign attest_sw_binding_4_we = addr_hit[23] & reg_we & !reg_error;
 
   assign attest_sw_binding_4_wd = reg_wdata[31:0];
-  assign attest_sw_binding_5_we = addr_hit[23] & reg_we & !reg_error;
+  assign attest_sw_binding_5_we = addr_hit[24] & reg_we & !reg_error;
 
   assign attest_sw_binding_5_wd = reg_wdata[31:0];
-  assign attest_sw_binding_6_we = addr_hit[24] & reg_we & !reg_error;
+  assign attest_sw_binding_6_we = addr_hit[25] & reg_we & !reg_error;
 
   assign attest_sw_binding_6_wd = reg_wdata[31:0];
-  assign attest_sw_binding_7_we = addr_hit[25] & reg_we & !reg_error;
+  assign attest_sw_binding_7_we = addr_hit[26] & reg_we & !reg_error;
 
   assign attest_sw_binding_7_wd = reg_wdata[31:0];
-  assign salt_0_we = addr_hit[26] & reg_we & !reg_error;
+  assign salt_0_we = addr_hit[27] & reg_we & !reg_error;
 
   assign salt_0_wd = reg_wdata[31:0];
-  assign salt_1_we = addr_hit[27] & reg_we & !reg_error;
+  assign salt_1_we = addr_hit[28] & reg_we & !reg_error;
 
   assign salt_1_wd = reg_wdata[31:0];
-  assign salt_2_we = addr_hit[28] & reg_we & !reg_error;
+  assign salt_2_we = addr_hit[29] & reg_we & !reg_error;
 
   assign salt_2_wd = reg_wdata[31:0];
-  assign salt_3_we = addr_hit[29] & reg_we & !reg_error;
+  assign salt_3_we = addr_hit[30] & reg_we & !reg_error;
 
   assign salt_3_wd = reg_wdata[31:0];
-  assign salt_4_we = addr_hit[30] & reg_we & !reg_error;
+  assign salt_4_we = addr_hit[31] & reg_we & !reg_error;
 
   assign salt_4_wd = reg_wdata[31:0];
-  assign salt_5_we = addr_hit[31] & reg_we & !reg_error;
+  assign salt_5_we = addr_hit[32] & reg_we & !reg_error;
 
   assign salt_5_wd = reg_wdata[31:0];
-  assign salt_6_we = addr_hit[32] & reg_we & !reg_error;
+  assign salt_6_we = addr_hit[33] & reg_we & !reg_error;
 
   assign salt_6_wd = reg_wdata[31:0];
-  assign salt_7_we = addr_hit[33] & reg_we & !reg_error;
+  assign salt_7_we = addr_hit[34] & reg_we & !reg_error;
 
   assign salt_7_wd = reg_wdata[31:0];
-  assign key_version_we = addr_hit[34] & reg_we & !reg_error;
+  assign key_version_we = addr_hit[35] & reg_we & !reg_error;
 
   assign key_version_wd = reg_wdata[31:0];
-  assign max_creator_key_ver_regwen_we = addr_hit[35] & reg_we & !reg_error;
+  assign max_creator_key_ver_regwen_we = addr_hit[36] & reg_we & !reg_error;
 
   assign max_creator_key_ver_regwen_wd = reg_wdata[0];
-  assign max_creator_key_ver_shadowed_re = addr_hit[36] & reg_re & !reg_error;
-  assign max_creator_key_ver_shadowed_we = addr_hit[36] & reg_we & !reg_error;
+  assign max_creator_key_ver_shadowed_re = addr_hit[37] & reg_re & !reg_error;
+  assign max_creator_key_ver_shadowed_we = addr_hit[37] & reg_we & !reg_error;
 
   assign max_creator_key_ver_shadowed_wd = reg_wdata[31:0];
-  assign max_owner_int_key_ver_regwen_we = addr_hit[37] & reg_we & !reg_error;
+  assign max_owner_int_key_ver_regwen_we = addr_hit[38] & reg_we & !reg_error;
 
   assign max_owner_int_key_ver_regwen_wd = reg_wdata[0];
-  assign max_owner_int_key_ver_shadowed_re = addr_hit[38] & reg_re & !reg_error;
-  assign max_owner_int_key_ver_shadowed_we = addr_hit[38] & reg_we & !reg_error;
+  assign max_owner_int_key_ver_shadowed_re = addr_hit[39] & reg_re & !reg_error;
+  assign max_owner_int_key_ver_shadowed_we = addr_hit[39] & reg_we & !reg_error;
 
   assign max_owner_int_key_ver_shadowed_wd = reg_wdata[31:0];
-  assign max_owner_key_ver_regwen_we = addr_hit[39] & reg_we & !reg_error;
+  assign max_owner_key_ver_regwen_we = addr_hit[40] & reg_we & !reg_error;
 
   assign max_owner_key_ver_regwen_wd = reg_wdata[0];
-  assign max_owner_key_ver_shadowed_re = addr_hit[40] & reg_re & !reg_error;
-  assign max_owner_key_ver_shadowed_we = addr_hit[40] & reg_we & !reg_error;
+  assign max_owner_key_ver_shadowed_re = addr_hit[41] & reg_re & !reg_error;
+  assign max_owner_key_ver_shadowed_we = addr_hit[41] & reg_we & !reg_error;
 
   assign max_owner_key_ver_shadowed_wd = reg_wdata[31:0];
-  assign sw_share0_output_0_re = addr_hit[41] & reg_re & !reg_error;
+  assign sw_share0_output_0_re = addr_hit[42] & reg_re & !reg_error;
 
   assign sw_share0_output_0_wd = '1;
-  assign sw_share0_output_1_re = addr_hit[42] & reg_re & !reg_error;
+  assign sw_share0_output_1_re = addr_hit[43] & reg_re & !reg_error;
 
   assign sw_share0_output_1_wd = '1;
-  assign sw_share0_output_2_re = addr_hit[43] & reg_re & !reg_error;
+  assign sw_share0_output_2_re = addr_hit[44] & reg_re & !reg_error;
 
   assign sw_share0_output_2_wd = '1;
-  assign sw_share0_output_3_re = addr_hit[44] & reg_re & !reg_error;
+  assign sw_share0_output_3_re = addr_hit[45] & reg_re & !reg_error;
 
   assign sw_share0_output_3_wd = '1;
-  assign sw_share0_output_4_re = addr_hit[45] & reg_re & !reg_error;
+  assign sw_share0_output_4_re = addr_hit[46] & reg_re & !reg_error;
 
   assign sw_share0_output_4_wd = '1;
-  assign sw_share0_output_5_re = addr_hit[46] & reg_re & !reg_error;
+  assign sw_share0_output_5_re = addr_hit[47] & reg_re & !reg_error;
 
   assign sw_share0_output_5_wd = '1;
-  assign sw_share0_output_6_re = addr_hit[47] & reg_re & !reg_error;
+  assign sw_share0_output_6_re = addr_hit[48] & reg_re & !reg_error;
 
   assign sw_share0_output_6_wd = '1;
-  assign sw_share0_output_7_re = addr_hit[48] & reg_re & !reg_error;
+  assign sw_share0_output_7_re = addr_hit[49] & reg_re & !reg_error;
 
   assign sw_share0_output_7_wd = '1;
-  assign sw_share1_output_0_re = addr_hit[49] & reg_re & !reg_error;
+  assign sw_share1_output_0_re = addr_hit[50] & reg_re & !reg_error;
 
   assign sw_share1_output_0_wd = '1;
-  assign sw_share1_output_1_re = addr_hit[50] & reg_re & !reg_error;
+  assign sw_share1_output_1_re = addr_hit[51] & reg_re & !reg_error;
 
   assign sw_share1_output_1_wd = '1;
-  assign sw_share1_output_2_re = addr_hit[51] & reg_re & !reg_error;
+  assign sw_share1_output_2_re = addr_hit[52] & reg_re & !reg_error;
 
   assign sw_share1_output_2_wd = '1;
-  assign sw_share1_output_3_re = addr_hit[52] & reg_re & !reg_error;
+  assign sw_share1_output_3_re = addr_hit[53] & reg_re & !reg_error;
 
   assign sw_share1_output_3_wd = '1;
-  assign sw_share1_output_4_re = addr_hit[53] & reg_re & !reg_error;
+  assign sw_share1_output_4_re = addr_hit[54] & reg_re & !reg_error;
 
   assign sw_share1_output_4_wd = '1;
-  assign sw_share1_output_5_re = addr_hit[54] & reg_re & !reg_error;
+  assign sw_share1_output_5_re = addr_hit[55] & reg_re & !reg_error;
 
   assign sw_share1_output_5_wd = '1;
-  assign sw_share1_output_6_re = addr_hit[55] & reg_re & !reg_error;
+  assign sw_share1_output_6_re = addr_hit[56] & reg_re & !reg_error;
 
   assign sw_share1_output_6_wd = '1;
-  assign sw_share1_output_7_re = addr_hit[56] & reg_re & !reg_error;
+  assign sw_share1_output_7_re = addr_hit[57] & reg_re & !reg_error;
 
   assign sw_share1_output_7_wd = '1;
-  assign op_status_we = addr_hit[58] & reg_we & !reg_error;
+  assign op_status_we = addr_hit[59] & reg_we & !reg_error;
 
   assign op_status_wd = reg_wdata[1:0];
-  assign err_code_we = addr_hit[59] & reg_we & !reg_error;
+  assign err_code_we = addr_hit[60] & reg_we & !reg_error;
 
   assign err_code_invalid_op_wd = reg_wdata[0];
 
@@ -2640,231 +2665,234 @@
       end
 
       addr_hit[5]: begin
-        reg_rdata_next[0] = control_start_qs;
-        reg_rdata_next[6:4] = control_operation_qs;
-        reg_rdata_next[7] = control_cdi_sel_qs;
-        reg_rdata_next[14:12] = control_dest_sel_qs;
+        reg_rdata_next[0] = start_qs;
       end
 
       addr_hit[6]: begin
-        reg_rdata_next[2:0] = sideload_clear_qs;
+        reg_rdata_next[6:4] = control_shadowed_operation_qs;
+        reg_rdata_next[7] = control_shadowed_cdi_sel_qs;
+        reg_rdata_next[14:12] = control_shadowed_dest_sel_qs;
       end
 
       addr_hit[7]: begin
-        reg_rdata_next[0] = reseed_interval_regwen_qs;
+        reg_rdata_next[2:0] = sideload_clear_qs;
       end
 
       addr_hit[8]: begin
-        reg_rdata_next[15:0] = reseed_interval_shadowed_qs;
+        reg_rdata_next[0] = reseed_interval_regwen_qs;
       end
 
       addr_hit[9]: begin
-        reg_rdata_next[0] = sw_binding_regwen_qs;
+        reg_rdata_next[15:0] = reseed_interval_shadowed_qs;
       end
 
       addr_hit[10]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_0_qs;
+        reg_rdata_next[0] = sw_binding_regwen_qs;
       end
 
       addr_hit[11]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_1_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_0_qs;
       end
 
       addr_hit[12]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_2_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_1_qs;
       end
 
       addr_hit[13]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_3_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_2_qs;
       end
 
       addr_hit[14]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_4_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_3_qs;
       end
 
       addr_hit[15]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_5_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_4_qs;
       end
 
       addr_hit[16]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_6_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_5_qs;
       end
 
       addr_hit[17]: begin
-        reg_rdata_next[31:0] = sealing_sw_binding_7_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_6_qs;
       end
 
       addr_hit[18]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_0_qs;
+        reg_rdata_next[31:0] = sealing_sw_binding_7_qs;
       end
 
       addr_hit[19]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_1_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_0_qs;
       end
 
       addr_hit[20]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_2_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_1_qs;
       end
 
       addr_hit[21]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_3_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_2_qs;
       end
 
       addr_hit[22]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_4_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_3_qs;
       end
 
       addr_hit[23]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_5_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_4_qs;
       end
 
       addr_hit[24]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_6_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_5_qs;
       end
 
       addr_hit[25]: begin
-        reg_rdata_next[31:0] = attest_sw_binding_7_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_6_qs;
       end
 
       addr_hit[26]: begin
-        reg_rdata_next[31:0] = salt_0_qs;
+        reg_rdata_next[31:0] = attest_sw_binding_7_qs;
       end
 
       addr_hit[27]: begin
-        reg_rdata_next[31:0] = salt_1_qs;
+        reg_rdata_next[31:0] = salt_0_qs;
       end
 
       addr_hit[28]: begin
-        reg_rdata_next[31:0] = salt_2_qs;
+        reg_rdata_next[31:0] = salt_1_qs;
       end
 
       addr_hit[29]: begin
-        reg_rdata_next[31:0] = salt_3_qs;
+        reg_rdata_next[31:0] = salt_2_qs;
       end
 
       addr_hit[30]: begin
-        reg_rdata_next[31:0] = salt_4_qs;
+        reg_rdata_next[31:0] = salt_3_qs;
       end
 
       addr_hit[31]: begin
-        reg_rdata_next[31:0] = salt_5_qs;
+        reg_rdata_next[31:0] = salt_4_qs;
       end
 
       addr_hit[32]: begin
-        reg_rdata_next[31:0] = salt_6_qs;
+        reg_rdata_next[31:0] = salt_5_qs;
       end
 
       addr_hit[33]: begin
-        reg_rdata_next[31:0] = salt_7_qs;
+        reg_rdata_next[31:0] = salt_6_qs;
       end
 
       addr_hit[34]: begin
-        reg_rdata_next[31:0] = key_version_qs;
+        reg_rdata_next[31:0] = salt_7_qs;
       end
 
       addr_hit[35]: begin
-        reg_rdata_next[0] = max_creator_key_ver_regwen_qs;
+        reg_rdata_next[31:0] = key_version_qs;
       end
 
       addr_hit[36]: begin
-        reg_rdata_next[31:0] = max_creator_key_ver_shadowed_qs;
+        reg_rdata_next[0] = max_creator_key_ver_regwen_qs;
       end
 
       addr_hit[37]: begin
-        reg_rdata_next[0] = max_owner_int_key_ver_regwen_qs;
+        reg_rdata_next[31:0] = max_creator_key_ver_shadowed_qs;
       end
 
       addr_hit[38]: begin
-        reg_rdata_next[31:0] = max_owner_int_key_ver_shadowed_qs;
+        reg_rdata_next[0] = max_owner_int_key_ver_regwen_qs;
       end
 
       addr_hit[39]: begin
-        reg_rdata_next[0] = max_owner_key_ver_regwen_qs;
+        reg_rdata_next[31:0] = max_owner_int_key_ver_shadowed_qs;
       end
 
       addr_hit[40]: begin
-        reg_rdata_next[31:0] = max_owner_key_ver_shadowed_qs;
+        reg_rdata_next[0] = max_owner_key_ver_regwen_qs;
       end
 
       addr_hit[41]: begin
-        reg_rdata_next[31:0] = sw_share0_output_0_qs;
+        reg_rdata_next[31:0] = max_owner_key_ver_shadowed_qs;
       end
 
       addr_hit[42]: begin
-        reg_rdata_next[31:0] = sw_share0_output_1_qs;
+        reg_rdata_next[31:0] = sw_share0_output_0_qs;
       end
 
       addr_hit[43]: begin
-        reg_rdata_next[31:0] = sw_share0_output_2_qs;
+        reg_rdata_next[31:0] = sw_share0_output_1_qs;
       end
 
       addr_hit[44]: begin
-        reg_rdata_next[31:0] = sw_share0_output_3_qs;
+        reg_rdata_next[31:0] = sw_share0_output_2_qs;
       end
 
       addr_hit[45]: begin
-        reg_rdata_next[31:0] = sw_share0_output_4_qs;
+        reg_rdata_next[31:0] = sw_share0_output_3_qs;
       end
 
       addr_hit[46]: begin
-        reg_rdata_next[31:0] = sw_share0_output_5_qs;
+        reg_rdata_next[31:0] = sw_share0_output_4_qs;
       end
 
       addr_hit[47]: begin
-        reg_rdata_next[31:0] = sw_share0_output_6_qs;
+        reg_rdata_next[31:0] = sw_share0_output_5_qs;
       end
 
       addr_hit[48]: begin
-        reg_rdata_next[31:0] = sw_share0_output_7_qs;
+        reg_rdata_next[31:0] = sw_share0_output_6_qs;
       end
 
       addr_hit[49]: begin
-        reg_rdata_next[31:0] = sw_share1_output_0_qs;
+        reg_rdata_next[31:0] = sw_share0_output_7_qs;
       end
 
       addr_hit[50]: begin
-        reg_rdata_next[31:0] = sw_share1_output_1_qs;
+        reg_rdata_next[31:0] = sw_share1_output_0_qs;
       end
 
       addr_hit[51]: begin
-        reg_rdata_next[31:0] = sw_share1_output_2_qs;
+        reg_rdata_next[31:0] = sw_share1_output_1_qs;
       end
 
       addr_hit[52]: begin
-        reg_rdata_next[31:0] = sw_share1_output_3_qs;
+        reg_rdata_next[31:0] = sw_share1_output_2_qs;
       end
 
       addr_hit[53]: begin
-        reg_rdata_next[31:0] = sw_share1_output_4_qs;
+        reg_rdata_next[31:0] = sw_share1_output_3_qs;
       end
 
       addr_hit[54]: begin
-        reg_rdata_next[31:0] = sw_share1_output_5_qs;
+        reg_rdata_next[31:0] = sw_share1_output_4_qs;
       end
 
       addr_hit[55]: begin
-        reg_rdata_next[31:0] = sw_share1_output_6_qs;
+        reg_rdata_next[31:0] = sw_share1_output_5_qs;
       end
 
       addr_hit[56]: begin
-        reg_rdata_next[31:0] = sw_share1_output_7_qs;
+        reg_rdata_next[31:0] = sw_share1_output_6_qs;
       end
 
       addr_hit[57]: begin
-        reg_rdata_next[2:0] = working_state_qs;
+        reg_rdata_next[31:0] = sw_share1_output_7_qs;
       end
 
       addr_hit[58]: begin
-        reg_rdata_next[1:0] = op_status_qs;
+        reg_rdata_next[2:0] = working_state_qs;
       end
 
       addr_hit[59]: begin
+        reg_rdata_next[1:0] = op_status_qs;
+      end
+
+      addr_hit[60]: begin
         reg_rdata_next[0] = err_code_invalid_op_qs;
         reg_rdata_next[1] = err_code_invalid_kmac_input_qs;
         reg_rdata_next[2] = err_code_invalid_shadow_update_qs;
       end
 
-      addr_hit[60]: begin
+      addr_hit[61]: begin
         reg_rdata_next[0] = fault_status_cmd_qs;
         reg_rdata_next[1] = fault_status_kmac_fsm_qs;
         reg_rdata_next[2] = fault_status_kmac_op_qs;
diff --git a/sw/device/lib/dif/dif_keymgr.c b/sw/device/lib/dif/dif_keymgr.c
index e8d0c68..0b00e6f 100644
--- a/sw/device/lib/dif/dif_keymgr.c
+++ b/sw/device/lib/dif/dif_keymgr.c
@@ -221,14 +221,14 @@
  */
 static void start_operation(const dif_keymgr_t *keymgr,
                             start_operation_params_t params) {
-  uint32_t reg_control =
-      bitfield_field32_write(0, KEYMGR_CONTROL_DEST_SEL_FIELD, params.dest);
+  uint32_t reg_control = bitfield_field32_write(
+      0, KEYMGR_CONTROL_SHADOWED_DEST_SEL_FIELD, params.dest);
   reg_control = bitfield_field32_write(
-      reg_control, KEYMGR_CONTROL_OPERATION_FIELD, params.op);
-  reg_control =
-      bitfield_bit32_write(reg_control, KEYMGR_CONTROL_START_BIT, true);
-  mmio_region_write32(keymgr->base_addr, KEYMGR_CONTROL_REG_OFFSET,
-                      reg_control);
+      reg_control, KEYMGR_CONTROL_SHADOWED_OPERATION_FIELD, params.op);
+  mmio_region_write32_shadowed(keymgr->base_addr,
+                               KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg_control);
+  mmio_region_write32(keymgr->base_addr, KEYMGR_START_REG_OFFSET,
+                      1 << KEYMGR_START_EN_BIT);
 }
 
 dif_result_t dif_keymgr_configure(const dif_keymgr_t *keymgr,
@@ -310,10 +310,11 @@
   }
 
   // Advance state.
-  start_operation(keymgr, (start_operation_params_t){
-                              .dest = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-                              .op = KEYMGR_CONTROL_OPERATION_VALUE_ADVANCE,
-                          });
+  start_operation(keymgr,
+                  (start_operation_params_t){
+                      .dest = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+                      .op = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE,
+                  });
 
   return kDifOk;
 }
@@ -328,10 +329,11 @@
   }
 
   // Disable key manager.
-  start_operation(keymgr, (start_operation_params_t){
-                              .dest = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-                              .op = KEYMGR_CONTROL_OPERATION_VALUE_DISABLE,
-                          });
+  start_operation(keymgr,
+                  (start_operation_params_t){
+                      .dest = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+                      .op = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_DISABLE,
+                  });
 
   return kDifOk;
 }
@@ -438,10 +440,11 @@
     return kDifLocked;
   }
 
-  start_operation(keymgr, (start_operation_params_t){
-                              .dest = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-                              .op = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_ID,
-                          });
+  start_operation(keymgr,
+                  (start_operation_params_t){
+                      .dest = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+                      .op = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_ID,
+                  });
 
   return kDifOk;
 }
@@ -456,20 +459,20 @@
   switch (params.dest) {
     case kDifKeymgrVersionedKeyDestSw:
       hw_op_params = (start_operation_params_t){
-          .dest = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-          .op = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_SW_OUTPUT,
+          .dest = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+          .op = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_SW_OUTPUT,
       };
       break;
     case kDifKeymgrVersionedKeyDestAes:
       hw_op_params = (start_operation_params_t){
-          .dest = KEYMGR_CONTROL_DEST_SEL_VALUE_AES,
-          .op = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_HW_OUTPUT,
+          .dest = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_AES,
+          .op = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT,
       };
       break;
     case kDifKeymgrVersionedKeyDestKmac:
       hw_op_params = (start_operation_params_t){
-          .dest = KEYMGR_CONTROL_DEST_SEL_VALUE_KMAC,
-          .op = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_HW_OUTPUT,
+          .dest = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_KMAC,
+          .op = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT,
       };
       break;
     default:
diff --git a/sw/device/lib/dif/dif_keymgr_unittest.cc b/sw/device/lib/dif/dif_keymgr_unittest.cc
index 134178a..0556182 100644
--- a/sw/device/lib/dif/dif_keymgr_unittest.cc
+++ b/sw/device/lib/dif/dif_keymgr_unittest.cc
@@ -209,19 +209,21 @@
    * Expectations for starting an operation.
    */
   void ExpectOperationStart(const OperationStartParams &params) {
-    EXPECT_WRITE32(KEYMGR_CONTROL_REG_OFFSET,
-                   {{
-                        .offset = KEYMGR_CONTROL_DEST_SEL_OFFSET,
-                        .value = params.dest_sel,
-                    },
-                    {
-                        .offset = KEYMGR_CONTROL_OPERATION_OFFSET,
-                        .value = params.operation,
-                    },
-                    {
-                        .offset = KEYMGR_CONTROL_START_BIT,
-                        .value = 1,
-                    }});
+    EXPECT_WRITE32_SHADOWED(
+        KEYMGR_CONTROL_SHADOWED_REG_OFFSET,
+        {{
+             .offset = KEYMGR_CONTROL_SHADOWED_DEST_SEL_OFFSET,
+             .value = params.dest_sel,
+         },
+         {
+             .offset = KEYMGR_CONTROL_SHADOWED_OPERATION_OFFSET,
+             .value = params.operation,
+         }});
+
+    EXPECT_WRITE32(KEYMGR_START_REG_OFFSET, {{
+                                                .offset = KEYMGR_START_EN_BIT,
+                                                .value = 1,
+                                            }});
   }
 
   /**
@@ -372,8 +374,8 @@
   EXPECT_WRITE32_SHADOWED(reg_info.offset, kStateParams.max_key_version);
   EXPECT_WRITE32(reg_info.wen_offset, 0);
   ExpectOperationStart({
-      .dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-      .operation = KEYMGR_CONTROL_OPERATION_VALUE_ADVANCE,
+      .dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+      .operation = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE,
   });
 
   EXPECT_EQ(dif_keymgr_advance_state(&keymgr_, &kStateParams), kDifOk);
@@ -382,8 +384,8 @@
 TEST_P(AdvanceToNonOperational, Success) {
   ExpectIdleAtState(GetParam());
   ExpectOperationStart({
-      .dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-      .operation = KEYMGR_CONTROL_OPERATION_VALUE_ADVANCE,
+      .dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+      .operation = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE,
   });
 
   EXPECT_EQ(dif_keymgr_advance_state(&keymgr_, nullptr), kDifOk);
@@ -409,8 +411,8 @@
 TEST_F(DisableTest, Disable) {
   ExpectIdle();
   ExpectOperationStart({
-      .dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-      .operation = KEYMGR_CONTROL_OPERATION_VALUE_DISABLE,
+      .dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+      .operation = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_DISABLE,
   });
 
   EXPECT_EQ(dif_keymgr_disable(&keymgr_), kDifOk);
@@ -637,8 +639,8 @@
 TEST_F(GenerateIdentityTest, Generate) {
   ExpectIdle();
   ExpectOperationStart({
-      .dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-      .operation = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_ID,
+      .dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+      .operation = KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_ID,
   });
 
   EXPECT_EQ(dif_keymgr_generate_identity_seed(&keymgr_), kDifOk);
@@ -712,18 +714,21 @@
     testing::Values(
         GenerateVersionedKeyTestCase{
             .dest = kDifKeymgrVersionedKeyDestSw,
-            .exp_dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_NONE,
-            .exp_operation = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_SW_OUTPUT,
+            .exp_dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE,
+            .exp_operation =
+                KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_SW_OUTPUT,
         },
         GenerateVersionedKeyTestCase{
             .dest = kDifKeymgrVersionedKeyDestAes,
-            .exp_dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_AES,
-            .exp_operation = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_HW_OUTPUT,
+            .exp_dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_AES,
+            .exp_operation =
+                KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT,
         },
         GenerateVersionedKeyTestCase{
             .dest = kDifKeymgrVersionedKeyDestKmac,
-            .exp_dest_sel = KEYMGR_CONTROL_DEST_SEL_VALUE_KMAC,
-            .exp_operation = KEYMGR_CONTROL_OPERATION_VALUE_GENERATE_HW_OUTPUT,
+            .exp_dest_sel = KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_KMAC,
+            .exp_operation =
+                KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_GENERATE_HW_OUTPUT,
         }));
 
 class SideloadClearTest : public DifKeymgrInitialized {};
diff --git a/sw/device/silicon_creator/lib/drivers/keymgr.c b/sw/device/silicon_creator/lib/drivers/keymgr.c
index 6b6b13e..fc40f35 100644
--- a/sw/device/silicon_creator/lib/drivers/keymgr.c
+++ b/sw/device/silicon_creator/lib/drivers/keymgr.c
@@ -114,12 +114,14 @@
 }
 
 void keymgr_advance_state(void) {
-  uint32_t reg = bitfield_bit32_write(0, KEYMGR_CONTROL_START_BIT, true);
-  reg = bitfield_field32_write(reg, KEYMGR_CONTROL_DEST_SEL_FIELD,
-                               KEYMGR_CONTROL_DEST_SEL_VALUE_NONE);
-  reg = bitfield_field32_write(reg, KEYMGR_CONTROL_OPERATION_FIELD,
-                               KEYMGR_CONTROL_OPERATION_VALUE_ADVANCE);
-  abs_mmio_write32(kBase + KEYMGR_CONTROL_REG_OFFSET, reg);
+  uint32_t reg =
+      bitfield_field32_write(0, KEYMGR_CONTROL_SHADOWED_DEST_SEL_FIELD,
+                             KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE);
+  reg = bitfield_field32_write(reg, KEYMGR_CONTROL_SHADOWED_OPERATION_FIELD,
+                               KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE);
+  abs_mmio_write32_shadowed(kBase + KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg);
+
+  abs_mmio_write32(kBase + KEYMGR_START_REG_OFFSET, 1);
 }
 
 rom_error_t keymgr_state_check(keymgr_state_t expected_state) {
diff --git a/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc b/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc
index dfe19ae..b8b8668 100644
--- a/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc
+++ b/sw/device/silicon_creator/lib/drivers/keymgr_unittest.cc
@@ -122,14 +122,18 @@
 }
 
 TEST_F(KeymgrTest, AdvanceState) {
-  EXPECT_ABS_WRITE32(
-      base_ + KEYMGR_CONTROL_REG_OFFSET,
+  EXPECT_ABS_WRITE32_SHADOWED(
+      base_ + KEYMGR_CONTROL_SHADOWED_REG_OFFSET,
       {
-          {KEYMGR_CONTROL_START_BIT, true},
-          {KEYMGR_CONTROL_DEST_SEL_OFFSET, KEYMGR_CONTROL_DEST_SEL_VALUE_NONE},
-          {KEYMGR_CONTROL_OPERATION_OFFSET,
-           KEYMGR_CONTROL_OPERATION_VALUE_ADVANCE},
+          {KEYMGR_CONTROL_SHADOWED_DEST_SEL_OFFSET,
+           KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE},
+          {KEYMGR_CONTROL_SHADOWED_OPERATION_OFFSET,
+           KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_ADVANCE},
       });
+  EXPECT_ABS_WRITE32(base_ + KEYMGR_START_REG_OFFSET,
+                     {
+                         {KEYMGR_START_EN_BIT, true},
+                     });
   keymgr_advance_state();
 }
 
diff --git a/sw/device/silicon_creator/lib/shutdown.c b/sw/device/silicon_creator/lib/shutdown.c
index fa24236..fa41ff3 100644
--- a/sw/device/silicon_creator/lib/shutdown.c
+++ b/sw/device/silicon_creator/lib/shutdown.c
@@ -277,12 +277,14 @@
   enum {
     kBase = TOP_EARLGREY_KEYMGR_BASE_ADDR,
   };
-  uint32_t reg = bitfield_bit32_write(0, KEYMGR_CONTROL_START_BIT, true);
-  reg = bitfield_field32_write(reg, KEYMGR_CONTROL_DEST_SEL_FIELD,
-                               KEYMGR_CONTROL_DEST_SEL_VALUE_NONE);
-  reg = bitfield_field32_write(reg, KEYMGR_CONTROL_OPERATION_FIELD,
-                               KEYMGR_CONTROL_OPERATION_VALUE_DISABLE);
-  abs_mmio_write32(kBase + KEYMGR_CONTROL_REG_OFFSET, reg);
+  uint32_t reg =
+      bitfield_field32_write(0, KEYMGR_CONTROL_SHADOWED_DEST_SEL_FIELD,
+                             KEYMGR_CONTROL_SHADOWED_DEST_SEL_VALUE_NONE);
+  reg = bitfield_field32_write(reg, KEYMGR_CONTROL_SHADOWED_OPERATION_FIELD,
+                               KEYMGR_CONTROL_SHADOWED_OPERATION_VALUE_DISABLE);
+  abs_mmio_write32_shadowed(kBase + KEYMGR_CONTROL_SHADOWED_REG_OFFSET, reg);
+
+  abs_mmio_write32(kBase + KEYMGR_START_REG_OFFSET, 1);
   abs_mmio_write32(kBase + KEYMGR_SIDELOAD_CLEAR_REG_OFFSET, 1);
 }