[flash_ctrl] Add generic registers for the flash wrapper

Signed-off-by: Michael Schaffner <msf@opentitan.org>
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.hjson b/hw/ip/flash_ctrl/data/flash_ctrl.hjson
index 6a99c37..8c79db4 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.hjson
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.hjson
@@ -4,14 +4,14 @@
 
 
 
-{ name: "FLASH_CTRL",
+{ name: "flash_ctrl",
   clocking: [
     {clock: "clk_i", reset: "rst_ni", primary: true},
     {clock: "clk_otp_i", reset: "rst_otp_ni"}
   ]
   bus_interfaces: [
     { protocol: "tlul", direction: "device", name: "core" }
-    { protocol: "tlul", direction: "device", name: "prim" }
+    { protocol: "tlul", direction: "device", name: "prim" , hier_path: "u_eflash.u_flash.gen_generic.u_impl_generic.u_reg_top"}
     { protocol: "tlul", direction: "device", name: "mem" }
   ],
   available_input_list: [
@@ -2158,7 +2158,867 @@
       },
     ],
 
-    prim: []
+    prim: [
+      {
+        name: "CSR0_REGWEN",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw0c",
+            hwaccess: "none",
+            resval: "1",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      },
+      {
+        name: "CSR1",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "12:8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR2",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "1",
+            name: "field1",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "2",
+            name: "field2",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "3",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "4",
+            name: "field4",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5",
+            name: "field5",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "6",
+            name: "field6",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "7",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      },
+      {
+        name: "CSR3",
+        desc: "",
+        fields: [
+          {
+            bits: "3:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "7:4",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "10:8",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:11",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:14",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "19:17",
+            name: "field5",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20",
+            name: "field6",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "23:21",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "25:24",
+            name: "field8",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "27:26",
+            name: "field9",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR4",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8:6",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "11:9",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR5",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "4:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:5",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "18:14",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "22:19",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR6",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:6",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:14",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "18:17",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20:19",
+            name: "field5",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "22:21",
+            name: "field6",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "23",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "24",
+            name: "field8",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR7",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR8",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR9",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR10",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR11",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR12",
+        desc: "",
+        fields: [
+          {
+            bits: "9:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR13",
+        desc: "",
+        fields: [
+          {
+            bits: "19:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR14",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR15",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR16",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR17",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR18",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR19",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR20",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "1",
+            name: "field1",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "2",
+            name: "field2",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      }
+    ],
     mem: []
   }
 }
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl b/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
index d9d5988..c36954a 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.hjson.tpl
@@ -15,14 +15,14 @@
   max_fifo_width = max_fifo_depth.bit_length()
 %>
 
-{ name: "FLASH_CTRL",
+{ name: "flash_ctrl",
   clocking: [
     {clock: "clk_i", reset: "rst_ni", primary: true},
     {clock: "clk_otp_i", reset: "rst_otp_ni"}
   ]
   bus_interfaces: [
     { protocol: "tlul", direction: "device", name: "core" }
-    { protocol: "tlul", direction: "device", name: "prim" }
+    { protocol: "tlul", direction: "device", name: "prim" , hier_path: "u_eflash.u_flash.gen_generic.u_impl_generic.u_reg_top"}
     { protocol: "tlul", direction: "device", name: "mem" }
   ],
   available_input_list: [
@@ -1633,7 +1633,867 @@
       },
     ],
 
-    prim: []
+    prim: [
+      {
+        name: "CSR0_REGWEN",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw0c",
+            hwaccess: "none",
+            resval: "1",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      },
+      {
+        name: "CSR1",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "12:8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR2",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "1",
+            name: "field1",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "2",
+            name: "field2",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "3",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "4",
+            name: "field4",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5",
+            name: "field5",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "6",
+            name: "field6",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "7",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      },
+      {
+        name: "CSR3",
+        desc: "",
+        fields: [
+          {
+            bits: "3:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "7:4",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "10:8",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:11",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:14",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "19:17",
+            name: "field5",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20",
+            name: "field6",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "23:21",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "25:24",
+            name: "field8",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "27:26",
+            name: "field9",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR4",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8:6",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "11:9",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR5",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "4:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:5",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "18:14",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "22:19",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR6",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:6",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:14",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "18:17",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20:19",
+            name: "field5",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "22:21",
+            name: "field6",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "23",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "24",
+            name: "field8",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR7",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR8",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR9",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR10",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR11",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR12",
+        desc: "",
+        fields: [
+          {
+            bits: "9:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR13",
+        desc: "",
+        fields: [
+          {
+            bits: "19:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR14",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR15",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR16",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR17",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR18",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR19",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR20",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "1",
+            name: "field1",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "2",
+            name: "field2",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      }
+    ],
     mem: []
   }
 }
diff --git a/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl b/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
index 21e64c6..353c6df 100644
--- a/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
+++ b/hw/ip/flash_ctrl/data/flash_ctrl.sv.tpl
@@ -1429,4 +1429,13 @@
 
   // Alert assertions for reg_we onehot check
   `ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(RegWeOnehotCheck_A, u_reg_core, alert_tx_o[1])
+
+  `ifndef PRIM_DEFAULT_IMPL
+    `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric
+  `endif
+  if (`PRIM_DEFAULT_IMPL == prim_pkg::ImplGeneric) begin : gen_reg_we_assert_generic
+    `ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(PrimRegWeOnehotCheck_A,
+        u_eflash.u_flash.gen_generic.u_impl_generic.u_reg_top, alert_tx_o[1])
+  end
+
 endmodule
diff --git a/hw/ip/flash_ctrl/flash_ctrl_prim_reg_top.core b/hw/ip/flash_ctrl/flash_ctrl_prim_reg_top.core
new file mode 100644
index 0000000..9643afd
--- /dev/null
+++ b/hw/ip/flash_ctrl/flash_ctrl_prim_reg_top.core
@@ -0,0 +1,26 @@
+CAPI=2:
+# Copyright lowRISC contributors.
+# Licensed under the Apache License, Version 2.0, see LICENSE for details.
+# SPDX-License-Identifier: Apache-2.0
+name: "lowrisc:ip:flash_ctrl_prim_reg_top:1.0"
+description: "Generic register top for the FLASH wrapper"
+filesets:
+  files_rtl:
+    depend:
+      - lowrisc:ip:flash_ctrl_pkg
+    files:
+      - rtl/flash_ctrl_prim_reg_top.sv
+    file_type: systemVerilogSource
+
+
+parameters:
+  SYNTHESIS:
+    datatype: bool
+    paramtype: vlogdefine
+
+
+targets:
+  default: &default_target
+    filesets:
+      - files_rtl
+    toplevel: lc_ctrl
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
index 527f74a..60454f9 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
@@ -1430,4 +1430,13 @@
 
   // Alert assertions for reg_we onehot check
   `ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(RegWeOnehotCheck_A, u_reg_core, alert_tx_o[1])
+
+  `ifndef PRIM_DEFAULT_IMPL
+    `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric
+  `endif
+  if (`PRIM_DEFAULT_IMPL == prim_pkg::ImplGeneric) begin : gen_reg_we_assert_generic
+    `ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(PrimRegWeOnehotCheck_A,
+        u_eflash.u_flash.gen_generic.u_impl_generic.u_reg_top, alert_tx_o[1])
+  end
+
 endmodule
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_prim_reg_top.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_prim_reg_top.sv
index 73d1a43..c0d0ae2 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_prim_reg_top.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_prim_reg_top.sv
@@ -12,6 +12,8 @@
   input  tlul_pkg::tl_h2d_t tl_i,
   output tlul_pkg::tl_d2h_t tl_o,
   // To HW
+  output flash_ctrl_reg_pkg::flash_ctrl_prim_reg2hw_t reg2hw, // Write
+  input  flash_ctrl_reg_pkg::flash_ctrl_prim_hw2reg_t hw2reg, // Read
 
   // Integrity check errors
   output logic intg_err_o,
@@ -22,11 +24,60 @@
 
   import flash_ctrl_reg_pkg::* ;
 
+  localparam int AW = 7;
+  localparam int DW = 32;
+  localparam int DBW = DW/8;                    // Byte Width
+
+  // register signals
+  logic           reg_we;
+  logic           reg_re;
+  logic [AW-1:0]  reg_addr;
+  logic [DW-1:0]  reg_wdata;
+  logic [DBW-1:0] reg_be;
+  logic [DW-1:0]  reg_rdata;
+  logic           reg_error;
+
+  logic          addrmiss, wr_err;
+
+  logic [DW-1:0] reg_rdata_next;
+  logic reg_busy;
+
+  tlul_pkg::tl_h2d_t tl_reg_h2d;
+  tlul_pkg::tl_d2h_t tl_reg_d2h;
 
 
-  // Since there are no registers in this block, commands are routed through to windows which
-  // can report their own integrity errors.
-  assign intg_err_o = 1'b0;
+  // incoming payload check
+  logic intg_err;
+  tlul_cmd_intg_chk u_chk (
+    .tl_i(tl_i),
+    .err_o(intg_err)
+  );
+
+  // also check for spurious write enables
+  logic reg_we_err;
+  logic [20:0] reg_we_check;
+  prim_reg_we_check #(
+    .OneHotWidth(21)
+  ) u_prim_reg_we_check (
+    .clk_i(clk_i),
+    .rst_ni(rst_ni),
+    .oh_i  (reg_we_check),
+    .en_i  (reg_we && !addrmiss),
+    .err_o (reg_we_err)
+  );
+
+  logic err_q;
+  always_ff @(posedge clk_i or negedge rst_ni) begin
+    if (!rst_ni) begin
+      err_q <= '0;
+    end else if (intg_err || reg_we_err) begin
+      err_q <= 1'b1;
+    end
+  end
+
+  // integrity error output is permanent and should be used for alert generation
+  // register errors are transactional
+  assign intg_err_o = err_q | intg_err | reg_we_err;
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
@@ -41,8 +92,2240 @@
   assign tl_reg_h2d = tl_i;
   assign tl_o_pre   = tl_reg_d2h;
 
+  tlul_adapter_reg #(
+    .RegAw(AW),
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
+  ) u_reg_if (
+    .clk_i  (clk_i),
+    .rst_ni (rst_ni),
+
+    .tl_i (tl_reg_h2d),
+    .tl_o (tl_reg_d2h),
+
+    .we_o    (reg_we),
+    .re_o    (reg_re),
+    .addr_o  (reg_addr),
+    .wdata_o (reg_wdata),
+    .be_o    (reg_be),
+    .busy_i  (reg_busy),
+    .rdata_i (reg_rdata),
+    .error_i (reg_error)
+  );
+
+  // cdc oversampling signals
+
+  assign reg_rdata = reg_rdata_next ;
+  assign reg_error = (devmode_i & addrmiss) | wr_err | intg_err;
+
+  // Define SW related signals
+  // Format: <reg>_<field>_{wd|we|qs}
+  //        or <reg>_{wd|we|qs} if field == 1 or 0
+  logic csr0_regwen_we;
+  logic csr0_regwen_qs;
+  logic csr0_regwen_wd;
+  logic csr1_we;
+  logic [7:0] csr1_field0_qs;
+  logic [7:0] csr1_field0_wd;
+  logic [4:0] csr1_field1_qs;
+  logic [4:0] csr1_field1_wd;
+  logic csr2_we;
+  logic csr2_field0_qs;
+  logic csr2_field0_wd;
+  logic csr2_field1_qs;
+  logic csr2_field1_wd;
+  logic csr2_field2_qs;
+  logic csr2_field2_wd;
+  logic csr2_field3_qs;
+  logic csr2_field3_wd;
+  logic csr2_field4_qs;
+  logic csr2_field4_wd;
+  logic csr2_field5_qs;
+  logic csr2_field5_wd;
+  logic csr2_field6_qs;
+  logic csr2_field6_wd;
+  logic csr2_field7_qs;
+  logic csr2_field7_wd;
+  logic csr3_we;
+  logic [3:0] csr3_field0_qs;
+  logic [3:0] csr3_field0_wd;
+  logic [3:0] csr3_field1_qs;
+  logic [3:0] csr3_field1_wd;
+  logic [2:0] csr3_field2_qs;
+  logic [2:0] csr3_field2_wd;
+  logic [2:0] csr3_field3_qs;
+  logic [2:0] csr3_field3_wd;
+  logic [2:0] csr3_field4_qs;
+  logic [2:0] csr3_field4_wd;
+  logic [2:0] csr3_field5_qs;
+  logic [2:0] csr3_field5_wd;
+  logic csr3_field6_qs;
+  logic csr3_field6_wd;
+  logic [2:0] csr3_field7_qs;
+  logic [2:0] csr3_field7_wd;
+  logic [1:0] csr3_field8_qs;
+  logic [1:0] csr3_field8_wd;
+  logic [1:0] csr3_field9_qs;
+  logic [1:0] csr3_field9_wd;
+  logic csr4_we;
+  logic [2:0] csr4_field0_qs;
+  logic [2:0] csr4_field0_wd;
+  logic [2:0] csr4_field1_qs;
+  logic [2:0] csr4_field1_wd;
+  logic [2:0] csr4_field2_qs;
+  logic [2:0] csr4_field2_wd;
+  logic [2:0] csr4_field3_qs;
+  logic [2:0] csr4_field3_wd;
+  logic csr5_we;
+  logic [2:0] csr5_field0_qs;
+  logic [2:0] csr5_field0_wd;
+  logic [1:0] csr5_field1_qs;
+  logic [1:0] csr5_field1_wd;
+  logic [8:0] csr5_field2_qs;
+  logic [8:0] csr5_field2_wd;
+  logic [4:0] csr5_field3_qs;
+  logic [4:0] csr5_field3_wd;
+  logic [3:0] csr5_field4_qs;
+  logic [3:0] csr5_field4_wd;
+  logic csr6_we;
+  logic [2:0] csr6_field0_qs;
+  logic [2:0] csr6_field0_wd;
+  logic [2:0] csr6_field1_qs;
+  logic [2:0] csr6_field1_wd;
+  logic [7:0] csr6_field2_qs;
+  logic [7:0] csr6_field2_wd;
+  logic [2:0] csr6_field3_qs;
+  logic [2:0] csr6_field3_wd;
+  logic [1:0] csr6_field4_qs;
+  logic [1:0] csr6_field4_wd;
+  logic [1:0] csr6_field5_qs;
+  logic [1:0] csr6_field5_wd;
+  logic [1:0] csr6_field6_qs;
+  logic [1:0] csr6_field6_wd;
+  logic csr6_field7_qs;
+  logic csr6_field7_wd;
+  logic csr6_field8_qs;
+  logic csr6_field8_wd;
+  logic csr7_we;
+  logic [7:0] csr7_field0_qs;
+  logic [7:0] csr7_field0_wd;
+  logic [8:0] csr7_field1_qs;
+  logic [8:0] csr7_field1_wd;
+  logic csr8_we;
+  logic [31:0] csr8_qs;
+  logic [31:0] csr8_wd;
+  logic csr9_we;
+  logic [31:0] csr9_qs;
+  logic [31:0] csr9_wd;
+  logic csr10_we;
+  logic [31:0] csr10_qs;
+  logic [31:0] csr10_wd;
+  logic csr11_we;
+  logic [31:0] csr11_qs;
+  logic [31:0] csr11_wd;
+  logic csr12_we;
+  logic [9:0] csr12_qs;
+  logic [9:0] csr12_wd;
+  logic csr13_we;
+  logic [19:0] csr13_field0_qs;
+  logic [19:0] csr13_field0_wd;
+  logic csr13_field1_qs;
+  logic csr13_field1_wd;
+  logic csr14_we;
+  logic [7:0] csr14_field0_qs;
+  logic [7:0] csr14_field0_wd;
+  logic csr14_field1_qs;
+  logic csr14_field1_wd;
+  logic csr15_we;
+  logic [7:0] csr15_field0_qs;
+  logic [7:0] csr15_field0_wd;
+  logic csr15_field1_qs;
+  logic csr15_field1_wd;
+  logic csr16_we;
+  logic [7:0] csr16_field0_qs;
+  logic [7:0] csr16_field0_wd;
+  logic csr16_field1_qs;
+  logic csr16_field1_wd;
+  logic csr17_we;
+  logic [7:0] csr17_field0_qs;
+  logic [7:0] csr17_field0_wd;
+  logic csr17_field1_qs;
+  logic csr17_field1_wd;
+  logic csr18_we;
+  logic csr18_qs;
+  logic csr18_wd;
+  logic csr19_we;
+  logic csr19_qs;
+  logic csr19_wd;
+  logic csr20_we;
+  logic csr20_field0_qs;
+  logic csr20_field0_wd;
+  logic csr20_field1_qs;
+  logic csr20_field1_wd;
+  logic csr20_field2_qs;
+  logic csr20_field2_wd;
+
+  // Register instances
+  // R[csr0_regwen]: V(False)
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW0C),
+    .RESVAL  (1'h1)
+  ) u_csr0_regwen (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr0_regwen_we),
+    .wd     (csr0_regwen_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr0_regwen_qs)
+  );
+
+
+  // R[csr1]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr1_gated_we;
+  assign csr1_gated_we = csr1_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr1_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr1_gated_we),
+    .wd     (csr1_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr1.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr1_field0_qs)
+  );
+
+  //   F[field1]: 12:8
+  prim_subreg #(
+    .DW      (5),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (5'h0)
+  ) u_csr1_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr1_gated_we),
+    .wd     (csr1_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr1.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr1_field1_qs)
+  );
+
+
+  // R[csr2]: V(False)
+  //   F[field0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field0_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field0.de),
+    .d      (hw2reg.csr2.field0.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field0_qs)
+  );
+
+  //   F[field1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field1_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field1.de),
+    .d      (hw2reg.csr2.field1.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field1_qs)
+  );
+
+  //   F[field2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field2_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field2.de),
+    .d      (hw2reg.csr2.field2.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field2_qs)
+  );
+
+  //   F[field3]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr2_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field3_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field3.de),
+    .d      (hw2reg.csr2.field3.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field3_qs)
+  );
+
+  //   F[field4]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field4_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field4.de),
+    .d      (hw2reg.csr2.field4.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field4_qs)
+  );
+
+  //   F[field5]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field5_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field5.de),
+    .d      (hw2reg.csr2.field5.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field5.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field5_qs)
+  );
+
+  //   F[field6]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field6_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field6.de),
+    .d      (hw2reg.csr2.field6.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field6.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field6_qs)
+  );
+
+  //   F[field7]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr2_field7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field7_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field7.de),
+    .d      (hw2reg.csr2.field7.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field7.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field7_qs)
+  );
+
+
+  // R[csr3]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr3_gated_we;
+  assign csr3_gated_we = csr3_we & csr0_regwen_qs;
+  //   F[field0]: 3:0
+  prim_subreg #(
+    .DW      (4),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (4'h0)
+  ) u_csr3_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field0_qs)
+  );
+
+  //   F[field1]: 7:4
+  prim_subreg #(
+    .DW      (4),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (4'h0)
+  ) u_csr3_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field1_qs)
+  );
+
+  //   F[field2]: 10:8
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field2_qs)
+  );
+
+  //   F[field3]: 13:11
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field3_qs)
+  );
+
+  //   F[field4]: 16:14
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field4_qs)
+  );
+
+  //   F[field5]: 19:17
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field5_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field5.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field5_qs)
+  );
+
+  //   F[field6]: 20:20
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr3_field6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field6_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field6.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field6_qs)
+  );
+
+  //   F[field7]: 23:21
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field7_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field7.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field7_qs)
+  );
+
+  //   F[field8]: 25:24
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr3_field8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field8.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field8_qs)
+  );
+
+  //   F[field9]: 27:26
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr3_field9 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field9_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field9.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field9_qs)
+  );
+
+
+  // R[csr4]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr4_gated_we;
+  assign csr4_gated_we = csr4_we & csr0_regwen_qs;
+  //   F[field0]: 2:0
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field0_qs)
+  );
+
+  //   F[field1]: 5:3
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field1_qs)
+  );
+
+  //   F[field2]: 8:6
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field2_qs)
+  );
+
+  //   F[field3]: 11:9
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field3_qs)
+  );
+
+
+  // R[csr5]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr5_gated_we;
+  assign csr5_gated_we = csr5_we & csr0_regwen_qs;
+  //   F[field0]: 2:0
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr5_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field0_qs)
+  );
+
+  //   F[field1]: 4:3
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr5_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field1_qs)
+  );
+
+  //   F[field2]: 13:5
+  prim_subreg #(
+    .DW      (9),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (9'h0)
+  ) u_csr5_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field2_qs)
+  );
+
+  //   F[field3]: 18:14
+  prim_subreg #(
+    .DW      (5),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (5'h0)
+  ) u_csr5_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field3_qs)
+  );
+
+  //   F[field4]: 22:19
+  prim_subreg #(
+    .DW      (4),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (4'h0)
+  ) u_csr5_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field4_qs)
+  );
+
+
+  // R[csr6]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr6_gated_we;
+  assign csr6_gated_we = csr6_we & csr0_regwen_qs;
+  //   F[field0]: 2:0
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr6_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field0_qs)
+  );
+
+  //   F[field1]: 5:3
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr6_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field1_qs)
+  );
+
+  //   F[field2]: 13:6
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr6_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field2_qs)
+  );
+
+  //   F[field3]: 16:14
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr6_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field3_qs)
+  );
+
+  //   F[field4]: 18:17
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr6_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field4_qs)
+  );
+
+  //   F[field5]: 20:19
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr6_field5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field5_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field5.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field5_qs)
+  );
+
+  //   F[field6]: 22:21
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr6_field6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field6_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field6.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field6_qs)
+  );
+
+  //   F[field7]: 23:23
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr6_field7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field7_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field7.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field7_qs)
+  );
+
+  //   F[field8]: 24:24
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr6_field8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field8.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field8_qs)
+  );
+
+
+  // R[csr7]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr7_gated_we;
+  assign csr7_gated_we = csr7_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr7_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr7_gated_we),
+    .wd     (csr7_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr7.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr7_field0_qs)
+  );
+
+  //   F[field1]: 16:8
+  prim_subreg #(
+    .DW      (9),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (9'h0)
+  ) u_csr7_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr7_gated_we),
+    .wd     (csr7_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr7.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr7_field1_qs)
+  );
+
+
+  // R[csr8]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr8_gated_we;
+  assign csr8_gated_we = csr8_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr8_gated_we),
+    .wd     (csr8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr8.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr8_qs)
+  );
+
+
+  // R[csr9]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr9_gated_we;
+  assign csr9_gated_we = csr9_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr9 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr9_gated_we),
+    .wd     (csr9_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr9.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr9_qs)
+  );
+
+
+  // R[csr10]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr10_gated_we;
+  assign csr10_gated_we = csr10_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr10 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr10_gated_we),
+    .wd     (csr10_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr10.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr10_qs)
+  );
+
+
+  // R[csr11]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr11_gated_we;
+  assign csr11_gated_we = csr11_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr11_gated_we),
+    .wd     (csr11_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr11.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr11_qs)
+  );
+
+
+  // R[csr12]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr12_gated_we;
+  assign csr12_gated_we = csr12_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (10),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (10'h0)
+  ) u_csr12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr12_gated_we),
+    .wd     (csr12_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr12.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr12_qs)
+  );
+
+
+  // R[csr13]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr13_gated_we;
+  assign csr13_gated_we = csr13_we & csr0_regwen_qs;
+  //   F[field0]: 19:0
+  prim_subreg #(
+    .DW      (20),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (20'h0)
+  ) u_csr13_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr13_gated_we),
+    .wd     (csr13_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr13.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr13_field0_qs)
+  );
+
+  //   F[field1]: 20:20
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr13_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr13_gated_we),
+    .wd     (csr13_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr13.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr13_field1_qs)
+  );
+
+
+  // R[csr14]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr14_gated_we;
+  assign csr14_gated_we = csr14_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr14_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr14_gated_we),
+    .wd     (csr14_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr14.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr14_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr14_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr14_gated_we),
+    .wd     (csr14_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr14.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr14_field1_qs)
+  );
+
+
+  // R[csr15]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr15_gated_we;
+  assign csr15_gated_we = csr15_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr15_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr15_gated_we),
+    .wd     (csr15_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr15.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr15_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr15_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr15_gated_we),
+    .wd     (csr15_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr15.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr15_field1_qs)
+  );
+
+
+  // R[csr16]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr16_gated_we;
+  assign csr16_gated_we = csr16_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr16_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr16_gated_we),
+    .wd     (csr16_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr16.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr16_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr16_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr16_gated_we),
+    .wd     (csr16_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr16.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr16_field1_qs)
+  );
+
+
+  // R[csr17]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr17_gated_we;
+  assign csr17_gated_we = csr17_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr17_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr17_gated_we),
+    .wd     (csr17_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr17.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr17_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr17_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr17_gated_we),
+    .wd     (csr17_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr17.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr17_field1_qs)
+  );
+
+
+  // R[csr18]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr18_gated_we;
+  assign csr18_gated_we = csr18_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr18 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr18_gated_we),
+    .wd     (csr18_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr18.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr18_qs)
+  );
+
+
+  // R[csr19]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr19_gated_we;
+  assign csr19_gated_we = csr19_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr19 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr19_gated_we),
+    .wd     (csr19_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr19.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr19_qs)
+  );
+
+
+  // R[csr20]: V(False)
+  //   F[field0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr20_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr20_we),
+    .wd     (csr20_field0_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr20.field0.de),
+    .d      (hw2reg.csr20.field0.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr20.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr20_field0_qs)
+  );
+
+  //   F[field1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr20_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr20_we),
+    .wd     (csr20_field1_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr20.field1.de),
+    .d      (hw2reg.csr20.field1.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr20.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr20_field1_qs)
+  );
+
+  //   F[field2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr20_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr20_we),
+    .wd     (csr20_field2_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr20.field2.de),
+    .d      (hw2reg.csr20.field2.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr20.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr20_field2_qs)
+  );
+
+
+
+  logic [20:0] addr_hit;
+  always_comb begin
+    addr_hit = '0;
+    addr_hit[ 0] = (reg_addr == FLASH_CTRL_CSR0_REGWEN_OFFSET);
+    addr_hit[ 1] = (reg_addr == FLASH_CTRL_CSR1_OFFSET);
+    addr_hit[ 2] = (reg_addr == FLASH_CTRL_CSR2_OFFSET);
+    addr_hit[ 3] = (reg_addr == FLASH_CTRL_CSR3_OFFSET);
+    addr_hit[ 4] = (reg_addr == FLASH_CTRL_CSR4_OFFSET);
+    addr_hit[ 5] = (reg_addr == FLASH_CTRL_CSR5_OFFSET);
+    addr_hit[ 6] = (reg_addr == FLASH_CTRL_CSR6_OFFSET);
+    addr_hit[ 7] = (reg_addr == FLASH_CTRL_CSR7_OFFSET);
+    addr_hit[ 8] = (reg_addr == FLASH_CTRL_CSR8_OFFSET);
+    addr_hit[ 9] = (reg_addr == FLASH_CTRL_CSR9_OFFSET);
+    addr_hit[10] = (reg_addr == FLASH_CTRL_CSR10_OFFSET);
+    addr_hit[11] = (reg_addr == FLASH_CTRL_CSR11_OFFSET);
+    addr_hit[12] = (reg_addr == FLASH_CTRL_CSR12_OFFSET);
+    addr_hit[13] = (reg_addr == FLASH_CTRL_CSR13_OFFSET);
+    addr_hit[14] = (reg_addr == FLASH_CTRL_CSR14_OFFSET);
+    addr_hit[15] = (reg_addr == FLASH_CTRL_CSR15_OFFSET);
+    addr_hit[16] = (reg_addr == FLASH_CTRL_CSR16_OFFSET);
+    addr_hit[17] = (reg_addr == FLASH_CTRL_CSR17_OFFSET);
+    addr_hit[18] = (reg_addr == FLASH_CTRL_CSR18_OFFSET);
+    addr_hit[19] = (reg_addr == FLASH_CTRL_CSR19_OFFSET);
+    addr_hit[20] = (reg_addr == FLASH_CTRL_CSR20_OFFSET);
+  end
+
+  assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
+
+  // Check sub-word write is permitted
+  always_comb begin
+    wr_err = (reg_we &
+              ((addr_hit[ 0] & (|(FLASH_CTRL_PRIM_PERMIT[ 0] & ~reg_be))) |
+               (addr_hit[ 1] & (|(FLASH_CTRL_PRIM_PERMIT[ 1] & ~reg_be))) |
+               (addr_hit[ 2] & (|(FLASH_CTRL_PRIM_PERMIT[ 2] & ~reg_be))) |
+               (addr_hit[ 3] & (|(FLASH_CTRL_PRIM_PERMIT[ 3] & ~reg_be))) |
+               (addr_hit[ 4] & (|(FLASH_CTRL_PRIM_PERMIT[ 4] & ~reg_be))) |
+               (addr_hit[ 5] & (|(FLASH_CTRL_PRIM_PERMIT[ 5] & ~reg_be))) |
+               (addr_hit[ 6] & (|(FLASH_CTRL_PRIM_PERMIT[ 6] & ~reg_be))) |
+               (addr_hit[ 7] & (|(FLASH_CTRL_PRIM_PERMIT[ 7] & ~reg_be))) |
+               (addr_hit[ 8] & (|(FLASH_CTRL_PRIM_PERMIT[ 8] & ~reg_be))) |
+               (addr_hit[ 9] & (|(FLASH_CTRL_PRIM_PERMIT[ 9] & ~reg_be))) |
+               (addr_hit[10] & (|(FLASH_CTRL_PRIM_PERMIT[10] & ~reg_be))) |
+               (addr_hit[11] & (|(FLASH_CTRL_PRIM_PERMIT[11] & ~reg_be))) |
+               (addr_hit[12] & (|(FLASH_CTRL_PRIM_PERMIT[12] & ~reg_be))) |
+               (addr_hit[13] & (|(FLASH_CTRL_PRIM_PERMIT[13] & ~reg_be))) |
+               (addr_hit[14] & (|(FLASH_CTRL_PRIM_PERMIT[14] & ~reg_be))) |
+               (addr_hit[15] & (|(FLASH_CTRL_PRIM_PERMIT[15] & ~reg_be))) |
+               (addr_hit[16] & (|(FLASH_CTRL_PRIM_PERMIT[16] & ~reg_be))) |
+               (addr_hit[17] & (|(FLASH_CTRL_PRIM_PERMIT[17] & ~reg_be))) |
+               (addr_hit[18] & (|(FLASH_CTRL_PRIM_PERMIT[18] & ~reg_be))) |
+               (addr_hit[19] & (|(FLASH_CTRL_PRIM_PERMIT[19] & ~reg_be))) |
+               (addr_hit[20] & (|(FLASH_CTRL_PRIM_PERMIT[20] & ~reg_be)))));
+  end
+
+  // Generate write-enables
+  assign csr0_regwen_we = addr_hit[0] & reg_we & !reg_error;
+
+  assign csr0_regwen_wd = reg_wdata[0];
+  assign csr1_we = addr_hit[1] & reg_we & !reg_error;
+
+  assign csr1_field0_wd = reg_wdata[7:0];
+
+  assign csr1_field1_wd = reg_wdata[12:8];
+  assign csr2_we = addr_hit[2] & reg_we & !reg_error;
+
+  assign csr2_field0_wd = reg_wdata[0];
+
+  assign csr2_field1_wd = reg_wdata[1];
+
+  assign csr2_field2_wd = reg_wdata[2];
+
+  assign csr2_field3_wd = reg_wdata[3];
+
+  assign csr2_field4_wd = reg_wdata[4];
+
+  assign csr2_field5_wd = reg_wdata[5];
+
+  assign csr2_field6_wd = reg_wdata[6];
+
+  assign csr2_field7_wd = reg_wdata[7];
+  assign csr3_we = addr_hit[3] & reg_we & !reg_error;
+
+  assign csr3_field0_wd = reg_wdata[3:0];
+
+  assign csr3_field1_wd = reg_wdata[7:4];
+
+  assign csr3_field2_wd = reg_wdata[10:8];
+
+  assign csr3_field3_wd = reg_wdata[13:11];
+
+  assign csr3_field4_wd = reg_wdata[16:14];
+
+  assign csr3_field5_wd = reg_wdata[19:17];
+
+  assign csr3_field6_wd = reg_wdata[20];
+
+  assign csr3_field7_wd = reg_wdata[23:21];
+
+  assign csr3_field8_wd = reg_wdata[25:24];
+
+  assign csr3_field9_wd = reg_wdata[27:26];
+  assign csr4_we = addr_hit[4] & reg_we & !reg_error;
+
+  assign csr4_field0_wd = reg_wdata[2:0];
+
+  assign csr4_field1_wd = reg_wdata[5:3];
+
+  assign csr4_field2_wd = reg_wdata[8:6];
+
+  assign csr4_field3_wd = reg_wdata[11:9];
+  assign csr5_we = addr_hit[5] & reg_we & !reg_error;
+
+  assign csr5_field0_wd = reg_wdata[2:0];
+
+  assign csr5_field1_wd = reg_wdata[4:3];
+
+  assign csr5_field2_wd = reg_wdata[13:5];
+
+  assign csr5_field3_wd = reg_wdata[18:14];
+
+  assign csr5_field4_wd = reg_wdata[22:19];
+  assign csr6_we = addr_hit[6] & reg_we & !reg_error;
+
+  assign csr6_field0_wd = reg_wdata[2:0];
+
+  assign csr6_field1_wd = reg_wdata[5:3];
+
+  assign csr6_field2_wd = reg_wdata[13:6];
+
+  assign csr6_field3_wd = reg_wdata[16:14];
+
+  assign csr6_field4_wd = reg_wdata[18:17];
+
+  assign csr6_field5_wd = reg_wdata[20:19];
+
+  assign csr6_field6_wd = reg_wdata[22:21];
+
+  assign csr6_field7_wd = reg_wdata[23];
+
+  assign csr6_field8_wd = reg_wdata[24];
+  assign csr7_we = addr_hit[7] & reg_we & !reg_error;
+
+  assign csr7_field0_wd = reg_wdata[7:0];
+
+  assign csr7_field1_wd = reg_wdata[16:8];
+  assign csr8_we = addr_hit[8] & reg_we & !reg_error;
+
+  assign csr8_wd = reg_wdata[31:0];
+  assign csr9_we = addr_hit[9] & reg_we & !reg_error;
+
+  assign csr9_wd = reg_wdata[31:0];
+  assign csr10_we = addr_hit[10] & reg_we & !reg_error;
+
+  assign csr10_wd = reg_wdata[31:0];
+  assign csr11_we = addr_hit[11] & reg_we & !reg_error;
+
+  assign csr11_wd = reg_wdata[31:0];
+  assign csr12_we = addr_hit[12] & reg_we & !reg_error;
+
+  assign csr12_wd = reg_wdata[9:0];
+  assign csr13_we = addr_hit[13] & reg_we & !reg_error;
+
+  assign csr13_field0_wd = reg_wdata[19:0];
+
+  assign csr13_field1_wd = reg_wdata[20];
+  assign csr14_we = addr_hit[14] & reg_we & !reg_error;
+
+  assign csr14_field0_wd = reg_wdata[7:0];
+
+  assign csr14_field1_wd = reg_wdata[8];
+  assign csr15_we = addr_hit[15] & reg_we & !reg_error;
+
+  assign csr15_field0_wd = reg_wdata[7:0];
+
+  assign csr15_field1_wd = reg_wdata[8];
+  assign csr16_we = addr_hit[16] & reg_we & !reg_error;
+
+  assign csr16_field0_wd = reg_wdata[7:0];
+
+  assign csr16_field1_wd = reg_wdata[8];
+  assign csr17_we = addr_hit[17] & reg_we & !reg_error;
+
+  assign csr17_field0_wd = reg_wdata[7:0];
+
+  assign csr17_field1_wd = reg_wdata[8];
+  assign csr18_we = addr_hit[18] & reg_we & !reg_error;
+
+  assign csr18_wd = reg_wdata[0];
+  assign csr19_we = addr_hit[19] & reg_we & !reg_error;
+
+  assign csr19_wd = reg_wdata[0];
+  assign csr20_we = addr_hit[20] & reg_we & !reg_error;
+
+  assign csr20_field0_wd = reg_wdata[0];
+
+  assign csr20_field1_wd = reg_wdata[1];
+
+  assign csr20_field2_wd = reg_wdata[2];
+
+  // Assign write-enables to checker logic vector.
+  always_comb begin
+    reg_we_check = '0;
+    reg_we_check[0] = csr0_regwen_we;
+    reg_we_check[1] = csr1_gated_we;
+    reg_we_check[2] = csr2_we;
+    reg_we_check[3] = csr3_gated_we;
+    reg_we_check[4] = csr4_gated_we;
+    reg_we_check[5] = csr5_gated_we;
+    reg_we_check[6] = csr6_gated_we;
+    reg_we_check[7] = csr7_gated_we;
+    reg_we_check[8] = csr8_gated_we;
+    reg_we_check[9] = csr9_gated_we;
+    reg_we_check[10] = csr10_gated_we;
+    reg_we_check[11] = csr11_gated_we;
+    reg_we_check[12] = csr12_gated_we;
+    reg_we_check[13] = csr13_gated_we;
+    reg_we_check[14] = csr14_gated_we;
+    reg_we_check[15] = csr15_gated_we;
+    reg_we_check[16] = csr16_gated_we;
+    reg_we_check[17] = csr17_gated_we;
+    reg_we_check[18] = csr18_gated_we;
+    reg_we_check[19] = csr19_gated_we;
+    reg_we_check[20] = csr20_we;
+  end
+
+  // Read data return
+  always_comb begin
+    reg_rdata_next = '0;
+    unique case (1'b1)
+      addr_hit[0]: begin
+        reg_rdata_next[0] = csr0_regwen_qs;
+      end
+
+      addr_hit[1]: begin
+        reg_rdata_next[7:0] = csr1_field0_qs;
+        reg_rdata_next[12:8] = csr1_field1_qs;
+      end
+
+      addr_hit[2]: begin
+        reg_rdata_next[0] = csr2_field0_qs;
+        reg_rdata_next[1] = csr2_field1_qs;
+        reg_rdata_next[2] = csr2_field2_qs;
+        reg_rdata_next[3] = csr2_field3_qs;
+        reg_rdata_next[4] = csr2_field4_qs;
+        reg_rdata_next[5] = csr2_field5_qs;
+        reg_rdata_next[6] = csr2_field6_qs;
+        reg_rdata_next[7] = csr2_field7_qs;
+      end
+
+      addr_hit[3]: begin
+        reg_rdata_next[3:0] = csr3_field0_qs;
+        reg_rdata_next[7:4] = csr3_field1_qs;
+        reg_rdata_next[10:8] = csr3_field2_qs;
+        reg_rdata_next[13:11] = csr3_field3_qs;
+        reg_rdata_next[16:14] = csr3_field4_qs;
+        reg_rdata_next[19:17] = csr3_field5_qs;
+        reg_rdata_next[20] = csr3_field6_qs;
+        reg_rdata_next[23:21] = csr3_field7_qs;
+        reg_rdata_next[25:24] = csr3_field8_qs;
+        reg_rdata_next[27:26] = csr3_field9_qs;
+      end
+
+      addr_hit[4]: begin
+        reg_rdata_next[2:0] = csr4_field0_qs;
+        reg_rdata_next[5:3] = csr4_field1_qs;
+        reg_rdata_next[8:6] = csr4_field2_qs;
+        reg_rdata_next[11:9] = csr4_field3_qs;
+      end
+
+      addr_hit[5]: begin
+        reg_rdata_next[2:0] = csr5_field0_qs;
+        reg_rdata_next[4:3] = csr5_field1_qs;
+        reg_rdata_next[13:5] = csr5_field2_qs;
+        reg_rdata_next[18:14] = csr5_field3_qs;
+        reg_rdata_next[22:19] = csr5_field4_qs;
+      end
+
+      addr_hit[6]: begin
+        reg_rdata_next[2:0] = csr6_field0_qs;
+        reg_rdata_next[5:3] = csr6_field1_qs;
+        reg_rdata_next[13:6] = csr6_field2_qs;
+        reg_rdata_next[16:14] = csr6_field3_qs;
+        reg_rdata_next[18:17] = csr6_field4_qs;
+        reg_rdata_next[20:19] = csr6_field5_qs;
+        reg_rdata_next[22:21] = csr6_field6_qs;
+        reg_rdata_next[23] = csr6_field7_qs;
+        reg_rdata_next[24] = csr6_field8_qs;
+      end
+
+      addr_hit[7]: begin
+        reg_rdata_next[7:0] = csr7_field0_qs;
+        reg_rdata_next[16:8] = csr7_field1_qs;
+      end
+
+      addr_hit[8]: begin
+        reg_rdata_next[31:0] = csr8_qs;
+      end
+
+      addr_hit[9]: begin
+        reg_rdata_next[31:0] = csr9_qs;
+      end
+
+      addr_hit[10]: begin
+        reg_rdata_next[31:0] = csr10_qs;
+      end
+
+      addr_hit[11]: begin
+        reg_rdata_next[31:0] = csr11_qs;
+      end
+
+      addr_hit[12]: begin
+        reg_rdata_next[9:0] = csr12_qs;
+      end
+
+      addr_hit[13]: begin
+        reg_rdata_next[19:0] = csr13_field0_qs;
+        reg_rdata_next[20] = csr13_field1_qs;
+      end
+
+      addr_hit[14]: begin
+        reg_rdata_next[7:0] = csr14_field0_qs;
+        reg_rdata_next[8] = csr14_field1_qs;
+      end
+
+      addr_hit[15]: begin
+        reg_rdata_next[7:0] = csr15_field0_qs;
+        reg_rdata_next[8] = csr15_field1_qs;
+      end
+
+      addr_hit[16]: begin
+        reg_rdata_next[7:0] = csr16_field0_qs;
+        reg_rdata_next[8] = csr16_field1_qs;
+      end
+
+      addr_hit[17]: begin
+        reg_rdata_next[7:0] = csr17_field0_qs;
+        reg_rdata_next[8] = csr17_field1_qs;
+      end
+
+      addr_hit[18]: begin
+        reg_rdata_next[0] = csr18_qs;
+      end
+
+      addr_hit[19]: begin
+        reg_rdata_next[0] = csr19_qs;
+      end
+
+      addr_hit[20]: begin
+        reg_rdata_next[0] = csr20_field0_qs;
+        reg_rdata_next[1] = csr20_field1_qs;
+        reg_rdata_next[2] = csr20_field2_qs;
+      end
+
+      default: begin
+        reg_rdata_next = '1;
+      end
+    endcase
+  end
+
+  // shadow busy
+  logic shadow_busy;
+  assign shadow_busy = 1'b0;
+
+  // register busy
+  assign reg_busy = shadow_busy;
+
   // Unused signal tieoff
-  // devmode_i is not used if there are no registers
-  logic unused_devmode;
-  assign unused_devmode = ^devmode_i;
+
+  // wdata / byte enable are not always fully used
+  // add a blanket unused statement to handle lint waivers
+  logic unused_wdata;
+  logic unused_be;
+  assign unused_wdata = ^reg_wdata;
+  assign unused_be = ^reg_be;
+
+  // Assertions for Register Interface
+  `ASSERT_PULSE(wePulse, reg_we, clk_i, !rst_ni)
+  `ASSERT_PULSE(rePulse, reg_re, clk_i, !rst_ni)
+
+  `ASSERT(reAfterRv, $rose(reg_re || reg_we) |=> tl_o_pre.d_valid, clk_i, !rst_ni)
+
+  `ASSERT(en2addrHit, (reg_we || reg_re) |-> $onehot0(addr_hit), clk_i, !rst_ni)
+
+  // this is formulated as an assumption such that the FPV testbenches do disprove this
+  // property by mistake
+  //`ASSUME(reqParity, tl_reg_h2d.a_valid |-> tl_reg_h2d.a_user.chk_en == tlul_pkg::CheckDis)
+
 endmodule
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
index 40c05c9..26c8ab2 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
@@ -28,7 +28,7 @@
 
   // Address widths within the block
   parameter int CoreAw = 9;
-  parameter int PrimAw = 1;
+  parameter int PrimAw = 7;
   parameter int MemAw = 1;
 
   ///////////////////////////////////////////////
@@ -1128,4 +1128,387 @@
     4'b 0011  // index[106] FLASH_CTRL_CURR_FIFO_LVL
   };
 
+  ///////////////////////////////////////////////
+  // Typedefs for registers for prim interface //
+  ///////////////////////////////////////////////
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic [4:0]  q;
+    } field1;
+  } flash_ctrl_reg2hw_csr1_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+    struct packed {
+      logic        q;
+    } field2;
+    struct packed {
+      logic        q;
+    } field3;
+    struct packed {
+      logic        q;
+    } field4;
+    struct packed {
+      logic        q;
+    } field5;
+    struct packed {
+      logic        q;
+    } field6;
+    struct packed {
+      logic        q;
+    } field7;
+  } flash_ctrl_reg2hw_csr2_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [3:0]  q;
+    } field0;
+    struct packed {
+      logic [3:0]  q;
+    } field1;
+    struct packed {
+      logic [2:0]  q;
+    } field2;
+    struct packed {
+      logic [2:0]  q;
+    } field3;
+    struct packed {
+      logic [2:0]  q;
+    } field4;
+    struct packed {
+      logic [2:0]  q;
+    } field5;
+    struct packed {
+      logic        q;
+    } field6;
+    struct packed {
+      logic [2:0]  q;
+    } field7;
+    struct packed {
+      logic [1:0]  q;
+    } field8;
+    struct packed {
+      logic [1:0]  q;
+    } field9;
+  } flash_ctrl_reg2hw_csr3_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [2:0]  q;
+    } field0;
+    struct packed {
+      logic [2:0]  q;
+    } field1;
+    struct packed {
+      logic [2:0]  q;
+    } field2;
+    struct packed {
+      logic [2:0]  q;
+    } field3;
+  } flash_ctrl_reg2hw_csr4_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [2:0]  q;
+    } field0;
+    struct packed {
+      logic [1:0]  q;
+    } field1;
+    struct packed {
+      logic [8:0]  q;
+    } field2;
+    struct packed {
+      logic [4:0]  q;
+    } field3;
+    struct packed {
+      logic [3:0]  q;
+    } field4;
+  } flash_ctrl_reg2hw_csr5_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [2:0]  q;
+    } field0;
+    struct packed {
+      logic [2:0]  q;
+    } field1;
+    struct packed {
+      logic [7:0]  q;
+    } field2;
+    struct packed {
+      logic [2:0]  q;
+    } field3;
+    struct packed {
+      logic [1:0]  q;
+    } field4;
+    struct packed {
+      logic [1:0]  q;
+    } field5;
+    struct packed {
+      logic [1:0]  q;
+    } field6;
+    struct packed {
+      logic        q;
+    } field7;
+    struct packed {
+      logic        q;
+    } field8;
+  } flash_ctrl_reg2hw_csr6_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic [8:0]  q;
+    } field1;
+  } flash_ctrl_reg2hw_csr7_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr8_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr9_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr10_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr11_reg_t;
+
+  typedef struct packed {
+    logic [9:0] q;
+  } flash_ctrl_reg2hw_csr12_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [19:0] q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr13_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr14_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr15_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr16_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr17_reg_t;
+
+  typedef struct packed {
+    logic        q;
+  } flash_ctrl_reg2hw_csr18_reg_t;
+
+  typedef struct packed {
+    logic        q;
+  } flash_ctrl_reg2hw_csr19_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+    struct packed {
+      logic        q;
+    } field2;
+  } flash_ctrl_reg2hw_csr20_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        d;
+      logic        de;
+    } field0;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field1;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field2;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field3;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field4;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field5;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field6;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field7;
+  } flash_ctrl_hw2reg_csr2_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        d;
+      logic        de;
+    } field0;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field1;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field2;
+  } flash_ctrl_hw2reg_csr20_reg_t;
+
+  // Register -> HW type for prim interface
+  typedef struct packed {
+    flash_ctrl_reg2hw_csr1_reg_t csr1; // [325:313]
+    flash_ctrl_reg2hw_csr2_reg_t csr2; // [312:305]
+    flash_ctrl_reg2hw_csr3_reg_t csr3; // [304:277]
+    flash_ctrl_reg2hw_csr4_reg_t csr4; // [276:265]
+    flash_ctrl_reg2hw_csr5_reg_t csr5; // [264:242]
+    flash_ctrl_reg2hw_csr6_reg_t csr6; // [241:217]
+    flash_ctrl_reg2hw_csr7_reg_t csr7; // [216:200]
+    flash_ctrl_reg2hw_csr8_reg_t csr8; // [199:168]
+    flash_ctrl_reg2hw_csr9_reg_t csr9; // [167:136]
+    flash_ctrl_reg2hw_csr10_reg_t csr10; // [135:104]
+    flash_ctrl_reg2hw_csr11_reg_t csr11; // [103:72]
+    flash_ctrl_reg2hw_csr12_reg_t csr12; // [71:62]
+    flash_ctrl_reg2hw_csr13_reg_t csr13; // [61:41]
+    flash_ctrl_reg2hw_csr14_reg_t csr14; // [40:32]
+    flash_ctrl_reg2hw_csr15_reg_t csr15; // [31:23]
+    flash_ctrl_reg2hw_csr16_reg_t csr16; // [22:14]
+    flash_ctrl_reg2hw_csr17_reg_t csr17; // [13:5]
+    flash_ctrl_reg2hw_csr18_reg_t csr18; // [4:4]
+    flash_ctrl_reg2hw_csr19_reg_t csr19; // [3:3]
+    flash_ctrl_reg2hw_csr20_reg_t csr20; // [2:0]
+  } flash_ctrl_prim_reg2hw_t;
+
+  // HW -> register type for prim interface
+  typedef struct packed {
+    flash_ctrl_hw2reg_csr2_reg_t csr2; // [21:6]
+    flash_ctrl_hw2reg_csr20_reg_t csr20; // [5:0]
+  } flash_ctrl_prim_hw2reg_t;
+
+  // Register offsets for prim interface
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR0_REGWEN_OFFSET = 7'h 0;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR1_OFFSET = 7'h 4;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR2_OFFSET = 7'h 8;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR3_OFFSET = 7'h c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR4_OFFSET = 7'h 10;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR5_OFFSET = 7'h 14;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR6_OFFSET = 7'h 18;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR7_OFFSET = 7'h 1c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR8_OFFSET = 7'h 20;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR9_OFFSET = 7'h 24;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR10_OFFSET = 7'h 28;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR11_OFFSET = 7'h 2c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR12_OFFSET = 7'h 30;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR13_OFFSET = 7'h 34;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR14_OFFSET = 7'h 38;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR15_OFFSET = 7'h 3c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR16_OFFSET = 7'h 40;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR17_OFFSET = 7'h 44;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR18_OFFSET = 7'h 48;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR19_OFFSET = 7'h 4c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR20_OFFSET = 7'h 50;
+
+  // Register index for prim interface
+  typedef enum int {
+    FLASH_CTRL_CSR0_REGWEN,
+    FLASH_CTRL_CSR1,
+    FLASH_CTRL_CSR2,
+    FLASH_CTRL_CSR3,
+    FLASH_CTRL_CSR4,
+    FLASH_CTRL_CSR5,
+    FLASH_CTRL_CSR6,
+    FLASH_CTRL_CSR7,
+    FLASH_CTRL_CSR8,
+    FLASH_CTRL_CSR9,
+    FLASH_CTRL_CSR10,
+    FLASH_CTRL_CSR11,
+    FLASH_CTRL_CSR12,
+    FLASH_CTRL_CSR13,
+    FLASH_CTRL_CSR14,
+    FLASH_CTRL_CSR15,
+    FLASH_CTRL_CSR16,
+    FLASH_CTRL_CSR17,
+    FLASH_CTRL_CSR18,
+    FLASH_CTRL_CSR19,
+    FLASH_CTRL_CSR20
+  } flash_ctrl_prim_id_e;
+
+  // Register width information to check illegal writes for prim interface
+  parameter logic [3:0] FLASH_CTRL_PRIM_PERMIT [21] = '{
+    4'b 0001, // index[ 0] FLASH_CTRL_CSR0_REGWEN
+    4'b 0011, // index[ 1] FLASH_CTRL_CSR1
+    4'b 0001, // index[ 2] FLASH_CTRL_CSR2
+    4'b 1111, // index[ 3] FLASH_CTRL_CSR3
+    4'b 0011, // index[ 4] FLASH_CTRL_CSR4
+    4'b 0111, // index[ 5] FLASH_CTRL_CSR5
+    4'b 1111, // index[ 6] FLASH_CTRL_CSR6
+    4'b 0111, // index[ 7] FLASH_CTRL_CSR7
+    4'b 1111, // index[ 8] FLASH_CTRL_CSR8
+    4'b 1111, // index[ 9] FLASH_CTRL_CSR9
+    4'b 1111, // index[10] FLASH_CTRL_CSR10
+    4'b 1111, // index[11] FLASH_CTRL_CSR11
+    4'b 0011, // index[12] FLASH_CTRL_CSR12
+    4'b 0111, // index[13] FLASH_CTRL_CSR13
+    4'b 0011, // index[14] FLASH_CTRL_CSR14
+    4'b 0011, // index[15] FLASH_CTRL_CSR15
+    4'b 0011, // index[16] FLASH_CTRL_CSR16
+    4'b 0011, // index[17] FLASH_CTRL_CSR17
+    4'b 0001, // index[18] FLASH_CTRL_CSR18
+    4'b 0001, // index[19] FLASH_CTRL_CSR19
+    4'b 0001  // index[20] FLASH_CTRL_CSR20
+  };
+
 endpackage
diff --git a/hw/ip/prim_generic/prim_generic_flash.core b/hw/ip/prim_generic/prim_generic_flash.core
index 7cf5c30..29afdf8f 100644
--- a/hw/ip/prim_generic/prim_generic_flash.core
+++ b/hw/ip/prim_generic/prim_generic_flash.core
@@ -13,6 +13,7 @@
       - "fileset_partner  ? (partner:systems:ast_pkg)"
       - "!fileset_partner ? (lowrisc:systems:ast_pkg)"
       - lowrisc:ip:flash_ctrl_pkg
+      - lowrisc:ip:flash_ctrl_prim_reg_top
     files:
       - rtl/prim_generic_flash_bank.sv
       - rtl/prim_generic_flash.sv
diff --git a/hw/ip/prim_generic/rtl/prim_generic_flash.sv b/hw/ip/prim_generic/rtl/prim_generic_flash.sv
index c120927..a3cd6af 100644
--- a/hw/ip/prim_generic/rtl/prim_generic_flash.sv
+++ b/hw/ip/prim_generic/rtl/prim_generic_flash.sv
@@ -119,61 +119,26 @@
   assign unused_tms = tms_i;
   assign tdo_o = '0;
 
-  // fake memory used to emulate configuration
-  logic cfg_req;
-  logic cfg_we;
-  logic [CfgAddrWidth-1:0] cfg_addr;
-  logic [31:0] cfg_wdata;
-  logic cfg_rvalid;
-  logic [31:0] cfg_rdata;
+  ////////////////////////////////////
+  // TL-UL Test Interface Emulation //
+  ////////////////////////////////////
 
-  always_ff @(posedge clk_i or negedge rst_ni) begin
-    if (!rst_ni) begin
-      cfg_rvalid <= 1'b0;
-    end else begin
-      cfg_rvalid <= cfg_req & !cfg_we;
-    end
-  end
-
-  tlul_adapter_sram #(
-    .SramAw(CfgAddrWidth),
-    .SramDw(32),
-    .Outstanding(2),
-    .ErrOnWrite(0),
-    .EnableRspIntgGen(1),
-    .EnableDataIntgGen(1)
-  ) u_cfg (
+  flash_ctrl_reg_pkg::flash_ctrl_prim_reg2hw_t reg2hw;
+  flash_ctrl_reg_pkg::flash_ctrl_prim_hw2reg_t hw2reg;
+  flash_ctrl_prim_reg_top u_reg_top (
     .clk_i,
     .rst_ni,
-    .tl_i,
-    .tl_o,
-    .en_ifetch_i(prim_mubi_pkg::MuBi4False),
-    .req_o(cfg_req),
-    .req_type_o(),
-    .gnt_i(1'b1),
-    .we_o(cfg_we),
-    .addr_o(cfg_addr),
-    .wdata_o(cfg_wdata),
-    .wmask_o(),
-    .intg_error_o(),
-    .rdata_i(cfg_rdata),
-    .rvalid_i(cfg_rvalid),
-    .rerror_i('0)
+    .tl_i      (tl_i),
+    .tl_o      (tl_o),
+    .reg2hw    (reg2hw),
+    .hw2reg    (hw2reg),
+    .intg_err_o(), // TODO: do we need to wire this up?
+    .devmode_i (1'b1)
   );
 
-  prim_ram_1p #(
-    .Width(32),
-    .Depth(CfgRegs)
-  ) u_cfg_ram (
-    .clk_i,
-    .req_i(cfg_req),
-    .write_i(cfg_we),
-    .addr_i(cfg_addr),
-    .wdata_i(cfg_wdata),
-    .wmask_i({32{1'b1}}),
-    .rdata_o(cfg_rdata),
-    .cfg_i('0)
-  );
+  logic unused_reg_sig;
+  assign unused_reg_sig = ^reg2hw;
+  assign hw2reg = '0;
 
   logic unused_bist_enable;
   assign unused_bist_enable = ^bist_enable_i;
diff --git a/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson b/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
index e9dfe76..a218068 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
+++ b/hw/top_earlgrey/ip/flash_ctrl/data/autogen/flash_ctrl.hjson
@@ -10,14 +10,14 @@
 
 
 
-{ name: "FLASH_CTRL",
+{ name: "flash_ctrl",
   clocking: [
     {clock: "clk_i", reset: "rst_ni", primary: true},
     {clock: "clk_otp_i", reset: "rst_otp_ni"}
   ]
   bus_interfaces: [
     { protocol: "tlul", direction: "device", name: "core" }
-    { protocol: "tlul", direction: "device", name: "prim" }
+    { protocol: "tlul", direction: "device", name: "prim" , hier_path: "u_eflash.u_flash.gen_generic.u_impl_generic.u_reg_top"}
     { protocol: "tlul", direction: "device", name: "mem" }
   ],
   available_input_list: [
@@ -2164,7 +2164,867 @@
       },
     ],
 
-    prim: []
+    prim: [
+      {
+        name: "CSR0_REGWEN",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw0c",
+            hwaccess: "none",
+            resval: "1",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      },
+      {
+        name: "CSR1",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "12:8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR2",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "1",
+            name: "field1",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "2",
+            name: "field2",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "3",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "4",
+            name: "field4",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5",
+            name: "field5",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "6",
+            name: "field6",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "7",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      },
+      {
+        name: "CSR3",
+        desc: "",
+        fields: [
+          {
+            bits: "3:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "7:4",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "10:8",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:11",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:14",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "19:17",
+            name: "field5",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20",
+            name: "field6",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "23:21",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "25:24",
+            name: "field8",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "27:26",
+            name: "field9",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR4",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8:6",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "11:9",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR5",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "4:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:5",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "18:14",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "22:19",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR6",
+        desc: "",
+        fields: [
+          {
+            bits: "2:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "5:3",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "13:6",
+            name: "field2",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:14",
+            name: "field3",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "18:17",
+            name: "field4",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20:19",
+            name: "field5",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "22:21",
+            name: "field6",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "23",
+            name: "field7",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "24",
+            name: "field8",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR7",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "16:8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR8",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR9",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR10",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR11",
+        desc: "",
+        fields: [
+          {
+            bits: "31:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR12",
+        desc: "",
+        fields: [
+          {
+            bits: "9:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR13",
+        desc: "",
+        fields: [
+          {
+            bits: "19:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "20",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR14",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR15",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR16",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR17",
+        desc: "",
+        fields: [
+          {
+            bits: "7:0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "8",
+            name: "field1",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR18",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR19",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw",
+            hwaccess: "hro",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False",
+        regwen: "CSR0_REGWEN"
+      },
+      {
+        name: "CSR20",
+        desc: "",
+        fields: [
+          {
+            bits: "0",
+            name: "field0",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "1",
+            name: "field1",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          },
+          {
+            bits: "2",
+            name: "field2",
+            swaccess: "rw1c",
+            hwaccess: "hrw",
+            resval: "0",
+            tags: [],
+            desc: "",
+            enum: []
+          }
+        ],
+        hwext: "False",
+        hwqe: "False",
+        hwre: "False",
+        tags: [],
+        shadowed: "False"
+      }
+    ],
     mem: []
   }
 }
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
index 6e3d3ab..56e0d7e 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl.sv
@@ -1436,4 +1436,13 @@
 
   // Alert assertions for reg_we onehot check
   `ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(RegWeOnehotCheck_A, u_reg_core, alert_tx_o[1])
+
+  `ifndef PRIM_DEFAULT_IMPL
+    `define PRIM_DEFAULT_IMPL prim_pkg::ImplGeneric
+  `endif
+  if (`PRIM_DEFAULT_IMPL == prim_pkg::ImplGeneric) begin : gen_reg_we_assert_generic
+    `ASSERT_PRIM_REG_WE_ONEHOT_ERROR_TRIGGER_ALERT(PrimRegWeOnehotCheck_A,
+        u_eflash.u_flash.gen_generic.u_impl_generic.u_reg_top, alert_tx_o[1])
+  end
+
 endmodule
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_prim_reg_top.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_prim_reg_top.sv
index 73d1a43..c0d0ae2 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_prim_reg_top.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_prim_reg_top.sv
@@ -12,6 +12,8 @@
   input  tlul_pkg::tl_h2d_t tl_i,
   output tlul_pkg::tl_d2h_t tl_o,
   // To HW
+  output flash_ctrl_reg_pkg::flash_ctrl_prim_reg2hw_t reg2hw, // Write
+  input  flash_ctrl_reg_pkg::flash_ctrl_prim_hw2reg_t hw2reg, // Read
 
   // Integrity check errors
   output logic intg_err_o,
@@ -22,11 +24,60 @@
 
   import flash_ctrl_reg_pkg::* ;
 
+  localparam int AW = 7;
+  localparam int DW = 32;
+  localparam int DBW = DW/8;                    // Byte Width
+
+  // register signals
+  logic           reg_we;
+  logic           reg_re;
+  logic [AW-1:0]  reg_addr;
+  logic [DW-1:0]  reg_wdata;
+  logic [DBW-1:0] reg_be;
+  logic [DW-1:0]  reg_rdata;
+  logic           reg_error;
+
+  logic          addrmiss, wr_err;
+
+  logic [DW-1:0] reg_rdata_next;
+  logic reg_busy;
+
+  tlul_pkg::tl_h2d_t tl_reg_h2d;
+  tlul_pkg::tl_d2h_t tl_reg_d2h;
 
 
-  // Since there are no registers in this block, commands are routed through to windows which
-  // can report their own integrity errors.
-  assign intg_err_o = 1'b0;
+  // incoming payload check
+  logic intg_err;
+  tlul_cmd_intg_chk u_chk (
+    .tl_i(tl_i),
+    .err_o(intg_err)
+  );
+
+  // also check for spurious write enables
+  logic reg_we_err;
+  logic [20:0] reg_we_check;
+  prim_reg_we_check #(
+    .OneHotWidth(21)
+  ) u_prim_reg_we_check (
+    .clk_i(clk_i),
+    .rst_ni(rst_ni),
+    .oh_i  (reg_we_check),
+    .en_i  (reg_we && !addrmiss),
+    .err_o (reg_we_err)
+  );
+
+  logic err_q;
+  always_ff @(posedge clk_i or negedge rst_ni) begin
+    if (!rst_ni) begin
+      err_q <= '0;
+    end else if (intg_err || reg_we_err) begin
+      err_q <= 1'b1;
+    end
+  end
+
+  // integrity error output is permanent and should be used for alert generation
+  // register errors are transactional
+  assign intg_err_o = err_q | intg_err | reg_we_err;
 
   // outgoing integrity generation
   tlul_pkg::tl_d2h_t tl_o_pre;
@@ -41,8 +92,2240 @@
   assign tl_reg_h2d = tl_i;
   assign tl_o_pre   = tl_reg_d2h;
 
+  tlul_adapter_reg #(
+    .RegAw(AW),
+    .RegDw(DW),
+    .EnableDataIntgGen(0)
+  ) u_reg_if (
+    .clk_i  (clk_i),
+    .rst_ni (rst_ni),
+
+    .tl_i (tl_reg_h2d),
+    .tl_o (tl_reg_d2h),
+
+    .we_o    (reg_we),
+    .re_o    (reg_re),
+    .addr_o  (reg_addr),
+    .wdata_o (reg_wdata),
+    .be_o    (reg_be),
+    .busy_i  (reg_busy),
+    .rdata_i (reg_rdata),
+    .error_i (reg_error)
+  );
+
+  // cdc oversampling signals
+
+  assign reg_rdata = reg_rdata_next ;
+  assign reg_error = (devmode_i & addrmiss) | wr_err | intg_err;
+
+  // Define SW related signals
+  // Format: <reg>_<field>_{wd|we|qs}
+  //        or <reg>_{wd|we|qs} if field == 1 or 0
+  logic csr0_regwen_we;
+  logic csr0_regwen_qs;
+  logic csr0_regwen_wd;
+  logic csr1_we;
+  logic [7:0] csr1_field0_qs;
+  logic [7:0] csr1_field0_wd;
+  logic [4:0] csr1_field1_qs;
+  logic [4:0] csr1_field1_wd;
+  logic csr2_we;
+  logic csr2_field0_qs;
+  logic csr2_field0_wd;
+  logic csr2_field1_qs;
+  logic csr2_field1_wd;
+  logic csr2_field2_qs;
+  logic csr2_field2_wd;
+  logic csr2_field3_qs;
+  logic csr2_field3_wd;
+  logic csr2_field4_qs;
+  logic csr2_field4_wd;
+  logic csr2_field5_qs;
+  logic csr2_field5_wd;
+  logic csr2_field6_qs;
+  logic csr2_field6_wd;
+  logic csr2_field7_qs;
+  logic csr2_field7_wd;
+  logic csr3_we;
+  logic [3:0] csr3_field0_qs;
+  logic [3:0] csr3_field0_wd;
+  logic [3:0] csr3_field1_qs;
+  logic [3:0] csr3_field1_wd;
+  logic [2:0] csr3_field2_qs;
+  logic [2:0] csr3_field2_wd;
+  logic [2:0] csr3_field3_qs;
+  logic [2:0] csr3_field3_wd;
+  logic [2:0] csr3_field4_qs;
+  logic [2:0] csr3_field4_wd;
+  logic [2:0] csr3_field5_qs;
+  logic [2:0] csr3_field5_wd;
+  logic csr3_field6_qs;
+  logic csr3_field6_wd;
+  logic [2:0] csr3_field7_qs;
+  logic [2:0] csr3_field7_wd;
+  logic [1:0] csr3_field8_qs;
+  logic [1:0] csr3_field8_wd;
+  logic [1:0] csr3_field9_qs;
+  logic [1:0] csr3_field9_wd;
+  logic csr4_we;
+  logic [2:0] csr4_field0_qs;
+  logic [2:0] csr4_field0_wd;
+  logic [2:0] csr4_field1_qs;
+  logic [2:0] csr4_field1_wd;
+  logic [2:0] csr4_field2_qs;
+  logic [2:0] csr4_field2_wd;
+  logic [2:0] csr4_field3_qs;
+  logic [2:0] csr4_field3_wd;
+  logic csr5_we;
+  logic [2:0] csr5_field0_qs;
+  logic [2:0] csr5_field0_wd;
+  logic [1:0] csr5_field1_qs;
+  logic [1:0] csr5_field1_wd;
+  logic [8:0] csr5_field2_qs;
+  logic [8:0] csr5_field2_wd;
+  logic [4:0] csr5_field3_qs;
+  logic [4:0] csr5_field3_wd;
+  logic [3:0] csr5_field4_qs;
+  logic [3:0] csr5_field4_wd;
+  logic csr6_we;
+  logic [2:0] csr6_field0_qs;
+  logic [2:0] csr6_field0_wd;
+  logic [2:0] csr6_field1_qs;
+  logic [2:0] csr6_field1_wd;
+  logic [7:0] csr6_field2_qs;
+  logic [7:0] csr6_field2_wd;
+  logic [2:0] csr6_field3_qs;
+  logic [2:0] csr6_field3_wd;
+  logic [1:0] csr6_field4_qs;
+  logic [1:0] csr6_field4_wd;
+  logic [1:0] csr6_field5_qs;
+  logic [1:0] csr6_field5_wd;
+  logic [1:0] csr6_field6_qs;
+  logic [1:0] csr6_field6_wd;
+  logic csr6_field7_qs;
+  logic csr6_field7_wd;
+  logic csr6_field8_qs;
+  logic csr6_field8_wd;
+  logic csr7_we;
+  logic [7:0] csr7_field0_qs;
+  logic [7:0] csr7_field0_wd;
+  logic [8:0] csr7_field1_qs;
+  logic [8:0] csr7_field1_wd;
+  logic csr8_we;
+  logic [31:0] csr8_qs;
+  logic [31:0] csr8_wd;
+  logic csr9_we;
+  logic [31:0] csr9_qs;
+  logic [31:0] csr9_wd;
+  logic csr10_we;
+  logic [31:0] csr10_qs;
+  logic [31:0] csr10_wd;
+  logic csr11_we;
+  logic [31:0] csr11_qs;
+  logic [31:0] csr11_wd;
+  logic csr12_we;
+  logic [9:0] csr12_qs;
+  logic [9:0] csr12_wd;
+  logic csr13_we;
+  logic [19:0] csr13_field0_qs;
+  logic [19:0] csr13_field0_wd;
+  logic csr13_field1_qs;
+  logic csr13_field1_wd;
+  logic csr14_we;
+  logic [7:0] csr14_field0_qs;
+  logic [7:0] csr14_field0_wd;
+  logic csr14_field1_qs;
+  logic csr14_field1_wd;
+  logic csr15_we;
+  logic [7:0] csr15_field0_qs;
+  logic [7:0] csr15_field0_wd;
+  logic csr15_field1_qs;
+  logic csr15_field1_wd;
+  logic csr16_we;
+  logic [7:0] csr16_field0_qs;
+  logic [7:0] csr16_field0_wd;
+  logic csr16_field1_qs;
+  logic csr16_field1_wd;
+  logic csr17_we;
+  logic [7:0] csr17_field0_qs;
+  logic [7:0] csr17_field0_wd;
+  logic csr17_field1_qs;
+  logic csr17_field1_wd;
+  logic csr18_we;
+  logic csr18_qs;
+  logic csr18_wd;
+  logic csr19_we;
+  logic csr19_qs;
+  logic csr19_wd;
+  logic csr20_we;
+  logic csr20_field0_qs;
+  logic csr20_field0_wd;
+  logic csr20_field1_qs;
+  logic csr20_field1_wd;
+  logic csr20_field2_qs;
+  logic csr20_field2_wd;
+
+  // Register instances
+  // R[csr0_regwen]: V(False)
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW0C),
+    .RESVAL  (1'h1)
+  ) u_csr0_regwen (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr0_regwen_we),
+    .wd     (csr0_regwen_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr0_regwen_qs)
+  );
+
+
+  // R[csr1]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr1_gated_we;
+  assign csr1_gated_we = csr1_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr1_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr1_gated_we),
+    .wd     (csr1_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr1.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr1_field0_qs)
+  );
+
+  //   F[field1]: 12:8
+  prim_subreg #(
+    .DW      (5),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (5'h0)
+  ) u_csr1_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr1_gated_we),
+    .wd     (csr1_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr1.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr1_field1_qs)
+  );
+
+
+  // R[csr2]: V(False)
+  //   F[field0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field0_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field0.de),
+    .d      (hw2reg.csr2.field0.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field0_qs)
+  );
+
+  //   F[field1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field1_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field1.de),
+    .d      (hw2reg.csr2.field1.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field1_qs)
+  );
+
+  //   F[field2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field2_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field2.de),
+    .d      (hw2reg.csr2.field2.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field2_qs)
+  );
+
+  //   F[field3]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr2_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field3_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field3.de),
+    .d      (hw2reg.csr2.field3.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field3_qs)
+  );
+
+  //   F[field4]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field4_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field4.de),
+    .d      (hw2reg.csr2.field4.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field4_qs)
+  );
+
+  //   F[field5]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field5_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field5.de),
+    .d      (hw2reg.csr2.field5.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field5.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field5_qs)
+  );
+
+  //   F[field6]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr2_field6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field6_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field6.de),
+    .d      (hw2reg.csr2.field6.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field6.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field6_qs)
+  );
+
+  //   F[field7]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr2_field7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr2_we),
+    .wd     (csr2_field7_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr2.field7.de),
+    .d      (hw2reg.csr2.field7.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr2.field7.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr2_field7_qs)
+  );
+
+
+  // R[csr3]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr3_gated_we;
+  assign csr3_gated_we = csr3_we & csr0_regwen_qs;
+  //   F[field0]: 3:0
+  prim_subreg #(
+    .DW      (4),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (4'h0)
+  ) u_csr3_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field0_qs)
+  );
+
+  //   F[field1]: 7:4
+  prim_subreg #(
+    .DW      (4),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (4'h0)
+  ) u_csr3_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field1_qs)
+  );
+
+  //   F[field2]: 10:8
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field2_qs)
+  );
+
+  //   F[field3]: 13:11
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field3_qs)
+  );
+
+  //   F[field4]: 16:14
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field4_qs)
+  );
+
+  //   F[field5]: 19:17
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field5_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field5.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field5_qs)
+  );
+
+  //   F[field6]: 20:20
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr3_field6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field6_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field6.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field6_qs)
+  );
+
+  //   F[field7]: 23:21
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr3_field7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field7_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field7.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field7_qs)
+  );
+
+  //   F[field8]: 25:24
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr3_field8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field8.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field8_qs)
+  );
+
+  //   F[field9]: 27:26
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr3_field9 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr3_gated_we),
+    .wd     (csr3_field9_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr3.field9.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr3_field9_qs)
+  );
+
+
+  // R[csr4]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr4_gated_we;
+  assign csr4_gated_we = csr4_we & csr0_regwen_qs;
+  //   F[field0]: 2:0
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field0_qs)
+  );
+
+  //   F[field1]: 5:3
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field1_qs)
+  );
+
+  //   F[field2]: 8:6
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field2_qs)
+  );
+
+  //   F[field3]: 11:9
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr4_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr4_gated_we),
+    .wd     (csr4_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr4.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr4_field3_qs)
+  );
+
+
+  // R[csr5]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr5_gated_we;
+  assign csr5_gated_we = csr5_we & csr0_regwen_qs;
+  //   F[field0]: 2:0
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr5_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field0_qs)
+  );
+
+  //   F[field1]: 4:3
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr5_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field1_qs)
+  );
+
+  //   F[field2]: 13:5
+  prim_subreg #(
+    .DW      (9),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (9'h0)
+  ) u_csr5_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field2_qs)
+  );
+
+  //   F[field3]: 18:14
+  prim_subreg #(
+    .DW      (5),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (5'h0)
+  ) u_csr5_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field3_qs)
+  );
+
+  //   F[field4]: 22:19
+  prim_subreg #(
+    .DW      (4),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (4'h0)
+  ) u_csr5_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr5_gated_we),
+    .wd     (csr5_field4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr5.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr5_field4_qs)
+  );
+
+
+  // R[csr6]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr6_gated_we;
+  assign csr6_gated_we = csr6_we & csr0_regwen_qs;
+  //   F[field0]: 2:0
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr6_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field0_qs)
+  );
+
+  //   F[field1]: 5:3
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr6_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field1_qs)
+  );
+
+  //   F[field2]: 13:6
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr6_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field2_qs)
+  );
+
+  //   F[field3]: 16:14
+  prim_subreg #(
+    .DW      (3),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (3'h0)
+  ) u_csr6_field3 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field3.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field3_qs)
+  );
+
+  //   F[field4]: 18:17
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr6_field4 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field4.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field4_qs)
+  );
+
+  //   F[field5]: 20:19
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr6_field5 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field5_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field5.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field5_qs)
+  );
+
+  //   F[field6]: 22:21
+  prim_subreg #(
+    .DW      (2),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (2'h0)
+  ) u_csr6_field6 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field6_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field6.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field6_qs)
+  );
+
+  //   F[field7]: 23:23
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr6_field7 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field7_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field7.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field7_qs)
+  );
+
+  //   F[field8]: 24:24
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr6_field8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr6_gated_we),
+    .wd     (csr6_field8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr6.field8.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr6_field8_qs)
+  );
+
+
+  // R[csr7]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr7_gated_we;
+  assign csr7_gated_we = csr7_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr7_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr7_gated_we),
+    .wd     (csr7_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr7.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr7_field0_qs)
+  );
+
+  //   F[field1]: 16:8
+  prim_subreg #(
+    .DW      (9),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (9'h0)
+  ) u_csr7_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr7_gated_we),
+    .wd     (csr7_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr7.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr7_field1_qs)
+  );
+
+
+  // R[csr8]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr8_gated_we;
+  assign csr8_gated_we = csr8_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr8 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr8_gated_we),
+    .wd     (csr8_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr8.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr8_qs)
+  );
+
+
+  // R[csr9]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr9_gated_we;
+  assign csr9_gated_we = csr9_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr9 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr9_gated_we),
+    .wd     (csr9_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr9.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr9_qs)
+  );
+
+
+  // R[csr10]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr10_gated_we;
+  assign csr10_gated_we = csr10_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr10 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr10_gated_we),
+    .wd     (csr10_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr10.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr10_qs)
+  );
+
+
+  // R[csr11]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr11_gated_we;
+  assign csr11_gated_we = csr11_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (32),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (32'h0)
+  ) u_csr11 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr11_gated_we),
+    .wd     (csr11_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr11.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr11_qs)
+  );
+
+
+  // R[csr12]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr12_gated_we;
+  assign csr12_gated_we = csr12_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (10),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (10'h0)
+  ) u_csr12 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr12_gated_we),
+    .wd     (csr12_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr12.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr12_qs)
+  );
+
+
+  // R[csr13]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr13_gated_we;
+  assign csr13_gated_we = csr13_we & csr0_regwen_qs;
+  //   F[field0]: 19:0
+  prim_subreg #(
+    .DW      (20),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (20'h0)
+  ) u_csr13_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr13_gated_we),
+    .wd     (csr13_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr13.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr13_field0_qs)
+  );
+
+  //   F[field1]: 20:20
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr13_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr13_gated_we),
+    .wd     (csr13_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr13.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr13_field1_qs)
+  );
+
+
+  // R[csr14]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr14_gated_we;
+  assign csr14_gated_we = csr14_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr14_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr14_gated_we),
+    .wd     (csr14_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr14.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr14_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr14_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr14_gated_we),
+    .wd     (csr14_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr14.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr14_field1_qs)
+  );
+
+
+  // R[csr15]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr15_gated_we;
+  assign csr15_gated_we = csr15_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr15_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr15_gated_we),
+    .wd     (csr15_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr15.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr15_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr15_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr15_gated_we),
+    .wd     (csr15_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr15.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr15_field1_qs)
+  );
+
+
+  // R[csr16]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr16_gated_we;
+  assign csr16_gated_we = csr16_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr16_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr16_gated_we),
+    .wd     (csr16_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr16.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr16_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr16_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr16_gated_we),
+    .wd     (csr16_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr16.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr16_field1_qs)
+  );
+
+
+  // R[csr17]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr17_gated_we;
+  assign csr17_gated_we = csr17_we & csr0_regwen_qs;
+  //   F[field0]: 7:0
+  prim_subreg #(
+    .DW      (8),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (8'h0)
+  ) u_csr17_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr17_gated_we),
+    .wd     (csr17_field0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr17.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr17_field0_qs)
+  );
+
+  //   F[field1]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr17_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr17_gated_we),
+    .wd     (csr17_field1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr17.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr17_field1_qs)
+  );
+
+
+  // R[csr18]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr18_gated_we;
+  assign csr18_gated_we = csr18_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr18 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr18_gated_we),
+    .wd     (csr18_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr18.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr18_qs)
+  );
+
+
+  // R[csr19]: V(False)
+  // Create REGWEN-gated WE signal
+  logic csr19_gated_we;
+  assign csr19_gated_we = csr19_we & csr0_regwen_qs;
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessRW),
+    .RESVAL  (1'h0)
+  ) u_csr19 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr19_gated_we),
+    .wd     (csr19_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr19.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr19_qs)
+  );
+
+
+  // R[csr20]: V(False)
+  //   F[field0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr20_field0 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr20_we),
+    .wd     (csr20_field0_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr20.field0.de),
+    .d      (hw2reg.csr20.field0.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr20.field0.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr20_field0_qs)
+  );
+
+  //   F[field1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr20_field1 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr20_we),
+    .wd     (csr20_field1_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr20.field1.de),
+    .d      (hw2reg.csr20.field1.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr20.field1.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr20_field1_qs)
+  );
+
+  //   F[field2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SwAccess(prim_subreg_pkg::SwAccessW1C),
+    .RESVAL  (1'h0)
+  ) u_csr20_field2 (
+    .clk_i   (clk_i),
+    .rst_ni  (rst_ni),
+
+    // from register interface
+    .we     (csr20_we),
+    .wd     (csr20_field2_wd),
+
+    // from internal hardware
+    .de     (hw2reg.csr20.field2.de),
+    .d      (hw2reg.csr20.field2.d),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.csr20.field2.q),
+    .ds     (),
+
+    // to register interface (read)
+    .qs     (csr20_field2_qs)
+  );
+
+
+
+  logic [20:0] addr_hit;
+  always_comb begin
+    addr_hit = '0;
+    addr_hit[ 0] = (reg_addr == FLASH_CTRL_CSR0_REGWEN_OFFSET);
+    addr_hit[ 1] = (reg_addr == FLASH_CTRL_CSR1_OFFSET);
+    addr_hit[ 2] = (reg_addr == FLASH_CTRL_CSR2_OFFSET);
+    addr_hit[ 3] = (reg_addr == FLASH_CTRL_CSR3_OFFSET);
+    addr_hit[ 4] = (reg_addr == FLASH_CTRL_CSR4_OFFSET);
+    addr_hit[ 5] = (reg_addr == FLASH_CTRL_CSR5_OFFSET);
+    addr_hit[ 6] = (reg_addr == FLASH_CTRL_CSR6_OFFSET);
+    addr_hit[ 7] = (reg_addr == FLASH_CTRL_CSR7_OFFSET);
+    addr_hit[ 8] = (reg_addr == FLASH_CTRL_CSR8_OFFSET);
+    addr_hit[ 9] = (reg_addr == FLASH_CTRL_CSR9_OFFSET);
+    addr_hit[10] = (reg_addr == FLASH_CTRL_CSR10_OFFSET);
+    addr_hit[11] = (reg_addr == FLASH_CTRL_CSR11_OFFSET);
+    addr_hit[12] = (reg_addr == FLASH_CTRL_CSR12_OFFSET);
+    addr_hit[13] = (reg_addr == FLASH_CTRL_CSR13_OFFSET);
+    addr_hit[14] = (reg_addr == FLASH_CTRL_CSR14_OFFSET);
+    addr_hit[15] = (reg_addr == FLASH_CTRL_CSR15_OFFSET);
+    addr_hit[16] = (reg_addr == FLASH_CTRL_CSR16_OFFSET);
+    addr_hit[17] = (reg_addr == FLASH_CTRL_CSR17_OFFSET);
+    addr_hit[18] = (reg_addr == FLASH_CTRL_CSR18_OFFSET);
+    addr_hit[19] = (reg_addr == FLASH_CTRL_CSR19_OFFSET);
+    addr_hit[20] = (reg_addr == FLASH_CTRL_CSR20_OFFSET);
+  end
+
+  assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
+
+  // Check sub-word write is permitted
+  always_comb begin
+    wr_err = (reg_we &
+              ((addr_hit[ 0] & (|(FLASH_CTRL_PRIM_PERMIT[ 0] & ~reg_be))) |
+               (addr_hit[ 1] & (|(FLASH_CTRL_PRIM_PERMIT[ 1] & ~reg_be))) |
+               (addr_hit[ 2] & (|(FLASH_CTRL_PRIM_PERMIT[ 2] & ~reg_be))) |
+               (addr_hit[ 3] & (|(FLASH_CTRL_PRIM_PERMIT[ 3] & ~reg_be))) |
+               (addr_hit[ 4] & (|(FLASH_CTRL_PRIM_PERMIT[ 4] & ~reg_be))) |
+               (addr_hit[ 5] & (|(FLASH_CTRL_PRIM_PERMIT[ 5] & ~reg_be))) |
+               (addr_hit[ 6] & (|(FLASH_CTRL_PRIM_PERMIT[ 6] & ~reg_be))) |
+               (addr_hit[ 7] & (|(FLASH_CTRL_PRIM_PERMIT[ 7] & ~reg_be))) |
+               (addr_hit[ 8] & (|(FLASH_CTRL_PRIM_PERMIT[ 8] & ~reg_be))) |
+               (addr_hit[ 9] & (|(FLASH_CTRL_PRIM_PERMIT[ 9] & ~reg_be))) |
+               (addr_hit[10] & (|(FLASH_CTRL_PRIM_PERMIT[10] & ~reg_be))) |
+               (addr_hit[11] & (|(FLASH_CTRL_PRIM_PERMIT[11] & ~reg_be))) |
+               (addr_hit[12] & (|(FLASH_CTRL_PRIM_PERMIT[12] & ~reg_be))) |
+               (addr_hit[13] & (|(FLASH_CTRL_PRIM_PERMIT[13] & ~reg_be))) |
+               (addr_hit[14] & (|(FLASH_CTRL_PRIM_PERMIT[14] & ~reg_be))) |
+               (addr_hit[15] & (|(FLASH_CTRL_PRIM_PERMIT[15] & ~reg_be))) |
+               (addr_hit[16] & (|(FLASH_CTRL_PRIM_PERMIT[16] & ~reg_be))) |
+               (addr_hit[17] & (|(FLASH_CTRL_PRIM_PERMIT[17] & ~reg_be))) |
+               (addr_hit[18] & (|(FLASH_CTRL_PRIM_PERMIT[18] & ~reg_be))) |
+               (addr_hit[19] & (|(FLASH_CTRL_PRIM_PERMIT[19] & ~reg_be))) |
+               (addr_hit[20] & (|(FLASH_CTRL_PRIM_PERMIT[20] & ~reg_be)))));
+  end
+
+  // Generate write-enables
+  assign csr0_regwen_we = addr_hit[0] & reg_we & !reg_error;
+
+  assign csr0_regwen_wd = reg_wdata[0];
+  assign csr1_we = addr_hit[1] & reg_we & !reg_error;
+
+  assign csr1_field0_wd = reg_wdata[7:0];
+
+  assign csr1_field1_wd = reg_wdata[12:8];
+  assign csr2_we = addr_hit[2] & reg_we & !reg_error;
+
+  assign csr2_field0_wd = reg_wdata[0];
+
+  assign csr2_field1_wd = reg_wdata[1];
+
+  assign csr2_field2_wd = reg_wdata[2];
+
+  assign csr2_field3_wd = reg_wdata[3];
+
+  assign csr2_field4_wd = reg_wdata[4];
+
+  assign csr2_field5_wd = reg_wdata[5];
+
+  assign csr2_field6_wd = reg_wdata[6];
+
+  assign csr2_field7_wd = reg_wdata[7];
+  assign csr3_we = addr_hit[3] & reg_we & !reg_error;
+
+  assign csr3_field0_wd = reg_wdata[3:0];
+
+  assign csr3_field1_wd = reg_wdata[7:4];
+
+  assign csr3_field2_wd = reg_wdata[10:8];
+
+  assign csr3_field3_wd = reg_wdata[13:11];
+
+  assign csr3_field4_wd = reg_wdata[16:14];
+
+  assign csr3_field5_wd = reg_wdata[19:17];
+
+  assign csr3_field6_wd = reg_wdata[20];
+
+  assign csr3_field7_wd = reg_wdata[23:21];
+
+  assign csr3_field8_wd = reg_wdata[25:24];
+
+  assign csr3_field9_wd = reg_wdata[27:26];
+  assign csr4_we = addr_hit[4] & reg_we & !reg_error;
+
+  assign csr4_field0_wd = reg_wdata[2:0];
+
+  assign csr4_field1_wd = reg_wdata[5:3];
+
+  assign csr4_field2_wd = reg_wdata[8:6];
+
+  assign csr4_field3_wd = reg_wdata[11:9];
+  assign csr5_we = addr_hit[5] & reg_we & !reg_error;
+
+  assign csr5_field0_wd = reg_wdata[2:0];
+
+  assign csr5_field1_wd = reg_wdata[4:3];
+
+  assign csr5_field2_wd = reg_wdata[13:5];
+
+  assign csr5_field3_wd = reg_wdata[18:14];
+
+  assign csr5_field4_wd = reg_wdata[22:19];
+  assign csr6_we = addr_hit[6] & reg_we & !reg_error;
+
+  assign csr6_field0_wd = reg_wdata[2:0];
+
+  assign csr6_field1_wd = reg_wdata[5:3];
+
+  assign csr6_field2_wd = reg_wdata[13:6];
+
+  assign csr6_field3_wd = reg_wdata[16:14];
+
+  assign csr6_field4_wd = reg_wdata[18:17];
+
+  assign csr6_field5_wd = reg_wdata[20:19];
+
+  assign csr6_field6_wd = reg_wdata[22:21];
+
+  assign csr6_field7_wd = reg_wdata[23];
+
+  assign csr6_field8_wd = reg_wdata[24];
+  assign csr7_we = addr_hit[7] & reg_we & !reg_error;
+
+  assign csr7_field0_wd = reg_wdata[7:0];
+
+  assign csr7_field1_wd = reg_wdata[16:8];
+  assign csr8_we = addr_hit[8] & reg_we & !reg_error;
+
+  assign csr8_wd = reg_wdata[31:0];
+  assign csr9_we = addr_hit[9] & reg_we & !reg_error;
+
+  assign csr9_wd = reg_wdata[31:0];
+  assign csr10_we = addr_hit[10] & reg_we & !reg_error;
+
+  assign csr10_wd = reg_wdata[31:0];
+  assign csr11_we = addr_hit[11] & reg_we & !reg_error;
+
+  assign csr11_wd = reg_wdata[31:0];
+  assign csr12_we = addr_hit[12] & reg_we & !reg_error;
+
+  assign csr12_wd = reg_wdata[9:0];
+  assign csr13_we = addr_hit[13] & reg_we & !reg_error;
+
+  assign csr13_field0_wd = reg_wdata[19:0];
+
+  assign csr13_field1_wd = reg_wdata[20];
+  assign csr14_we = addr_hit[14] & reg_we & !reg_error;
+
+  assign csr14_field0_wd = reg_wdata[7:0];
+
+  assign csr14_field1_wd = reg_wdata[8];
+  assign csr15_we = addr_hit[15] & reg_we & !reg_error;
+
+  assign csr15_field0_wd = reg_wdata[7:0];
+
+  assign csr15_field1_wd = reg_wdata[8];
+  assign csr16_we = addr_hit[16] & reg_we & !reg_error;
+
+  assign csr16_field0_wd = reg_wdata[7:0];
+
+  assign csr16_field1_wd = reg_wdata[8];
+  assign csr17_we = addr_hit[17] & reg_we & !reg_error;
+
+  assign csr17_field0_wd = reg_wdata[7:0];
+
+  assign csr17_field1_wd = reg_wdata[8];
+  assign csr18_we = addr_hit[18] & reg_we & !reg_error;
+
+  assign csr18_wd = reg_wdata[0];
+  assign csr19_we = addr_hit[19] & reg_we & !reg_error;
+
+  assign csr19_wd = reg_wdata[0];
+  assign csr20_we = addr_hit[20] & reg_we & !reg_error;
+
+  assign csr20_field0_wd = reg_wdata[0];
+
+  assign csr20_field1_wd = reg_wdata[1];
+
+  assign csr20_field2_wd = reg_wdata[2];
+
+  // Assign write-enables to checker logic vector.
+  always_comb begin
+    reg_we_check = '0;
+    reg_we_check[0] = csr0_regwen_we;
+    reg_we_check[1] = csr1_gated_we;
+    reg_we_check[2] = csr2_we;
+    reg_we_check[3] = csr3_gated_we;
+    reg_we_check[4] = csr4_gated_we;
+    reg_we_check[5] = csr5_gated_we;
+    reg_we_check[6] = csr6_gated_we;
+    reg_we_check[7] = csr7_gated_we;
+    reg_we_check[8] = csr8_gated_we;
+    reg_we_check[9] = csr9_gated_we;
+    reg_we_check[10] = csr10_gated_we;
+    reg_we_check[11] = csr11_gated_we;
+    reg_we_check[12] = csr12_gated_we;
+    reg_we_check[13] = csr13_gated_we;
+    reg_we_check[14] = csr14_gated_we;
+    reg_we_check[15] = csr15_gated_we;
+    reg_we_check[16] = csr16_gated_we;
+    reg_we_check[17] = csr17_gated_we;
+    reg_we_check[18] = csr18_gated_we;
+    reg_we_check[19] = csr19_gated_we;
+    reg_we_check[20] = csr20_we;
+  end
+
+  // Read data return
+  always_comb begin
+    reg_rdata_next = '0;
+    unique case (1'b1)
+      addr_hit[0]: begin
+        reg_rdata_next[0] = csr0_regwen_qs;
+      end
+
+      addr_hit[1]: begin
+        reg_rdata_next[7:0] = csr1_field0_qs;
+        reg_rdata_next[12:8] = csr1_field1_qs;
+      end
+
+      addr_hit[2]: begin
+        reg_rdata_next[0] = csr2_field0_qs;
+        reg_rdata_next[1] = csr2_field1_qs;
+        reg_rdata_next[2] = csr2_field2_qs;
+        reg_rdata_next[3] = csr2_field3_qs;
+        reg_rdata_next[4] = csr2_field4_qs;
+        reg_rdata_next[5] = csr2_field5_qs;
+        reg_rdata_next[6] = csr2_field6_qs;
+        reg_rdata_next[7] = csr2_field7_qs;
+      end
+
+      addr_hit[3]: begin
+        reg_rdata_next[3:0] = csr3_field0_qs;
+        reg_rdata_next[7:4] = csr3_field1_qs;
+        reg_rdata_next[10:8] = csr3_field2_qs;
+        reg_rdata_next[13:11] = csr3_field3_qs;
+        reg_rdata_next[16:14] = csr3_field4_qs;
+        reg_rdata_next[19:17] = csr3_field5_qs;
+        reg_rdata_next[20] = csr3_field6_qs;
+        reg_rdata_next[23:21] = csr3_field7_qs;
+        reg_rdata_next[25:24] = csr3_field8_qs;
+        reg_rdata_next[27:26] = csr3_field9_qs;
+      end
+
+      addr_hit[4]: begin
+        reg_rdata_next[2:0] = csr4_field0_qs;
+        reg_rdata_next[5:3] = csr4_field1_qs;
+        reg_rdata_next[8:6] = csr4_field2_qs;
+        reg_rdata_next[11:9] = csr4_field3_qs;
+      end
+
+      addr_hit[5]: begin
+        reg_rdata_next[2:0] = csr5_field0_qs;
+        reg_rdata_next[4:3] = csr5_field1_qs;
+        reg_rdata_next[13:5] = csr5_field2_qs;
+        reg_rdata_next[18:14] = csr5_field3_qs;
+        reg_rdata_next[22:19] = csr5_field4_qs;
+      end
+
+      addr_hit[6]: begin
+        reg_rdata_next[2:0] = csr6_field0_qs;
+        reg_rdata_next[5:3] = csr6_field1_qs;
+        reg_rdata_next[13:6] = csr6_field2_qs;
+        reg_rdata_next[16:14] = csr6_field3_qs;
+        reg_rdata_next[18:17] = csr6_field4_qs;
+        reg_rdata_next[20:19] = csr6_field5_qs;
+        reg_rdata_next[22:21] = csr6_field6_qs;
+        reg_rdata_next[23] = csr6_field7_qs;
+        reg_rdata_next[24] = csr6_field8_qs;
+      end
+
+      addr_hit[7]: begin
+        reg_rdata_next[7:0] = csr7_field0_qs;
+        reg_rdata_next[16:8] = csr7_field1_qs;
+      end
+
+      addr_hit[8]: begin
+        reg_rdata_next[31:0] = csr8_qs;
+      end
+
+      addr_hit[9]: begin
+        reg_rdata_next[31:0] = csr9_qs;
+      end
+
+      addr_hit[10]: begin
+        reg_rdata_next[31:0] = csr10_qs;
+      end
+
+      addr_hit[11]: begin
+        reg_rdata_next[31:0] = csr11_qs;
+      end
+
+      addr_hit[12]: begin
+        reg_rdata_next[9:0] = csr12_qs;
+      end
+
+      addr_hit[13]: begin
+        reg_rdata_next[19:0] = csr13_field0_qs;
+        reg_rdata_next[20] = csr13_field1_qs;
+      end
+
+      addr_hit[14]: begin
+        reg_rdata_next[7:0] = csr14_field0_qs;
+        reg_rdata_next[8] = csr14_field1_qs;
+      end
+
+      addr_hit[15]: begin
+        reg_rdata_next[7:0] = csr15_field0_qs;
+        reg_rdata_next[8] = csr15_field1_qs;
+      end
+
+      addr_hit[16]: begin
+        reg_rdata_next[7:0] = csr16_field0_qs;
+        reg_rdata_next[8] = csr16_field1_qs;
+      end
+
+      addr_hit[17]: begin
+        reg_rdata_next[7:0] = csr17_field0_qs;
+        reg_rdata_next[8] = csr17_field1_qs;
+      end
+
+      addr_hit[18]: begin
+        reg_rdata_next[0] = csr18_qs;
+      end
+
+      addr_hit[19]: begin
+        reg_rdata_next[0] = csr19_qs;
+      end
+
+      addr_hit[20]: begin
+        reg_rdata_next[0] = csr20_field0_qs;
+        reg_rdata_next[1] = csr20_field1_qs;
+        reg_rdata_next[2] = csr20_field2_qs;
+      end
+
+      default: begin
+        reg_rdata_next = '1;
+      end
+    endcase
+  end
+
+  // shadow busy
+  logic shadow_busy;
+  assign shadow_busy = 1'b0;
+
+  // register busy
+  assign reg_busy = shadow_busy;
+
   // Unused signal tieoff
-  // devmode_i is not used if there are no registers
-  logic unused_devmode;
-  assign unused_devmode = ^devmode_i;
+
+  // wdata / byte enable are not always fully used
+  // add a blanket unused statement to handle lint waivers
+  logic unused_wdata;
+  logic unused_be;
+  assign unused_wdata = ^reg_wdata;
+  assign unused_be = ^reg_be;
+
+  // Assertions for Register Interface
+  `ASSERT_PULSE(wePulse, reg_we, clk_i, !rst_ni)
+  `ASSERT_PULSE(rePulse, reg_re, clk_i, !rst_ni)
+
+  `ASSERT(reAfterRv, $rose(reg_re || reg_we) |=> tl_o_pre.d_valid, clk_i, !rst_ni)
+
+  `ASSERT(en2addrHit, (reg_we || reg_re) |-> $onehot0(addr_hit), clk_i, !rst_ni)
+
+  // this is formulated as an assumption such that the FPV testbenches do disprove this
+  // property by mistake
+  //`ASSUME(reqParity, tl_reg_h2d.a_valid |-> tl_reg_h2d.a_user.chk_en == tlul_pkg::CheckDis)
+
 endmodule
diff --git a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
index 40c05c9..26c8ab2 100644
--- a/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/flash_ctrl/rtl/autogen/flash_ctrl_reg_pkg.sv
@@ -28,7 +28,7 @@
 
   // Address widths within the block
   parameter int CoreAw = 9;
-  parameter int PrimAw = 1;
+  parameter int PrimAw = 7;
   parameter int MemAw = 1;
 
   ///////////////////////////////////////////////
@@ -1128,4 +1128,387 @@
     4'b 0011  // index[106] FLASH_CTRL_CURR_FIFO_LVL
   };
 
+  ///////////////////////////////////////////////
+  // Typedefs for registers for prim interface //
+  ///////////////////////////////////////////////
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic [4:0]  q;
+    } field1;
+  } flash_ctrl_reg2hw_csr1_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+    struct packed {
+      logic        q;
+    } field2;
+    struct packed {
+      logic        q;
+    } field3;
+    struct packed {
+      logic        q;
+    } field4;
+    struct packed {
+      logic        q;
+    } field5;
+    struct packed {
+      logic        q;
+    } field6;
+    struct packed {
+      logic        q;
+    } field7;
+  } flash_ctrl_reg2hw_csr2_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [3:0]  q;
+    } field0;
+    struct packed {
+      logic [3:0]  q;
+    } field1;
+    struct packed {
+      logic [2:0]  q;
+    } field2;
+    struct packed {
+      logic [2:0]  q;
+    } field3;
+    struct packed {
+      logic [2:0]  q;
+    } field4;
+    struct packed {
+      logic [2:0]  q;
+    } field5;
+    struct packed {
+      logic        q;
+    } field6;
+    struct packed {
+      logic [2:0]  q;
+    } field7;
+    struct packed {
+      logic [1:0]  q;
+    } field8;
+    struct packed {
+      logic [1:0]  q;
+    } field9;
+  } flash_ctrl_reg2hw_csr3_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [2:0]  q;
+    } field0;
+    struct packed {
+      logic [2:0]  q;
+    } field1;
+    struct packed {
+      logic [2:0]  q;
+    } field2;
+    struct packed {
+      logic [2:0]  q;
+    } field3;
+  } flash_ctrl_reg2hw_csr4_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [2:0]  q;
+    } field0;
+    struct packed {
+      logic [1:0]  q;
+    } field1;
+    struct packed {
+      logic [8:0]  q;
+    } field2;
+    struct packed {
+      logic [4:0]  q;
+    } field3;
+    struct packed {
+      logic [3:0]  q;
+    } field4;
+  } flash_ctrl_reg2hw_csr5_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [2:0]  q;
+    } field0;
+    struct packed {
+      logic [2:0]  q;
+    } field1;
+    struct packed {
+      logic [7:0]  q;
+    } field2;
+    struct packed {
+      logic [2:0]  q;
+    } field3;
+    struct packed {
+      logic [1:0]  q;
+    } field4;
+    struct packed {
+      logic [1:0]  q;
+    } field5;
+    struct packed {
+      logic [1:0]  q;
+    } field6;
+    struct packed {
+      logic        q;
+    } field7;
+    struct packed {
+      logic        q;
+    } field8;
+  } flash_ctrl_reg2hw_csr6_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic [8:0]  q;
+    } field1;
+  } flash_ctrl_reg2hw_csr7_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr8_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr9_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr10_reg_t;
+
+  typedef struct packed {
+    logic [31:0] q;
+  } flash_ctrl_reg2hw_csr11_reg_t;
+
+  typedef struct packed {
+    logic [9:0] q;
+  } flash_ctrl_reg2hw_csr12_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [19:0] q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr13_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr14_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr15_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr16_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic [7:0]  q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+  } flash_ctrl_reg2hw_csr17_reg_t;
+
+  typedef struct packed {
+    logic        q;
+  } flash_ctrl_reg2hw_csr18_reg_t;
+
+  typedef struct packed {
+    logic        q;
+  } flash_ctrl_reg2hw_csr19_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        q;
+    } field0;
+    struct packed {
+      logic        q;
+    } field1;
+    struct packed {
+      logic        q;
+    } field2;
+  } flash_ctrl_reg2hw_csr20_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        d;
+      logic        de;
+    } field0;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field1;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field2;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field3;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field4;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field5;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field6;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field7;
+  } flash_ctrl_hw2reg_csr2_reg_t;
+
+  typedef struct packed {
+    struct packed {
+      logic        d;
+      logic        de;
+    } field0;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field1;
+    struct packed {
+      logic        d;
+      logic        de;
+    } field2;
+  } flash_ctrl_hw2reg_csr20_reg_t;
+
+  // Register -> HW type for prim interface
+  typedef struct packed {
+    flash_ctrl_reg2hw_csr1_reg_t csr1; // [325:313]
+    flash_ctrl_reg2hw_csr2_reg_t csr2; // [312:305]
+    flash_ctrl_reg2hw_csr3_reg_t csr3; // [304:277]
+    flash_ctrl_reg2hw_csr4_reg_t csr4; // [276:265]
+    flash_ctrl_reg2hw_csr5_reg_t csr5; // [264:242]
+    flash_ctrl_reg2hw_csr6_reg_t csr6; // [241:217]
+    flash_ctrl_reg2hw_csr7_reg_t csr7; // [216:200]
+    flash_ctrl_reg2hw_csr8_reg_t csr8; // [199:168]
+    flash_ctrl_reg2hw_csr9_reg_t csr9; // [167:136]
+    flash_ctrl_reg2hw_csr10_reg_t csr10; // [135:104]
+    flash_ctrl_reg2hw_csr11_reg_t csr11; // [103:72]
+    flash_ctrl_reg2hw_csr12_reg_t csr12; // [71:62]
+    flash_ctrl_reg2hw_csr13_reg_t csr13; // [61:41]
+    flash_ctrl_reg2hw_csr14_reg_t csr14; // [40:32]
+    flash_ctrl_reg2hw_csr15_reg_t csr15; // [31:23]
+    flash_ctrl_reg2hw_csr16_reg_t csr16; // [22:14]
+    flash_ctrl_reg2hw_csr17_reg_t csr17; // [13:5]
+    flash_ctrl_reg2hw_csr18_reg_t csr18; // [4:4]
+    flash_ctrl_reg2hw_csr19_reg_t csr19; // [3:3]
+    flash_ctrl_reg2hw_csr20_reg_t csr20; // [2:0]
+  } flash_ctrl_prim_reg2hw_t;
+
+  // HW -> register type for prim interface
+  typedef struct packed {
+    flash_ctrl_hw2reg_csr2_reg_t csr2; // [21:6]
+    flash_ctrl_hw2reg_csr20_reg_t csr20; // [5:0]
+  } flash_ctrl_prim_hw2reg_t;
+
+  // Register offsets for prim interface
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR0_REGWEN_OFFSET = 7'h 0;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR1_OFFSET = 7'h 4;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR2_OFFSET = 7'h 8;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR3_OFFSET = 7'h c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR4_OFFSET = 7'h 10;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR5_OFFSET = 7'h 14;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR6_OFFSET = 7'h 18;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR7_OFFSET = 7'h 1c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR8_OFFSET = 7'h 20;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR9_OFFSET = 7'h 24;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR10_OFFSET = 7'h 28;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR11_OFFSET = 7'h 2c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR12_OFFSET = 7'h 30;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR13_OFFSET = 7'h 34;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR14_OFFSET = 7'h 38;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR15_OFFSET = 7'h 3c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR16_OFFSET = 7'h 40;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR17_OFFSET = 7'h 44;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR18_OFFSET = 7'h 48;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR19_OFFSET = 7'h 4c;
+  parameter logic [PrimAw-1:0] FLASH_CTRL_CSR20_OFFSET = 7'h 50;
+
+  // Register index for prim interface
+  typedef enum int {
+    FLASH_CTRL_CSR0_REGWEN,
+    FLASH_CTRL_CSR1,
+    FLASH_CTRL_CSR2,
+    FLASH_CTRL_CSR3,
+    FLASH_CTRL_CSR4,
+    FLASH_CTRL_CSR5,
+    FLASH_CTRL_CSR6,
+    FLASH_CTRL_CSR7,
+    FLASH_CTRL_CSR8,
+    FLASH_CTRL_CSR9,
+    FLASH_CTRL_CSR10,
+    FLASH_CTRL_CSR11,
+    FLASH_CTRL_CSR12,
+    FLASH_CTRL_CSR13,
+    FLASH_CTRL_CSR14,
+    FLASH_CTRL_CSR15,
+    FLASH_CTRL_CSR16,
+    FLASH_CTRL_CSR17,
+    FLASH_CTRL_CSR18,
+    FLASH_CTRL_CSR19,
+    FLASH_CTRL_CSR20
+  } flash_ctrl_prim_id_e;
+
+  // Register width information to check illegal writes for prim interface
+  parameter logic [3:0] FLASH_CTRL_PRIM_PERMIT [21] = '{
+    4'b 0001, // index[ 0] FLASH_CTRL_CSR0_REGWEN
+    4'b 0011, // index[ 1] FLASH_CTRL_CSR1
+    4'b 0001, // index[ 2] FLASH_CTRL_CSR2
+    4'b 1111, // index[ 3] FLASH_CTRL_CSR3
+    4'b 0011, // index[ 4] FLASH_CTRL_CSR4
+    4'b 0111, // index[ 5] FLASH_CTRL_CSR5
+    4'b 1111, // index[ 6] FLASH_CTRL_CSR6
+    4'b 0111, // index[ 7] FLASH_CTRL_CSR7
+    4'b 1111, // index[ 8] FLASH_CTRL_CSR8
+    4'b 1111, // index[ 9] FLASH_CTRL_CSR9
+    4'b 1111, // index[10] FLASH_CTRL_CSR10
+    4'b 1111, // index[11] FLASH_CTRL_CSR11
+    4'b 0011, // index[12] FLASH_CTRL_CSR12
+    4'b 0111, // index[13] FLASH_CTRL_CSR13
+    4'b 0011, // index[14] FLASH_CTRL_CSR14
+    4'b 0011, // index[15] FLASH_CTRL_CSR15
+    4'b 0011, // index[16] FLASH_CTRL_CSR16
+    4'b 0011, // index[17] FLASH_CTRL_CSR17
+    4'b 0001, // index[18] FLASH_CTRL_CSR18
+    4'b 0001, // index[19] FLASH_CTRL_CSR19
+    4'b 0001  // index[20] FLASH_CTRL_CSR20
+  };
+
 endpackage