[clkmgr] Combined shadow error registers into a single field

- Fixes #11450
- This is not technically a bug fix, but eases DV automation

Signed-off-by: Timothy Chen <timothytim@google.com>
diff --git a/hw/ip/clkmgr/data/clkmgr.hjson.tpl b/hw/ip/clkmgr/data/clkmgr.hjson.tpl
index da48e3f..71edb4a 100644
--- a/hw/ip/clkmgr/data/clkmgr.hjson.tpl
+++ b/hw/ip/clkmgr/data/clkmgr.hjson.tpl
@@ -474,9 +474,16 @@
       swaccess: "rw1c",
       hwaccess: "hwo",
       fields: [
+        { bits: "0",
+          name: "SHADOW_UPDATE_ERR",
+          resval: 0
+          desc: '''
+            One of the shadow registers encountered an update error.
+          '''
+        },
 % for src in typed_clocks.rg_srcs:
         {
-          bits: "${loop.index}",
+          bits: "${loop.index+1}",
           name: "${src.upper()}_MEASURE_ERR",
           resval: 0,
           desc: '''
@@ -486,7 +493,7 @@
 % endfor
 % for src in typed_clocks.rg_srcs:
         {
-          bits: "${loop.index + len(typed_clocks.rg_srcs)}",
+          bits: "${loop.index + len(typed_clocks.rg_srcs)+1}",
           name: "${src.upper()}_TIMEOUT_ERR",
           resval: 0,
           desc: '''
@@ -494,16 +501,6 @@
           '''
         }
 % endfor
-% for src in typed_clocks.rg_srcs:
-        {
-          bits: "${loop.index + 2*len(typed_clocks.rg_srcs)}",
-          name: "${src.upper()}_UPDATE_ERR",
-          resval: 0,
-          desc: '''
-            !!${src.upper()}_MEASURE_CTRL_SHADOWED has an update error.
-          '''
-        }
-% endfor
       ]
     },
 
@@ -526,16 +523,13 @@
             One of the idle counts encountered a duplicate error.
           '''
         },
-% for src in typed_clocks.rg_srcs:
-        {
-          bits: "${loop.index + 2}",
-          name: "${src.upper()}_STORAGE_ERR",
-          resval: 0,
+        { bits: "2",
+          name: "SHADOW_STORAGE_ERR",
+          resval: 0
           desc: '''
-            !!${src.upper()}_MEASURE_CTRL_SHADOWED has a storage error.
+            One of the shadow registers encountered a storage error.
           '''
         },
-% endfor
       ]
     },
   ]
diff --git a/hw/ip/clkmgr/data/clkmgr.sv.tpl b/hw/ip/clkmgr/data/clkmgr.sv.tpl
index c9e0349..05a50b8 100644
--- a/hw/ip/clkmgr/data/clkmgr.sv.tpl
+++ b/hw/ip/clkmgr/data/clkmgr.sv.tpl
@@ -187,10 +187,10 @@
   logic recov_alert;
   assign recov_alert =
 % for src in typed_clocks.rg_srcs:
-    hw2reg.recov_err_code.${src}_update_err.de |
     hw2reg.recov_err_code.${src}_measure_err.de |
-    hw2reg.recov_err_code.${src}_timeout_err.de${";" if loop.last else " |"}
+    hw2reg.recov_err_code.${src}_timeout_err.de |
 % endfor
+    hw2reg.recov_err_code.shadow_update_err.de;
 
   assign alerts = {
     |reg2hw.fatal_err_code,
@@ -307,6 +307,13 @@
   // SEC_CM: TIMEOUT.CLK.BKGN_CHK, MEAS.CLK.BKGN_CHK
   ////////////////////////////////////////////////////
 
+  logic [${len(typed_clocks.rg_srcs)-1}:0] shadow_update_errs;
+  logic [${len(typed_clocks.rg_srcs)-1}:0] shadow_storage_errs;
+  assign hw2reg.recov_err_code.shadow_update_err.d = 1'b1;
+  assign hw2reg.recov_err_code.shadow_update_err.de = |shadow_update_errs;
+  assign hw2reg.fatal_err_code.shadow_storage_err.d = 1'b1;
+  assign hw2reg.fatal_err_code.shadow_storage_err.de = |shadow_storage_errs;
+
 <% aon_freq = clocks.all_srcs['aon'].freq %>\
 % for src in typed_clocks.rg_srcs:
   logic ${src}_fast_err;
@@ -364,13 +371,11 @@
   assign hw2reg.recov_err_code.${src}_measure_err.de = synced_${src}_err;
   assign hw2reg.recov_err_code.${src}_timeout_err.d = 1'b1;
   assign hw2reg.recov_err_code.${src}_timeout_err.de = synced_${src}_timeout_err;
-  assign hw2reg.recov_err_code.${src}_update_err.d = 1'b1;
-  assign hw2reg.recov_err_code.${src}_update_err.de =
+  assign shadow_update_errs[${loop.index}] =
     reg2hw.${src}_meas_ctrl_shadowed.en.err_update |
     reg2hw.${src}_meas_ctrl_shadowed.hi.err_update |
     reg2hw.${src}_meas_ctrl_shadowed.lo.err_update;
-  assign hw2reg.fatal_err_code.${src}_storage_err.d = 1'b1;
-  assign hw2reg.fatal_err_code.${src}_storage_err.de =
+  assign shadow_storage_errs[${loop.index}] =
     reg2hw.${src}_meas_ctrl_shadowed.en.err_storage |
     reg2hw.${src}_meas_ctrl_shadowed.hi.err_storage |
     reg2hw.${src}_meas_ctrl_shadowed.lo.err_storage;
diff --git a/hw/top_earlgrey/ip/clkmgr/data/autogen/clkmgr.hjson b/hw/top_earlgrey/ip/clkmgr/data/autogen/clkmgr.hjson
index 1ad8f7f..12eeed6 100644
--- a/hw/top_earlgrey/ip/clkmgr/data/autogen/clkmgr.hjson
+++ b/hw/top_earlgrey/ip/clkmgr/data/autogen/clkmgr.hjson
@@ -709,8 +709,15 @@
       swaccess: "rw1c",
       hwaccess: "hwo",
       fields: [
+        { bits: "0",
+          name: "SHADOW_UPDATE_ERR",
+          resval: 0
+          desc: '''
+            One of the shadow registers encountered an update error.
+          '''
+        },
         {
-          bits: "0",
+          bits: "1",
           name: "IO_MEASURE_ERR",
           resval: 0,
           desc: '''
@@ -718,7 +725,7 @@
           '''
         },
         {
-          bits: "1",
+          bits: "2",
           name: "IO_DIV2_MEASURE_ERR",
           resval: 0,
           desc: '''
@@ -726,7 +733,7 @@
           '''
         },
         {
-          bits: "2",
+          bits: "3",
           name: "IO_DIV4_MEASURE_ERR",
           resval: 0,
           desc: '''
@@ -734,7 +741,7 @@
           '''
         },
         {
-          bits: "3",
+          bits: "4",
           name: "MAIN_MEASURE_ERR",
           resval: 0,
           desc: '''
@@ -742,7 +749,7 @@
           '''
         },
         {
-          bits: "4",
+          bits: "5",
           name: "USB_MEASURE_ERR",
           resval: 0,
           desc: '''
@@ -750,7 +757,7 @@
           '''
         },
         {
-          bits: "5",
+          bits: "6",
           name: "IO_TIMEOUT_ERR",
           resval: 0,
           desc: '''
@@ -758,7 +765,7 @@
           '''
         }
         {
-          bits: "6",
+          bits: "7",
           name: "IO_DIV2_TIMEOUT_ERR",
           resval: 0,
           desc: '''
@@ -766,7 +773,7 @@
           '''
         }
         {
-          bits: "7",
+          bits: "8",
           name: "IO_DIV4_TIMEOUT_ERR",
           resval: 0,
           desc: '''
@@ -774,7 +781,7 @@
           '''
         }
         {
-          bits: "8",
+          bits: "9",
           name: "MAIN_TIMEOUT_ERR",
           resval: 0,
           desc: '''
@@ -782,53 +789,13 @@
           '''
         }
         {
-          bits: "9",
+          bits: "10",
           name: "USB_TIMEOUT_ERR",
           resval: 0,
           desc: '''
             usb has timed out.
           '''
         }
-        {
-          bits: "10",
-          name: "IO_UPDATE_ERR",
-          resval: 0,
-          desc: '''
-            !!IO_MEASURE_CTRL_SHADOWED has an update error.
-          '''
-        }
-        {
-          bits: "11",
-          name: "IO_DIV2_UPDATE_ERR",
-          resval: 0,
-          desc: '''
-            !!IO_DIV2_MEASURE_CTRL_SHADOWED has an update error.
-          '''
-        }
-        {
-          bits: "12",
-          name: "IO_DIV4_UPDATE_ERR",
-          resval: 0,
-          desc: '''
-            !!IO_DIV4_MEASURE_CTRL_SHADOWED has an update error.
-          '''
-        }
-        {
-          bits: "13",
-          name: "MAIN_UPDATE_ERR",
-          resval: 0,
-          desc: '''
-            !!MAIN_MEASURE_CTRL_SHADOWED has an update error.
-          '''
-        }
-        {
-          bits: "14",
-          name: "USB_UPDATE_ERR",
-          resval: 0,
-          desc: '''
-            !!USB_MEASURE_CTRL_SHADOWED has an update error.
-          '''
-        }
       ]
     },
 
@@ -851,44 +818,11 @@
             One of the idle counts encountered a duplicate error.
           '''
         },
-        {
-          bits: "2",
-          name: "IO_STORAGE_ERR",
-          resval: 0,
+        { bits: "2",
+          name: "SHADOW_STORAGE_ERR",
+          resval: 0
           desc: '''
-            !!IO_MEASURE_CTRL_SHADOWED has a storage error.
-          '''
-        },
-        {
-          bits: "3",
-          name: "IO_DIV2_STORAGE_ERR",
-          resval: 0,
-          desc: '''
-            !!IO_DIV2_MEASURE_CTRL_SHADOWED has a storage error.
-          '''
-        },
-        {
-          bits: "4",
-          name: "IO_DIV4_STORAGE_ERR",
-          resval: 0,
-          desc: '''
-            !!IO_DIV4_MEASURE_CTRL_SHADOWED has a storage error.
-          '''
-        },
-        {
-          bits: "5",
-          name: "MAIN_STORAGE_ERR",
-          resval: 0,
-          desc: '''
-            !!MAIN_MEASURE_CTRL_SHADOWED has a storage error.
-          '''
-        },
-        {
-          bits: "6",
-          name: "USB_STORAGE_ERR",
-          resval: 0,
-          desc: '''
-            !!USB_MEASURE_CTRL_SHADOWED has a storage error.
+            One of the shadow registers encountered a storage error.
           '''
         },
       ]
diff --git a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr.sv b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr.sv
index 6f03363..f549ca7 100644
--- a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr.sv
+++ b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr.sv
@@ -213,21 +213,17 @@
 
   logic recov_alert;
   assign recov_alert =
-    hw2reg.recov_err_code.io_update_err.de |
     hw2reg.recov_err_code.io_measure_err.de |
     hw2reg.recov_err_code.io_timeout_err.de |
-    hw2reg.recov_err_code.io_div2_update_err.de |
     hw2reg.recov_err_code.io_div2_measure_err.de |
     hw2reg.recov_err_code.io_div2_timeout_err.de |
-    hw2reg.recov_err_code.io_div4_update_err.de |
     hw2reg.recov_err_code.io_div4_measure_err.de |
     hw2reg.recov_err_code.io_div4_timeout_err.de |
-    hw2reg.recov_err_code.main_update_err.de |
     hw2reg.recov_err_code.main_measure_err.de |
     hw2reg.recov_err_code.main_timeout_err.de |
-    hw2reg.recov_err_code.usb_update_err.de |
     hw2reg.recov_err_code.usb_measure_err.de |
-    hw2reg.recov_err_code.usb_timeout_err.de;
+    hw2reg.recov_err_code.usb_timeout_err.de |
+    hw2reg.recov_err_code.shadow_update_err.de;
 
   assign alerts = {
     |reg2hw.fatal_err_code,
@@ -481,6 +477,13 @@
   // SEC_CM: TIMEOUT.CLK.BKGN_CHK, MEAS.CLK.BKGN_CHK
   ////////////////////////////////////////////////////
 
+  logic [4:0] shadow_update_errs;
+  logic [4:0] shadow_storage_errs;
+  assign hw2reg.recov_err_code.shadow_update_err.d = 1'b1;
+  assign hw2reg.recov_err_code.shadow_update_err.de = |shadow_update_errs;
+  assign hw2reg.fatal_err_code.shadow_storage_err.d = 1'b1;
+  assign hw2reg.fatal_err_code.shadow_storage_err.de = |shadow_storage_errs;
+
   logic io_fast_err;
   logic io_slow_err;
   logic io_timeout_err;
@@ -532,13 +535,11 @@
   assign hw2reg.recov_err_code.io_measure_err.de = synced_io_err;
   assign hw2reg.recov_err_code.io_timeout_err.d = 1'b1;
   assign hw2reg.recov_err_code.io_timeout_err.de = synced_io_timeout_err;
-  assign hw2reg.recov_err_code.io_update_err.d = 1'b1;
-  assign hw2reg.recov_err_code.io_update_err.de =
+  assign shadow_update_errs[0] =
     reg2hw.io_meas_ctrl_shadowed.en.err_update |
     reg2hw.io_meas_ctrl_shadowed.hi.err_update |
     reg2hw.io_meas_ctrl_shadowed.lo.err_update;
-  assign hw2reg.fatal_err_code.io_storage_err.d = 1'b1;
-  assign hw2reg.fatal_err_code.io_storage_err.de =
+  assign shadow_storage_errs[0] =
     reg2hw.io_meas_ctrl_shadowed.en.err_storage |
     reg2hw.io_meas_ctrl_shadowed.hi.err_storage |
     reg2hw.io_meas_ctrl_shadowed.lo.err_storage;
@@ -594,13 +595,11 @@
   assign hw2reg.recov_err_code.io_div2_measure_err.de = synced_io_div2_err;
   assign hw2reg.recov_err_code.io_div2_timeout_err.d = 1'b1;
   assign hw2reg.recov_err_code.io_div2_timeout_err.de = synced_io_div2_timeout_err;
-  assign hw2reg.recov_err_code.io_div2_update_err.d = 1'b1;
-  assign hw2reg.recov_err_code.io_div2_update_err.de =
+  assign shadow_update_errs[1] =
     reg2hw.io_div2_meas_ctrl_shadowed.en.err_update |
     reg2hw.io_div2_meas_ctrl_shadowed.hi.err_update |
     reg2hw.io_div2_meas_ctrl_shadowed.lo.err_update;
-  assign hw2reg.fatal_err_code.io_div2_storage_err.d = 1'b1;
-  assign hw2reg.fatal_err_code.io_div2_storage_err.de =
+  assign shadow_storage_errs[1] =
     reg2hw.io_div2_meas_ctrl_shadowed.en.err_storage |
     reg2hw.io_div2_meas_ctrl_shadowed.hi.err_storage |
     reg2hw.io_div2_meas_ctrl_shadowed.lo.err_storage;
@@ -656,13 +655,11 @@
   assign hw2reg.recov_err_code.io_div4_measure_err.de = synced_io_div4_err;
   assign hw2reg.recov_err_code.io_div4_timeout_err.d = 1'b1;
   assign hw2reg.recov_err_code.io_div4_timeout_err.de = synced_io_div4_timeout_err;
-  assign hw2reg.recov_err_code.io_div4_update_err.d = 1'b1;
-  assign hw2reg.recov_err_code.io_div4_update_err.de =
+  assign shadow_update_errs[2] =
     reg2hw.io_div4_meas_ctrl_shadowed.en.err_update |
     reg2hw.io_div4_meas_ctrl_shadowed.hi.err_update |
     reg2hw.io_div4_meas_ctrl_shadowed.lo.err_update;
-  assign hw2reg.fatal_err_code.io_div4_storage_err.d = 1'b1;
-  assign hw2reg.fatal_err_code.io_div4_storage_err.de =
+  assign shadow_storage_errs[2] =
     reg2hw.io_div4_meas_ctrl_shadowed.en.err_storage |
     reg2hw.io_div4_meas_ctrl_shadowed.hi.err_storage |
     reg2hw.io_div4_meas_ctrl_shadowed.lo.err_storage;
@@ -718,13 +715,11 @@
   assign hw2reg.recov_err_code.main_measure_err.de = synced_main_err;
   assign hw2reg.recov_err_code.main_timeout_err.d = 1'b1;
   assign hw2reg.recov_err_code.main_timeout_err.de = synced_main_timeout_err;
-  assign hw2reg.recov_err_code.main_update_err.d = 1'b1;
-  assign hw2reg.recov_err_code.main_update_err.de =
+  assign shadow_update_errs[3] =
     reg2hw.main_meas_ctrl_shadowed.en.err_update |
     reg2hw.main_meas_ctrl_shadowed.hi.err_update |
     reg2hw.main_meas_ctrl_shadowed.lo.err_update;
-  assign hw2reg.fatal_err_code.main_storage_err.d = 1'b1;
-  assign hw2reg.fatal_err_code.main_storage_err.de =
+  assign shadow_storage_errs[3] =
     reg2hw.main_meas_ctrl_shadowed.en.err_storage |
     reg2hw.main_meas_ctrl_shadowed.hi.err_storage |
     reg2hw.main_meas_ctrl_shadowed.lo.err_storage;
@@ -780,13 +775,11 @@
   assign hw2reg.recov_err_code.usb_measure_err.de = synced_usb_err;
   assign hw2reg.recov_err_code.usb_timeout_err.d = 1'b1;
   assign hw2reg.recov_err_code.usb_timeout_err.de = synced_usb_timeout_err;
-  assign hw2reg.recov_err_code.usb_update_err.d = 1'b1;
-  assign hw2reg.recov_err_code.usb_update_err.de =
+  assign shadow_update_errs[4] =
     reg2hw.usb_meas_ctrl_shadowed.en.err_update |
     reg2hw.usb_meas_ctrl_shadowed.hi.err_update |
     reg2hw.usb_meas_ctrl_shadowed.lo.err_update;
-  assign hw2reg.fatal_err_code.usb_storage_err.d = 1'b1;
-  assign hw2reg.fatal_err_code.usb_storage_err.de =
+  assign shadow_storage_errs[4] =
     reg2hw.usb_meas_ctrl_shadowed.en.err_storage |
     reg2hw.usb_meas_ctrl_shadowed.hi.err_storage |
     reg2hw.usb_meas_ctrl_shadowed.lo.err_storage;
diff --git a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_pkg.sv b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_pkg.sv
index e5a7cfa..19f4c7b 100644
--- a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_pkg.sv
@@ -172,19 +172,7 @@
     } idle_cnt;
     struct packed {
       logic        q;
-    } io_storage_err;
-    struct packed {
-      logic        q;
-    } io_div2_storage_err;
-    struct packed {
-      logic        q;
-    } io_div4_storage_err;
-    struct packed {
-      logic        q;
-    } main_storage_err;
-    struct packed {
-      logic        q;
-    } usb_storage_err;
+    } shadow_storage_err;
   } clkmgr_reg2hw_fatal_err_code_reg_t;
 
   typedef struct packed {
@@ -210,6 +198,10 @@
     struct packed {
       logic        d;
       logic        de;
+    } shadow_update_err;
+    struct packed {
+      logic        d;
+      logic        de;
     } io_measure_err;
     struct packed {
       logic        d;
@@ -247,26 +239,6 @@
       logic        d;
       logic        de;
     } usb_timeout_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } io_update_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } io_div2_update_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } io_div4_update_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } main_update_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } usb_update_err;
   } clkmgr_hw2reg_recov_err_code_reg_t;
 
   typedef struct packed {
@@ -281,45 +253,29 @@
     struct packed {
       logic        d;
       logic        de;
-    } io_storage_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } io_div2_storage_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } io_div4_storage_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } main_storage_err;
-    struct packed {
-      logic        d;
-      logic        de;
-    } usb_storage_err;
+    } shadow_storage_err;
   } clkmgr_hw2reg_fatal_err_code_reg_t;
 
   // Register -> HW type
   typedef struct packed {
-    clkmgr_reg2hw_alert_test_reg_t alert_test; // [127:124]
-    clkmgr_reg2hw_extclk_ctrl_reg_t extclk_ctrl; // [123:116]
-    clkmgr_reg2hw_jitter_enable_reg_t jitter_enable; // [115:112]
-    clkmgr_reg2hw_clk_enables_reg_t clk_enables; // [111:108]
-    clkmgr_reg2hw_clk_hints_reg_t clk_hints; // [107:104]
-    clkmgr_reg2hw_io_meas_ctrl_shadowed_reg_t io_meas_ctrl_shadowed; // [103:83]
-    clkmgr_reg2hw_io_div2_meas_ctrl_shadowed_reg_t io_div2_meas_ctrl_shadowed; // [82:64]
-    clkmgr_reg2hw_io_div4_meas_ctrl_shadowed_reg_t io_div4_meas_ctrl_shadowed; // [63:47]
-    clkmgr_reg2hw_main_meas_ctrl_shadowed_reg_t main_meas_ctrl_shadowed; // [46:26]
-    clkmgr_reg2hw_usb_meas_ctrl_shadowed_reg_t usb_meas_ctrl_shadowed; // [25:7]
-    clkmgr_reg2hw_fatal_err_code_reg_t fatal_err_code; // [6:0]
+    clkmgr_reg2hw_alert_test_reg_t alert_test; // [123:120]
+    clkmgr_reg2hw_extclk_ctrl_reg_t extclk_ctrl; // [119:112]
+    clkmgr_reg2hw_jitter_enable_reg_t jitter_enable; // [111:108]
+    clkmgr_reg2hw_clk_enables_reg_t clk_enables; // [107:104]
+    clkmgr_reg2hw_clk_hints_reg_t clk_hints; // [103:100]
+    clkmgr_reg2hw_io_meas_ctrl_shadowed_reg_t io_meas_ctrl_shadowed; // [99:79]
+    clkmgr_reg2hw_io_div2_meas_ctrl_shadowed_reg_t io_div2_meas_ctrl_shadowed; // [78:60]
+    clkmgr_reg2hw_io_div4_meas_ctrl_shadowed_reg_t io_div4_meas_ctrl_shadowed; // [59:43]
+    clkmgr_reg2hw_main_meas_ctrl_shadowed_reg_t main_meas_ctrl_shadowed; // [42:22]
+    clkmgr_reg2hw_usb_meas_ctrl_shadowed_reg_t usb_meas_ctrl_shadowed; // [21:3]
+    clkmgr_reg2hw_fatal_err_code_reg_t fatal_err_code; // [2:0]
   } clkmgr_reg2hw_t;
 
   // HW -> register type
   typedef struct packed {
-    clkmgr_hw2reg_clk_hints_status_reg_t clk_hints_status; // [51:44]
-    clkmgr_hw2reg_recov_err_code_reg_t recov_err_code; // [43:14]
-    clkmgr_hw2reg_fatal_err_code_reg_t fatal_err_code; // [13:0]
+    clkmgr_hw2reg_clk_hints_status_reg_t clk_hints_status; // [35:28]
+    clkmgr_hw2reg_recov_err_code_reg_t recov_err_code; // [27:6]
+    clkmgr_hw2reg_fatal_err_code_reg_t fatal_err_code; // [5:0]
   } clkmgr_hw2reg_t;
 
   // Register offsets
diff --git a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv
index 4f073a1..40e0b00 100644
--- a/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv
+++ b/hw/top_earlgrey/ip/clkmgr/rtl/autogen/clkmgr_reg_top.sv
@@ -242,6 +242,8 @@
   logic [21:0] usb_meas_ctrl_shadowed_qs;
   logic usb_meas_ctrl_shadowed_busy;
   logic recov_err_code_we;
+  logic recov_err_code_shadow_update_err_qs;
+  logic recov_err_code_shadow_update_err_wd;
   logic recov_err_code_io_measure_err_qs;
   logic recov_err_code_io_measure_err_wd;
   logic recov_err_code_io_div2_measure_err_qs;
@@ -262,23 +264,9 @@
   logic recov_err_code_main_timeout_err_wd;
   logic recov_err_code_usb_timeout_err_qs;
   logic recov_err_code_usb_timeout_err_wd;
-  logic recov_err_code_io_update_err_qs;
-  logic recov_err_code_io_update_err_wd;
-  logic recov_err_code_io_div2_update_err_qs;
-  logic recov_err_code_io_div2_update_err_wd;
-  logic recov_err_code_io_div4_update_err_qs;
-  logic recov_err_code_io_div4_update_err_wd;
-  logic recov_err_code_main_update_err_qs;
-  logic recov_err_code_main_update_err_wd;
-  logic recov_err_code_usb_update_err_qs;
-  logic recov_err_code_usb_update_err_wd;
   logic fatal_err_code_reg_intg_qs;
   logic fatal_err_code_idle_cnt_qs;
-  logic fatal_err_code_io_storage_err_qs;
-  logic fatal_err_code_io_div2_storage_err_qs;
-  logic fatal_err_code_io_div4_storage_err_qs;
-  logic fatal_err_code_main_storage_err_qs;
-  logic fatal_err_code_usb_storage_err_qs;
+  logic fatal_err_code_shadow_storage_err_qs;
   // Define register CDC handling.
   // CDC handling is done on a per-reg instead of per-field boundary.
 
@@ -1871,7 +1859,32 @@
 
 
   // R[recov_err_code]: V(False)
-  //   F[io_measure_err]: 0:0
+  //   F[shadow_update_err]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_recov_err_code_shadow_update_err (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (recov_err_code_we),
+    .wd     (recov_err_code_shadow_update_err_wd),
+
+    // from internal hardware
+    .de     (hw2reg.recov_err_code.shadow_update_err.de),
+    .d      (hw2reg.recov_err_code.shadow_update_err.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (recov_err_code_shadow_update_err_qs)
+  );
+
+  //   F[io_measure_err]: 1:1
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -1896,7 +1909,7 @@
     .qs     (recov_err_code_io_measure_err_qs)
   );
 
-  //   F[io_div2_measure_err]: 1:1
+  //   F[io_div2_measure_err]: 2:2
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -1921,7 +1934,7 @@
     .qs     (recov_err_code_io_div2_measure_err_qs)
   );
 
-  //   F[io_div4_measure_err]: 2:2
+  //   F[io_div4_measure_err]: 3:3
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -1946,7 +1959,7 @@
     .qs     (recov_err_code_io_div4_measure_err_qs)
   );
 
-  //   F[main_measure_err]: 3:3
+  //   F[main_measure_err]: 4:4
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -1971,7 +1984,7 @@
     .qs     (recov_err_code_main_measure_err_qs)
   );
 
-  //   F[usb_measure_err]: 4:4
+  //   F[usb_measure_err]: 5:5
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -1996,7 +2009,7 @@
     .qs     (recov_err_code_usb_measure_err_qs)
   );
 
-  //   F[io_timeout_err]: 5:5
+  //   F[io_timeout_err]: 6:6
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -2021,7 +2034,7 @@
     .qs     (recov_err_code_io_timeout_err_qs)
   );
 
-  //   F[io_div2_timeout_err]: 6:6
+  //   F[io_div2_timeout_err]: 7:7
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -2046,7 +2059,7 @@
     .qs     (recov_err_code_io_div2_timeout_err_qs)
   );
 
-  //   F[io_div4_timeout_err]: 7:7
+  //   F[io_div4_timeout_err]: 8:8
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -2071,7 +2084,7 @@
     .qs     (recov_err_code_io_div4_timeout_err_qs)
   );
 
-  //   F[main_timeout_err]: 8:8
+  //   F[main_timeout_err]: 9:9
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -2096,7 +2109,7 @@
     .qs     (recov_err_code_main_timeout_err_qs)
   );
 
-  //   F[usb_timeout_err]: 9:9
+  //   F[usb_timeout_err]: 10:10
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessW1C),
@@ -2121,131 +2134,6 @@
     .qs     (recov_err_code_usb_timeout_err_qs)
   );
 
-  //   F[io_update_err]: 10:10
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessW1C),
-    .RESVAL  (1'h0)
-  ) u_recov_err_code_io_update_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (recov_err_code_we),
-    .wd     (recov_err_code_io_update_err_wd),
-
-    // from internal hardware
-    .de     (hw2reg.recov_err_code.io_update_err.de),
-    .d      (hw2reg.recov_err_code.io_update_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (),
-
-    // to register interface (read)
-    .qs     (recov_err_code_io_update_err_qs)
-  );
-
-  //   F[io_div2_update_err]: 11:11
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessW1C),
-    .RESVAL  (1'h0)
-  ) u_recov_err_code_io_div2_update_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (recov_err_code_we),
-    .wd     (recov_err_code_io_div2_update_err_wd),
-
-    // from internal hardware
-    .de     (hw2reg.recov_err_code.io_div2_update_err.de),
-    .d      (hw2reg.recov_err_code.io_div2_update_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (),
-
-    // to register interface (read)
-    .qs     (recov_err_code_io_div2_update_err_qs)
-  );
-
-  //   F[io_div4_update_err]: 12:12
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessW1C),
-    .RESVAL  (1'h0)
-  ) u_recov_err_code_io_div4_update_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (recov_err_code_we),
-    .wd     (recov_err_code_io_div4_update_err_wd),
-
-    // from internal hardware
-    .de     (hw2reg.recov_err_code.io_div4_update_err.de),
-    .d      (hw2reg.recov_err_code.io_div4_update_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (),
-
-    // to register interface (read)
-    .qs     (recov_err_code_io_div4_update_err_qs)
-  );
-
-  //   F[main_update_err]: 13:13
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessW1C),
-    .RESVAL  (1'h0)
-  ) u_recov_err_code_main_update_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (recov_err_code_we),
-    .wd     (recov_err_code_main_update_err_wd),
-
-    // from internal hardware
-    .de     (hw2reg.recov_err_code.main_update_err.de),
-    .d      (hw2reg.recov_err_code.main_update_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (),
-
-    // to register interface (read)
-    .qs     (recov_err_code_main_update_err_qs)
-  );
-
-  //   F[usb_update_err]: 14:14
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessW1C),
-    .RESVAL  (1'h0)
-  ) u_recov_err_code_usb_update_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (recov_err_code_we),
-    .wd     (recov_err_code_usb_update_err_wd),
-
-    // from internal hardware
-    .de     (hw2reg.recov_err_code.usb_update_err.de),
-    .d      (hw2reg.recov_err_code.usb_update_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (),
-
-    // to register interface (read)
-    .qs     (recov_err_code_usb_update_err_qs)
-  );
-
 
   // R[fatal_err_code]: V(False)
   //   F[reg_intg]: 0:0
@@ -2298,12 +2186,12 @@
     .qs     (fatal_err_code_idle_cnt_qs)
   );
 
-  //   F[io_storage_err]: 2:2
+  //   F[shadow_storage_err]: 2:2
   prim_subreg #(
     .DW      (1),
     .SwAccess(prim_subreg_pkg::SwAccessRO),
     .RESVAL  (1'h0)
-  ) u_fatal_err_code_io_storage_err (
+  ) u_fatal_err_code_shadow_storage_err (
     .clk_i   (clk_i),
     .rst_ni  (rst_ni),
 
@@ -2312,115 +2200,15 @@
     .wd     ('0),
 
     // from internal hardware
-    .de     (hw2reg.fatal_err_code.io_storage_err.de),
-    .d      (hw2reg.fatal_err_code.io_storage_err.d),
+    .de     (hw2reg.fatal_err_code.shadow_storage_err.de),
+    .d      (hw2reg.fatal_err_code.shadow_storage_err.d),
 
     // to internal hardware
     .qe     (),
-    .q      (reg2hw.fatal_err_code.io_storage_err.q),
+    .q      (reg2hw.fatal_err_code.shadow_storage_err.q),
 
     // to register interface (read)
-    .qs     (fatal_err_code_io_storage_err_qs)
-  );
-
-  //   F[io_div2_storage_err]: 3:3
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessRO),
-    .RESVAL  (1'h0)
-  ) u_fatal_err_code_io_div2_storage_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (1'b0),
-    .wd     ('0),
-
-    // from internal hardware
-    .de     (hw2reg.fatal_err_code.io_div2_storage_err.de),
-    .d      (hw2reg.fatal_err_code.io_div2_storage_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.fatal_err_code.io_div2_storage_err.q),
-
-    // to register interface (read)
-    .qs     (fatal_err_code_io_div2_storage_err_qs)
-  );
-
-  //   F[io_div4_storage_err]: 4:4
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessRO),
-    .RESVAL  (1'h0)
-  ) u_fatal_err_code_io_div4_storage_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (1'b0),
-    .wd     ('0),
-
-    // from internal hardware
-    .de     (hw2reg.fatal_err_code.io_div4_storage_err.de),
-    .d      (hw2reg.fatal_err_code.io_div4_storage_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.fatal_err_code.io_div4_storage_err.q),
-
-    // to register interface (read)
-    .qs     (fatal_err_code_io_div4_storage_err_qs)
-  );
-
-  //   F[main_storage_err]: 5:5
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessRO),
-    .RESVAL  (1'h0)
-  ) u_fatal_err_code_main_storage_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (1'b0),
-    .wd     ('0),
-
-    // from internal hardware
-    .de     (hw2reg.fatal_err_code.main_storage_err.de),
-    .d      (hw2reg.fatal_err_code.main_storage_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.fatal_err_code.main_storage_err.q),
-
-    // to register interface (read)
-    .qs     (fatal_err_code_main_storage_err_qs)
-  );
-
-  //   F[usb_storage_err]: 6:6
-  prim_subreg #(
-    .DW      (1),
-    .SwAccess(prim_subreg_pkg::SwAccessRO),
-    .RESVAL  (1'h0)
-  ) u_fatal_err_code_usb_storage_err (
-    .clk_i   (clk_i),
-    .rst_ni  (rst_ni),
-
-    // from register interface
-    .we     (1'b0),
-    .wd     ('0),
-
-    // from internal hardware
-    .de     (hw2reg.fatal_err_code.usb_storage_err.de),
-    .d      (hw2reg.fatal_err_code.usb_storage_err.d),
-
-    // to internal hardware
-    .qe     (),
-    .q      (reg2hw.fatal_err_code.usb_storage_err.q),
-
-    // to register interface (read)
-    .qs     (fatal_err_code_usb_storage_err_qs)
+    .qs     (fatal_err_code_shadow_storage_err_qs)
   );
 
 
@@ -2535,35 +2323,27 @@
 
   assign recov_err_code_we = addr_hit[14] & reg_we & !reg_error;
 
-  assign recov_err_code_io_measure_err_wd = reg_wdata[0];
+  assign recov_err_code_shadow_update_err_wd = reg_wdata[0];
 
-  assign recov_err_code_io_div2_measure_err_wd = reg_wdata[1];
+  assign recov_err_code_io_measure_err_wd = reg_wdata[1];
 
-  assign recov_err_code_io_div4_measure_err_wd = reg_wdata[2];
+  assign recov_err_code_io_div2_measure_err_wd = reg_wdata[2];
 
-  assign recov_err_code_main_measure_err_wd = reg_wdata[3];
+  assign recov_err_code_io_div4_measure_err_wd = reg_wdata[3];
 
-  assign recov_err_code_usb_measure_err_wd = reg_wdata[4];
+  assign recov_err_code_main_measure_err_wd = reg_wdata[4];
 
-  assign recov_err_code_io_timeout_err_wd = reg_wdata[5];
+  assign recov_err_code_usb_measure_err_wd = reg_wdata[5];
 
-  assign recov_err_code_io_div2_timeout_err_wd = reg_wdata[6];
+  assign recov_err_code_io_timeout_err_wd = reg_wdata[6];
 
-  assign recov_err_code_io_div4_timeout_err_wd = reg_wdata[7];
+  assign recov_err_code_io_div2_timeout_err_wd = reg_wdata[7];
 
-  assign recov_err_code_main_timeout_err_wd = reg_wdata[8];
+  assign recov_err_code_io_div4_timeout_err_wd = reg_wdata[8];
 
-  assign recov_err_code_usb_timeout_err_wd = reg_wdata[9];
+  assign recov_err_code_main_timeout_err_wd = reg_wdata[9];
 
-  assign recov_err_code_io_update_err_wd = reg_wdata[10];
-
-  assign recov_err_code_io_div2_update_err_wd = reg_wdata[11];
-
-  assign recov_err_code_io_div4_update_err_wd = reg_wdata[12];
-
-  assign recov_err_code_main_update_err_wd = reg_wdata[13];
-
-  assign recov_err_code_usb_update_err_wd = reg_wdata[14];
+  assign recov_err_code_usb_timeout_err_wd = reg_wdata[10];
 
   // Read data return
   always_comb begin
@@ -2632,31 +2412,23 @@
         reg_rdata_next = DW'(usb_meas_ctrl_shadowed_qs);
       end
       addr_hit[14]: begin
-        reg_rdata_next[0] = recov_err_code_io_measure_err_qs;
-        reg_rdata_next[1] = recov_err_code_io_div2_measure_err_qs;
-        reg_rdata_next[2] = recov_err_code_io_div4_measure_err_qs;
-        reg_rdata_next[3] = recov_err_code_main_measure_err_qs;
-        reg_rdata_next[4] = recov_err_code_usb_measure_err_qs;
-        reg_rdata_next[5] = recov_err_code_io_timeout_err_qs;
-        reg_rdata_next[6] = recov_err_code_io_div2_timeout_err_qs;
-        reg_rdata_next[7] = recov_err_code_io_div4_timeout_err_qs;
-        reg_rdata_next[8] = recov_err_code_main_timeout_err_qs;
-        reg_rdata_next[9] = recov_err_code_usb_timeout_err_qs;
-        reg_rdata_next[10] = recov_err_code_io_update_err_qs;
-        reg_rdata_next[11] = recov_err_code_io_div2_update_err_qs;
-        reg_rdata_next[12] = recov_err_code_io_div4_update_err_qs;
-        reg_rdata_next[13] = recov_err_code_main_update_err_qs;
-        reg_rdata_next[14] = recov_err_code_usb_update_err_qs;
+        reg_rdata_next[0] = recov_err_code_shadow_update_err_qs;
+        reg_rdata_next[1] = recov_err_code_io_measure_err_qs;
+        reg_rdata_next[2] = recov_err_code_io_div2_measure_err_qs;
+        reg_rdata_next[3] = recov_err_code_io_div4_measure_err_qs;
+        reg_rdata_next[4] = recov_err_code_main_measure_err_qs;
+        reg_rdata_next[5] = recov_err_code_usb_measure_err_qs;
+        reg_rdata_next[6] = recov_err_code_io_timeout_err_qs;
+        reg_rdata_next[7] = recov_err_code_io_div2_timeout_err_qs;
+        reg_rdata_next[8] = recov_err_code_io_div4_timeout_err_qs;
+        reg_rdata_next[9] = recov_err_code_main_timeout_err_qs;
+        reg_rdata_next[10] = recov_err_code_usb_timeout_err_qs;
       end
 
       addr_hit[15]: begin
         reg_rdata_next[0] = fatal_err_code_reg_intg_qs;
         reg_rdata_next[1] = fatal_err_code_idle_cnt_qs;
-        reg_rdata_next[2] = fatal_err_code_io_storage_err_qs;
-        reg_rdata_next[3] = fatal_err_code_io_div2_storage_err_qs;
-        reg_rdata_next[4] = fatal_err_code_io_div4_storage_err_qs;
-        reg_rdata_next[5] = fatal_err_code_main_storage_err_qs;
-        reg_rdata_next[6] = fatal_err_code_usb_storage_err_qs;
+        reg_rdata_next[2] = fatal_err_code_shadow_storage_err_qs;
       end
 
       default: begin