Flash updates

- provide configuration protection to region registers
- update interrupts to be edge triggered so there is not a storm
- Updates to reggen validate.py for multireg and unique regwen
diff --git a/hw/ip/flash_ctrl/doc/flash_ctrl.hjson b/hw/ip/flash_ctrl/doc/flash_ctrl.hjson
index 972d824..efaed29 100644
--- a/hw/ip/flash_ctrl/doc/flash_ctrl.hjson
+++ b/hw/ip/flash_ctrl/doc/flash_ctrl.hjson
@@ -115,6 +115,36 @@
         },
       ]
     },
+    { multireg: {
+        cname: "FLASH_CTRL",
+        name: "REGION_CFG_REGWEN"
+        desc: "Memory region registers configuration enable.",
+        count: 8,
+        swaccess: "rw0c",
+        hwaccess: "none",
+        fields: [
+            { bits: "0",
+              name: "REGION",
+              resval: "1"
+              desc: "Region register write enable.  Once set to 0, it can longer be configured to 1",
+              enum: [
+                { value: "0",
+                  name: "Region locked",
+                  desc: '''
+                    Region can no longer be configured until next reset
+                    '''
+                },
+                { value: "1",
+                  name: "Region enabled",
+                  desc: '''
+                    Region can be configured
+                    '''
+                },
+              ]
+            },
+        ],
+      },
+    },
 
     { multireg: {
         cname: "FLASH_CTRL",
@@ -123,6 +153,8 @@
         count: 8,
         swaccess: "rw",
         hwaccess: "hro",
+        regwen: "REGION_CFG_REGWEN_REGION",
+        regwen_incr: "true",
         fields: [
             { bits: "0",
               name: "EN",
@@ -202,11 +234,44 @@
 
     { multireg: {
         cname: "FLASH_CTRL",
+        name: "BANK_CFG_REGWEN"
+        desc: "Bank configuration registers configuration enable.",
+        count: 2,
+        swaccess: "rw0c",
+        hwaccess: "none",
+        fields: [
+            { bits: "0",
+              name: "BANK",
+              resval: "1"
+              desc: "Bank register write enable.  Once set to 0, it can longer be configured to 1",
+              enum: [
+                { value: "0",
+                  name: "Bank locked",
+                  desc: '''
+                    Bank can no longer be configured until next reset
+                    '''
+                },
+                { value: "1",
+                  name: "Bank enabled",
+                  desc: '''
+                    Bank can be configured
+                    '''
+                },
+              ]
+            },
+        ],
+      },
+    },
+
+    { multireg: {
+        cname: "FLASH_CTRL",
         name: "MP_BANK_CFG",
         desc: "Memory protect bank configuration",
         count: 2,
         swaccess: "rw",
         hwaccess: "hro",
+        regwen: "BANK_CFG_REGWEN_BANK"
+        regwen_incr: "true",
         fields: [
             { bits: "1",
               name: "ERASE_EN",
diff --git a/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv b/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv
index 1e917e1..c16c165 100644
--- a/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv
+++ b/hw/ip/flash_ctrl/dv/env/flash_ctrl_reg_block.sv
@@ -11,6 +11,7 @@
 typedef class flash_ctrl_reg_intr_test;
 typedef class flash_ctrl_reg_control;
 typedef class flash_ctrl_reg_addr;
+typedef class flash_ctrl_reg_region_cfg_regwen;
 typedef class flash_ctrl_reg_mp_region_cfg0;
 typedef class flash_ctrl_reg_mp_region_cfg1;
 typedef class flash_ctrl_reg_mp_region_cfg2;
@@ -20,6 +21,7 @@
 typedef class flash_ctrl_reg_mp_region_cfg6;
 typedef class flash_ctrl_reg_mp_region_cfg7;
 typedef class flash_ctrl_reg_default_region;
+typedef class flash_ctrl_reg_bank_cfg_regwen;
 typedef class flash_ctrl_reg_mp_bank_cfg;
 typedef class flash_ctrl_reg_op_status;
 typedef class flash_ctrl_reg_status;
@@ -408,6 +410,120 @@
 
 endclass : flash_ctrl_reg_addr
 
+// Class: flash_ctrl_reg_region_cfg_regwen
+class flash_ctrl_reg_region_cfg_regwen extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field region0;
+  rand dv_base_reg_field region1;
+  rand dv_base_reg_field region2;
+  rand dv_base_reg_field region3;
+  rand dv_base_reg_field region4;
+  rand dv_base_reg_field region5;
+  rand dv_base_reg_field region6;
+  rand dv_base_reg_field region7;
+
+  `uvm_object_utils(flash_ctrl_reg_region_cfg_regwen)
+
+  function new(string       name = "flash_ctrl_reg_region_cfg_regwen",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    region0 = dv_base_reg_field::type_id::create("region0");
+    region0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region1 = dv_base_reg_field::type_id::create("region1");
+    region1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region2 = dv_base_reg_field::type_id::create("region2");
+    region2.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region3 = dv_base_reg_field::type_id::create("region3");
+    region3.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region4 = dv_base_reg_field::type_id::create("region4");
+    region4.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region5 = dv_base_reg_field::type_id::create("region5");
+    region5.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region6 = dv_base_reg_field::type_id::create("region6");
+    region6.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(6),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region7 = dv_base_reg_field::type_id::create("region7");
+    region7.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(7),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_region_cfg_regwen
+
 // Class: flash_ctrl_reg_mp_region_cfg0
 class flash_ctrl_reg_mp_region_cfg0 extends dv_base_reg;
   // fields
@@ -1182,6 +1298,48 @@
 
 endclass : flash_ctrl_reg_default_region
 
+// Class: flash_ctrl_reg_bank_cfg_regwen
+class flash_ctrl_reg_bank_cfg_regwen extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field bank0;
+  rand dv_base_reg_field bank1;
+
+  `uvm_object_utils(flash_ctrl_reg_bank_cfg_regwen)
+
+  function new(string       name = "flash_ctrl_reg_bank_cfg_regwen",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    bank0 = dv_base_reg_field::type_id::create("bank0");
+    bank0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    bank1 = dv_base_reg_field::type_id::create("bank1");
+    bank1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_bank_cfg_regwen
+
 // Class: flash_ctrl_reg_mp_bank_cfg
 class flash_ctrl_reg_mp_bank_cfg extends dv_base_reg;
   // fields
@@ -1478,6 +1636,7 @@
   rand flash_ctrl_reg_intr_test intr_test;
   rand flash_ctrl_reg_control control;
   rand flash_ctrl_reg_addr addr;
+  rand flash_ctrl_reg_region_cfg_regwen region_cfg_regwen;
   rand flash_ctrl_reg_mp_region_cfg0 mp_region_cfg0;
   rand flash_ctrl_reg_mp_region_cfg1 mp_region_cfg1;
   rand flash_ctrl_reg_mp_region_cfg2 mp_region_cfg2;
@@ -1487,6 +1646,7 @@
   rand flash_ctrl_reg_mp_region_cfg6 mp_region_cfg6;
   rand flash_ctrl_reg_mp_region_cfg7 mp_region_cfg7;
   rand flash_ctrl_reg_default_region default_region;
+  rand flash_ctrl_reg_bank_cfg_regwen bank_cfg_regwen;
   rand flash_ctrl_reg_mp_bank_cfg mp_bank_cfg;
   rand flash_ctrl_reg_op_status op_status;
   rand flash_ctrl_reg_status status;
@@ -1541,101 +1701,113 @@
     default_map.add_reg(.rg(addr),
                         .offset(32'h10),
                         .rights("RW"));
+    region_cfg_regwen = flash_ctrl_reg_region_cfg_regwen::type_id::create("region_cfg_regwen");
+    region_cfg_regwen.configure(.blk_parent(this));
+    region_cfg_regwen.build();
+    default_map.add_reg(.rg(region_cfg_regwen),
+                        .offset(32'h14),
+                        .rights("RW"));
     mp_region_cfg0 = flash_ctrl_reg_mp_region_cfg0::type_id::create("mp_region_cfg0");
     mp_region_cfg0.configure(.blk_parent(this));
     mp_region_cfg0.build();
     default_map.add_reg(.rg(mp_region_cfg0),
-                        .offset(32'h14),
+                        .offset(32'h18),
                         .rights("RW"));
     mp_region_cfg1 = flash_ctrl_reg_mp_region_cfg1::type_id::create("mp_region_cfg1");
     mp_region_cfg1.configure(.blk_parent(this));
     mp_region_cfg1.build();
     default_map.add_reg(.rg(mp_region_cfg1),
-                        .offset(32'h18),
+                        .offset(32'h1c),
                         .rights("RW"));
     mp_region_cfg2 = flash_ctrl_reg_mp_region_cfg2::type_id::create("mp_region_cfg2");
     mp_region_cfg2.configure(.blk_parent(this));
     mp_region_cfg2.build();
     default_map.add_reg(.rg(mp_region_cfg2),
-                        .offset(32'h1c),
+                        .offset(32'h20),
                         .rights("RW"));
     mp_region_cfg3 = flash_ctrl_reg_mp_region_cfg3::type_id::create("mp_region_cfg3");
     mp_region_cfg3.configure(.blk_parent(this));
     mp_region_cfg3.build();
     default_map.add_reg(.rg(mp_region_cfg3),
-                        .offset(32'h20),
+                        .offset(32'h24),
                         .rights("RW"));
     mp_region_cfg4 = flash_ctrl_reg_mp_region_cfg4::type_id::create("mp_region_cfg4");
     mp_region_cfg4.configure(.blk_parent(this));
     mp_region_cfg4.build();
     default_map.add_reg(.rg(mp_region_cfg4),
-                        .offset(32'h24),
+                        .offset(32'h28),
                         .rights("RW"));
     mp_region_cfg5 = flash_ctrl_reg_mp_region_cfg5::type_id::create("mp_region_cfg5");
     mp_region_cfg5.configure(.blk_parent(this));
     mp_region_cfg5.build();
     default_map.add_reg(.rg(mp_region_cfg5),
-                        .offset(32'h28),
+                        .offset(32'h2c),
                         .rights("RW"));
     mp_region_cfg6 = flash_ctrl_reg_mp_region_cfg6::type_id::create("mp_region_cfg6");
     mp_region_cfg6.configure(.blk_parent(this));
     mp_region_cfg6.build();
     default_map.add_reg(.rg(mp_region_cfg6),
-                        .offset(32'h2c),
+                        .offset(32'h30),
                         .rights("RW"));
     mp_region_cfg7 = flash_ctrl_reg_mp_region_cfg7::type_id::create("mp_region_cfg7");
     mp_region_cfg7.configure(.blk_parent(this));
     mp_region_cfg7.build();
     default_map.add_reg(.rg(mp_region_cfg7),
-                        .offset(32'h30),
+                        .offset(32'h34),
                         .rights("RW"));
     default_region = flash_ctrl_reg_default_region::type_id::create("default_region");
     default_region.configure(.blk_parent(this));
     default_region.build();
     default_map.add_reg(.rg(default_region),
-                        .offset(32'h34),
+                        .offset(32'h38),
+                        .rights("RW"));
+    bank_cfg_regwen = flash_ctrl_reg_bank_cfg_regwen::type_id::create("bank_cfg_regwen");
+    bank_cfg_regwen.configure(.blk_parent(this));
+    bank_cfg_regwen.build();
+    default_map.add_reg(.rg(bank_cfg_regwen),
+                        .offset(32'h3c),
                         .rights("RW"));
     mp_bank_cfg = flash_ctrl_reg_mp_bank_cfg::type_id::create("mp_bank_cfg");
     mp_bank_cfg.configure(.blk_parent(this));
     mp_bank_cfg.build();
     default_map.add_reg(.rg(mp_bank_cfg),
-                        .offset(32'h38),
+                        .offset(32'h40),
                         .rights("RW"));
     op_status = flash_ctrl_reg_op_status::type_id::create("op_status");
     op_status.configure(.blk_parent(this));
     op_status.build();
     default_map.add_reg(.rg(op_status),
-                        .offset(32'h3c),
+                        .offset(32'h44),
                         .rights("RW"));
     status = flash_ctrl_reg_status::type_id::create("status");
     status.configure(.blk_parent(this));
     status.build();
     default_map.add_reg(.rg(status),
-                        .offset(32'h40),
+                        .offset(32'h48),
                         .rights("RO"));
     scratch = flash_ctrl_reg_scratch::type_id::create("scratch");
     scratch.configure(.blk_parent(this));
     scratch.build();
     default_map.add_reg(.rg(scratch),
-                        .offset(32'h44),
+                        .offset(32'h4c),
                         .rights("RW"));
     fifo_lvl = flash_ctrl_reg_fifo_lvl::type_id::create("fifo_lvl");
     fifo_lvl.configure(.blk_parent(this));
     fifo_lvl.build();
     default_map.add_reg(.rg(fifo_lvl),
-                        .offset(32'h48),
+                        .offset(32'h50),
                         .rights("RW"));
 
     // create memories
     prog_fifo = flash_ctrl_mem_prog_fifo::type_id::create("prog_fifo");
     prog_fifo.configure(.parent(this));
     default_map.add_mem(.mem(prog_fifo),
-                        .offset(32'h4c),
+                        .offset(32'h54),
                         .rights("WO"));
     rd_fifo = flash_ctrl_mem_rd_fifo::type_id::create("rd_fifo");
     rd_fifo.configure(.parent(this));
     default_map.add_mem(.mem(rd_fifo),
-                        .offset(32'h50),
+                        .offset(32'h58),
                         .rights("RO"));
   endfunction : build
 
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
index bdfff59..f3e770d 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl.sv
@@ -425,6 +425,28 @@
   assign init_busy = flash_i.init_busy;
 
   // Interrupts
+  // Generate edge triggered signals for sources that are level
+  logic [3:0] intr_src;
+  logic [3:0] intr_src_q;
+  logic [3:0] intr_assert;
+
+  assign intr_src = { ~prog_fifo_rvalid,
+                      reg2hw.fifo_lvl.prog.q == prog_fifo_depth,
+                      ~rd_fifo_wready,
+                      reg2hw.fifo_lvl.rd.q == rd_fifo_depth
+                    };
+
+  always_ff @(posedge clk_i or negedge rst_ni) begin
+    if (!rst_ni) begin
+      intr_src_q <= 'h0;
+    end else begin
+      intr_src_q <= intr_src;
+    end
+  end
+
+  assign intr_assert = ~intr_src_q & intr_src;
+
+
   assign intr_prog_empty_o = reg2hw.intr_enable.prog_empty.q & reg2hw.intr_state.prog_empty.q;
   assign intr_prog_lvl_o = reg2hw.intr_enable.prog_lvl.q & reg2hw.intr_state.prog_lvl.q;
   assign intr_rd_full_o = reg2hw.intr_enable.rd_full.q & reg2hw.intr_state.rd_full.q;
@@ -433,22 +455,22 @@
   assign intr_op_error_o = reg2hw.intr_enable.op_error.q & reg2hw.intr_state.op_error.q;
 
   assign hw2reg.intr_state.prog_empty.d  = 1'b1;
-  assign hw2reg.intr_state.prog_empty.de = ~prog_fifo_rvalid  |
+  assign hw2reg.intr_state.prog_empty.de = intr_assert[3]  |
                                            (reg2hw.intr_test.prog_empty.qe  &
                                            reg2hw.intr_test.prog_empty.q);
 
   assign hw2reg.intr_state.prog_lvl.d  = 1'b1;
-  assign hw2reg.intr_state.prog_lvl.de = (reg2hw.fifo_lvl.prog.q == prog_fifo_depth)  |
+  assign hw2reg.intr_state.prog_lvl.de = intr_assert[2]  |
                                          (reg2hw.intr_test.prog_lvl.qe  &
                                          reg2hw.intr_test.prog_lvl.q);
 
   assign hw2reg.intr_state.rd_full.d  = 1'b1;
-  assign hw2reg.intr_state.rd_full.de = ~rd_fifo_wready |
+  assign hw2reg.intr_state.rd_full.de = intr_assert[1] |
                                         (reg2hw.intr_test.rd_full.qe  &
                                         reg2hw.intr_test.rd_full.q);
 
   assign hw2reg.intr_state.rd_lvl.d  = 1'b1;
-  assign hw2reg.intr_state.rd_lvl.de = (reg2hw.fifo_lvl.rd.q == rd_fifo_depth)  |
+  assign hw2reg.intr_state.rd_lvl.de =  intr_assert[0] |
                                        (reg2hw.intr_test.rd_lvl.qe  &
                                        reg2hw.intr_test.rd_lvl.q);
 
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 dfc0262..9a68b92 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_pkg.sv
@@ -7,7 +7,9 @@
 package flash_ctrl_reg_pkg;
 
   // Param list
+  localparam int REGION_CFG_REGWEN = 8;
   localparam int MP_REGION_CFG = 8;
+  localparam int BANK_CFG_REGWEN = 2;
   localparam int MP_BANK_CFG = 2;
 
 // Register to internal design logic
@@ -367,25 +369,27 @@
   parameter FLASH_CTRL_INTR_TEST_OFFSET = 7'h 8;
   parameter FLASH_CTRL_CONTROL_OFFSET = 7'h c;
   parameter FLASH_CTRL_ADDR_OFFSET = 7'h 10;
-  parameter FLASH_CTRL_MP_REGION_CFG0_OFFSET = 7'h 14;
-  parameter FLASH_CTRL_MP_REGION_CFG1_OFFSET = 7'h 18;
-  parameter FLASH_CTRL_MP_REGION_CFG2_OFFSET = 7'h 1c;
-  parameter FLASH_CTRL_MP_REGION_CFG3_OFFSET = 7'h 20;
-  parameter FLASH_CTRL_MP_REGION_CFG4_OFFSET = 7'h 24;
-  parameter FLASH_CTRL_MP_REGION_CFG5_OFFSET = 7'h 28;
-  parameter FLASH_CTRL_MP_REGION_CFG6_OFFSET = 7'h 2c;
-  parameter FLASH_CTRL_MP_REGION_CFG7_OFFSET = 7'h 30;
-  parameter FLASH_CTRL_DEFAULT_REGION_OFFSET = 7'h 34;
-  parameter FLASH_CTRL_MP_BANK_CFG_OFFSET = 7'h 38;
-  parameter FLASH_CTRL_OP_STATUS_OFFSET = 7'h 3c;
-  parameter FLASH_CTRL_STATUS_OFFSET = 7'h 40;
-  parameter FLASH_CTRL_SCRATCH_OFFSET = 7'h 44;
-  parameter FLASH_CTRL_FIFO_LVL_OFFSET = 7'h 48;
+  parameter FLASH_CTRL_REGION_CFG_REGWEN_OFFSET = 7'h 14;
+  parameter FLASH_CTRL_MP_REGION_CFG0_OFFSET = 7'h 18;
+  parameter FLASH_CTRL_MP_REGION_CFG1_OFFSET = 7'h 1c;
+  parameter FLASH_CTRL_MP_REGION_CFG2_OFFSET = 7'h 20;
+  parameter FLASH_CTRL_MP_REGION_CFG3_OFFSET = 7'h 24;
+  parameter FLASH_CTRL_MP_REGION_CFG4_OFFSET = 7'h 28;
+  parameter FLASH_CTRL_MP_REGION_CFG5_OFFSET = 7'h 2c;
+  parameter FLASH_CTRL_MP_REGION_CFG6_OFFSET = 7'h 30;
+  parameter FLASH_CTRL_MP_REGION_CFG7_OFFSET = 7'h 34;
+  parameter FLASH_CTRL_DEFAULT_REGION_OFFSET = 7'h 38;
+  parameter FLASH_CTRL_BANK_CFG_REGWEN_OFFSET = 7'h 3c;
+  parameter FLASH_CTRL_MP_BANK_CFG_OFFSET = 7'h 40;
+  parameter FLASH_CTRL_OP_STATUS_OFFSET = 7'h 44;
+  parameter FLASH_CTRL_STATUS_OFFSET = 7'h 48;
+  parameter FLASH_CTRL_SCRATCH_OFFSET = 7'h 4c;
+  parameter FLASH_CTRL_FIFO_LVL_OFFSET = 7'h 50;
 
   // Window parameter
-  parameter FLASH_CTRL_PROG_FIFO_OFFSET = 7'h 4c;
+  parameter FLASH_CTRL_PROG_FIFO_OFFSET = 7'h 54;
   parameter FLASH_CTRL_PROG_FIFO_SIZE   = 7'h 4;
-  parameter FLASH_CTRL_RD_FIFO_OFFSET = 7'h 50;
+  parameter FLASH_CTRL_RD_FIFO_OFFSET = 7'h 58;
   parameter FLASH_CTRL_RD_FIFO_SIZE   = 7'h 4;
 
   // Register Index
@@ -395,6 +399,7 @@
     FLASH_CTRL_INTR_TEST,
     FLASH_CTRL_CONTROL,
     FLASH_CTRL_ADDR,
+    FLASH_CTRL_REGION_CFG_REGWEN,
     FLASH_CTRL_MP_REGION_CFG0,
     FLASH_CTRL_MP_REGION_CFG1,
     FLASH_CTRL_MP_REGION_CFG2,
@@ -404,6 +409,7 @@
     FLASH_CTRL_MP_REGION_CFG6,
     FLASH_CTRL_MP_REGION_CFG7,
     FLASH_CTRL_DEFAULT_REGION,
+    FLASH_CTRL_BANK_CFG_REGWEN,
     FLASH_CTRL_MP_BANK_CFG,
     FLASH_CTRL_OP_STATUS,
     FLASH_CTRL_STATUS,
@@ -412,26 +418,28 @@
   } flash_ctrl_id_e;
 
   // Register width information to check illegal writes
-  localparam logic [3:0] FLASH_CTRL_PERMIT [19] = '{
+  localparam logic [3:0] FLASH_CTRL_PERMIT [21] = '{
     4'b 0001, // index[ 0] FLASH_CTRL_INTR_STATE
     4'b 0001, // index[ 1] FLASH_CTRL_INTR_ENABLE
     4'b 0001, // index[ 2] FLASH_CTRL_INTR_TEST
     4'b 1111, // index[ 3] FLASH_CTRL_CONTROL
     4'b 1111, // index[ 4] FLASH_CTRL_ADDR
-    4'b 1111, // index[ 5] FLASH_CTRL_MP_REGION_CFG0
-    4'b 1111, // index[ 6] FLASH_CTRL_MP_REGION_CFG1
-    4'b 1111, // index[ 7] FLASH_CTRL_MP_REGION_CFG2
-    4'b 1111, // index[ 8] FLASH_CTRL_MP_REGION_CFG3
-    4'b 1111, // index[ 9] FLASH_CTRL_MP_REGION_CFG4
-    4'b 1111, // index[10] FLASH_CTRL_MP_REGION_CFG5
-    4'b 1111, // index[11] FLASH_CTRL_MP_REGION_CFG6
-    4'b 1111, // index[12] FLASH_CTRL_MP_REGION_CFG7
-    4'b 0001, // index[13] FLASH_CTRL_DEFAULT_REGION
-    4'b 0001, // index[14] FLASH_CTRL_MP_BANK_CFG
-    4'b 0001, // index[15] FLASH_CTRL_OP_STATUS
-    4'b 1111, // index[16] FLASH_CTRL_STATUS
-    4'b 1111, // index[17] FLASH_CTRL_SCRATCH
-    4'b 0011  // index[18] FLASH_CTRL_FIFO_LVL
+    4'b 0001, // index[ 5] FLASH_CTRL_REGION_CFG_REGWEN
+    4'b 1111, // index[ 6] FLASH_CTRL_MP_REGION_CFG0
+    4'b 1111, // index[ 7] FLASH_CTRL_MP_REGION_CFG1
+    4'b 1111, // index[ 8] FLASH_CTRL_MP_REGION_CFG2
+    4'b 1111, // index[ 9] FLASH_CTRL_MP_REGION_CFG3
+    4'b 1111, // index[10] FLASH_CTRL_MP_REGION_CFG4
+    4'b 1111, // index[11] FLASH_CTRL_MP_REGION_CFG5
+    4'b 1111, // index[12] FLASH_CTRL_MP_REGION_CFG6
+    4'b 1111, // index[13] FLASH_CTRL_MP_REGION_CFG7
+    4'b 0001, // index[14] FLASH_CTRL_DEFAULT_REGION
+    4'b 0001, // index[15] FLASH_CTRL_BANK_CFG_REGWEN
+    4'b 0001, // index[16] FLASH_CTRL_MP_BANK_CFG
+    4'b 0001, // index[17] FLASH_CTRL_OP_STATUS
+    4'b 1111, // index[18] FLASH_CTRL_STATUS
+    4'b 1111, // index[19] FLASH_CTRL_SCRATCH
+    4'b 0011  // index[20] FLASH_CTRL_FIFO_LVL
   };
 endpackage
 
diff --git a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
index 64b6ef1..c44f403 100644
--- a/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
+++ b/hw/ip/flash_ctrl/rtl/flash_ctrl_reg_top.sv
@@ -87,10 +87,10 @@
     reg_steer = 2;       // Default set to register
 
     // TODO: Can below codes be unique case () inside ?
-    if (tl_i.a_address[AW-1:0] >= 76 && tl_i.a_address[AW-1:0] < 80) begin
+    if (tl_i.a_address[AW-1:0] >= 84 && tl_i.a_address[AW-1:0] < 88) begin
       reg_steer = 0;
     end
-    if (tl_i.a_address[AW-1:0] >= 80 && tl_i.a_address[AW-1:0] < 84) begin
+    if (tl_i.a_address[AW-1:0] >= 88 && tl_i.a_address[AW-1:0] < 92) begin
       reg_steer = 1;
     end
   end
@@ -186,6 +186,30 @@
   logic [31:0] addr_qs;
   logic [31:0] addr_wd;
   logic addr_we;
+  logic region_cfg_regwen_region0_qs;
+  logic region_cfg_regwen_region0_wd;
+  logic region_cfg_regwen_region0_we;
+  logic region_cfg_regwen_region1_qs;
+  logic region_cfg_regwen_region1_wd;
+  logic region_cfg_regwen_region1_we;
+  logic region_cfg_regwen_region2_qs;
+  logic region_cfg_regwen_region2_wd;
+  logic region_cfg_regwen_region2_we;
+  logic region_cfg_regwen_region3_qs;
+  logic region_cfg_regwen_region3_wd;
+  logic region_cfg_regwen_region3_we;
+  logic region_cfg_regwen_region4_qs;
+  logic region_cfg_regwen_region4_wd;
+  logic region_cfg_regwen_region4_we;
+  logic region_cfg_regwen_region5_qs;
+  logic region_cfg_regwen_region5_wd;
+  logic region_cfg_regwen_region5_we;
+  logic region_cfg_regwen_region6_qs;
+  logic region_cfg_regwen_region6_wd;
+  logic region_cfg_regwen_region6_we;
+  logic region_cfg_regwen_region7_qs;
+  logic region_cfg_regwen_region7_wd;
+  logic region_cfg_regwen_region7_we;
   logic mp_region_cfg0_en0_qs;
   logic mp_region_cfg0_en0_wd;
   logic mp_region_cfg0_en0_we;
@@ -339,6 +363,12 @@
   logic default_region_erase_en_qs;
   logic default_region_erase_en_wd;
   logic default_region_erase_en_we;
+  logic bank_cfg_regwen_bank0_qs;
+  logic bank_cfg_regwen_bank0_wd;
+  logic bank_cfg_regwen_bank0_we;
+  logic bank_cfg_regwen_bank1_qs;
+  logic bank_cfg_regwen_bank1_wd;
+  logic bank_cfg_regwen_bank1_we;
   logic mp_bank_cfg_erase_en0_qs;
   logic mp_bank_cfg_erase_en0_wd;
   logic mp_bank_cfg_erase_en0_we;
@@ -943,6 +973,216 @@
   );
 
 
+  // R[region_cfg_regwen]: V(False)
+
+  //   F[region0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region0 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region0_we),
+    .wd     (region_cfg_regwen_region0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region0_qs)
+  );
+
+
+  //   F[region1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region1 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region1_we),
+    .wd     (region_cfg_regwen_region1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region1_qs)
+  );
+
+
+  //   F[region2]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region2 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region2_we),
+    .wd     (region_cfg_regwen_region2_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region2_qs)
+  );
+
+
+  //   F[region3]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region3 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region3_we),
+    .wd     (region_cfg_regwen_region3_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region3_qs)
+  );
+
+
+  //   F[region4]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region4 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region4_we),
+    .wd     (region_cfg_regwen_region4_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region4_qs)
+  );
+
+
+  //   F[region5]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region5 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region5_we),
+    .wd     (region_cfg_regwen_region5_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region5_qs)
+  );
+
+
+  //   F[region6]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region6 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region6_we),
+    .wd     (region_cfg_regwen_region6_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region6_qs)
+  );
+
+
+  //   F[region7]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_region_cfg_regwen_region7 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (region_cfg_regwen_region7_we),
+    .wd     (region_cfg_regwen_region7_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (region_cfg_regwen_region7_qs)
+  );
+
+
   // R[mp_region_cfg0]: V(False)
 
   //   F[en0]: 0:0
@@ -954,8 +1194,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg0_en0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg0_en0_we & region_cfg_regwen_region0_qs),
     .wd     (mp_region_cfg0_en0_wd),
 
     // from internal hardware
@@ -980,8 +1220,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg0_rd_en0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg0_rd_en0_we & region_cfg_regwen_region0_qs),
     .wd     (mp_region_cfg0_rd_en0_wd),
 
     // from internal hardware
@@ -1006,8 +1246,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg0_prog_en0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg0_prog_en0_we & region_cfg_regwen_region0_qs),
     .wd     (mp_region_cfg0_prog_en0_wd),
 
     // from internal hardware
@@ -1032,8 +1272,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg0_erase_en0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg0_erase_en0_we & region_cfg_regwen_region0_qs),
     .wd     (mp_region_cfg0_erase_en0_wd),
 
     // from internal hardware
@@ -1058,8 +1298,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg0_base0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg0_base0_we & region_cfg_regwen_region0_qs),
     .wd     (mp_region_cfg0_base0_wd),
 
     // from internal hardware
@@ -1084,8 +1324,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg0_size0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg0_size0_we & region_cfg_regwen_region0_qs),
     .wd     (mp_region_cfg0_size0_wd),
 
     // from internal hardware
@@ -1112,8 +1352,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg1_en1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg1_en1_we & region_cfg_regwen_region1_qs),
     .wd     (mp_region_cfg1_en1_wd),
 
     // from internal hardware
@@ -1138,8 +1378,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg1_rd_en1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg1_rd_en1_we & region_cfg_regwen_region1_qs),
     .wd     (mp_region_cfg1_rd_en1_wd),
 
     // from internal hardware
@@ -1164,8 +1404,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg1_prog_en1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg1_prog_en1_we & region_cfg_regwen_region1_qs),
     .wd     (mp_region_cfg1_prog_en1_wd),
 
     // from internal hardware
@@ -1190,8 +1430,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg1_erase_en1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg1_erase_en1_we & region_cfg_regwen_region1_qs),
     .wd     (mp_region_cfg1_erase_en1_wd),
 
     // from internal hardware
@@ -1216,8 +1456,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg1_base1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg1_base1_we & region_cfg_regwen_region1_qs),
     .wd     (mp_region_cfg1_base1_wd),
 
     // from internal hardware
@@ -1242,8 +1482,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg1_size1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg1_size1_we & region_cfg_regwen_region1_qs),
     .wd     (mp_region_cfg1_size1_wd),
 
     // from internal hardware
@@ -1270,8 +1510,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg2_en2_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg2_en2_we & region_cfg_regwen_region2_qs),
     .wd     (mp_region_cfg2_en2_wd),
 
     // from internal hardware
@@ -1296,8 +1536,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg2_rd_en2_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg2_rd_en2_we & region_cfg_regwen_region2_qs),
     .wd     (mp_region_cfg2_rd_en2_wd),
 
     // from internal hardware
@@ -1322,8 +1562,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg2_prog_en2_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg2_prog_en2_we & region_cfg_regwen_region2_qs),
     .wd     (mp_region_cfg2_prog_en2_wd),
 
     // from internal hardware
@@ -1348,8 +1588,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg2_erase_en2_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg2_erase_en2_we & region_cfg_regwen_region2_qs),
     .wd     (mp_region_cfg2_erase_en2_wd),
 
     // from internal hardware
@@ -1374,8 +1614,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg2_base2_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg2_base2_we & region_cfg_regwen_region2_qs),
     .wd     (mp_region_cfg2_base2_wd),
 
     // from internal hardware
@@ -1400,8 +1640,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg2_size2_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg2_size2_we & region_cfg_regwen_region2_qs),
     .wd     (mp_region_cfg2_size2_wd),
 
     // from internal hardware
@@ -1428,8 +1668,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg3_en3_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg3_en3_we & region_cfg_regwen_region3_qs),
     .wd     (mp_region_cfg3_en3_wd),
 
     // from internal hardware
@@ -1454,8 +1694,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg3_rd_en3_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg3_rd_en3_we & region_cfg_regwen_region3_qs),
     .wd     (mp_region_cfg3_rd_en3_wd),
 
     // from internal hardware
@@ -1480,8 +1720,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg3_prog_en3_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg3_prog_en3_we & region_cfg_regwen_region3_qs),
     .wd     (mp_region_cfg3_prog_en3_wd),
 
     // from internal hardware
@@ -1506,8 +1746,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg3_erase_en3_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg3_erase_en3_we & region_cfg_regwen_region3_qs),
     .wd     (mp_region_cfg3_erase_en3_wd),
 
     // from internal hardware
@@ -1532,8 +1772,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg3_base3_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg3_base3_we & region_cfg_regwen_region3_qs),
     .wd     (mp_region_cfg3_base3_wd),
 
     // from internal hardware
@@ -1558,8 +1798,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg3_size3_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg3_size3_we & region_cfg_regwen_region3_qs),
     .wd     (mp_region_cfg3_size3_wd),
 
     // from internal hardware
@@ -1586,8 +1826,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg4_en4_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg4_en4_we & region_cfg_regwen_region4_qs),
     .wd     (mp_region_cfg4_en4_wd),
 
     // from internal hardware
@@ -1612,8 +1852,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg4_rd_en4_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg4_rd_en4_we & region_cfg_regwen_region4_qs),
     .wd     (mp_region_cfg4_rd_en4_wd),
 
     // from internal hardware
@@ -1638,8 +1878,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg4_prog_en4_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg4_prog_en4_we & region_cfg_regwen_region4_qs),
     .wd     (mp_region_cfg4_prog_en4_wd),
 
     // from internal hardware
@@ -1664,8 +1904,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg4_erase_en4_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg4_erase_en4_we & region_cfg_regwen_region4_qs),
     .wd     (mp_region_cfg4_erase_en4_wd),
 
     // from internal hardware
@@ -1690,8 +1930,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg4_base4_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg4_base4_we & region_cfg_regwen_region4_qs),
     .wd     (mp_region_cfg4_base4_wd),
 
     // from internal hardware
@@ -1716,8 +1956,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg4_size4_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg4_size4_we & region_cfg_regwen_region4_qs),
     .wd     (mp_region_cfg4_size4_wd),
 
     // from internal hardware
@@ -1744,8 +1984,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg5_en5_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg5_en5_we & region_cfg_regwen_region5_qs),
     .wd     (mp_region_cfg5_en5_wd),
 
     // from internal hardware
@@ -1770,8 +2010,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg5_rd_en5_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg5_rd_en5_we & region_cfg_regwen_region5_qs),
     .wd     (mp_region_cfg5_rd_en5_wd),
 
     // from internal hardware
@@ -1796,8 +2036,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg5_prog_en5_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg5_prog_en5_we & region_cfg_regwen_region5_qs),
     .wd     (mp_region_cfg5_prog_en5_wd),
 
     // from internal hardware
@@ -1822,8 +2062,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg5_erase_en5_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg5_erase_en5_we & region_cfg_regwen_region5_qs),
     .wd     (mp_region_cfg5_erase_en5_wd),
 
     // from internal hardware
@@ -1848,8 +2088,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg5_base5_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg5_base5_we & region_cfg_regwen_region5_qs),
     .wd     (mp_region_cfg5_base5_wd),
 
     // from internal hardware
@@ -1874,8 +2114,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg5_size5_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg5_size5_we & region_cfg_regwen_region5_qs),
     .wd     (mp_region_cfg5_size5_wd),
 
     // from internal hardware
@@ -1902,8 +2142,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg6_en6_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg6_en6_we & region_cfg_regwen_region6_qs),
     .wd     (mp_region_cfg6_en6_wd),
 
     // from internal hardware
@@ -1928,8 +2168,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg6_rd_en6_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg6_rd_en6_we & region_cfg_regwen_region6_qs),
     .wd     (mp_region_cfg6_rd_en6_wd),
 
     // from internal hardware
@@ -1954,8 +2194,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg6_prog_en6_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg6_prog_en6_we & region_cfg_regwen_region6_qs),
     .wd     (mp_region_cfg6_prog_en6_wd),
 
     // from internal hardware
@@ -1980,8 +2220,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg6_erase_en6_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg6_erase_en6_we & region_cfg_regwen_region6_qs),
     .wd     (mp_region_cfg6_erase_en6_wd),
 
     // from internal hardware
@@ -2006,8 +2246,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg6_base6_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg6_base6_we & region_cfg_regwen_region6_qs),
     .wd     (mp_region_cfg6_base6_wd),
 
     // from internal hardware
@@ -2032,8 +2272,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg6_size6_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg6_size6_we & region_cfg_regwen_region6_qs),
     .wd     (mp_region_cfg6_size6_wd),
 
     // from internal hardware
@@ -2060,8 +2300,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg7_en7_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg7_en7_we & region_cfg_regwen_region7_qs),
     .wd     (mp_region_cfg7_en7_wd),
 
     // from internal hardware
@@ -2086,8 +2326,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg7_rd_en7_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg7_rd_en7_we & region_cfg_regwen_region7_qs),
     .wd     (mp_region_cfg7_rd_en7_wd),
 
     // from internal hardware
@@ -2112,8 +2352,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg7_prog_en7_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg7_prog_en7_we & region_cfg_regwen_region7_qs),
     .wd     (mp_region_cfg7_prog_en7_wd),
 
     // from internal hardware
@@ -2138,8 +2378,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg7_erase_en7_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg7_erase_en7_we & region_cfg_regwen_region7_qs),
     .wd     (mp_region_cfg7_erase_en7_wd),
 
     // from internal hardware
@@ -2164,8 +2404,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg7_base7_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg7_base7_we & region_cfg_regwen_region7_qs),
     .wd     (mp_region_cfg7_base7_wd),
 
     // from internal hardware
@@ -2190,8 +2430,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_region_cfg7_size7_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_region_cfg7_size7_we & region_cfg_regwen_region7_qs),
     .wd     (mp_region_cfg7_size7_wd),
 
     // from internal hardware
@@ -2287,6 +2527,60 @@
   );
 
 
+  // R[bank_cfg_regwen]: V(False)
+
+  //   F[bank0]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_bank_cfg_regwen_bank0 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (bank_cfg_regwen_bank0_we),
+    .wd     (bank_cfg_regwen_bank0_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (bank_cfg_regwen_bank0_qs)
+  );
+
+
+  //   F[bank1]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("W0C"),
+    .RESVAL  (1'h1)
+  ) u_bank_cfg_regwen_bank1 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (bank_cfg_regwen_bank1_we),
+    .wd     (bank_cfg_regwen_bank1_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (bank_cfg_regwen_bank1_qs)
+  );
+
+
   // R[mp_bank_cfg]: V(False)
 
   //   F[erase_en0]: 1:1
@@ -2298,8 +2592,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_bank_cfg_erase_en0_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_bank_cfg_erase_en0_we & bank_cfg_regwen_bank_qs),
     .wd     (mp_bank_cfg_erase_en0_wd),
 
     // from internal hardware
@@ -2324,8 +2618,8 @@
     .clk_i   (clk_i    ),
     .rst_ni  (rst_ni  ),
 
-    // from register interface
-    .we     (mp_bank_cfg_erase_en1_we),
+    // from register interface (qualified with register enable)
+    .we     (mp_bank_cfg_erase_en1_we & bank_cfg_regwen_bank_qs),
     .wd     (mp_bank_cfg_erase_en1_wd),
 
     // from internal hardware
@@ -2584,7 +2878,7 @@
 
 
 
-  logic [18:0] addr_hit;
+  logic [20:0] addr_hit;
   always_comb begin
     addr_hit = '0;
     addr_hit[ 0] = (reg_addr == FLASH_CTRL_INTR_STATE_OFFSET);
@@ -2592,20 +2886,22 @@
     addr_hit[ 2] = (reg_addr == FLASH_CTRL_INTR_TEST_OFFSET);
     addr_hit[ 3] = (reg_addr == FLASH_CTRL_CONTROL_OFFSET);
     addr_hit[ 4] = (reg_addr == FLASH_CTRL_ADDR_OFFSET);
-    addr_hit[ 5] = (reg_addr == FLASH_CTRL_MP_REGION_CFG0_OFFSET);
-    addr_hit[ 6] = (reg_addr == FLASH_CTRL_MP_REGION_CFG1_OFFSET);
-    addr_hit[ 7] = (reg_addr == FLASH_CTRL_MP_REGION_CFG2_OFFSET);
-    addr_hit[ 8] = (reg_addr == FLASH_CTRL_MP_REGION_CFG3_OFFSET);
-    addr_hit[ 9] = (reg_addr == FLASH_CTRL_MP_REGION_CFG4_OFFSET);
-    addr_hit[10] = (reg_addr == FLASH_CTRL_MP_REGION_CFG5_OFFSET);
-    addr_hit[11] = (reg_addr == FLASH_CTRL_MP_REGION_CFG6_OFFSET);
-    addr_hit[12] = (reg_addr == FLASH_CTRL_MP_REGION_CFG7_OFFSET);
-    addr_hit[13] = (reg_addr == FLASH_CTRL_DEFAULT_REGION_OFFSET);
-    addr_hit[14] = (reg_addr == FLASH_CTRL_MP_BANK_CFG_OFFSET);
-    addr_hit[15] = (reg_addr == FLASH_CTRL_OP_STATUS_OFFSET);
-    addr_hit[16] = (reg_addr == FLASH_CTRL_STATUS_OFFSET);
-    addr_hit[17] = (reg_addr == FLASH_CTRL_SCRATCH_OFFSET);
-    addr_hit[18] = (reg_addr == FLASH_CTRL_FIFO_LVL_OFFSET);
+    addr_hit[ 5] = (reg_addr == FLASH_CTRL_REGION_CFG_REGWEN_OFFSET);
+    addr_hit[ 6] = (reg_addr == FLASH_CTRL_MP_REGION_CFG0_OFFSET);
+    addr_hit[ 7] = (reg_addr == FLASH_CTRL_MP_REGION_CFG1_OFFSET);
+    addr_hit[ 8] = (reg_addr == FLASH_CTRL_MP_REGION_CFG2_OFFSET);
+    addr_hit[ 9] = (reg_addr == FLASH_CTRL_MP_REGION_CFG3_OFFSET);
+    addr_hit[10] = (reg_addr == FLASH_CTRL_MP_REGION_CFG4_OFFSET);
+    addr_hit[11] = (reg_addr == FLASH_CTRL_MP_REGION_CFG5_OFFSET);
+    addr_hit[12] = (reg_addr == FLASH_CTRL_MP_REGION_CFG6_OFFSET);
+    addr_hit[13] = (reg_addr == FLASH_CTRL_MP_REGION_CFG7_OFFSET);
+    addr_hit[14] = (reg_addr == FLASH_CTRL_DEFAULT_REGION_OFFSET);
+    addr_hit[15] = (reg_addr == FLASH_CTRL_BANK_CFG_REGWEN_OFFSET);
+    addr_hit[16] = (reg_addr == FLASH_CTRL_MP_BANK_CFG_OFFSET);
+    addr_hit[17] = (reg_addr == FLASH_CTRL_OP_STATUS_OFFSET);
+    addr_hit[18] = (reg_addr == FLASH_CTRL_STATUS_OFFSET);
+    addr_hit[19] = (reg_addr == FLASH_CTRL_SCRATCH_OFFSET);
+    addr_hit[20] = (reg_addr == FLASH_CTRL_FIFO_LVL_OFFSET);
   end
 
   assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -2632,6 +2928,8 @@
     if (addr_hit[16] && reg_we && (FLASH_CTRL_PERMIT[16] != (FLASH_CTRL_PERMIT[16] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[17] && reg_we && (FLASH_CTRL_PERMIT[17] != (FLASH_CTRL_PERMIT[17] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[18] && reg_we && (FLASH_CTRL_PERMIT[18] != (FLASH_CTRL_PERMIT[18] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[19] && reg_we && (FLASH_CTRL_PERMIT[19] != (FLASH_CTRL_PERMIT[19] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[20] && reg_we && (FLASH_CTRL_PERMIT[20] != (FLASH_CTRL_PERMIT[20] & reg_be))) wr_err = 1'b1 ;
   end
 
   assign intr_state_prog_empty_we = addr_hit[0] & reg_we & ~wr_err;
@@ -2706,192 +3004,222 @@
   assign addr_we = addr_hit[4] & reg_we & ~wr_err;
   assign addr_wd = reg_wdata[31:0];
 
-  assign mp_region_cfg0_en0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region0_wd = reg_wdata[0];
+
+  assign region_cfg_regwen_region1_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region1_wd = reg_wdata[1];
+
+  assign region_cfg_regwen_region2_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region2_wd = reg_wdata[2];
+
+  assign region_cfg_regwen_region3_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region3_wd = reg_wdata[3];
+
+  assign region_cfg_regwen_region4_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region4_wd = reg_wdata[4];
+
+  assign region_cfg_regwen_region5_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region5_wd = reg_wdata[5];
+
+  assign region_cfg_regwen_region6_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region6_wd = reg_wdata[6];
+
+  assign region_cfg_regwen_region7_we = addr_hit[5] & reg_we & ~wr_err;
+  assign region_cfg_regwen_region7_wd = reg_wdata[7];
+
+  assign mp_region_cfg0_en0_we = addr_hit[6] & reg_we & ~wr_err;
   assign mp_region_cfg0_en0_wd = reg_wdata[0];
 
-  assign mp_region_cfg0_rd_en0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign mp_region_cfg0_rd_en0_we = addr_hit[6] & reg_we & ~wr_err;
   assign mp_region_cfg0_rd_en0_wd = reg_wdata[1];
 
-  assign mp_region_cfg0_prog_en0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign mp_region_cfg0_prog_en0_we = addr_hit[6] & reg_we & ~wr_err;
   assign mp_region_cfg0_prog_en0_wd = reg_wdata[2];
 
-  assign mp_region_cfg0_erase_en0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign mp_region_cfg0_erase_en0_we = addr_hit[6] & reg_we & ~wr_err;
   assign mp_region_cfg0_erase_en0_wd = reg_wdata[3];
 
-  assign mp_region_cfg0_base0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign mp_region_cfg0_base0_we = addr_hit[6] & reg_we & ~wr_err;
   assign mp_region_cfg0_base0_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg0_size0_we = addr_hit[5] & reg_we & ~wr_err;
+  assign mp_region_cfg0_size0_we = addr_hit[6] & reg_we & ~wr_err;
   assign mp_region_cfg0_size0_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg1_en1_we = addr_hit[6] & reg_we & ~wr_err;
+  assign mp_region_cfg1_en1_we = addr_hit[7] & reg_we & ~wr_err;
   assign mp_region_cfg1_en1_wd = reg_wdata[0];
 
-  assign mp_region_cfg1_rd_en1_we = addr_hit[6] & reg_we & ~wr_err;
+  assign mp_region_cfg1_rd_en1_we = addr_hit[7] & reg_we & ~wr_err;
   assign mp_region_cfg1_rd_en1_wd = reg_wdata[1];
 
-  assign mp_region_cfg1_prog_en1_we = addr_hit[6] & reg_we & ~wr_err;
+  assign mp_region_cfg1_prog_en1_we = addr_hit[7] & reg_we & ~wr_err;
   assign mp_region_cfg1_prog_en1_wd = reg_wdata[2];
 
-  assign mp_region_cfg1_erase_en1_we = addr_hit[6] & reg_we & ~wr_err;
+  assign mp_region_cfg1_erase_en1_we = addr_hit[7] & reg_we & ~wr_err;
   assign mp_region_cfg1_erase_en1_wd = reg_wdata[3];
 
-  assign mp_region_cfg1_base1_we = addr_hit[6] & reg_we & ~wr_err;
+  assign mp_region_cfg1_base1_we = addr_hit[7] & reg_we & ~wr_err;
   assign mp_region_cfg1_base1_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg1_size1_we = addr_hit[6] & reg_we & ~wr_err;
+  assign mp_region_cfg1_size1_we = addr_hit[7] & reg_we & ~wr_err;
   assign mp_region_cfg1_size1_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg2_en2_we = addr_hit[7] & reg_we & ~wr_err;
+  assign mp_region_cfg2_en2_we = addr_hit[8] & reg_we & ~wr_err;
   assign mp_region_cfg2_en2_wd = reg_wdata[0];
 
-  assign mp_region_cfg2_rd_en2_we = addr_hit[7] & reg_we & ~wr_err;
+  assign mp_region_cfg2_rd_en2_we = addr_hit[8] & reg_we & ~wr_err;
   assign mp_region_cfg2_rd_en2_wd = reg_wdata[1];
 
-  assign mp_region_cfg2_prog_en2_we = addr_hit[7] & reg_we & ~wr_err;
+  assign mp_region_cfg2_prog_en2_we = addr_hit[8] & reg_we & ~wr_err;
   assign mp_region_cfg2_prog_en2_wd = reg_wdata[2];
 
-  assign mp_region_cfg2_erase_en2_we = addr_hit[7] & reg_we & ~wr_err;
+  assign mp_region_cfg2_erase_en2_we = addr_hit[8] & reg_we & ~wr_err;
   assign mp_region_cfg2_erase_en2_wd = reg_wdata[3];
 
-  assign mp_region_cfg2_base2_we = addr_hit[7] & reg_we & ~wr_err;
+  assign mp_region_cfg2_base2_we = addr_hit[8] & reg_we & ~wr_err;
   assign mp_region_cfg2_base2_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg2_size2_we = addr_hit[7] & reg_we & ~wr_err;
+  assign mp_region_cfg2_size2_we = addr_hit[8] & reg_we & ~wr_err;
   assign mp_region_cfg2_size2_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg3_en3_we = addr_hit[8] & reg_we & ~wr_err;
+  assign mp_region_cfg3_en3_we = addr_hit[9] & reg_we & ~wr_err;
   assign mp_region_cfg3_en3_wd = reg_wdata[0];
 
-  assign mp_region_cfg3_rd_en3_we = addr_hit[8] & reg_we & ~wr_err;
+  assign mp_region_cfg3_rd_en3_we = addr_hit[9] & reg_we & ~wr_err;
   assign mp_region_cfg3_rd_en3_wd = reg_wdata[1];
 
-  assign mp_region_cfg3_prog_en3_we = addr_hit[8] & reg_we & ~wr_err;
+  assign mp_region_cfg3_prog_en3_we = addr_hit[9] & reg_we & ~wr_err;
   assign mp_region_cfg3_prog_en3_wd = reg_wdata[2];
 
-  assign mp_region_cfg3_erase_en3_we = addr_hit[8] & reg_we & ~wr_err;
+  assign mp_region_cfg3_erase_en3_we = addr_hit[9] & reg_we & ~wr_err;
   assign mp_region_cfg3_erase_en3_wd = reg_wdata[3];
 
-  assign mp_region_cfg3_base3_we = addr_hit[8] & reg_we & ~wr_err;
+  assign mp_region_cfg3_base3_we = addr_hit[9] & reg_we & ~wr_err;
   assign mp_region_cfg3_base3_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg3_size3_we = addr_hit[8] & reg_we & ~wr_err;
+  assign mp_region_cfg3_size3_we = addr_hit[9] & reg_we & ~wr_err;
   assign mp_region_cfg3_size3_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg4_en4_we = addr_hit[9] & reg_we & ~wr_err;
+  assign mp_region_cfg4_en4_we = addr_hit[10] & reg_we & ~wr_err;
   assign mp_region_cfg4_en4_wd = reg_wdata[0];
 
-  assign mp_region_cfg4_rd_en4_we = addr_hit[9] & reg_we & ~wr_err;
+  assign mp_region_cfg4_rd_en4_we = addr_hit[10] & reg_we & ~wr_err;
   assign mp_region_cfg4_rd_en4_wd = reg_wdata[1];
 
-  assign mp_region_cfg4_prog_en4_we = addr_hit[9] & reg_we & ~wr_err;
+  assign mp_region_cfg4_prog_en4_we = addr_hit[10] & reg_we & ~wr_err;
   assign mp_region_cfg4_prog_en4_wd = reg_wdata[2];
 
-  assign mp_region_cfg4_erase_en4_we = addr_hit[9] & reg_we & ~wr_err;
+  assign mp_region_cfg4_erase_en4_we = addr_hit[10] & reg_we & ~wr_err;
   assign mp_region_cfg4_erase_en4_wd = reg_wdata[3];
 
-  assign mp_region_cfg4_base4_we = addr_hit[9] & reg_we & ~wr_err;
+  assign mp_region_cfg4_base4_we = addr_hit[10] & reg_we & ~wr_err;
   assign mp_region_cfg4_base4_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg4_size4_we = addr_hit[9] & reg_we & ~wr_err;
+  assign mp_region_cfg4_size4_we = addr_hit[10] & reg_we & ~wr_err;
   assign mp_region_cfg4_size4_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg5_en5_we = addr_hit[10] & reg_we & ~wr_err;
+  assign mp_region_cfg5_en5_we = addr_hit[11] & reg_we & ~wr_err;
   assign mp_region_cfg5_en5_wd = reg_wdata[0];
 
-  assign mp_region_cfg5_rd_en5_we = addr_hit[10] & reg_we & ~wr_err;
+  assign mp_region_cfg5_rd_en5_we = addr_hit[11] & reg_we & ~wr_err;
   assign mp_region_cfg5_rd_en5_wd = reg_wdata[1];
 
-  assign mp_region_cfg5_prog_en5_we = addr_hit[10] & reg_we & ~wr_err;
+  assign mp_region_cfg5_prog_en5_we = addr_hit[11] & reg_we & ~wr_err;
   assign mp_region_cfg5_prog_en5_wd = reg_wdata[2];
 
-  assign mp_region_cfg5_erase_en5_we = addr_hit[10] & reg_we & ~wr_err;
+  assign mp_region_cfg5_erase_en5_we = addr_hit[11] & reg_we & ~wr_err;
   assign mp_region_cfg5_erase_en5_wd = reg_wdata[3];
 
-  assign mp_region_cfg5_base5_we = addr_hit[10] & reg_we & ~wr_err;
+  assign mp_region_cfg5_base5_we = addr_hit[11] & reg_we & ~wr_err;
   assign mp_region_cfg5_base5_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg5_size5_we = addr_hit[10] & reg_we & ~wr_err;
+  assign mp_region_cfg5_size5_we = addr_hit[11] & reg_we & ~wr_err;
   assign mp_region_cfg5_size5_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg6_en6_we = addr_hit[11] & reg_we & ~wr_err;
+  assign mp_region_cfg6_en6_we = addr_hit[12] & reg_we & ~wr_err;
   assign mp_region_cfg6_en6_wd = reg_wdata[0];
 
-  assign mp_region_cfg6_rd_en6_we = addr_hit[11] & reg_we & ~wr_err;
+  assign mp_region_cfg6_rd_en6_we = addr_hit[12] & reg_we & ~wr_err;
   assign mp_region_cfg6_rd_en6_wd = reg_wdata[1];
 
-  assign mp_region_cfg6_prog_en6_we = addr_hit[11] & reg_we & ~wr_err;
+  assign mp_region_cfg6_prog_en6_we = addr_hit[12] & reg_we & ~wr_err;
   assign mp_region_cfg6_prog_en6_wd = reg_wdata[2];
 
-  assign mp_region_cfg6_erase_en6_we = addr_hit[11] & reg_we & ~wr_err;
+  assign mp_region_cfg6_erase_en6_we = addr_hit[12] & reg_we & ~wr_err;
   assign mp_region_cfg6_erase_en6_wd = reg_wdata[3];
 
-  assign mp_region_cfg6_base6_we = addr_hit[11] & reg_we & ~wr_err;
+  assign mp_region_cfg6_base6_we = addr_hit[12] & reg_we & ~wr_err;
   assign mp_region_cfg6_base6_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg6_size6_we = addr_hit[11] & reg_we & ~wr_err;
+  assign mp_region_cfg6_size6_we = addr_hit[12] & reg_we & ~wr_err;
   assign mp_region_cfg6_size6_wd = reg_wdata[24:16];
 
-  assign mp_region_cfg7_en7_we = addr_hit[12] & reg_we & ~wr_err;
+  assign mp_region_cfg7_en7_we = addr_hit[13] & reg_we & ~wr_err;
   assign mp_region_cfg7_en7_wd = reg_wdata[0];
 
-  assign mp_region_cfg7_rd_en7_we = addr_hit[12] & reg_we & ~wr_err;
+  assign mp_region_cfg7_rd_en7_we = addr_hit[13] & reg_we & ~wr_err;
   assign mp_region_cfg7_rd_en7_wd = reg_wdata[1];
 
-  assign mp_region_cfg7_prog_en7_we = addr_hit[12] & reg_we & ~wr_err;
+  assign mp_region_cfg7_prog_en7_we = addr_hit[13] & reg_we & ~wr_err;
   assign mp_region_cfg7_prog_en7_wd = reg_wdata[2];
 
-  assign mp_region_cfg7_erase_en7_we = addr_hit[12] & reg_we & ~wr_err;
+  assign mp_region_cfg7_erase_en7_we = addr_hit[13] & reg_we & ~wr_err;
   assign mp_region_cfg7_erase_en7_wd = reg_wdata[3];
 
-  assign mp_region_cfg7_base7_we = addr_hit[12] & reg_we & ~wr_err;
+  assign mp_region_cfg7_base7_we = addr_hit[13] & reg_we & ~wr_err;
   assign mp_region_cfg7_base7_wd = reg_wdata[12:4];
 
-  assign mp_region_cfg7_size7_we = addr_hit[12] & reg_we & ~wr_err;
+  assign mp_region_cfg7_size7_we = addr_hit[13] & reg_we & ~wr_err;
   assign mp_region_cfg7_size7_wd = reg_wdata[24:16];
 
-  assign default_region_rd_en_we = addr_hit[13] & reg_we & ~wr_err;
+  assign default_region_rd_en_we = addr_hit[14] & reg_we & ~wr_err;
   assign default_region_rd_en_wd = reg_wdata[0];
 
-  assign default_region_prog_en_we = addr_hit[13] & reg_we & ~wr_err;
+  assign default_region_prog_en_we = addr_hit[14] & reg_we & ~wr_err;
   assign default_region_prog_en_wd = reg_wdata[1];
 
-  assign default_region_erase_en_we = addr_hit[13] & reg_we & ~wr_err;
+  assign default_region_erase_en_we = addr_hit[14] & reg_we & ~wr_err;
   assign default_region_erase_en_wd = reg_wdata[2];
 
-  assign mp_bank_cfg_erase_en0_we = addr_hit[14] & reg_we & ~wr_err;
+  assign bank_cfg_regwen_bank0_we = addr_hit[15] & reg_we & ~wr_err;
+  assign bank_cfg_regwen_bank0_wd = reg_wdata[0];
+
+  assign bank_cfg_regwen_bank1_we = addr_hit[15] & reg_we & ~wr_err;
+  assign bank_cfg_regwen_bank1_wd = reg_wdata[1];
+
+  assign mp_bank_cfg_erase_en0_we = addr_hit[16] & reg_we & ~wr_err;
   assign mp_bank_cfg_erase_en0_wd = reg_wdata[1];
 
-  assign mp_bank_cfg_erase_en1_we = addr_hit[14] & reg_we & ~wr_err;
+  assign mp_bank_cfg_erase_en1_we = addr_hit[16] & reg_we & ~wr_err;
   assign mp_bank_cfg_erase_en1_wd = reg_wdata[2];
 
-  assign op_status_done_we = addr_hit[15] & reg_we & ~wr_err;
+  assign op_status_done_we = addr_hit[17] & reg_we & ~wr_err;
   assign op_status_done_wd = reg_wdata[0];
 
-  assign op_status_err_we = addr_hit[15] & reg_we & ~wr_err;
+  assign op_status_err_we = addr_hit[17] & reg_we & ~wr_err;
   assign op_status_err_wd = reg_wdata[1];
 
-  assign status_rd_full_re = addr_hit[16] && reg_re;
+  assign status_rd_full_re = addr_hit[18] && reg_re;
 
-  assign status_rd_empty_re = addr_hit[16] && reg_re;
+  assign status_rd_empty_re = addr_hit[18] && reg_re;
 
-  assign status_prog_full_re = addr_hit[16] && reg_re;
+  assign status_prog_full_re = addr_hit[18] && reg_re;
 
-  assign status_prog_empty_re = addr_hit[16] && reg_re;
+  assign status_prog_empty_re = addr_hit[18] && reg_re;
 
-  assign status_init_wip_re = addr_hit[16] && reg_re;
+  assign status_init_wip_re = addr_hit[18] && reg_re;
 
-  assign status_error_page_re = addr_hit[16] && reg_re;
+  assign status_error_page_re = addr_hit[18] && reg_re;
 
-  assign status_error_bank_re = addr_hit[16] && reg_re;
+  assign status_error_bank_re = addr_hit[18] && reg_re;
 
-  assign scratch_we = addr_hit[17] & reg_we & ~wr_err;
+  assign scratch_we = addr_hit[19] & reg_we & ~wr_err;
   assign scratch_wd = reg_wdata[31:0];
 
-  assign fifo_lvl_prog_we = addr_hit[18] & reg_we & ~wr_err;
+  assign fifo_lvl_prog_we = addr_hit[20] & reg_we & ~wr_err;
   assign fifo_lvl_prog_wd = reg_wdata[4:0];
 
-  assign fifo_lvl_rd_we = addr_hit[18] & reg_we & ~wr_err;
+  assign fifo_lvl_rd_we = addr_hit[20] & reg_we & ~wr_err;
   assign fifo_lvl_rd_wd = reg_wdata[12:8];
 
   // Read data return
@@ -2938,6 +3266,17 @@
       end
 
       addr_hit[5]: begin
+        reg_rdata_next[0] = region_cfg_regwen_region0_qs;
+        reg_rdata_next[1] = region_cfg_regwen_region1_qs;
+        reg_rdata_next[2] = region_cfg_regwen_region2_qs;
+        reg_rdata_next[3] = region_cfg_regwen_region3_qs;
+        reg_rdata_next[4] = region_cfg_regwen_region4_qs;
+        reg_rdata_next[5] = region_cfg_regwen_region5_qs;
+        reg_rdata_next[6] = region_cfg_regwen_region6_qs;
+        reg_rdata_next[7] = region_cfg_regwen_region7_qs;
+      end
+
+      addr_hit[6]: begin
         reg_rdata_next[0] = mp_region_cfg0_en0_qs;
         reg_rdata_next[1] = mp_region_cfg0_rd_en0_qs;
         reg_rdata_next[2] = mp_region_cfg0_prog_en0_qs;
@@ -2946,7 +3285,7 @@
         reg_rdata_next[24:16] = mp_region_cfg0_size0_qs;
       end
 
-      addr_hit[6]: begin
+      addr_hit[7]: begin
         reg_rdata_next[0] = mp_region_cfg1_en1_qs;
         reg_rdata_next[1] = mp_region_cfg1_rd_en1_qs;
         reg_rdata_next[2] = mp_region_cfg1_prog_en1_qs;
@@ -2955,7 +3294,7 @@
         reg_rdata_next[24:16] = mp_region_cfg1_size1_qs;
       end
 
-      addr_hit[7]: begin
+      addr_hit[8]: begin
         reg_rdata_next[0] = mp_region_cfg2_en2_qs;
         reg_rdata_next[1] = mp_region_cfg2_rd_en2_qs;
         reg_rdata_next[2] = mp_region_cfg2_prog_en2_qs;
@@ -2964,7 +3303,7 @@
         reg_rdata_next[24:16] = mp_region_cfg2_size2_qs;
       end
 
-      addr_hit[8]: begin
+      addr_hit[9]: begin
         reg_rdata_next[0] = mp_region_cfg3_en3_qs;
         reg_rdata_next[1] = mp_region_cfg3_rd_en3_qs;
         reg_rdata_next[2] = mp_region_cfg3_prog_en3_qs;
@@ -2973,7 +3312,7 @@
         reg_rdata_next[24:16] = mp_region_cfg3_size3_qs;
       end
 
-      addr_hit[9]: begin
+      addr_hit[10]: begin
         reg_rdata_next[0] = mp_region_cfg4_en4_qs;
         reg_rdata_next[1] = mp_region_cfg4_rd_en4_qs;
         reg_rdata_next[2] = mp_region_cfg4_prog_en4_qs;
@@ -2982,7 +3321,7 @@
         reg_rdata_next[24:16] = mp_region_cfg4_size4_qs;
       end
 
-      addr_hit[10]: begin
+      addr_hit[11]: begin
         reg_rdata_next[0] = mp_region_cfg5_en5_qs;
         reg_rdata_next[1] = mp_region_cfg5_rd_en5_qs;
         reg_rdata_next[2] = mp_region_cfg5_prog_en5_qs;
@@ -2991,7 +3330,7 @@
         reg_rdata_next[24:16] = mp_region_cfg5_size5_qs;
       end
 
-      addr_hit[11]: begin
+      addr_hit[12]: begin
         reg_rdata_next[0] = mp_region_cfg6_en6_qs;
         reg_rdata_next[1] = mp_region_cfg6_rd_en6_qs;
         reg_rdata_next[2] = mp_region_cfg6_prog_en6_qs;
@@ -3000,7 +3339,7 @@
         reg_rdata_next[24:16] = mp_region_cfg6_size6_qs;
       end
 
-      addr_hit[12]: begin
+      addr_hit[13]: begin
         reg_rdata_next[0] = mp_region_cfg7_en7_qs;
         reg_rdata_next[1] = mp_region_cfg7_rd_en7_qs;
         reg_rdata_next[2] = mp_region_cfg7_prog_en7_qs;
@@ -3009,23 +3348,28 @@
         reg_rdata_next[24:16] = mp_region_cfg7_size7_qs;
       end
 
-      addr_hit[13]: begin
+      addr_hit[14]: begin
         reg_rdata_next[0] = default_region_rd_en_qs;
         reg_rdata_next[1] = default_region_prog_en_qs;
         reg_rdata_next[2] = default_region_erase_en_qs;
       end
 
-      addr_hit[14]: begin
+      addr_hit[15]: begin
+        reg_rdata_next[0] = bank_cfg_regwen_bank0_qs;
+        reg_rdata_next[1] = bank_cfg_regwen_bank1_qs;
+      end
+
+      addr_hit[16]: begin
         reg_rdata_next[1] = mp_bank_cfg_erase_en0_qs;
         reg_rdata_next[2] = mp_bank_cfg_erase_en1_qs;
       end
 
-      addr_hit[15]: begin
+      addr_hit[17]: begin
         reg_rdata_next[0] = op_status_done_qs;
         reg_rdata_next[1] = op_status_err_qs;
       end
 
-      addr_hit[16]: begin
+      addr_hit[18]: begin
         reg_rdata_next[0] = status_rd_full_qs;
         reg_rdata_next[1] = status_rd_empty_qs;
         reg_rdata_next[2] = status_prog_full_qs;
@@ -3035,11 +3379,11 @@
         reg_rdata_next[17] = status_error_bank_qs;
       end
 
-      addr_hit[17]: begin
+      addr_hit[19]: begin
         reg_rdata_next[31:0] = scratch_qs;
       end
 
-      addr_hit[18]: begin
+      addr_hit[20]: begin
         reg_rdata_next[4:0] = fifo_lvl_prog_qs;
         reg_rdata_next[12:8] = fifo_lvl_rd_qs;
       end
diff --git a/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h b/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h
index 54dba3e..13cfa46 100644
--- a/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h
+++ b/hw/ip/flash_ctrl/sw/flash_ctrl_regs.h
@@ -53,8 +53,19 @@
 // Address for flash operation
 #define FLASH_CTRL_ADDR(id) (FLASH_CTRL##id##_BASE_ADDR + 0x10)
 
+// Memory region registers configuration enable.
+#define FLASH_CTRL_REGION_CFG_REGWEN(id) (FLASH_CTRL##id##_BASE_ADDR + 0x14)
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION0 0
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION1 1
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION2 2
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION3 3
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION4 4
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION5 5
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION6 6
+#define FLASH_CTRL_REGION_CFG_REGWEN_REGION7 7
+
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG0(id) (FLASH_CTRL##id##_BASE_ADDR + 0x14)
+#define FLASH_CTRL_MP_REGION_CFG0(id) (FLASH_CTRL##id##_BASE_ADDR + 0x18)
 #define FLASH_CTRL_MP_REGION_CFG0_EN0 0
 #define FLASH_CTRL_MP_REGION_CFG0_RD_EN0 1
 #define FLASH_CTRL_MP_REGION_CFG0_PROG_EN0 2
@@ -65,7 +76,7 @@
 #define FLASH_CTRL_MP_REGION_CFG0_SIZE0_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG1(id) (FLASH_CTRL##id##_BASE_ADDR + 0x18)
+#define FLASH_CTRL_MP_REGION_CFG1(id) (FLASH_CTRL##id##_BASE_ADDR + 0x1c)
 #define FLASH_CTRL_MP_REGION_CFG1_EN1 0
 #define FLASH_CTRL_MP_REGION_CFG1_RD_EN1 1
 #define FLASH_CTRL_MP_REGION_CFG1_PROG_EN1 2
@@ -76,7 +87,7 @@
 #define FLASH_CTRL_MP_REGION_CFG1_SIZE1_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG2(id) (FLASH_CTRL##id##_BASE_ADDR + 0x1c)
+#define FLASH_CTRL_MP_REGION_CFG2(id) (FLASH_CTRL##id##_BASE_ADDR + 0x20)
 #define FLASH_CTRL_MP_REGION_CFG2_EN2 0
 #define FLASH_CTRL_MP_REGION_CFG2_RD_EN2 1
 #define FLASH_CTRL_MP_REGION_CFG2_PROG_EN2 2
@@ -87,7 +98,7 @@
 #define FLASH_CTRL_MP_REGION_CFG2_SIZE2_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG3(id) (FLASH_CTRL##id##_BASE_ADDR + 0x20)
+#define FLASH_CTRL_MP_REGION_CFG3(id) (FLASH_CTRL##id##_BASE_ADDR + 0x24)
 #define FLASH_CTRL_MP_REGION_CFG3_EN3 0
 #define FLASH_CTRL_MP_REGION_CFG3_RD_EN3 1
 #define FLASH_CTRL_MP_REGION_CFG3_PROG_EN3 2
@@ -98,7 +109,7 @@
 #define FLASH_CTRL_MP_REGION_CFG3_SIZE3_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG4(id) (FLASH_CTRL##id##_BASE_ADDR + 0x24)
+#define FLASH_CTRL_MP_REGION_CFG4(id) (FLASH_CTRL##id##_BASE_ADDR + 0x28)
 #define FLASH_CTRL_MP_REGION_CFG4_EN4 0
 #define FLASH_CTRL_MP_REGION_CFG4_RD_EN4 1
 #define FLASH_CTRL_MP_REGION_CFG4_PROG_EN4 2
@@ -109,7 +120,7 @@
 #define FLASH_CTRL_MP_REGION_CFG4_SIZE4_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG5(id) (FLASH_CTRL##id##_BASE_ADDR + 0x28)
+#define FLASH_CTRL_MP_REGION_CFG5(id) (FLASH_CTRL##id##_BASE_ADDR + 0x2c)
 #define FLASH_CTRL_MP_REGION_CFG5_EN5 0
 #define FLASH_CTRL_MP_REGION_CFG5_RD_EN5 1
 #define FLASH_CTRL_MP_REGION_CFG5_PROG_EN5 2
@@ -120,7 +131,7 @@
 #define FLASH_CTRL_MP_REGION_CFG5_SIZE5_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG6(id) (FLASH_CTRL##id##_BASE_ADDR + 0x2c)
+#define FLASH_CTRL_MP_REGION_CFG6(id) (FLASH_CTRL##id##_BASE_ADDR + 0x30)
 #define FLASH_CTRL_MP_REGION_CFG6_EN6 0
 #define FLASH_CTRL_MP_REGION_CFG6_RD_EN6 1
 #define FLASH_CTRL_MP_REGION_CFG6_PROG_EN6 2
@@ -131,7 +142,7 @@
 #define FLASH_CTRL_MP_REGION_CFG6_SIZE6_OFFSET 16
 
 // Memory protection configuration
-#define FLASH_CTRL_MP_REGION_CFG7(id) (FLASH_CTRL##id##_BASE_ADDR + 0x30)
+#define FLASH_CTRL_MP_REGION_CFG7(id) (FLASH_CTRL##id##_BASE_ADDR + 0x34)
 #define FLASH_CTRL_MP_REGION_CFG7_EN7 0
 #define FLASH_CTRL_MP_REGION_CFG7_RD_EN7 1
 #define FLASH_CTRL_MP_REGION_CFG7_PROG_EN7 2
@@ -142,23 +153,28 @@
 #define FLASH_CTRL_MP_REGION_CFG7_SIZE7_OFFSET 16
 
 // Default region permissions
-#define FLASH_CTRL_DEFAULT_REGION(id) (FLASH_CTRL##id##_BASE_ADDR + 0x34)
+#define FLASH_CTRL_DEFAULT_REGION(id) (FLASH_CTRL##id##_BASE_ADDR + 0x38)
 #define FLASH_CTRL_DEFAULT_REGION_RD_EN 0
 #define FLASH_CTRL_DEFAULT_REGION_PROG_EN 1
 #define FLASH_CTRL_DEFAULT_REGION_ERASE_EN 2
 
+// Bank configuration registers configuration enable.
+#define FLASH_CTRL_BANK_CFG_REGWEN(id) (FLASH_CTRL##id##_BASE_ADDR + 0x3c)
+#define FLASH_CTRL_BANK_CFG_REGWEN_BANK0 0
+#define FLASH_CTRL_BANK_CFG_REGWEN_BANK1 1
+
 // Memory protect bank configuration
-#define FLASH_CTRL_MP_BANK_CFG(id) (FLASH_CTRL##id##_BASE_ADDR + 0x38)
+#define FLASH_CTRL_MP_BANK_CFG(id) (FLASH_CTRL##id##_BASE_ADDR + 0x40)
 #define FLASH_CTRL_MP_BANK_CFG_ERASE_EN0 1
 #define FLASH_CTRL_MP_BANK_CFG_ERASE_EN1 2
 
 // Flash Operation Status
-#define FLASH_CTRL_OP_STATUS(id) (FLASH_CTRL##id##_BASE_ADDR + 0x3c)
+#define FLASH_CTRL_OP_STATUS(id) (FLASH_CTRL##id##_BASE_ADDR + 0x44)
 #define FLASH_CTRL_OP_STATUS_DONE 0
 #define FLASH_CTRL_OP_STATUS_ERR 1
 
 // Flash Controller Status
-#define FLASH_CTRL_STATUS(id) (FLASH_CTRL##id##_BASE_ADDR + 0x40)
+#define FLASH_CTRL_STATUS(id) (FLASH_CTRL##id##_BASE_ADDR + 0x48)
 #define FLASH_CTRL_STATUS_RD_FULL 0
 #define FLASH_CTRL_STATUS_RD_EMPTY 1
 #define FLASH_CTRL_STATUS_PROG_FULL 2
@@ -169,21 +185,21 @@
 #define FLASH_CTRL_STATUS_ERROR_BANK 17
 
 // Flash Controller Scratch
-#define FLASH_CTRL_SCRATCH(id) (FLASH_CTRL##id##_BASE_ADDR + 0x44)
+#define FLASH_CTRL_SCRATCH(id) (FLASH_CTRL##id##_BASE_ADDR + 0x4c)
 
 // Programmable depth where fifos should generate interrupts
-#define FLASH_CTRL_FIFO_LVL(id) (FLASH_CTRL##id##_BASE_ADDR + 0x48)
+#define FLASH_CTRL_FIFO_LVL(id) (FLASH_CTRL##id##_BASE_ADDR + 0x50)
 #define FLASH_CTRL_FIFO_LVL_PROG_MASK 0x1f
 #define FLASH_CTRL_FIFO_LVL_PROG_OFFSET 0
 #define FLASH_CTRL_FIFO_LVL_RD_MASK 0x1f
 #define FLASH_CTRL_FIFO_LVL_RD_OFFSET 8
 
 // Memory area: Flash program fifo.
-#define FLASH_CTRL_PROG_FIFO(id) (FLASH_CTRL##id##_BASE_ADDR + 0x4c)
+#define FLASH_CTRL_PROG_FIFO(id) (FLASH_CTRL##id##_BASE_ADDR + 0x54)
 #define FLASH_CTRL_PROG_FIFO_SIZE_WORDS 1
 #define FLASH_CTRL_PROG_FIFO_SIZE_BYTES 4
 // Memory area: Flash read fifo.
-#define FLASH_CTRL_RD_FIFO(id) (FLASH_CTRL##id##_BASE_ADDR + 0x50)
+#define FLASH_CTRL_RD_FIFO(id) (FLASH_CTRL##id##_BASE_ADDR + 0x58)
 #define FLASH_CTRL_RD_FIFO_SIZE_WORDS 1
 #define FLASH_CTRL_RD_FIFO_SIZE_BYTES 4
 #endif  // _FLASH_CTRL_REG_DEFS_
diff --git a/hw/top_earlgrey/dv/env/chip_reg_block.sv b/hw/top_earlgrey/dv/env/chip_reg_block.sv
index c89bf67..46f842c 100644
--- a/hw/top_earlgrey/dv/env/chip_reg_block.sv
+++ b/hw/top_earlgrey/dv/env/chip_reg_block.sv
@@ -6,6 +6,74 @@
 // Do Not Edit directly
 
 // Forward declare all register/memory/block classes
+typedef class spi_device_reg_intr_state;
+typedef class spi_device_reg_intr_enable;
+typedef class spi_device_reg_intr_test;
+typedef class spi_device_reg_control;
+typedef class spi_device_reg_cfg;
+typedef class spi_device_reg_fifo_level;
+typedef class spi_device_reg_async_fifo_level;
+typedef class spi_device_reg_status;
+typedef class spi_device_reg_rxf_ptr;
+typedef class spi_device_reg_txf_ptr;
+typedef class spi_device_reg_rxf_addr;
+typedef class spi_device_reg_txf_addr;
+typedef class spi_device_mem_buffer;
+typedef class spi_device_reg_block;
+
+typedef class flash_ctrl_reg_intr_state;
+typedef class flash_ctrl_reg_intr_enable;
+typedef class flash_ctrl_reg_intr_test;
+typedef class flash_ctrl_reg_control;
+typedef class flash_ctrl_reg_addr;
+typedef class flash_ctrl_reg_region_cfg_regwen;
+typedef class flash_ctrl_reg_mp_region_cfg0;
+typedef class flash_ctrl_reg_mp_region_cfg1;
+typedef class flash_ctrl_reg_mp_region_cfg2;
+typedef class flash_ctrl_reg_mp_region_cfg3;
+typedef class flash_ctrl_reg_mp_region_cfg4;
+typedef class flash_ctrl_reg_mp_region_cfg5;
+typedef class flash_ctrl_reg_mp_region_cfg6;
+typedef class flash_ctrl_reg_mp_region_cfg7;
+typedef class flash_ctrl_reg_default_region;
+typedef class flash_ctrl_reg_bank_cfg_regwen;
+typedef class flash_ctrl_reg_mp_bank_cfg;
+typedef class flash_ctrl_reg_op_status;
+typedef class flash_ctrl_reg_status;
+typedef class flash_ctrl_reg_scratch;
+typedef class flash_ctrl_reg_fifo_lvl;
+typedef class flash_ctrl_mem_prog_fifo;
+typedef class flash_ctrl_mem_rd_fifo;
+typedef class flash_ctrl_reg_block;
+
+typedef class rv_timer_reg_ctrl;
+typedef class rv_timer_reg_cfg0;
+typedef class rv_timer_reg_timer_v_lower0;
+typedef class rv_timer_reg_timer_v_upper0;
+typedef class rv_timer_reg_compare_lower0_0;
+typedef class rv_timer_reg_compare_upper0_0;
+typedef class rv_timer_reg_intr_enable0;
+typedef class rv_timer_reg_intr_state0;
+typedef class rv_timer_reg_intr_test0;
+typedef class rv_timer_reg_block;
+
+typedef class gpio_reg_intr_state;
+typedef class gpio_reg_intr_enable;
+typedef class gpio_reg_intr_test;
+typedef class gpio_reg_data_in;
+typedef class gpio_reg_direct_out;
+typedef class gpio_reg_masked_out_lower;
+typedef class gpio_reg_masked_out_upper;
+typedef class gpio_reg_direct_oe;
+typedef class gpio_reg_masked_oe_lower;
+typedef class gpio_reg_masked_oe_upper;
+typedef class gpio_reg_intr_ctrl_en_rising;
+typedef class gpio_reg_intr_ctrl_en_falling;
+typedef class gpio_reg_intr_ctrl_en_lvlhigh;
+typedef class gpio_reg_intr_ctrl_en_lvllow;
+typedef class gpio_reg_ctrl_en_input_filter;
+typedef class gpio_reg_block;
+
 typedef class hmac_reg_intr_state;
 typedef class hmac_reg_intr_enable;
 typedef class hmac_reg_intr_test;
@@ -34,46 +102,6 @@
 typedef class hmac_mem_msg_fifo;
 typedef class hmac_reg_block;
 
-typedef class gpio_reg_intr_state;
-typedef class gpio_reg_intr_enable;
-typedef class gpio_reg_intr_test;
-typedef class gpio_reg_data_in;
-typedef class gpio_reg_direct_out;
-typedef class gpio_reg_masked_out_lower;
-typedef class gpio_reg_masked_out_upper;
-typedef class gpio_reg_direct_oe;
-typedef class gpio_reg_masked_oe_lower;
-typedef class gpio_reg_masked_oe_upper;
-typedef class gpio_reg_intr_ctrl_en_rising;
-typedef class gpio_reg_intr_ctrl_en_falling;
-typedef class gpio_reg_intr_ctrl_en_lvlhigh;
-typedef class gpio_reg_intr_ctrl_en_lvllow;
-typedef class gpio_reg_ctrl_en_input_filter;
-typedef class gpio_reg_block;
-
-typedef class flash_ctrl_reg_intr_state;
-typedef class flash_ctrl_reg_intr_enable;
-typedef class flash_ctrl_reg_intr_test;
-typedef class flash_ctrl_reg_control;
-typedef class flash_ctrl_reg_addr;
-typedef class flash_ctrl_reg_mp_region_cfg0;
-typedef class flash_ctrl_reg_mp_region_cfg1;
-typedef class flash_ctrl_reg_mp_region_cfg2;
-typedef class flash_ctrl_reg_mp_region_cfg3;
-typedef class flash_ctrl_reg_mp_region_cfg4;
-typedef class flash_ctrl_reg_mp_region_cfg5;
-typedef class flash_ctrl_reg_mp_region_cfg6;
-typedef class flash_ctrl_reg_mp_region_cfg7;
-typedef class flash_ctrl_reg_default_region;
-typedef class flash_ctrl_reg_mp_bank_cfg;
-typedef class flash_ctrl_reg_op_status;
-typedef class flash_ctrl_reg_status;
-typedef class flash_ctrl_reg_scratch;
-typedef class flash_ctrl_reg_fifo_lvl;
-typedef class flash_ctrl_mem_prog_fifo;
-typedef class flash_ctrl_mem_rd_fifo;
-typedef class flash_ctrl_reg_block;
-
 typedef class uart_reg_intr_state;
 typedef class uart_reg_intr_enable;
 typedef class uart_reg_intr_test;
@@ -88,32 +116,6 @@
 typedef class uart_reg_timeout_ctrl;
 typedef class uart_reg_block;
 
-typedef class spi_device_reg_intr_state;
-typedef class spi_device_reg_intr_enable;
-typedef class spi_device_reg_intr_test;
-typedef class spi_device_reg_control;
-typedef class spi_device_reg_cfg;
-typedef class spi_device_reg_fifo_level;
-typedef class spi_device_reg_async_fifo_level;
-typedef class spi_device_reg_status;
-typedef class spi_device_reg_rxf_ptr;
-typedef class spi_device_reg_txf_ptr;
-typedef class spi_device_reg_rxf_addr;
-typedef class spi_device_reg_txf_addr;
-typedef class spi_device_mem_buffer;
-typedef class spi_device_reg_block;
-
-typedef class rv_timer_reg_ctrl;
-typedef class rv_timer_reg_cfg0;
-typedef class rv_timer_reg_timer_v_lower0;
-typedef class rv_timer_reg_timer_v_upper0;
-typedef class rv_timer_reg_compare_lower0_0;
-typedef class rv_timer_reg_compare_upper0_0;
-typedef class rv_timer_reg_intr_enable0;
-typedef class rv_timer_reg_intr_state0;
-typedef class rv_timer_reg_intr_test0;
-typedef class rv_timer_reg_block;
-
 typedef class rv_plic_reg_ip0;
 typedef class rv_plic_reg_ip1;
 typedef class rv_plic_reg_le0;
@@ -184,6 +186,3672 @@
 typedef class chip_mem_eflash;
 typedef class chip_reg_block;
 
+// Block: spi_device
+// Class: spi_device_reg_intr_state
+class spi_device_reg_intr_state extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rxf;
+  rand dv_base_reg_field rxlvl;
+  rand dv_base_reg_field txlvl;
+  rand dv_base_reg_field rxerr;
+  rand dv_base_reg_field rxoverflow;
+  rand dv_base_reg_field txunderflow;
+
+  `uvm_object_utils(spi_device_reg_intr_state)
+
+  function new(string       name = "spi_device_reg_intr_state",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rxf = dv_base_reg_field::type_id::create("rxf");
+    rxf.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
+    rxlvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txlvl = dv_base_reg_field::type_id::create("txlvl");
+    txlvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxerr = dv_base_reg_field::type_id::create("rxerr");
+    rxerr.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxoverflow = dv_base_reg_field::type_id::create("rxoverflow");
+    rxoverflow.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txunderflow = dv_base_reg_field::type_id::create("txunderflow");
+    txunderflow.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_intr_state
+
+// Class: spi_device_reg_intr_enable
+class spi_device_reg_intr_enable extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rxf;
+  rand dv_base_reg_field rxlvl;
+  rand dv_base_reg_field txlvl;
+  rand dv_base_reg_field rxerr;
+  rand dv_base_reg_field rxoverflow;
+  rand dv_base_reg_field txunderflow;
+
+  `uvm_object_utils(spi_device_reg_intr_enable)
+
+  function new(string       name = "spi_device_reg_intr_enable",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rxf = dv_base_reg_field::type_id::create("rxf");
+    rxf.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
+    rxlvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txlvl = dv_base_reg_field::type_id::create("txlvl");
+    txlvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxerr = dv_base_reg_field::type_id::create("rxerr");
+    rxerr.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxoverflow = dv_base_reg_field::type_id::create("rxoverflow");
+    rxoverflow.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txunderflow = dv_base_reg_field::type_id::create("txunderflow");
+    txunderflow.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_intr_enable
+
+// Class: spi_device_reg_intr_test
+class spi_device_reg_intr_test extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rxf;
+  rand dv_base_reg_field rxlvl;
+  rand dv_base_reg_field txlvl;
+  rand dv_base_reg_field rxerr;
+  rand dv_base_reg_field rxoverflow;
+  rand dv_base_reg_field txunderflow;
+
+  `uvm_object_utils(spi_device_reg_intr_test)
+
+  function new(string       name = "spi_device_reg_intr_test",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rxf = dv_base_reg_field::type_id::create("rxf");
+    rxf.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
+    rxlvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txlvl = dv_base_reg_field::type_id::create("txlvl");
+    txlvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxerr = dv_base_reg_field::type_id::create("rxerr");
+    rxerr.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxoverflow = dv_base_reg_field::type_id::create("rxoverflow");
+    rxoverflow.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txunderflow = dv_base_reg_field::type_id::create("txunderflow");
+    txunderflow.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_intr_test
+
+// Class: spi_device_reg_control
+class spi_device_reg_control extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field abort;
+  rand dv_base_reg_field mode;
+  rand dv_base_reg_field rst_txfifo;
+  rand dv_base_reg_field rst_rxfifo;
+
+  `uvm_object_utils(spi_device_reg_control)
+
+  function new(string       name = "spi_device_reg_control",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    abort = dv_base_reg_field::type_id::create("abort");
+    abort.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    mode = dv_base_reg_field::type_id::create("mode");
+    mode.configure(
+      .parent(this),
+      .size(2),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rst_txfifo = dv_base_reg_field::type_id::create("rst_txfifo");
+    rst_txfifo.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rst_rxfifo = dv_base_reg_field::type_id::create("rst_rxfifo");
+    rst_rxfifo.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(17),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_control
+
+// Class: spi_device_reg_cfg
+class spi_device_reg_cfg extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field cpol;
+  rand dv_base_reg_field cpha;
+  rand dv_base_reg_field tx_order;
+  rand dv_base_reg_field rx_order;
+  rand dv_base_reg_field timer_v;
+
+  `uvm_object_utils(spi_device_reg_cfg)
+
+  function new(string       name = "spi_device_reg_cfg",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    cpol = dv_base_reg_field::type_id::create("cpol");
+    cpol.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    cpha = dv_base_reg_field::type_id::create("cpha");
+    cpha.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    tx_order = dv_base_reg_field::type_id::create("tx_order");
+    tx_order.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rx_order = dv_base_reg_field::type_id::create("rx_order");
+    rx_order.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    timer_v = dv_base_reg_field::type_id::create("timer_v");
+    timer_v.configure(
+      .parent(this),
+      .size(8),
+      .lsb_pos(8),
+      .access("RW"),
+      .volatile(0),
+      .reset(127),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_cfg
+
+// Class: spi_device_reg_fifo_level
+class spi_device_reg_fifo_level extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rxlvl;
+  rand dv_base_reg_field txlvl;
+
+  `uvm_object_utils(spi_device_reg_fifo_level)
+
+  function new(string       name = "spi_device_reg_fifo_level",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
+    rxlvl.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(128),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txlvl = dv_base_reg_field::type_id::create("txlvl");
+    txlvl.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_fifo_level
+
+// Class: spi_device_reg_async_fifo_level
+class spi_device_reg_async_fifo_level extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rxlvl;
+  rand dv_base_reg_field txlvl;
+
+  `uvm_object_utils(spi_device_reg_async_fifo_level)
+
+  function new(string       name = "spi_device_reg_async_fifo_level",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
+    rxlvl.configure(
+      .parent(this),
+      .size(8),
+      .lsb_pos(0),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txlvl = dv_base_reg_field::type_id::create("txlvl");
+    txlvl.configure(
+      .parent(this),
+      .size(8),
+      .lsb_pos(16),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_async_fifo_level
+
+// Class: spi_device_reg_status
+class spi_device_reg_status extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rxf_full;
+  rand dv_base_reg_field rxf_empty;
+  rand dv_base_reg_field txf_full;
+  rand dv_base_reg_field txf_empty;
+  rand dv_base_reg_field abort_done;
+  rand dv_base_reg_field csb;
+
+  `uvm_object_utils(spi_device_reg_status)
+
+  function new(string       name = "spi_device_reg_status",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rxf_full = dv_base_reg_field::type_id::create("rxf_full");
+    rxf_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rxf_empty = dv_base_reg_field::type_id::create("rxf_empty");
+    rxf_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RO"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txf_full = dv_base_reg_field::type_id::create("txf_full");
+    txf_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    txf_empty = dv_base_reg_field::type_id::create("txf_empty");
+    txf_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RO"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    abort_done = dv_base_reg_field::type_id::create("abort_done");
+    abort_done.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("RO"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    csb = dv_base_reg_field::type_id::create("csb");
+    csb.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("RO"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_status
+
+// Class: spi_device_reg_rxf_ptr
+class spi_device_reg_rxf_ptr extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rptr;
+  rand dv_base_reg_field wptr;
+
+  `uvm_object_utils(spi_device_reg_rxf_ptr)
+
+  function new(string       name = "spi_device_reg_rxf_ptr",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rptr = dv_base_reg_field::type_id::create("rptr");
+    rptr.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    wptr = dv_base_reg_field::type_id::create("wptr");
+    wptr.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_rxf_ptr
+
+// Class: spi_device_reg_txf_ptr
+class spi_device_reg_txf_ptr extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rptr;
+  rand dv_base_reg_field wptr;
+
+  `uvm_object_utils(spi_device_reg_txf_ptr)
+
+  function new(string       name = "spi_device_reg_txf_ptr",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rptr = dv_base_reg_field::type_id::create("rptr");
+    rptr.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    wptr = dv_base_reg_field::type_id::create("wptr");
+    wptr.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_txf_ptr
+
+// Class: spi_device_reg_rxf_addr
+class spi_device_reg_rxf_addr extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field base;
+  rand dv_base_reg_field limit;
+
+  `uvm_object_utils(spi_device_reg_rxf_addr)
+
+  function new(string       name = "spi_device_reg_rxf_addr",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    base = dv_base_reg_field::type_id::create("base");
+    base.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    limit = dv_base_reg_field::type_id::create("limit");
+    limit.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(508),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_rxf_addr
+
+// Class: spi_device_reg_txf_addr
+class spi_device_reg_txf_addr extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field base;
+  rand dv_base_reg_field limit;
+
+  `uvm_object_utils(spi_device_reg_txf_addr)
+
+  function new(string       name = "spi_device_reg_txf_addr",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    base = dv_base_reg_field::type_id::create("base");
+    base.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(512),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    limit = dv_base_reg_field::type_id::create("limit");
+    limit.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(1020),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : spi_device_reg_txf_addr
+
+// Class: spi_device_mem_buffer
+class spi_device_mem_buffer extends dv_base_mem;
+
+  `uvm_object_utils(spi_device_mem_buffer)
+
+  function new(string           name = "spi_device_mem_buffer",
+               longint unsigned size = 512,
+               int unsigned     n_bits = 32,
+               string           access = "RW"/* TODO:"RW"*/,
+               int              has_coverage = UVM_NO_COVERAGE);
+    super.new(name, size, n_bits, access, has_coverage);
+  endfunction : new
+
+endclass : spi_device_mem_buffer
+
+// Class: spi_device_reg_block
+class spi_device_reg_block extends dv_base_reg_block;
+  // registers
+  rand spi_device_reg_intr_state intr_state;
+  rand spi_device_reg_intr_enable intr_enable;
+  rand spi_device_reg_intr_test intr_test;
+  rand spi_device_reg_control control;
+  rand spi_device_reg_cfg cfg;
+  rand spi_device_reg_fifo_level fifo_level;
+  rand spi_device_reg_async_fifo_level async_fifo_level;
+  rand spi_device_reg_status status;
+  rand spi_device_reg_rxf_ptr rxf_ptr;
+  rand spi_device_reg_txf_ptr txf_ptr;
+  rand spi_device_reg_rxf_addr rxf_addr;
+  rand spi_device_reg_txf_addr txf_addr;
+  // memories
+  rand spi_device_mem_buffer buffer;
+
+  `uvm_object_utils(spi_device_reg_block)
+
+  function new(string name = "spi_device_reg_block",
+               int    has_coverage = UVM_NO_COVERAGE);
+    super.new(name, has_coverage);
+  endfunction : new
+
+  virtual function void build(uvm_reg_addr_t base_addr);
+    // create default map
+    this.default_map = create_map(.name("default_map"),
+                                  .base_addr(base_addr),
+                                  .n_bytes(4),
+                                  .endian(UVM_LITTLE_ENDIAN));
+
+    // create registers
+    intr_state = spi_device_reg_intr_state::type_id::create("intr_state");
+    intr_state.configure(.blk_parent(this));
+    intr_state.build();
+    default_map.add_reg(.rg(intr_state),
+                        .offset(32'h0),
+                        .rights("RW"));
+    intr_enable = spi_device_reg_intr_enable::type_id::create("intr_enable");
+    intr_enable.configure(.blk_parent(this));
+    intr_enable.build();
+    default_map.add_reg(.rg(intr_enable),
+                        .offset(32'h4),
+                        .rights("RW"));
+    intr_test = spi_device_reg_intr_test::type_id::create("intr_test");
+    intr_test.configure(.blk_parent(this));
+    intr_test.build();
+    default_map.add_reg(.rg(intr_test),
+                        .offset(32'h8),
+                        .rights("WO"));
+    control = spi_device_reg_control::type_id::create("control");
+    control.configure(.blk_parent(this));
+    control.build();
+    default_map.add_reg(.rg(control),
+                        .offset(32'hc),
+                        .rights("RW"));
+    cfg = spi_device_reg_cfg::type_id::create("cfg");
+    cfg.configure(.blk_parent(this));
+    cfg.build();
+    default_map.add_reg(.rg(cfg),
+                        .offset(32'h10),
+                        .rights("RW"));
+    fifo_level = spi_device_reg_fifo_level::type_id::create("fifo_level");
+    fifo_level.configure(.blk_parent(this));
+    fifo_level.build();
+    default_map.add_reg(.rg(fifo_level),
+                        .offset(32'h14),
+                        .rights("RW"));
+    async_fifo_level = spi_device_reg_async_fifo_level::type_id::create("async_fifo_level");
+    async_fifo_level.configure(.blk_parent(this));
+    async_fifo_level.build();
+    default_map.add_reg(.rg(async_fifo_level),
+                        .offset(32'h18),
+                        .rights("RO"));
+    status = spi_device_reg_status::type_id::create("status");
+    status.configure(.blk_parent(this));
+    status.build();
+    default_map.add_reg(.rg(status),
+                        .offset(32'h1c),
+                        .rights("RO"));
+    rxf_ptr = spi_device_reg_rxf_ptr::type_id::create("rxf_ptr");
+    rxf_ptr.configure(.blk_parent(this));
+    rxf_ptr.build();
+    default_map.add_reg(.rg(rxf_ptr),
+                        .offset(32'h20),
+                        .rights("RW"));
+    txf_ptr = spi_device_reg_txf_ptr::type_id::create("txf_ptr");
+    txf_ptr.configure(.blk_parent(this));
+    txf_ptr.build();
+    default_map.add_reg(.rg(txf_ptr),
+                        .offset(32'h24),
+                        .rights("RW"));
+    rxf_addr = spi_device_reg_rxf_addr::type_id::create("rxf_addr");
+    rxf_addr.configure(.blk_parent(this));
+    rxf_addr.build();
+    default_map.add_reg(.rg(rxf_addr),
+                        .offset(32'h28),
+                        .rights("RW"));
+    txf_addr = spi_device_reg_txf_addr::type_id::create("txf_addr");
+    txf_addr.configure(.blk_parent(this));
+    txf_addr.build();
+    default_map.add_reg(.rg(txf_addr),
+                        .offset(32'h2c),
+                        .rights("RW"));
+
+    // create memories
+    buffer = spi_device_mem_buffer::type_id::create("buffer");
+    buffer.configure(.parent(this));
+    default_map.add_mem(.mem(buffer),
+                        .offset(32'h800),
+                        .rights("RW"));
+  endfunction : build
+
+endclass : spi_device_reg_block
+
+// Block: flash_ctrl
+// Class: flash_ctrl_reg_intr_state
+class flash_ctrl_reg_intr_state extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field prog_empty;
+  rand dv_base_reg_field prog_lvl;
+  rand dv_base_reg_field rd_full;
+  rand dv_base_reg_field rd_lvl;
+  rand dv_base_reg_field op_done;
+  rand dv_base_reg_field op_error;
+
+  `uvm_object_utils(flash_ctrl_reg_intr_state)
+
+  function new(string       name = "flash_ctrl_reg_intr_state",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
+    prog_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_lvl = dv_base_reg_field::type_id::create("prog_lvl");
+    prog_lvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_full = dv_base_reg_field::type_id::create("rd_full");
+    rd_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_lvl = dv_base_reg_field::type_id::create("rd_lvl");
+    rd_lvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op_done = dv_base_reg_field::type_id::create("op_done");
+    op_done.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op_error = dv_base_reg_field::type_id::create("op_error");
+    op_error.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_intr_state
+
+// Class: flash_ctrl_reg_intr_enable
+class flash_ctrl_reg_intr_enable extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field prog_empty;
+  rand dv_base_reg_field prog_lvl;
+  rand dv_base_reg_field rd_full;
+  rand dv_base_reg_field rd_lvl;
+  rand dv_base_reg_field op_done;
+  rand dv_base_reg_field op_error;
+
+  `uvm_object_utils(flash_ctrl_reg_intr_enable)
+
+  function new(string       name = "flash_ctrl_reg_intr_enable",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
+    prog_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_lvl = dv_base_reg_field::type_id::create("prog_lvl");
+    prog_lvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_full = dv_base_reg_field::type_id::create("rd_full");
+    rd_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_lvl = dv_base_reg_field::type_id::create("rd_lvl");
+    rd_lvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op_done = dv_base_reg_field::type_id::create("op_done");
+    op_done.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op_error = dv_base_reg_field::type_id::create("op_error");
+    op_error.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_intr_enable
+
+// Class: flash_ctrl_reg_intr_test
+class flash_ctrl_reg_intr_test extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field prog_empty;
+  rand dv_base_reg_field prog_lvl;
+  rand dv_base_reg_field rd_full;
+  rand dv_base_reg_field rd_lvl;
+  rand dv_base_reg_field op_done;
+  rand dv_base_reg_field op_error;
+
+  `uvm_object_utils(flash_ctrl_reg_intr_test)
+
+  function new(string       name = "flash_ctrl_reg_intr_test",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
+    prog_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_lvl = dv_base_reg_field::type_id::create("prog_lvl");
+    prog_lvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_full = dv_base_reg_field::type_id::create("rd_full");
+    rd_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_lvl = dv_base_reg_field::type_id::create("rd_lvl");
+    rd_lvl.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op_done = dv_base_reg_field::type_id::create("op_done");
+    op_done.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op_error = dv_base_reg_field::type_id::create("op_error");
+    op_error.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_intr_test
+
+// Class: flash_ctrl_reg_control
+class flash_ctrl_reg_control extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field start;
+  rand dv_base_reg_field op;
+  rand dv_base_reg_field erase_sel;
+  rand dv_base_reg_field fifo_rst;
+  rand dv_base_reg_field num;
+
+  `uvm_object_utils(flash_ctrl_reg_control)
+
+  function new(string       name = "flash_ctrl_reg_control",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    start = dv_base_reg_field::type_id::create("start");
+    start.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    op = dv_base_reg_field::type_id::create("op");
+    op.configure(
+      .parent(this),
+      .size(2),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_sel = dv_base_reg_field::type_id::create("erase_sel");
+    erase_sel.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    fifo_rst = dv_base_reg_field::type_id::create("fifo_rst");
+    fifo_rst.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(7),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    num = dv_base_reg_field::type_id::create("num");
+    num.configure(
+      .parent(this),
+      .size(12),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_control
+
+// Class: flash_ctrl_reg_addr
+class flash_ctrl_reg_addr extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field start;
+
+  `uvm_object_utils(flash_ctrl_reg_addr)
+
+  function new(string       name = "flash_ctrl_reg_addr",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    start = dv_base_reg_field::type_id::create("start");
+    start.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_addr
+
+// Class: flash_ctrl_reg_region_cfg_regwen
+class flash_ctrl_reg_region_cfg_regwen extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field region0;
+  rand dv_base_reg_field region1;
+  rand dv_base_reg_field region2;
+  rand dv_base_reg_field region3;
+  rand dv_base_reg_field region4;
+  rand dv_base_reg_field region5;
+  rand dv_base_reg_field region6;
+  rand dv_base_reg_field region7;
+
+  `uvm_object_utils(flash_ctrl_reg_region_cfg_regwen)
+
+  function new(string       name = "flash_ctrl_reg_region_cfg_regwen",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    region0 = dv_base_reg_field::type_id::create("region0");
+    region0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region1 = dv_base_reg_field::type_id::create("region1");
+    region1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region2 = dv_base_reg_field::type_id::create("region2");
+    region2.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region3 = dv_base_reg_field::type_id::create("region3");
+    region3.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region4 = dv_base_reg_field::type_id::create("region4");
+    region4.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region5 = dv_base_reg_field::type_id::create("region5");
+    region5.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(5),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region6 = dv_base_reg_field::type_id::create("region6");
+    region6.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(6),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    region7 = dv_base_reg_field::type_id::create("region7");
+    region7.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(7),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_region_cfg_regwen
+
+// Class: flash_ctrl_reg_mp_region_cfg0
+class flash_ctrl_reg_mp_region_cfg0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en0;
+  rand dv_base_reg_field rd_en0;
+  rand dv_base_reg_field prog_en0;
+  rand dv_base_reg_field erase_en0;
+  rand dv_base_reg_field base0;
+  rand dv_base_reg_field size0;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg0)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en0 = dv_base_reg_field::type_id::create("en0");
+    en0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en0 = dv_base_reg_field::type_id::create("rd_en0");
+    rd_en0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en0 = dv_base_reg_field::type_id::create("prog_en0");
+    prog_en0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en0 = dv_base_reg_field::type_id::create("erase_en0");
+    erase_en0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base0 = dv_base_reg_field::type_id::create("base0");
+    base0.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size0 = dv_base_reg_field::type_id::create("size0");
+    size0.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg0
+
+// Class: flash_ctrl_reg_mp_region_cfg1
+class flash_ctrl_reg_mp_region_cfg1 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en1;
+  rand dv_base_reg_field rd_en1;
+  rand dv_base_reg_field prog_en1;
+  rand dv_base_reg_field erase_en1;
+  rand dv_base_reg_field base1;
+  rand dv_base_reg_field size1;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg1)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg1",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en1 = dv_base_reg_field::type_id::create("en1");
+    en1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en1 = dv_base_reg_field::type_id::create("rd_en1");
+    rd_en1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en1 = dv_base_reg_field::type_id::create("prog_en1");
+    prog_en1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en1 = dv_base_reg_field::type_id::create("erase_en1");
+    erase_en1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base1 = dv_base_reg_field::type_id::create("base1");
+    base1.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size1 = dv_base_reg_field::type_id::create("size1");
+    size1.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg1
+
+// Class: flash_ctrl_reg_mp_region_cfg2
+class flash_ctrl_reg_mp_region_cfg2 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en2;
+  rand dv_base_reg_field rd_en2;
+  rand dv_base_reg_field prog_en2;
+  rand dv_base_reg_field erase_en2;
+  rand dv_base_reg_field base2;
+  rand dv_base_reg_field size2;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg2)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg2",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en2 = dv_base_reg_field::type_id::create("en2");
+    en2.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en2 = dv_base_reg_field::type_id::create("rd_en2");
+    rd_en2.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en2 = dv_base_reg_field::type_id::create("prog_en2");
+    prog_en2.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en2 = dv_base_reg_field::type_id::create("erase_en2");
+    erase_en2.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base2 = dv_base_reg_field::type_id::create("base2");
+    base2.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size2 = dv_base_reg_field::type_id::create("size2");
+    size2.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg2
+
+// Class: flash_ctrl_reg_mp_region_cfg3
+class flash_ctrl_reg_mp_region_cfg3 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en3;
+  rand dv_base_reg_field rd_en3;
+  rand dv_base_reg_field prog_en3;
+  rand dv_base_reg_field erase_en3;
+  rand dv_base_reg_field base3;
+  rand dv_base_reg_field size3;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg3)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg3",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en3 = dv_base_reg_field::type_id::create("en3");
+    en3.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en3 = dv_base_reg_field::type_id::create("rd_en3");
+    rd_en3.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en3 = dv_base_reg_field::type_id::create("prog_en3");
+    prog_en3.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en3 = dv_base_reg_field::type_id::create("erase_en3");
+    erase_en3.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base3 = dv_base_reg_field::type_id::create("base3");
+    base3.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size3 = dv_base_reg_field::type_id::create("size3");
+    size3.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg3
+
+// Class: flash_ctrl_reg_mp_region_cfg4
+class flash_ctrl_reg_mp_region_cfg4 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en4;
+  rand dv_base_reg_field rd_en4;
+  rand dv_base_reg_field prog_en4;
+  rand dv_base_reg_field erase_en4;
+  rand dv_base_reg_field base4;
+  rand dv_base_reg_field size4;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg4)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg4",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en4 = dv_base_reg_field::type_id::create("en4");
+    en4.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en4 = dv_base_reg_field::type_id::create("rd_en4");
+    rd_en4.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en4 = dv_base_reg_field::type_id::create("prog_en4");
+    prog_en4.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en4 = dv_base_reg_field::type_id::create("erase_en4");
+    erase_en4.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base4 = dv_base_reg_field::type_id::create("base4");
+    base4.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size4 = dv_base_reg_field::type_id::create("size4");
+    size4.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg4
+
+// Class: flash_ctrl_reg_mp_region_cfg5
+class flash_ctrl_reg_mp_region_cfg5 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en5;
+  rand dv_base_reg_field rd_en5;
+  rand dv_base_reg_field prog_en5;
+  rand dv_base_reg_field erase_en5;
+  rand dv_base_reg_field base5;
+  rand dv_base_reg_field size5;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg5)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg5",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en5 = dv_base_reg_field::type_id::create("en5");
+    en5.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en5 = dv_base_reg_field::type_id::create("rd_en5");
+    rd_en5.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en5 = dv_base_reg_field::type_id::create("prog_en5");
+    prog_en5.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en5 = dv_base_reg_field::type_id::create("erase_en5");
+    erase_en5.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base5 = dv_base_reg_field::type_id::create("base5");
+    base5.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size5 = dv_base_reg_field::type_id::create("size5");
+    size5.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg5
+
+// Class: flash_ctrl_reg_mp_region_cfg6
+class flash_ctrl_reg_mp_region_cfg6 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en6;
+  rand dv_base_reg_field rd_en6;
+  rand dv_base_reg_field prog_en6;
+  rand dv_base_reg_field erase_en6;
+  rand dv_base_reg_field base6;
+  rand dv_base_reg_field size6;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg6)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg6",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en6 = dv_base_reg_field::type_id::create("en6");
+    en6.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en6 = dv_base_reg_field::type_id::create("rd_en6");
+    rd_en6.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en6 = dv_base_reg_field::type_id::create("prog_en6");
+    prog_en6.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en6 = dv_base_reg_field::type_id::create("erase_en6");
+    erase_en6.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base6 = dv_base_reg_field::type_id::create("base6");
+    base6.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size6 = dv_base_reg_field::type_id::create("size6");
+    size6.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg6
+
+// Class: flash_ctrl_reg_mp_region_cfg7
+class flash_ctrl_reg_mp_region_cfg7 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field en7;
+  rand dv_base_reg_field rd_en7;
+  rand dv_base_reg_field prog_en7;
+  rand dv_base_reg_field erase_en7;
+  rand dv_base_reg_field base7;
+  rand dv_base_reg_field size7;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg7)
+
+  function new(string       name = "flash_ctrl_reg_mp_region_cfg7",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    en7 = dv_base_reg_field::type_id::create("en7");
+    en7.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_en7 = dv_base_reg_field::type_id::create("rd_en7");
+    rd_en7.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en7 = dv_base_reg_field::type_id::create("prog_en7");
+    prog_en7.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en7 = dv_base_reg_field::type_id::create("erase_en7");
+    erase_en7.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    base7 = dv_base_reg_field::type_id::create("base7");
+    base7.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(4),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    size7 = dv_base_reg_field::type_id::create("size7");
+    size7.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_region_cfg7
+
+// Class: flash_ctrl_reg_default_region
+class flash_ctrl_reg_default_region extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rd_en;
+  rand dv_base_reg_field prog_en;
+  rand dv_base_reg_field erase_en;
+
+  `uvm_object_utils(flash_ctrl_reg_default_region)
+
+  function new(string       name = "flash_ctrl_reg_default_region",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rd_en = dv_base_reg_field::type_id::create("rd_en");
+    rd_en.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_en = dv_base_reg_field::type_id::create("prog_en");
+    prog_en.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en = dv_base_reg_field::type_id::create("erase_en");
+    erase_en.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_default_region
+
+// Class: flash_ctrl_reg_bank_cfg_regwen
+class flash_ctrl_reg_bank_cfg_regwen extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field bank0;
+  rand dv_base_reg_field bank1;
+
+  `uvm_object_utils(flash_ctrl_reg_bank_cfg_regwen)
+
+  function new(string       name = "flash_ctrl_reg_bank_cfg_regwen",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    bank0 = dv_base_reg_field::type_id::create("bank0");
+    bank0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    bank1 = dv_base_reg_field::type_id::create("bank1");
+    bank1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("W0C"),
+      .volatile(1),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_bank_cfg_regwen
+
+// Class: flash_ctrl_reg_mp_bank_cfg
+class flash_ctrl_reg_mp_bank_cfg extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field erase_en0;
+  rand dv_base_reg_field erase_en1;
+
+  `uvm_object_utils(flash_ctrl_reg_mp_bank_cfg)
+
+  function new(string       name = "flash_ctrl_reg_mp_bank_cfg",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    erase_en0 = dv_base_reg_field::type_id::create("erase_en0");
+    erase_en0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    erase_en1 = dv_base_reg_field::type_id::create("erase_en1");
+    erase_en1.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_mp_bank_cfg
+
+// Class: flash_ctrl_reg_op_status
+class flash_ctrl_reg_op_status extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field done;
+  rand dv_base_reg_field err;
+
+  `uvm_object_utils(flash_ctrl_reg_op_status)
+
+  function new(string       name = "flash_ctrl_reg_op_status",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    done = dv_base_reg_field::type_id::create("done");
+    done.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    err = dv_base_reg_field::type_id::create("err");
+    err.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_op_status
+
+// Class: flash_ctrl_reg_status
+class flash_ctrl_reg_status extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field rd_full;
+  rand dv_base_reg_field rd_empty;
+  rand dv_base_reg_field prog_full;
+  rand dv_base_reg_field prog_empty;
+  rand dv_base_reg_field init_wip;
+  rand dv_base_reg_field error_page;
+  rand dv_base_reg_field error_bank;
+
+  `uvm_object_utils(flash_ctrl_reg_status)
+
+  function new(string       name = "flash_ctrl_reg_status",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    rd_full = dv_base_reg_field::type_id::create("rd_full");
+    rd_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd_empty = dv_base_reg_field::type_id::create("rd_empty");
+    rd_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(1),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_full = dv_base_reg_field::type_id::create("prog_full");
+    prog_full.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(2),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
+    prog_empty.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(3),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    init_wip = dv_base_reg_field::type_id::create("init_wip");
+    init_wip.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(4),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    error_page = dv_base_reg_field::type_id::create("error_page");
+    error_page.configure(
+      .parent(this),
+      .size(9),
+      .lsb_pos(8),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    error_bank = dv_base_reg_field::type_id::create("error_bank");
+    error_bank.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(17),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_status
+
+// Class: flash_ctrl_reg_scratch
+class flash_ctrl_reg_scratch extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field data;
+
+  `uvm_object_utils(flash_ctrl_reg_scratch)
+
+  function new(string       name = "flash_ctrl_reg_scratch",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    data = dv_base_reg_field::type_id::create("data");
+    data.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_scratch
+
+// Class: flash_ctrl_reg_fifo_lvl
+class flash_ctrl_reg_fifo_lvl extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field prog;
+  rand dv_base_reg_field rd;
+
+  `uvm_object_utils(flash_ctrl_reg_fifo_lvl)
+
+  function new(string       name = "flash_ctrl_reg_fifo_lvl",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    prog = dv_base_reg_field::type_id::create("prog");
+    prog.configure(
+      .parent(this),
+      .size(5),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(15),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    rd = dv_base_reg_field::type_id::create("rd");
+    rd.configure(
+      .parent(this),
+      .size(5),
+      .lsb_pos(8),
+      .access("RW"),
+      .volatile(0),
+      .reset(15),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : flash_ctrl_reg_fifo_lvl
+
+// Class: flash_ctrl_mem_prog_fifo
+class flash_ctrl_mem_prog_fifo extends dv_base_mem;
+
+  `uvm_object_utils(flash_ctrl_mem_prog_fifo)
+
+  function new(string           name = "flash_ctrl_mem_prog_fifo",
+               longint unsigned size = 1,
+               int unsigned     n_bits = 32,
+               string           access = "RW"/* TODO:"WO"*/,
+               int              has_coverage = UVM_NO_COVERAGE);
+    super.new(name, size, n_bits, access, has_coverage);
+  endfunction : new
+
+endclass : flash_ctrl_mem_prog_fifo
+
+// Class: flash_ctrl_mem_rd_fifo
+class flash_ctrl_mem_rd_fifo extends dv_base_mem;
+
+  `uvm_object_utils(flash_ctrl_mem_rd_fifo)
+
+  function new(string           name = "flash_ctrl_mem_rd_fifo",
+               longint unsigned size = 1,
+               int unsigned     n_bits = 32,
+               string           access = "RW"/* TODO:"RO"*/,
+               int              has_coverage = UVM_NO_COVERAGE);
+    super.new(name, size, n_bits, access, has_coverage);
+  endfunction : new
+
+endclass : flash_ctrl_mem_rd_fifo
+
+// Class: flash_ctrl_reg_block
+class flash_ctrl_reg_block extends dv_base_reg_block;
+  // registers
+  rand flash_ctrl_reg_intr_state intr_state;
+  rand flash_ctrl_reg_intr_enable intr_enable;
+  rand flash_ctrl_reg_intr_test intr_test;
+  rand flash_ctrl_reg_control control;
+  rand flash_ctrl_reg_addr addr;
+  rand flash_ctrl_reg_region_cfg_regwen region_cfg_regwen;
+  rand flash_ctrl_reg_mp_region_cfg0 mp_region_cfg0;
+  rand flash_ctrl_reg_mp_region_cfg1 mp_region_cfg1;
+  rand flash_ctrl_reg_mp_region_cfg2 mp_region_cfg2;
+  rand flash_ctrl_reg_mp_region_cfg3 mp_region_cfg3;
+  rand flash_ctrl_reg_mp_region_cfg4 mp_region_cfg4;
+  rand flash_ctrl_reg_mp_region_cfg5 mp_region_cfg5;
+  rand flash_ctrl_reg_mp_region_cfg6 mp_region_cfg6;
+  rand flash_ctrl_reg_mp_region_cfg7 mp_region_cfg7;
+  rand flash_ctrl_reg_default_region default_region;
+  rand flash_ctrl_reg_bank_cfg_regwen bank_cfg_regwen;
+  rand flash_ctrl_reg_mp_bank_cfg mp_bank_cfg;
+  rand flash_ctrl_reg_op_status op_status;
+  rand flash_ctrl_reg_status status;
+  rand flash_ctrl_reg_scratch scratch;
+  rand flash_ctrl_reg_fifo_lvl fifo_lvl;
+  // memories
+  rand flash_ctrl_mem_prog_fifo prog_fifo;
+  rand flash_ctrl_mem_rd_fifo rd_fifo;
+
+  `uvm_object_utils(flash_ctrl_reg_block)
+
+  function new(string name = "flash_ctrl_reg_block",
+               int    has_coverage = UVM_NO_COVERAGE);
+    super.new(name, has_coverage);
+  endfunction : new
+
+  virtual function void build(uvm_reg_addr_t base_addr);
+    // create default map
+    this.default_map = create_map(.name("default_map"),
+                                  .base_addr(base_addr),
+                                  .n_bytes(4),
+                                  .endian(UVM_LITTLE_ENDIAN));
+
+    // create registers
+    intr_state = flash_ctrl_reg_intr_state::type_id::create("intr_state");
+    intr_state.configure(.blk_parent(this));
+    intr_state.build();
+    default_map.add_reg(.rg(intr_state),
+                        .offset(32'h0),
+                        .rights("RW"));
+    intr_enable = flash_ctrl_reg_intr_enable::type_id::create("intr_enable");
+    intr_enable.configure(.blk_parent(this));
+    intr_enable.build();
+    default_map.add_reg(.rg(intr_enable),
+                        .offset(32'h4),
+                        .rights("RW"));
+    intr_test = flash_ctrl_reg_intr_test::type_id::create("intr_test");
+    intr_test.configure(.blk_parent(this));
+    intr_test.build();
+    default_map.add_reg(.rg(intr_test),
+                        .offset(32'h8),
+                        .rights("WO"));
+    control = flash_ctrl_reg_control::type_id::create("control");
+    control.configure(.blk_parent(this));
+    control.build();
+    default_map.add_reg(.rg(control),
+                        .offset(32'hc),
+                        .rights("RW"));
+    addr = flash_ctrl_reg_addr::type_id::create("addr");
+    addr.configure(.blk_parent(this));
+    addr.build();
+    default_map.add_reg(.rg(addr),
+                        .offset(32'h10),
+                        .rights("RW"));
+    region_cfg_regwen = flash_ctrl_reg_region_cfg_regwen::type_id::create("region_cfg_regwen");
+    region_cfg_regwen.configure(.blk_parent(this));
+    region_cfg_regwen.build();
+    default_map.add_reg(.rg(region_cfg_regwen),
+                        .offset(32'h14),
+                        .rights("RW"));
+    mp_region_cfg0 = flash_ctrl_reg_mp_region_cfg0::type_id::create("mp_region_cfg0");
+    mp_region_cfg0.configure(.blk_parent(this));
+    mp_region_cfg0.build();
+    default_map.add_reg(.rg(mp_region_cfg0),
+                        .offset(32'h18),
+                        .rights("RW"));
+    mp_region_cfg1 = flash_ctrl_reg_mp_region_cfg1::type_id::create("mp_region_cfg1");
+    mp_region_cfg1.configure(.blk_parent(this));
+    mp_region_cfg1.build();
+    default_map.add_reg(.rg(mp_region_cfg1),
+                        .offset(32'h1c),
+                        .rights("RW"));
+    mp_region_cfg2 = flash_ctrl_reg_mp_region_cfg2::type_id::create("mp_region_cfg2");
+    mp_region_cfg2.configure(.blk_parent(this));
+    mp_region_cfg2.build();
+    default_map.add_reg(.rg(mp_region_cfg2),
+                        .offset(32'h20),
+                        .rights("RW"));
+    mp_region_cfg3 = flash_ctrl_reg_mp_region_cfg3::type_id::create("mp_region_cfg3");
+    mp_region_cfg3.configure(.blk_parent(this));
+    mp_region_cfg3.build();
+    default_map.add_reg(.rg(mp_region_cfg3),
+                        .offset(32'h24),
+                        .rights("RW"));
+    mp_region_cfg4 = flash_ctrl_reg_mp_region_cfg4::type_id::create("mp_region_cfg4");
+    mp_region_cfg4.configure(.blk_parent(this));
+    mp_region_cfg4.build();
+    default_map.add_reg(.rg(mp_region_cfg4),
+                        .offset(32'h28),
+                        .rights("RW"));
+    mp_region_cfg5 = flash_ctrl_reg_mp_region_cfg5::type_id::create("mp_region_cfg5");
+    mp_region_cfg5.configure(.blk_parent(this));
+    mp_region_cfg5.build();
+    default_map.add_reg(.rg(mp_region_cfg5),
+                        .offset(32'h2c),
+                        .rights("RW"));
+    mp_region_cfg6 = flash_ctrl_reg_mp_region_cfg6::type_id::create("mp_region_cfg6");
+    mp_region_cfg6.configure(.blk_parent(this));
+    mp_region_cfg6.build();
+    default_map.add_reg(.rg(mp_region_cfg6),
+                        .offset(32'h30),
+                        .rights("RW"));
+    mp_region_cfg7 = flash_ctrl_reg_mp_region_cfg7::type_id::create("mp_region_cfg7");
+    mp_region_cfg7.configure(.blk_parent(this));
+    mp_region_cfg7.build();
+    default_map.add_reg(.rg(mp_region_cfg7),
+                        .offset(32'h34),
+                        .rights("RW"));
+    default_region = flash_ctrl_reg_default_region::type_id::create("default_region");
+    default_region.configure(.blk_parent(this));
+    default_region.build();
+    default_map.add_reg(.rg(default_region),
+                        .offset(32'h38),
+                        .rights("RW"));
+    bank_cfg_regwen = flash_ctrl_reg_bank_cfg_regwen::type_id::create("bank_cfg_regwen");
+    bank_cfg_regwen.configure(.blk_parent(this));
+    bank_cfg_regwen.build();
+    default_map.add_reg(.rg(bank_cfg_regwen),
+                        .offset(32'h3c),
+                        .rights("RW"));
+    mp_bank_cfg = flash_ctrl_reg_mp_bank_cfg::type_id::create("mp_bank_cfg");
+    mp_bank_cfg.configure(.blk_parent(this));
+    mp_bank_cfg.build();
+    default_map.add_reg(.rg(mp_bank_cfg),
+                        .offset(32'h40),
+                        .rights("RW"));
+    op_status = flash_ctrl_reg_op_status::type_id::create("op_status");
+    op_status.configure(.blk_parent(this));
+    op_status.build();
+    default_map.add_reg(.rg(op_status),
+                        .offset(32'h44),
+                        .rights("RW"));
+    status = flash_ctrl_reg_status::type_id::create("status");
+    status.configure(.blk_parent(this));
+    status.build();
+    default_map.add_reg(.rg(status),
+                        .offset(32'h48),
+                        .rights("RO"));
+    scratch = flash_ctrl_reg_scratch::type_id::create("scratch");
+    scratch.configure(.blk_parent(this));
+    scratch.build();
+    default_map.add_reg(.rg(scratch),
+                        .offset(32'h4c),
+                        .rights("RW"));
+    fifo_lvl = flash_ctrl_reg_fifo_lvl::type_id::create("fifo_lvl");
+    fifo_lvl.configure(.blk_parent(this));
+    fifo_lvl.build();
+    default_map.add_reg(.rg(fifo_lvl),
+                        .offset(32'h50),
+                        .rights("RW"));
+
+    // create memories
+    prog_fifo = flash_ctrl_mem_prog_fifo::type_id::create("prog_fifo");
+    prog_fifo.configure(.parent(this));
+    default_map.add_mem(.mem(prog_fifo),
+                        .offset(32'h54),
+                        .rights("WO"));
+    rd_fifo = flash_ctrl_mem_rd_fifo::type_id::create("rd_fifo");
+    rd_fifo.configure(.parent(this));
+    default_map.add_mem(.mem(rd_fifo),
+                        .offset(32'h58),
+                        .rights("RO"));
+  endfunction : build
+
+endclass : flash_ctrl_reg_block
+
+// Block: rv_timer
+// Class: rv_timer_reg_ctrl
+class rv_timer_reg_ctrl extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field active0;
+
+  `uvm_object_utils(rv_timer_reg_ctrl)
+
+  function new(string       name = "rv_timer_reg_ctrl",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    active0 = dv_base_reg_field::type_id::create("active0");
+    active0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_ctrl
+
+// Class: rv_timer_reg_cfg0
+class rv_timer_reg_cfg0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field prescale;
+  rand dv_base_reg_field step;
+
+  `uvm_object_utils(rv_timer_reg_cfg0)
+
+  function new(string       name = "rv_timer_reg_cfg0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    prescale = dv_base_reg_field::type_id::create("prescale");
+    prescale.configure(
+      .parent(this),
+      .size(12),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    step = dv_base_reg_field::type_id::create("step");
+    step.configure(
+      .parent(this),
+      .size(8),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(0),
+      .reset(1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_cfg0
+
+// Class: rv_timer_reg_timer_v_lower0
+class rv_timer_reg_timer_v_lower0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field v;
+
+  `uvm_object_utils(rv_timer_reg_timer_v_lower0)
+
+  function new(string       name = "rv_timer_reg_timer_v_lower0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    v = dv_base_reg_field::type_id::create("v");
+    v.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_timer_v_lower0
+
+// Class: rv_timer_reg_timer_v_upper0
+class rv_timer_reg_timer_v_upper0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field v;
+
+  `uvm_object_utils(rv_timer_reg_timer_v_upper0)
+
+  function new(string       name = "rv_timer_reg_timer_v_upper0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    v = dv_base_reg_field::type_id::create("v");
+    v.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_timer_v_upper0
+
+// Class: rv_timer_reg_compare_lower0_0
+class rv_timer_reg_compare_lower0_0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field v;
+
+  `uvm_object_utils(rv_timer_reg_compare_lower0_0)
+
+  function new(string       name = "rv_timer_reg_compare_lower0_0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    v = dv_base_reg_field::type_id::create("v");
+    v.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(4294967295),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_compare_lower0_0
+
+// Class: rv_timer_reg_compare_upper0_0
+class rv_timer_reg_compare_upper0_0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field v;
+
+  `uvm_object_utils(rv_timer_reg_compare_upper0_0)
+
+  function new(string       name = "rv_timer_reg_compare_upper0_0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    v = dv_base_reg_field::type_id::create("v");
+    v.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(4294967295),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_compare_upper0_0
+
+// Class: rv_timer_reg_intr_enable0
+class rv_timer_reg_intr_enable0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field ie0;
+
+  `uvm_object_utils(rv_timer_reg_intr_enable0)
+
+  function new(string       name = "rv_timer_reg_intr_enable0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    ie0 = dv_base_reg_field::type_id::create("ie0");
+    ie0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_intr_enable0
+
+// Class: rv_timer_reg_intr_state0
+class rv_timer_reg_intr_state0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field is0;
+
+  `uvm_object_utils(rv_timer_reg_intr_state0)
+
+  function new(string       name = "rv_timer_reg_intr_state0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    is0 = dv_base_reg_field::type_id::create("is0");
+    is0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_intr_state0
+
+// Class: rv_timer_reg_intr_test0
+class rv_timer_reg_intr_test0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field t0;
+
+  `uvm_object_utils(rv_timer_reg_intr_test0)
+
+  function new(string       name = "rv_timer_reg_intr_test0",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    t0 = dv_base_reg_field::type_id::create("t0");
+    t0.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : rv_timer_reg_intr_test0
+
+// Class: rv_timer_reg_block
+class rv_timer_reg_block extends dv_base_reg_block;
+  // registers
+  rand rv_timer_reg_ctrl ctrl;
+  rand rv_timer_reg_cfg0 cfg0;
+  rand rv_timer_reg_timer_v_lower0 timer_v_lower0;
+  rand rv_timer_reg_timer_v_upper0 timer_v_upper0;
+  rand rv_timer_reg_compare_lower0_0 compare_lower0_0;
+  rand rv_timer_reg_compare_upper0_0 compare_upper0_0;
+  rand rv_timer_reg_intr_enable0 intr_enable0;
+  rand rv_timer_reg_intr_state0 intr_state0;
+  rand rv_timer_reg_intr_test0 intr_test0;
+
+  `uvm_object_utils(rv_timer_reg_block)
+
+  function new(string name = "rv_timer_reg_block",
+               int    has_coverage = UVM_NO_COVERAGE);
+    super.new(name, has_coverage);
+  endfunction : new
+
+  virtual function void build(uvm_reg_addr_t base_addr);
+    // create default map
+    this.default_map = create_map(.name("default_map"),
+                                  .base_addr(base_addr),
+                                  .n_bytes(4),
+                                  .endian(UVM_LITTLE_ENDIAN));
+
+    // create registers
+    ctrl = rv_timer_reg_ctrl::type_id::create("ctrl");
+    ctrl.configure(.blk_parent(this));
+    ctrl.build();
+    default_map.add_reg(.rg(ctrl),
+                        .offset(32'h0),
+                        .rights("RW"));
+    cfg0 = rv_timer_reg_cfg0::type_id::create("cfg0");
+    cfg0.configure(.blk_parent(this));
+    cfg0.build();
+    default_map.add_reg(.rg(cfg0),
+                        .offset(32'h100),
+                        .rights("RW"));
+    timer_v_lower0 = rv_timer_reg_timer_v_lower0::type_id::create("timer_v_lower0");
+    timer_v_lower0.configure(.blk_parent(this));
+    timer_v_lower0.build();
+    default_map.add_reg(.rg(timer_v_lower0),
+                        .offset(32'h104),
+                        .rights("RW"));
+    timer_v_upper0 = rv_timer_reg_timer_v_upper0::type_id::create("timer_v_upper0");
+    timer_v_upper0.configure(.blk_parent(this));
+    timer_v_upper0.build();
+    default_map.add_reg(.rg(timer_v_upper0),
+                        .offset(32'h108),
+                        .rights("RW"));
+    compare_lower0_0 = rv_timer_reg_compare_lower0_0::type_id::create("compare_lower0_0");
+    compare_lower0_0.configure(.blk_parent(this));
+    compare_lower0_0.build();
+    default_map.add_reg(.rg(compare_lower0_0),
+                        .offset(32'h10c),
+                        .rights("RW"));
+    compare_upper0_0 = rv_timer_reg_compare_upper0_0::type_id::create("compare_upper0_0");
+    compare_upper0_0.configure(.blk_parent(this));
+    compare_upper0_0.build();
+    default_map.add_reg(.rg(compare_upper0_0),
+                        .offset(32'h110),
+                        .rights("RW"));
+    intr_enable0 = rv_timer_reg_intr_enable0::type_id::create("intr_enable0");
+    intr_enable0.configure(.blk_parent(this));
+    intr_enable0.build();
+    default_map.add_reg(.rg(intr_enable0),
+                        .offset(32'h114),
+                        .rights("RW"));
+    intr_state0 = rv_timer_reg_intr_state0::type_id::create("intr_state0");
+    intr_state0.configure(.blk_parent(this));
+    intr_state0.build();
+    default_map.add_reg(.rg(intr_state0),
+                        .offset(32'h118),
+                        .rights("RW"));
+    intr_test0 = rv_timer_reg_intr_test0::type_id::create("intr_test0");
+    intr_test0.configure(.blk_parent(this));
+    intr_test0.build();
+    default_map.add_reg(.rg(intr_test0),
+                        .offset(32'h11c),
+                        .rights("WO"));
+  endfunction : build
+
+endclass : rv_timer_reg_block
+
+// Block: gpio
+// Class: gpio_reg_intr_state
+class gpio_reg_intr_state extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field gpio;
+
+  `uvm_object_utils(gpio_reg_intr_state)
+
+  function new(string       name = "gpio_reg_intr_state",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    gpio = dv_base_reg_field::type_id::create("gpio");
+    gpio.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("W1C"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_state
+
+// Class: gpio_reg_intr_enable
+class gpio_reg_intr_enable extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field gpio;
+
+  `uvm_object_utils(gpio_reg_intr_enable)
+
+  function new(string       name = "gpio_reg_intr_enable",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    gpio = dv_base_reg_field::type_id::create("gpio");
+    gpio.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_enable
+
+// Class: gpio_reg_intr_test
+class gpio_reg_intr_test extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field gpio;
+
+  `uvm_object_utils(gpio_reg_intr_test)
+
+  function new(string       name = "gpio_reg_intr_test",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    gpio = dv_base_reg_field::type_id::create("gpio");
+    gpio.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("WO"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_test
+
+// Class: gpio_reg_data_in
+class gpio_reg_data_in extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field data_in;
+
+  `uvm_object_utils(gpio_reg_data_in)
+
+  function new(string       name = "gpio_reg_data_in",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    data_in = dv_base_reg_field::type_id::create("data_in");
+    data_in.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_data_in
+
+// Class: gpio_reg_direct_out
+class gpio_reg_direct_out extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field direct_out;
+
+  `uvm_object_utils(gpio_reg_direct_out)
+
+  function new(string       name = "gpio_reg_direct_out",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    direct_out = dv_base_reg_field::type_id::create("direct_out");
+    direct_out.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_direct_out
+
+// Class: gpio_reg_masked_out_lower
+class gpio_reg_masked_out_lower extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field data;
+  rand dv_base_reg_field mask;
+
+  `uvm_object_utils(gpio_reg_masked_out_lower)
+
+  function new(string       name = "gpio_reg_masked_out_lower",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    data = dv_base_reg_field::type_id::create("data");
+    data.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    mask = dv_base_reg_field::type_id::create("mask");
+    mask.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("WO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_masked_out_lower
+
+// Class: gpio_reg_masked_out_upper
+class gpio_reg_masked_out_upper extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field data;
+  rand dv_base_reg_field mask;
+
+  `uvm_object_utils(gpio_reg_masked_out_upper)
+
+  function new(string       name = "gpio_reg_masked_out_upper",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    data = dv_base_reg_field::type_id::create("data");
+    data.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    mask = dv_base_reg_field::type_id::create("mask");
+    mask.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("WO"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_masked_out_upper
+
+// Class: gpio_reg_direct_oe
+class gpio_reg_direct_oe extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field direct_oe;
+
+  `uvm_object_utils(gpio_reg_direct_oe)
+
+  function new(string       name = "gpio_reg_direct_oe",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    direct_oe = dv_base_reg_field::type_id::create("direct_oe");
+    direct_oe.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_direct_oe
+
+// Class: gpio_reg_masked_oe_lower
+class gpio_reg_masked_oe_lower extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field data;
+  rand dv_base_reg_field mask;
+
+  `uvm_object_utils(gpio_reg_masked_oe_lower)
+
+  function new(string       name = "gpio_reg_masked_oe_lower",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    data = dv_base_reg_field::type_id::create("data");
+    data.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    mask = dv_base_reg_field::type_id::create("mask");
+    mask.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_masked_oe_lower
+
+// Class: gpio_reg_masked_oe_upper
+class gpio_reg_masked_oe_upper extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field data;
+  rand dv_base_reg_field mask;
+
+  `uvm_object_utils(gpio_reg_masked_oe_upper)
+
+  function new(string       name = "gpio_reg_masked_oe_upper",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    data = dv_base_reg_field::type_id::create("data");
+    data.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    mask = dv_base_reg_field::type_id::create("mask");
+    mask.configure(
+      .parent(this),
+      .size(16),
+      .lsb_pos(16),
+      .access("RW"),
+      .volatile(1),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_masked_oe_upper
+
+// Class: gpio_reg_intr_ctrl_en_rising
+class gpio_reg_intr_ctrl_en_rising extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field intr_ctrl_en_rising;
+
+  `uvm_object_utils(gpio_reg_intr_ctrl_en_rising)
+
+  function new(string       name = "gpio_reg_intr_ctrl_en_rising",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    intr_ctrl_en_rising = dv_base_reg_field::type_id::create("intr_ctrl_en_rising");
+    intr_ctrl_en_rising.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_ctrl_en_rising
+
+// Class: gpio_reg_intr_ctrl_en_falling
+class gpio_reg_intr_ctrl_en_falling extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field intr_ctrl_en_falling;
+
+  `uvm_object_utils(gpio_reg_intr_ctrl_en_falling)
+
+  function new(string       name = "gpio_reg_intr_ctrl_en_falling",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    intr_ctrl_en_falling = dv_base_reg_field::type_id::create("intr_ctrl_en_falling");
+    intr_ctrl_en_falling.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_ctrl_en_falling
+
+// Class: gpio_reg_intr_ctrl_en_lvlhigh
+class gpio_reg_intr_ctrl_en_lvlhigh extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field intr_ctrl_en_lvlhigh;
+
+  `uvm_object_utils(gpio_reg_intr_ctrl_en_lvlhigh)
+
+  function new(string       name = "gpio_reg_intr_ctrl_en_lvlhigh",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    intr_ctrl_en_lvlhigh = dv_base_reg_field::type_id::create("intr_ctrl_en_lvlhigh");
+    intr_ctrl_en_lvlhigh.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_ctrl_en_lvlhigh
+
+// Class: gpio_reg_intr_ctrl_en_lvllow
+class gpio_reg_intr_ctrl_en_lvllow extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field intr_ctrl_en_lvllow;
+
+  `uvm_object_utils(gpio_reg_intr_ctrl_en_lvllow)
+
+  function new(string       name = "gpio_reg_intr_ctrl_en_lvllow",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    intr_ctrl_en_lvllow = dv_base_reg_field::type_id::create("intr_ctrl_en_lvllow");
+    intr_ctrl_en_lvllow.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_intr_ctrl_en_lvllow
+
+// Class: gpio_reg_ctrl_en_input_filter
+class gpio_reg_ctrl_en_input_filter extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field ctrl_en_input_filter;
+
+  `uvm_object_utils(gpio_reg_ctrl_en_input_filter)
+
+  function new(string       name = "gpio_reg_ctrl_en_input_filter",
+               int unsigned n_bits = 32,
+               int          has_coverage = UVM_NO_COVERAGE);
+    super.new(name, n_bits, has_coverage);
+  endfunction : new
+
+  virtual function void build();
+    // create fields
+    ctrl_en_input_filter = dv_base_reg_field::type_id::create("ctrl_en_input_filter");
+    ctrl_en_input_filter.configure(
+      .parent(this),
+      .size(32),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : gpio_reg_ctrl_en_input_filter
+
+// Class: gpio_reg_block
+class gpio_reg_block extends dv_base_reg_block;
+  // registers
+  rand gpio_reg_intr_state intr_state;
+  rand gpio_reg_intr_enable intr_enable;
+  rand gpio_reg_intr_test intr_test;
+  rand gpio_reg_data_in data_in;
+  rand gpio_reg_direct_out direct_out;
+  rand gpio_reg_masked_out_lower masked_out_lower;
+  rand gpio_reg_masked_out_upper masked_out_upper;
+  rand gpio_reg_direct_oe direct_oe;
+  rand gpio_reg_masked_oe_lower masked_oe_lower;
+  rand gpio_reg_masked_oe_upper masked_oe_upper;
+  rand gpio_reg_intr_ctrl_en_rising intr_ctrl_en_rising;
+  rand gpio_reg_intr_ctrl_en_falling intr_ctrl_en_falling;
+  rand gpio_reg_intr_ctrl_en_lvlhigh intr_ctrl_en_lvlhigh;
+  rand gpio_reg_intr_ctrl_en_lvllow intr_ctrl_en_lvllow;
+  rand gpio_reg_ctrl_en_input_filter ctrl_en_input_filter;
+
+  `uvm_object_utils(gpio_reg_block)
+
+  function new(string name = "gpio_reg_block",
+               int    has_coverage = UVM_NO_COVERAGE);
+    super.new(name, has_coverage);
+  endfunction : new
+
+  virtual function void build(uvm_reg_addr_t base_addr);
+    // create default map
+    this.default_map = create_map(.name("default_map"),
+                                  .base_addr(base_addr),
+                                  .n_bytes(4),
+                                  .endian(UVM_LITTLE_ENDIAN));
+
+    // create registers
+    intr_state = gpio_reg_intr_state::type_id::create("intr_state");
+    intr_state.configure(.blk_parent(this));
+    intr_state.build();
+    default_map.add_reg(.rg(intr_state),
+                        .offset(32'h0),
+                        .rights("RW"));
+    intr_enable = gpio_reg_intr_enable::type_id::create("intr_enable");
+    intr_enable.configure(.blk_parent(this));
+    intr_enable.build();
+    default_map.add_reg(.rg(intr_enable),
+                        .offset(32'h4),
+                        .rights("RW"));
+    intr_test = gpio_reg_intr_test::type_id::create("intr_test");
+    intr_test.configure(.blk_parent(this));
+    intr_test.build();
+    default_map.add_reg(.rg(intr_test),
+                        .offset(32'h8),
+                        .rights("WO"));
+    data_in = gpio_reg_data_in::type_id::create("data_in");
+    data_in.configure(.blk_parent(this));
+    data_in.build();
+    default_map.add_reg(.rg(data_in),
+                        .offset(32'hc),
+                        .rights("RO"));
+    direct_out = gpio_reg_direct_out::type_id::create("direct_out");
+    direct_out.configure(.blk_parent(this));
+    direct_out.build();
+    default_map.add_reg(.rg(direct_out),
+                        .offset(32'h10),
+                        .rights("RW"));
+    masked_out_lower = gpio_reg_masked_out_lower::type_id::create("masked_out_lower");
+    masked_out_lower.configure(.blk_parent(this));
+    masked_out_lower.build();
+    default_map.add_reg(.rg(masked_out_lower),
+                        .offset(32'h14),
+                        .rights("RW"));
+    masked_out_upper = gpio_reg_masked_out_upper::type_id::create("masked_out_upper");
+    masked_out_upper.configure(.blk_parent(this));
+    masked_out_upper.build();
+    default_map.add_reg(.rg(masked_out_upper),
+                        .offset(32'h18),
+                        .rights("RW"));
+    direct_oe = gpio_reg_direct_oe::type_id::create("direct_oe");
+    direct_oe.configure(.blk_parent(this));
+    direct_oe.build();
+    default_map.add_reg(.rg(direct_oe),
+                        .offset(32'h1c),
+                        .rights("RW"));
+    masked_oe_lower = gpio_reg_masked_oe_lower::type_id::create("masked_oe_lower");
+    masked_oe_lower.configure(.blk_parent(this));
+    masked_oe_lower.build();
+    default_map.add_reg(.rg(masked_oe_lower),
+                        .offset(32'h20),
+                        .rights("RW"));
+    masked_oe_upper = gpio_reg_masked_oe_upper::type_id::create("masked_oe_upper");
+    masked_oe_upper.configure(.blk_parent(this));
+    masked_oe_upper.build();
+    default_map.add_reg(.rg(masked_oe_upper),
+                        .offset(32'h24),
+                        .rights("RW"));
+    intr_ctrl_en_rising = gpio_reg_intr_ctrl_en_rising::type_id::create("intr_ctrl_en_rising");
+    intr_ctrl_en_rising.configure(.blk_parent(this));
+    intr_ctrl_en_rising.build();
+    default_map.add_reg(.rg(intr_ctrl_en_rising),
+                        .offset(32'h28),
+                        .rights("RW"));
+    intr_ctrl_en_falling = gpio_reg_intr_ctrl_en_falling::type_id::create("intr_ctrl_en_falling");
+    intr_ctrl_en_falling.configure(.blk_parent(this));
+    intr_ctrl_en_falling.build();
+    default_map.add_reg(.rg(intr_ctrl_en_falling),
+                        .offset(32'h2c),
+                        .rights("RW"));
+    intr_ctrl_en_lvlhigh = gpio_reg_intr_ctrl_en_lvlhigh::type_id::create("intr_ctrl_en_lvlhigh");
+    intr_ctrl_en_lvlhigh.configure(.blk_parent(this));
+    intr_ctrl_en_lvlhigh.build();
+    default_map.add_reg(.rg(intr_ctrl_en_lvlhigh),
+                        .offset(32'h30),
+                        .rights("RW"));
+    intr_ctrl_en_lvllow = gpio_reg_intr_ctrl_en_lvllow::type_id::create("intr_ctrl_en_lvllow");
+    intr_ctrl_en_lvllow.configure(.blk_parent(this));
+    intr_ctrl_en_lvllow.build();
+    default_map.add_reg(.rg(intr_ctrl_en_lvllow),
+                        .offset(32'h34),
+                        .rights("RW"));
+    ctrl_en_input_filter = gpio_reg_ctrl_en_input_filter::type_id::create("ctrl_en_input_filter");
+    ctrl_en_input_filter.configure(.blk_parent(this));
+    ctrl_en_input_filter.build();
+    default_map.add_reg(.rg(ctrl_en_input_filter),
+                        .offset(32'h38),
+                        .rights("RW"));
+  endfunction : build
+
+endclass : gpio_reg_block
+
 // Block: hmac
 // Class: hmac_reg_intr_state
 class hmac_reg_intr_state extends dv_base_reg;
@@ -1265,2245 +4933,6 @@
 
 endclass : hmac_reg_block
 
-// Block: gpio
-// Class: gpio_reg_intr_state
-class gpio_reg_intr_state extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field gpio;
-
-  `uvm_object_utils(gpio_reg_intr_state)
-
-  function new(string       name = "gpio_reg_intr_state",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    gpio = dv_base_reg_field::type_id::create("gpio");
-    gpio.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_state
-
-// Class: gpio_reg_intr_enable
-class gpio_reg_intr_enable extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field gpio;
-
-  `uvm_object_utils(gpio_reg_intr_enable)
-
-  function new(string       name = "gpio_reg_intr_enable",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    gpio = dv_base_reg_field::type_id::create("gpio");
-    gpio.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_enable
-
-// Class: gpio_reg_intr_test
-class gpio_reg_intr_test extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field gpio;
-
-  `uvm_object_utils(gpio_reg_intr_test)
-
-  function new(string       name = "gpio_reg_intr_test",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    gpio = dv_base_reg_field::type_id::create("gpio");
-    gpio.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_test
-
-// Class: gpio_reg_data_in
-class gpio_reg_data_in extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field data_in;
-
-  `uvm_object_utils(gpio_reg_data_in)
-
-  function new(string       name = "gpio_reg_data_in",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    data_in = dv_base_reg_field::type_id::create("data_in");
-    data_in.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_data_in
-
-// Class: gpio_reg_direct_out
-class gpio_reg_direct_out extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field direct_out;
-
-  `uvm_object_utils(gpio_reg_direct_out)
-
-  function new(string       name = "gpio_reg_direct_out",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    direct_out = dv_base_reg_field::type_id::create("direct_out");
-    direct_out.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_direct_out
-
-// Class: gpio_reg_masked_out_lower
-class gpio_reg_masked_out_lower extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field data;
-  rand dv_base_reg_field mask;
-
-  `uvm_object_utils(gpio_reg_masked_out_lower)
-
-  function new(string       name = "gpio_reg_masked_out_lower",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    data = dv_base_reg_field::type_id::create("data");
-    data.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    mask = dv_base_reg_field::type_id::create("mask");
-    mask.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("WO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_masked_out_lower
-
-// Class: gpio_reg_masked_out_upper
-class gpio_reg_masked_out_upper extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field data;
-  rand dv_base_reg_field mask;
-
-  `uvm_object_utils(gpio_reg_masked_out_upper)
-
-  function new(string       name = "gpio_reg_masked_out_upper",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    data = dv_base_reg_field::type_id::create("data");
-    data.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    mask = dv_base_reg_field::type_id::create("mask");
-    mask.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("WO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_masked_out_upper
-
-// Class: gpio_reg_direct_oe
-class gpio_reg_direct_oe extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field direct_oe;
-
-  `uvm_object_utils(gpio_reg_direct_oe)
-
-  function new(string       name = "gpio_reg_direct_oe",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    direct_oe = dv_base_reg_field::type_id::create("direct_oe");
-    direct_oe.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_direct_oe
-
-// Class: gpio_reg_masked_oe_lower
-class gpio_reg_masked_oe_lower extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field data;
-  rand dv_base_reg_field mask;
-
-  `uvm_object_utils(gpio_reg_masked_oe_lower)
-
-  function new(string       name = "gpio_reg_masked_oe_lower",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    data = dv_base_reg_field::type_id::create("data");
-    data.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    mask = dv_base_reg_field::type_id::create("mask");
-    mask.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_masked_oe_lower
-
-// Class: gpio_reg_masked_oe_upper
-class gpio_reg_masked_oe_upper extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field data;
-  rand dv_base_reg_field mask;
-
-  `uvm_object_utils(gpio_reg_masked_oe_upper)
-
-  function new(string       name = "gpio_reg_masked_oe_upper",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    data = dv_base_reg_field::type_id::create("data");
-    data.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    mask = dv_base_reg_field::type_id::create("mask");
-    mask.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_masked_oe_upper
-
-// Class: gpio_reg_intr_ctrl_en_rising
-class gpio_reg_intr_ctrl_en_rising extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field intr_ctrl_en_rising;
-
-  `uvm_object_utils(gpio_reg_intr_ctrl_en_rising)
-
-  function new(string       name = "gpio_reg_intr_ctrl_en_rising",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    intr_ctrl_en_rising = dv_base_reg_field::type_id::create("intr_ctrl_en_rising");
-    intr_ctrl_en_rising.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_ctrl_en_rising
-
-// Class: gpio_reg_intr_ctrl_en_falling
-class gpio_reg_intr_ctrl_en_falling extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field intr_ctrl_en_falling;
-
-  `uvm_object_utils(gpio_reg_intr_ctrl_en_falling)
-
-  function new(string       name = "gpio_reg_intr_ctrl_en_falling",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    intr_ctrl_en_falling = dv_base_reg_field::type_id::create("intr_ctrl_en_falling");
-    intr_ctrl_en_falling.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_ctrl_en_falling
-
-// Class: gpio_reg_intr_ctrl_en_lvlhigh
-class gpio_reg_intr_ctrl_en_lvlhigh extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field intr_ctrl_en_lvlhigh;
-
-  `uvm_object_utils(gpio_reg_intr_ctrl_en_lvlhigh)
-
-  function new(string       name = "gpio_reg_intr_ctrl_en_lvlhigh",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    intr_ctrl_en_lvlhigh = dv_base_reg_field::type_id::create("intr_ctrl_en_lvlhigh");
-    intr_ctrl_en_lvlhigh.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_ctrl_en_lvlhigh
-
-// Class: gpio_reg_intr_ctrl_en_lvllow
-class gpio_reg_intr_ctrl_en_lvllow extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field intr_ctrl_en_lvllow;
-
-  `uvm_object_utils(gpio_reg_intr_ctrl_en_lvllow)
-
-  function new(string       name = "gpio_reg_intr_ctrl_en_lvllow",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    intr_ctrl_en_lvllow = dv_base_reg_field::type_id::create("intr_ctrl_en_lvllow");
-    intr_ctrl_en_lvllow.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_intr_ctrl_en_lvllow
-
-// Class: gpio_reg_ctrl_en_input_filter
-class gpio_reg_ctrl_en_input_filter extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field ctrl_en_input_filter;
-
-  `uvm_object_utils(gpio_reg_ctrl_en_input_filter)
-
-  function new(string       name = "gpio_reg_ctrl_en_input_filter",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    ctrl_en_input_filter = dv_base_reg_field::type_id::create("ctrl_en_input_filter");
-    ctrl_en_input_filter.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : gpio_reg_ctrl_en_input_filter
-
-// Class: gpio_reg_block
-class gpio_reg_block extends dv_base_reg_block;
-  // registers
-  rand gpio_reg_intr_state intr_state;
-  rand gpio_reg_intr_enable intr_enable;
-  rand gpio_reg_intr_test intr_test;
-  rand gpio_reg_data_in data_in;
-  rand gpio_reg_direct_out direct_out;
-  rand gpio_reg_masked_out_lower masked_out_lower;
-  rand gpio_reg_masked_out_upper masked_out_upper;
-  rand gpio_reg_direct_oe direct_oe;
-  rand gpio_reg_masked_oe_lower masked_oe_lower;
-  rand gpio_reg_masked_oe_upper masked_oe_upper;
-  rand gpio_reg_intr_ctrl_en_rising intr_ctrl_en_rising;
-  rand gpio_reg_intr_ctrl_en_falling intr_ctrl_en_falling;
-  rand gpio_reg_intr_ctrl_en_lvlhigh intr_ctrl_en_lvlhigh;
-  rand gpio_reg_intr_ctrl_en_lvllow intr_ctrl_en_lvllow;
-  rand gpio_reg_ctrl_en_input_filter ctrl_en_input_filter;
-
-  `uvm_object_utils(gpio_reg_block)
-
-  function new(string name = "gpio_reg_block",
-               int    has_coverage = UVM_NO_COVERAGE);
-    super.new(name, has_coverage);
-  endfunction : new
-
-  virtual function void build(uvm_reg_addr_t base_addr);
-    // create default map
-    this.default_map = create_map(.name("default_map"),
-                                  .base_addr(base_addr),
-                                  .n_bytes(4),
-                                  .endian(UVM_LITTLE_ENDIAN));
-
-    // create registers
-    intr_state = gpio_reg_intr_state::type_id::create("intr_state");
-    intr_state.configure(.blk_parent(this));
-    intr_state.build();
-    default_map.add_reg(.rg(intr_state),
-                        .offset(32'h0),
-                        .rights("RW"));
-    intr_enable = gpio_reg_intr_enable::type_id::create("intr_enable");
-    intr_enable.configure(.blk_parent(this));
-    intr_enable.build();
-    default_map.add_reg(.rg(intr_enable),
-                        .offset(32'h4),
-                        .rights("RW"));
-    intr_test = gpio_reg_intr_test::type_id::create("intr_test");
-    intr_test.configure(.blk_parent(this));
-    intr_test.build();
-    default_map.add_reg(.rg(intr_test),
-                        .offset(32'h8),
-                        .rights("WO"));
-    data_in = gpio_reg_data_in::type_id::create("data_in");
-    data_in.configure(.blk_parent(this));
-    data_in.build();
-    default_map.add_reg(.rg(data_in),
-                        .offset(32'hc),
-                        .rights("RO"));
-    direct_out = gpio_reg_direct_out::type_id::create("direct_out");
-    direct_out.configure(.blk_parent(this));
-    direct_out.build();
-    default_map.add_reg(.rg(direct_out),
-                        .offset(32'h10),
-                        .rights("RW"));
-    masked_out_lower = gpio_reg_masked_out_lower::type_id::create("masked_out_lower");
-    masked_out_lower.configure(.blk_parent(this));
-    masked_out_lower.build();
-    default_map.add_reg(.rg(masked_out_lower),
-                        .offset(32'h14),
-                        .rights("RW"));
-    masked_out_upper = gpio_reg_masked_out_upper::type_id::create("masked_out_upper");
-    masked_out_upper.configure(.blk_parent(this));
-    masked_out_upper.build();
-    default_map.add_reg(.rg(masked_out_upper),
-                        .offset(32'h18),
-                        .rights("RW"));
-    direct_oe = gpio_reg_direct_oe::type_id::create("direct_oe");
-    direct_oe.configure(.blk_parent(this));
-    direct_oe.build();
-    default_map.add_reg(.rg(direct_oe),
-                        .offset(32'h1c),
-                        .rights("RW"));
-    masked_oe_lower = gpio_reg_masked_oe_lower::type_id::create("masked_oe_lower");
-    masked_oe_lower.configure(.blk_parent(this));
-    masked_oe_lower.build();
-    default_map.add_reg(.rg(masked_oe_lower),
-                        .offset(32'h20),
-                        .rights("RW"));
-    masked_oe_upper = gpio_reg_masked_oe_upper::type_id::create("masked_oe_upper");
-    masked_oe_upper.configure(.blk_parent(this));
-    masked_oe_upper.build();
-    default_map.add_reg(.rg(masked_oe_upper),
-                        .offset(32'h24),
-                        .rights("RW"));
-    intr_ctrl_en_rising = gpio_reg_intr_ctrl_en_rising::type_id::create("intr_ctrl_en_rising");
-    intr_ctrl_en_rising.configure(.blk_parent(this));
-    intr_ctrl_en_rising.build();
-    default_map.add_reg(.rg(intr_ctrl_en_rising),
-                        .offset(32'h28),
-                        .rights("RW"));
-    intr_ctrl_en_falling = gpio_reg_intr_ctrl_en_falling::type_id::create("intr_ctrl_en_falling");
-    intr_ctrl_en_falling.configure(.blk_parent(this));
-    intr_ctrl_en_falling.build();
-    default_map.add_reg(.rg(intr_ctrl_en_falling),
-                        .offset(32'h2c),
-                        .rights("RW"));
-    intr_ctrl_en_lvlhigh = gpio_reg_intr_ctrl_en_lvlhigh::type_id::create("intr_ctrl_en_lvlhigh");
-    intr_ctrl_en_lvlhigh.configure(.blk_parent(this));
-    intr_ctrl_en_lvlhigh.build();
-    default_map.add_reg(.rg(intr_ctrl_en_lvlhigh),
-                        .offset(32'h30),
-                        .rights("RW"));
-    intr_ctrl_en_lvllow = gpio_reg_intr_ctrl_en_lvllow::type_id::create("intr_ctrl_en_lvllow");
-    intr_ctrl_en_lvllow.configure(.blk_parent(this));
-    intr_ctrl_en_lvllow.build();
-    default_map.add_reg(.rg(intr_ctrl_en_lvllow),
-                        .offset(32'h34),
-                        .rights("RW"));
-    ctrl_en_input_filter = gpio_reg_ctrl_en_input_filter::type_id::create("ctrl_en_input_filter");
-    ctrl_en_input_filter.configure(.blk_parent(this));
-    ctrl_en_input_filter.build();
-    default_map.add_reg(.rg(ctrl_en_input_filter),
-                        .offset(32'h38),
-                        .rights("RW"));
-  endfunction : build
-
-endclass : gpio_reg_block
-
-// Block: flash_ctrl
-// Class: flash_ctrl_reg_intr_state
-class flash_ctrl_reg_intr_state extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prog_empty;
-  rand dv_base_reg_field prog_lvl;
-  rand dv_base_reg_field rd_full;
-  rand dv_base_reg_field rd_lvl;
-  rand dv_base_reg_field op_done;
-  rand dv_base_reg_field op_error;
-
-  `uvm_object_utils(flash_ctrl_reg_intr_state)
-
-  function new(string       name = "flash_ctrl_reg_intr_state",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
-    prog_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_lvl = dv_base_reg_field::type_id::create("prog_lvl");
-    prog_lvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_full = dv_base_reg_field::type_id::create("rd_full");
-    rd_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_lvl = dv_base_reg_field::type_id::create("rd_lvl");
-    rd_lvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op_done = dv_base_reg_field::type_id::create("op_done");
-    op_done.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op_error = dv_base_reg_field::type_id::create("op_error");
-    op_error.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_intr_state
-
-// Class: flash_ctrl_reg_intr_enable
-class flash_ctrl_reg_intr_enable extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prog_empty;
-  rand dv_base_reg_field prog_lvl;
-  rand dv_base_reg_field rd_full;
-  rand dv_base_reg_field rd_lvl;
-  rand dv_base_reg_field op_done;
-  rand dv_base_reg_field op_error;
-
-  `uvm_object_utils(flash_ctrl_reg_intr_enable)
-
-  function new(string       name = "flash_ctrl_reg_intr_enable",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
-    prog_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_lvl = dv_base_reg_field::type_id::create("prog_lvl");
-    prog_lvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_full = dv_base_reg_field::type_id::create("rd_full");
-    rd_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_lvl = dv_base_reg_field::type_id::create("rd_lvl");
-    rd_lvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op_done = dv_base_reg_field::type_id::create("op_done");
-    op_done.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op_error = dv_base_reg_field::type_id::create("op_error");
-    op_error.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_intr_enable
-
-// Class: flash_ctrl_reg_intr_test
-class flash_ctrl_reg_intr_test extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prog_empty;
-  rand dv_base_reg_field prog_lvl;
-  rand dv_base_reg_field rd_full;
-  rand dv_base_reg_field rd_lvl;
-  rand dv_base_reg_field op_done;
-  rand dv_base_reg_field op_error;
-
-  `uvm_object_utils(flash_ctrl_reg_intr_test)
-
-  function new(string       name = "flash_ctrl_reg_intr_test",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
-    prog_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_lvl = dv_base_reg_field::type_id::create("prog_lvl");
-    prog_lvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_full = dv_base_reg_field::type_id::create("rd_full");
-    rd_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_lvl = dv_base_reg_field::type_id::create("rd_lvl");
-    rd_lvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op_done = dv_base_reg_field::type_id::create("op_done");
-    op_done.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op_error = dv_base_reg_field::type_id::create("op_error");
-    op_error.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_intr_test
-
-// Class: flash_ctrl_reg_control
-class flash_ctrl_reg_control extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field start;
-  rand dv_base_reg_field op;
-  rand dv_base_reg_field erase_sel;
-  rand dv_base_reg_field fifo_rst;
-  rand dv_base_reg_field num;
-
-  `uvm_object_utils(flash_ctrl_reg_control)
-
-  function new(string       name = "flash_ctrl_reg_control",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    start = dv_base_reg_field::type_id::create("start");
-    start.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    op = dv_base_reg_field::type_id::create("op");
-    op.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_sel = dv_base_reg_field::type_id::create("erase_sel");
-    erase_sel.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    fifo_rst = dv_base_reg_field::type_id::create("fifo_rst");
-    fifo_rst.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(7),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    num = dv_base_reg_field::type_id::create("num");
-    num.configure(
-      .parent(this),
-      .size(12),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_control
-
-// Class: flash_ctrl_reg_addr
-class flash_ctrl_reg_addr extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field start;
-
-  `uvm_object_utils(flash_ctrl_reg_addr)
-
-  function new(string       name = "flash_ctrl_reg_addr",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    start = dv_base_reg_field::type_id::create("start");
-    start.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_addr
-
-// Class: flash_ctrl_reg_mp_region_cfg0
-class flash_ctrl_reg_mp_region_cfg0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en0;
-  rand dv_base_reg_field rd_en0;
-  rand dv_base_reg_field prog_en0;
-  rand dv_base_reg_field erase_en0;
-  rand dv_base_reg_field base0;
-  rand dv_base_reg_field size0;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg0)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en0 = dv_base_reg_field::type_id::create("en0");
-    en0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en0 = dv_base_reg_field::type_id::create("rd_en0");
-    rd_en0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en0 = dv_base_reg_field::type_id::create("prog_en0");
-    prog_en0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en0 = dv_base_reg_field::type_id::create("erase_en0");
-    erase_en0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base0 = dv_base_reg_field::type_id::create("base0");
-    base0.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size0 = dv_base_reg_field::type_id::create("size0");
-    size0.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg0
-
-// Class: flash_ctrl_reg_mp_region_cfg1
-class flash_ctrl_reg_mp_region_cfg1 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en1;
-  rand dv_base_reg_field rd_en1;
-  rand dv_base_reg_field prog_en1;
-  rand dv_base_reg_field erase_en1;
-  rand dv_base_reg_field base1;
-  rand dv_base_reg_field size1;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg1)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg1",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en1 = dv_base_reg_field::type_id::create("en1");
-    en1.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en1 = dv_base_reg_field::type_id::create("rd_en1");
-    rd_en1.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en1 = dv_base_reg_field::type_id::create("prog_en1");
-    prog_en1.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en1 = dv_base_reg_field::type_id::create("erase_en1");
-    erase_en1.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base1 = dv_base_reg_field::type_id::create("base1");
-    base1.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size1 = dv_base_reg_field::type_id::create("size1");
-    size1.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg1
-
-// Class: flash_ctrl_reg_mp_region_cfg2
-class flash_ctrl_reg_mp_region_cfg2 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en2;
-  rand dv_base_reg_field rd_en2;
-  rand dv_base_reg_field prog_en2;
-  rand dv_base_reg_field erase_en2;
-  rand dv_base_reg_field base2;
-  rand dv_base_reg_field size2;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg2)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg2",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en2 = dv_base_reg_field::type_id::create("en2");
-    en2.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en2 = dv_base_reg_field::type_id::create("rd_en2");
-    rd_en2.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en2 = dv_base_reg_field::type_id::create("prog_en2");
-    prog_en2.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en2 = dv_base_reg_field::type_id::create("erase_en2");
-    erase_en2.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base2 = dv_base_reg_field::type_id::create("base2");
-    base2.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size2 = dv_base_reg_field::type_id::create("size2");
-    size2.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg2
-
-// Class: flash_ctrl_reg_mp_region_cfg3
-class flash_ctrl_reg_mp_region_cfg3 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en3;
-  rand dv_base_reg_field rd_en3;
-  rand dv_base_reg_field prog_en3;
-  rand dv_base_reg_field erase_en3;
-  rand dv_base_reg_field base3;
-  rand dv_base_reg_field size3;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg3)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg3",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en3 = dv_base_reg_field::type_id::create("en3");
-    en3.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en3 = dv_base_reg_field::type_id::create("rd_en3");
-    rd_en3.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en3 = dv_base_reg_field::type_id::create("prog_en3");
-    prog_en3.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en3 = dv_base_reg_field::type_id::create("erase_en3");
-    erase_en3.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base3 = dv_base_reg_field::type_id::create("base3");
-    base3.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size3 = dv_base_reg_field::type_id::create("size3");
-    size3.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg3
-
-// Class: flash_ctrl_reg_mp_region_cfg4
-class flash_ctrl_reg_mp_region_cfg4 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en4;
-  rand dv_base_reg_field rd_en4;
-  rand dv_base_reg_field prog_en4;
-  rand dv_base_reg_field erase_en4;
-  rand dv_base_reg_field base4;
-  rand dv_base_reg_field size4;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg4)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg4",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en4 = dv_base_reg_field::type_id::create("en4");
-    en4.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en4 = dv_base_reg_field::type_id::create("rd_en4");
-    rd_en4.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en4 = dv_base_reg_field::type_id::create("prog_en4");
-    prog_en4.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en4 = dv_base_reg_field::type_id::create("erase_en4");
-    erase_en4.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base4 = dv_base_reg_field::type_id::create("base4");
-    base4.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size4 = dv_base_reg_field::type_id::create("size4");
-    size4.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg4
-
-// Class: flash_ctrl_reg_mp_region_cfg5
-class flash_ctrl_reg_mp_region_cfg5 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en5;
-  rand dv_base_reg_field rd_en5;
-  rand dv_base_reg_field prog_en5;
-  rand dv_base_reg_field erase_en5;
-  rand dv_base_reg_field base5;
-  rand dv_base_reg_field size5;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg5)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg5",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en5 = dv_base_reg_field::type_id::create("en5");
-    en5.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en5 = dv_base_reg_field::type_id::create("rd_en5");
-    rd_en5.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en5 = dv_base_reg_field::type_id::create("prog_en5");
-    prog_en5.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en5 = dv_base_reg_field::type_id::create("erase_en5");
-    erase_en5.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base5 = dv_base_reg_field::type_id::create("base5");
-    base5.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size5 = dv_base_reg_field::type_id::create("size5");
-    size5.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg5
-
-// Class: flash_ctrl_reg_mp_region_cfg6
-class flash_ctrl_reg_mp_region_cfg6 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en6;
-  rand dv_base_reg_field rd_en6;
-  rand dv_base_reg_field prog_en6;
-  rand dv_base_reg_field erase_en6;
-  rand dv_base_reg_field base6;
-  rand dv_base_reg_field size6;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg6)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg6",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en6 = dv_base_reg_field::type_id::create("en6");
-    en6.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en6 = dv_base_reg_field::type_id::create("rd_en6");
-    rd_en6.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en6 = dv_base_reg_field::type_id::create("prog_en6");
-    prog_en6.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en6 = dv_base_reg_field::type_id::create("erase_en6");
-    erase_en6.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base6 = dv_base_reg_field::type_id::create("base6");
-    base6.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size6 = dv_base_reg_field::type_id::create("size6");
-    size6.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg6
-
-// Class: flash_ctrl_reg_mp_region_cfg7
-class flash_ctrl_reg_mp_region_cfg7 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field en7;
-  rand dv_base_reg_field rd_en7;
-  rand dv_base_reg_field prog_en7;
-  rand dv_base_reg_field erase_en7;
-  rand dv_base_reg_field base7;
-  rand dv_base_reg_field size7;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_region_cfg7)
-
-  function new(string       name = "flash_ctrl_reg_mp_region_cfg7",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    en7 = dv_base_reg_field::type_id::create("en7");
-    en7.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_en7 = dv_base_reg_field::type_id::create("rd_en7");
-    rd_en7.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en7 = dv_base_reg_field::type_id::create("prog_en7");
-    prog_en7.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en7 = dv_base_reg_field::type_id::create("erase_en7");
-    erase_en7.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    base7 = dv_base_reg_field::type_id::create("base7");
-    base7.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    size7 = dv_base_reg_field::type_id::create("size7");
-    size7.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_region_cfg7
-
-// Class: flash_ctrl_reg_default_region
-class flash_ctrl_reg_default_region extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rd_en;
-  rand dv_base_reg_field prog_en;
-  rand dv_base_reg_field erase_en;
-
-  `uvm_object_utils(flash_ctrl_reg_default_region)
-
-  function new(string       name = "flash_ctrl_reg_default_region",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rd_en = dv_base_reg_field::type_id::create("rd_en");
-    rd_en.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_en = dv_base_reg_field::type_id::create("prog_en");
-    prog_en.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en = dv_base_reg_field::type_id::create("erase_en");
-    erase_en.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_default_region
-
-// Class: flash_ctrl_reg_mp_bank_cfg
-class flash_ctrl_reg_mp_bank_cfg extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field erase_en0;
-  rand dv_base_reg_field erase_en1;
-
-  `uvm_object_utils(flash_ctrl_reg_mp_bank_cfg)
-
-  function new(string       name = "flash_ctrl_reg_mp_bank_cfg",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    erase_en0 = dv_base_reg_field::type_id::create("erase_en0");
-    erase_en0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    erase_en1 = dv_base_reg_field::type_id::create("erase_en1");
-    erase_en1.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_mp_bank_cfg
-
-// Class: flash_ctrl_reg_op_status
-class flash_ctrl_reg_op_status extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field done;
-  rand dv_base_reg_field err;
-
-  `uvm_object_utils(flash_ctrl_reg_op_status)
-
-  function new(string       name = "flash_ctrl_reg_op_status",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    done = dv_base_reg_field::type_id::create("done");
-    done.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    err = dv_base_reg_field::type_id::create("err");
-    err.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_op_status
-
-// Class: flash_ctrl_reg_status
-class flash_ctrl_reg_status extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rd_full;
-  rand dv_base_reg_field rd_empty;
-  rand dv_base_reg_field prog_full;
-  rand dv_base_reg_field prog_empty;
-  rand dv_base_reg_field init_wip;
-  rand dv_base_reg_field error_page;
-  rand dv_base_reg_field error_bank;
-
-  `uvm_object_utils(flash_ctrl_reg_status)
-
-  function new(string       name = "flash_ctrl_reg_status",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rd_full = dv_base_reg_field::type_id::create("rd_full");
-    rd_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd_empty = dv_base_reg_field::type_id::create("rd_empty");
-    rd_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_full = dv_base_reg_field::type_id::create("prog_full");
-    prog_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    prog_empty = dv_base_reg_field::type_id::create("prog_empty");
-    prog_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    init_wip = dv_base_reg_field::type_id::create("init_wip");
-    init_wip.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    error_page = dv_base_reg_field::type_id::create("error_page");
-    error_page.configure(
-      .parent(this),
-      .size(9),
-      .lsb_pos(8),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    error_bank = dv_base_reg_field::type_id::create("error_bank");
-    error_bank.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(17),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_status
-
-// Class: flash_ctrl_reg_scratch
-class flash_ctrl_reg_scratch extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field data;
-
-  `uvm_object_utils(flash_ctrl_reg_scratch)
-
-  function new(string       name = "flash_ctrl_reg_scratch",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    data = dv_base_reg_field::type_id::create("data");
-    data.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_scratch
-
-// Class: flash_ctrl_reg_fifo_lvl
-class flash_ctrl_reg_fifo_lvl extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prog;
-  rand dv_base_reg_field rd;
-
-  `uvm_object_utils(flash_ctrl_reg_fifo_lvl)
-
-  function new(string       name = "flash_ctrl_reg_fifo_lvl",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    prog = dv_base_reg_field::type_id::create("prog");
-    prog.configure(
-      .parent(this),
-      .size(5),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(15),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rd = dv_base_reg_field::type_id::create("rd");
-    rd.configure(
-      .parent(this),
-      .size(5),
-      .lsb_pos(8),
-      .access("RW"),
-      .volatile(0),
-      .reset(15),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : flash_ctrl_reg_fifo_lvl
-
-// Class: flash_ctrl_mem_prog_fifo
-class flash_ctrl_mem_prog_fifo extends dv_base_mem;
-
-  `uvm_object_utils(flash_ctrl_mem_prog_fifo)
-
-  function new(string           name = "flash_ctrl_mem_prog_fifo",
-               longint unsigned size = 1,
-               int unsigned     n_bits = 32,
-               string           access = "RW"/* TODO:"WO"*/,
-               int              has_coverage = UVM_NO_COVERAGE);
-    super.new(name, size, n_bits, access, has_coverage);
-  endfunction : new
-
-endclass : flash_ctrl_mem_prog_fifo
-
-// Class: flash_ctrl_mem_rd_fifo
-class flash_ctrl_mem_rd_fifo extends dv_base_mem;
-
-  `uvm_object_utils(flash_ctrl_mem_rd_fifo)
-
-  function new(string           name = "flash_ctrl_mem_rd_fifo",
-               longint unsigned size = 1,
-               int unsigned     n_bits = 32,
-               string           access = "RW"/* TODO:"RO"*/,
-               int              has_coverage = UVM_NO_COVERAGE);
-    super.new(name, size, n_bits, access, has_coverage);
-  endfunction : new
-
-endclass : flash_ctrl_mem_rd_fifo
-
-// Class: flash_ctrl_reg_block
-class flash_ctrl_reg_block extends dv_base_reg_block;
-  // registers
-  rand flash_ctrl_reg_intr_state intr_state;
-  rand flash_ctrl_reg_intr_enable intr_enable;
-  rand flash_ctrl_reg_intr_test intr_test;
-  rand flash_ctrl_reg_control control;
-  rand flash_ctrl_reg_addr addr;
-  rand flash_ctrl_reg_mp_region_cfg0 mp_region_cfg0;
-  rand flash_ctrl_reg_mp_region_cfg1 mp_region_cfg1;
-  rand flash_ctrl_reg_mp_region_cfg2 mp_region_cfg2;
-  rand flash_ctrl_reg_mp_region_cfg3 mp_region_cfg3;
-  rand flash_ctrl_reg_mp_region_cfg4 mp_region_cfg4;
-  rand flash_ctrl_reg_mp_region_cfg5 mp_region_cfg5;
-  rand flash_ctrl_reg_mp_region_cfg6 mp_region_cfg6;
-  rand flash_ctrl_reg_mp_region_cfg7 mp_region_cfg7;
-  rand flash_ctrl_reg_default_region default_region;
-  rand flash_ctrl_reg_mp_bank_cfg mp_bank_cfg;
-  rand flash_ctrl_reg_op_status op_status;
-  rand flash_ctrl_reg_status status;
-  rand flash_ctrl_reg_scratch scratch;
-  rand flash_ctrl_reg_fifo_lvl fifo_lvl;
-  // memories
-  rand flash_ctrl_mem_prog_fifo prog_fifo;
-  rand flash_ctrl_mem_rd_fifo rd_fifo;
-
-  `uvm_object_utils(flash_ctrl_reg_block)
-
-  function new(string name = "flash_ctrl_reg_block",
-               int    has_coverage = UVM_NO_COVERAGE);
-    super.new(name, has_coverage);
-  endfunction : new
-
-  virtual function void build(uvm_reg_addr_t base_addr);
-    // create default map
-    this.default_map = create_map(.name("default_map"),
-                                  .base_addr(base_addr),
-                                  .n_bytes(4),
-                                  .endian(UVM_LITTLE_ENDIAN));
-
-    // create registers
-    intr_state = flash_ctrl_reg_intr_state::type_id::create("intr_state");
-    intr_state.configure(.blk_parent(this));
-    intr_state.build();
-    default_map.add_reg(.rg(intr_state),
-                        .offset(32'h0),
-                        .rights("RW"));
-    intr_enable = flash_ctrl_reg_intr_enable::type_id::create("intr_enable");
-    intr_enable.configure(.blk_parent(this));
-    intr_enable.build();
-    default_map.add_reg(.rg(intr_enable),
-                        .offset(32'h4),
-                        .rights("RW"));
-    intr_test = flash_ctrl_reg_intr_test::type_id::create("intr_test");
-    intr_test.configure(.blk_parent(this));
-    intr_test.build();
-    default_map.add_reg(.rg(intr_test),
-                        .offset(32'h8),
-                        .rights("WO"));
-    control = flash_ctrl_reg_control::type_id::create("control");
-    control.configure(.blk_parent(this));
-    control.build();
-    default_map.add_reg(.rg(control),
-                        .offset(32'hc),
-                        .rights("RW"));
-    addr = flash_ctrl_reg_addr::type_id::create("addr");
-    addr.configure(.blk_parent(this));
-    addr.build();
-    default_map.add_reg(.rg(addr),
-                        .offset(32'h10),
-                        .rights("RW"));
-    mp_region_cfg0 = flash_ctrl_reg_mp_region_cfg0::type_id::create("mp_region_cfg0");
-    mp_region_cfg0.configure(.blk_parent(this));
-    mp_region_cfg0.build();
-    default_map.add_reg(.rg(mp_region_cfg0),
-                        .offset(32'h14),
-                        .rights("RW"));
-    mp_region_cfg1 = flash_ctrl_reg_mp_region_cfg1::type_id::create("mp_region_cfg1");
-    mp_region_cfg1.configure(.blk_parent(this));
-    mp_region_cfg1.build();
-    default_map.add_reg(.rg(mp_region_cfg1),
-                        .offset(32'h18),
-                        .rights("RW"));
-    mp_region_cfg2 = flash_ctrl_reg_mp_region_cfg2::type_id::create("mp_region_cfg2");
-    mp_region_cfg2.configure(.blk_parent(this));
-    mp_region_cfg2.build();
-    default_map.add_reg(.rg(mp_region_cfg2),
-                        .offset(32'h1c),
-                        .rights("RW"));
-    mp_region_cfg3 = flash_ctrl_reg_mp_region_cfg3::type_id::create("mp_region_cfg3");
-    mp_region_cfg3.configure(.blk_parent(this));
-    mp_region_cfg3.build();
-    default_map.add_reg(.rg(mp_region_cfg3),
-                        .offset(32'h20),
-                        .rights("RW"));
-    mp_region_cfg4 = flash_ctrl_reg_mp_region_cfg4::type_id::create("mp_region_cfg4");
-    mp_region_cfg4.configure(.blk_parent(this));
-    mp_region_cfg4.build();
-    default_map.add_reg(.rg(mp_region_cfg4),
-                        .offset(32'h24),
-                        .rights("RW"));
-    mp_region_cfg5 = flash_ctrl_reg_mp_region_cfg5::type_id::create("mp_region_cfg5");
-    mp_region_cfg5.configure(.blk_parent(this));
-    mp_region_cfg5.build();
-    default_map.add_reg(.rg(mp_region_cfg5),
-                        .offset(32'h28),
-                        .rights("RW"));
-    mp_region_cfg6 = flash_ctrl_reg_mp_region_cfg6::type_id::create("mp_region_cfg6");
-    mp_region_cfg6.configure(.blk_parent(this));
-    mp_region_cfg6.build();
-    default_map.add_reg(.rg(mp_region_cfg6),
-                        .offset(32'h2c),
-                        .rights("RW"));
-    mp_region_cfg7 = flash_ctrl_reg_mp_region_cfg7::type_id::create("mp_region_cfg7");
-    mp_region_cfg7.configure(.blk_parent(this));
-    mp_region_cfg7.build();
-    default_map.add_reg(.rg(mp_region_cfg7),
-                        .offset(32'h30),
-                        .rights("RW"));
-    default_region = flash_ctrl_reg_default_region::type_id::create("default_region");
-    default_region.configure(.blk_parent(this));
-    default_region.build();
-    default_map.add_reg(.rg(default_region),
-                        .offset(32'h34),
-                        .rights("RW"));
-    mp_bank_cfg = flash_ctrl_reg_mp_bank_cfg::type_id::create("mp_bank_cfg");
-    mp_bank_cfg.configure(.blk_parent(this));
-    mp_bank_cfg.build();
-    default_map.add_reg(.rg(mp_bank_cfg),
-                        .offset(32'h38),
-                        .rights("RW"));
-    op_status = flash_ctrl_reg_op_status::type_id::create("op_status");
-    op_status.configure(.blk_parent(this));
-    op_status.build();
-    default_map.add_reg(.rg(op_status),
-                        .offset(32'h3c),
-                        .rights("RW"));
-    status = flash_ctrl_reg_status::type_id::create("status");
-    status.configure(.blk_parent(this));
-    status.build();
-    default_map.add_reg(.rg(status),
-                        .offset(32'h40),
-                        .rights("RO"));
-    scratch = flash_ctrl_reg_scratch::type_id::create("scratch");
-    scratch.configure(.blk_parent(this));
-    scratch.build();
-    default_map.add_reg(.rg(scratch),
-                        .offset(32'h44),
-                        .rights("RW"));
-    fifo_lvl = flash_ctrl_reg_fifo_lvl::type_id::create("fifo_lvl");
-    fifo_lvl.configure(.blk_parent(this));
-    fifo_lvl.build();
-    default_map.add_reg(.rg(fifo_lvl),
-                        .offset(32'h48),
-                        .rights("RW"));
-
-    // create memories
-    prog_fifo = flash_ctrl_mem_prog_fifo::type_id::create("prog_fifo");
-    prog_fifo.configure(.parent(this));
-    default_map.add_mem(.mem(prog_fifo),
-                        .offset(32'h4c),
-                        .rights("WO"));
-    rd_fifo = flash_ctrl_mem_rd_fifo::type_id::create("rd_fifo");
-    rd_fifo.configure(.parent(this));
-    default_map.add_mem(.mem(rd_fifo),
-                        .offset(32'h50),
-                        .rights("RO"));
-  endfunction : build
-
-endclass : flash_ctrl_reg_block
-
 // Block: uart
 // Class: uart_reg_intr_state
 class uart_reg_intr_state extends dv_base_reg;
@@ -4452,1263 +5881,6 @@
 
 endclass : uart_reg_block
 
-// Block: spi_device
-// Class: spi_device_reg_intr_state
-class spi_device_reg_intr_state extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rxf;
-  rand dv_base_reg_field rxlvl;
-  rand dv_base_reg_field txlvl;
-  rand dv_base_reg_field rxerr;
-  rand dv_base_reg_field rxoverflow;
-  rand dv_base_reg_field txunderflow;
-
-  `uvm_object_utils(spi_device_reg_intr_state)
-
-  function new(string       name = "spi_device_reg_intr_state",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rxf = dv_base_reg_field::type_id::create("rxf");
-    rxf.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
-    rxlvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txlvl = dv_base_reg_field::type_id::create("txlvl");
-    txlvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxerr = dv_base_reg_field::type_id::create("rxerr");
-    rxerr.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxoverflow = dv_base_reg_field::type_id::create("rxoverflow");
-    rxoverflow.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txunderflow = dv_base_reg_field::type_id::create("txunderflow");
-    txunderflow.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_intr_state
-
-// Class: spi_device_reg_intr_enable
-class spi_device_reg_intr_enable extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rxf;
-  rand dv_base_reg_field rxlvl;
-  rand dv_base_reg_field txlvl;
-  rand dv_base_reg_field rxerr;
-  rand dv_base_reg_field rxoverflow;
-  rand dv_base_reg_field txunderflow;
-
-  `uvm_object_utils(spi_device_reg_intr_enable)
-
-  function new(string       name = "spi_device_reg_intr_enable",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rxf = dv_base_reg_field::type_id::create("rxf");
-    rxf.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
-    rxlvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txlvl = dv_base_reg_field::type_id::create("txlvl");
-    txlvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxerr = dv_base_reg_field::type_id::create("rxerr");
-    rxerr.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxoverflow = dv_base_reg_field::type_id::create("rxoverflow");
-    rxoverflow.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txunderflow = dv_base_reg_field::type_id::create("txunderflow");
-    txunderflow.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_intr_enable
-
-// Class: spi_device_reg_intr_test
-class spi_device_reg_intr_test extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rxf;
-  rand dv_base_reg_field rxlvl;
-  rand dv_base_reg_field txlvl;
-  rand dv_base_reg_field rxerr;
-  rand dv_base_reg_field rxoverflow;
-  rand dv_base_reg_field txunderflow;
-
-  `uvm_object_utils(spi_device_reg_intr_test)
-
-  function new(string       name = "spi_device_reg_intr_test",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rxf = dv_base_reg_field::type_id::create("rxf");
-    rxf.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
-    rxlvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txlvl = dv_base_reg_field::type_id::create("txlvl");
-    txlvl.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxerr = dv_base_reg_field::type_id::create("rxerr");
-    rxerr.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxoverflow = dv_base_reg_field::type_id::create("rxoverflow");
-    rxoverflow.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txunderflow = dv_base_reg_field::type_id::create("txunderflow");
-    txunderflow.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_intr_test
-
-// Class: spi_device_reg_control
-class spi_device_reg_control extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field abort;
-  rand dv_base_reg_field mode;
-  rand dv_base_reg_field rst_txfifo;
-  rand dv_base_reg_field rst_rxfifo;
-
-  `uvm_object_utils(spi_device_reg_control)
-
-  function new(string       name = "spi_device_reg_control",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    abort = dv_base_reg_field::type_id::create("abort");
-    abort.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    mode = dv_base_reg_field::type_id::create("mode");
-    mode.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rst_txfifo = dv_base_reg_field::type_id::create("rst_txfifo");
-    rst_txfifo.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rst_rxfifo = dv_base_reg_field::type_id::create("rst_rxfifo");
-    rst_rxfifo.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(17),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_control
-
-// Class: spi_device_reg_cfg
-class spi_device_reg_cfg extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field cpol;
-  rand dv_base_reg_field cpha;
-  rand dv_base_reg_field tx_order;
-  rand dv_base_reg_field rx_order;
-  rand dv_base_reg_field timer_v;
-
-  `uvm_object_utils(spi_device_reg_cfg)
-
-  function new(string       name = "spi_device_reg_cfg",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    cpol = dv_base_reg_field::type_id::create("cpol");
-    cpol.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    cpha = dv_base_reg_field::type_id::create("cpha");
-    cpha.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    tx_order = dv_base_reg_field::type_id::create("tx_order");
-    tx_order.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rx_order = dv_base_reg_field::type_id::create("rx_order");
-    rx_order.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    timer_v = dv_base_reg_field::type_id::create("timer_v");
-    timer_v.configure(
-      .parent(this),
-      .size(8),
-      .lsb_pos(8),
-      .access("RW"),
-      .volatile(0),
-      .reset(127),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_cfg
-
-// Class: spi_device_reg_fifo_level
-class spi_device_reg_fifo_level extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rxlvl;
-  rand dv_base_reg_field txlvl;
-
-  `uvm_object_utils(spi_device_reg_fifo_level)
-
-  function new(string       name = "spi_device_reg_fifo_level",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
-    rxlvl.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(128),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txlvl = dv_base_reg_field::type_id::create("txlvl");
-    txlvl.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_fifo_level
-
-// Class: spi_device_reg_async_fifo_level
-class spi_device_reg_async_fifo_level extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rxlvl;
-  rand dv_base_reg_field txlvl;
-
-  `uvm_object_utils(spi_device_reg_async_fifo_level)
-
-  function new(string       name = "spi_device_reg_async_fifo_level",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rxlvl = dv_base_reg_field::type_id::create("rxlvl");
-    rxlvl.configure(
-      .parent(this),
-      .size(8),
-      .lsb_pos(0),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txlvl = dv_base_reg_field::type_id::create("txlvl");
-    txlvl.configure(
-      .parent(this),
-      .size(8),
-      .lsb_pos(16),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_async_fifo_level
-
-// Class: spi_device_reg_status
-class spi_device_reg_status extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rxf_full;
-  rand dv_base_reg_field rxf_empty;
-  rand dv_base_reg_field txf_full;
-  rand dv_base_reg_field txf_empty;
-  rand dv_base_reg_field abort_done;
-  rand dv_base_reg_field csb;
-
-  `uvm_object_utils(spi_device_reg_status)
-
-  function new(string       name = "spi_device_reg_status",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rxf_full = dv_base_reg_field::type_id::create("rxf_full");
-    rxf_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    rxf_empty = dv_base_reg_field::type_id::create("rxf_empty");
-    rxf_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RO"),
-      .volatile(1),
-      .reset(1),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txf_full = dv_base_reg_field::type_id::create("txf_full");
-    txf_full.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    txf_empty = dv_base_reg_field::type_id::create("txf_empty");
-    txf_empty.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RO"),
-      .volatile(1),
-      .reset(1),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    abort_done = dv_base_reg_field::type_id::create("abort_done");
-    abort_done.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("RO"),
-      .volatile(1),
-      .reset(1),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    csb = dv_base_reg_field::type_id::create("csb");
-    csb.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("RO"),
-      .volatile(1),
-      .reset(1),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_status
-
-// Class: spi_device_reg_rxf_ptr
-class spi_device_reg_rxf_ptr extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rptr;
-  rand dv_base_reg_field wptr;
-
-  `uvm_object_utils(spi_device_reg_rxf_ptr)
-
-  function new(string       name = "spi_device_reg_rxf_ptr",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rptr = dv_base_reg_field::type_id::create("rptr");
-    rptr.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    wptr = dv_base_reg_field::type_id::create("wptr");
-    wptr.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_rxf_ptr
-
-// Class: spi_device_reg_txf_ptr
-class spi_device_reg_txf_ptr extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field rptr;
-  rand dv_base_reg_field wptr;
-
-  `uvm_object_utils(spi_device_reg_txf_ptr)
-
-  function new(string       name = "spi_device_reg_txf_ptr",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    rptr = dv_base_reg_field::type_id::create("rptr");
-    rptr.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RO"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    wptr = dv_base_reg_field::type_id::create("wptr");
-    wptr.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_txf_ptr
-
-// Class: spi_device_reg_rxf_addr
-class spi_device_reg_rxf_addr extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field base;
-  rand dv_base_reg_field limit;
-
-  `uvm_object_utils(spi_device_reg_rxf_addr)
-
-  function new(string       name = "spi_device_reg_rxf_addr",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    base = dv_base_reg_field::type_id::create("base");
-    base.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    limit = dv_base_reg_field::type_id::create("limit");
-    limit.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(508),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_rxf_addr
-
-// Class: spi_device_reg_txf_addr
-class spi_device_reg_txf_addr extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field base;
-  rand dv_base_reg_field limit;
-
-  `uvm_object_utils(spi_device_reg_txf_addr)
-
-  function new(string       name = "spi_device_reg_txf_addr",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    base = dv_base_reg_field::type_id::create("base");
-    base.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(512),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    limit = dv_base_reg_field::type_id::create("limit");
-    limit.configure(
-      .parent(this),
-      .size(16),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(1020),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : spi_device_reg_txf_addr
-
-// Class: spi_device_mem_buffer
-class spi_device_mem_buffer extends dv_base_mem;
-
-  `uvm_object_utils(spi_device_mem_buffer)
-
-  function new(string           name = "spi_device_mem_buffer",
-               longint unsigned size = 512,
-               int unsigned     n_bits = 32,
-               string           access = "RW"/* TODO:"RW"*/,
-               int              has_coverage = UVM_NO_COVERAGE);
-    super.new(name, size, n_bits, access, has_coverage);
-  endfunction : new
-
-endclass : spi_device_mem_buffer
-
-// Class: spi_device_reg_block
-class spi_device_reg_block extends dv_base_reg_block;
-  // registers
-  rand spi_device_reg_intr_state intr_state;
-  rand spi_device_reg_intr_enable intr_enable;
-  rand spi_device_reg_intr_test intr_test;
-  rand spi_device_reg_control control;
-  rand spi_device_reg_cfg cfg;
-  rand spi_device_reg_fifo_level fifo_level;
-  rand spi_device_reg_async_fifo_level async_fifo_level;
-  rand spi_device_reg_status status;
-  rand spi_device_reg_rxf_ptr rxf_ptr;
-  rand spi_device_reg_txf_ptr txf_ptr;
-  rand spi_device_reg_rxf_addr rxf_addr;
-  rand spi_device_reg_txf_addr txf_addr;
-  // memories
-  rand spi_device_mem_buffer buffer;
-
-  `uvm_object_utils(spi_device_reg_block)
-
-  function new(string name = "spi_device_reg_block",
-               int    has_coverage = UVM_NO_COVERAGE);
-    super.new(name, has_coverage);
-  endfunction : new
-
-  virtual function void build(uvm_reg_addr_t base_addr);
-    // create default map
-    this.default_map = create_map(.name("default_map"),
-                                  .base_addr(base_addr),
-                                  .n_bytes(4),
-                                  .endian(UVM_LITTLE_ENDIAN));
-
-    // create registers
-    intr_state = spi_device_reg_intr_state::type_id::create("intr_state");
-    intr_state.configure(.blk_parent(this));
-    intr_state.build();
-    default_map.add_reg(.rg(intr_state),
-                        .offset(32'h0),
-                        .rights("RW"));
-    intr_enable = spi_device_reg_intr_enable::type_id::create("intr_enable");
-    intr_enable.configure(.blk_parent(this));
-    intr_enable.build();
-    default_map.add_reg(.rg(intr_enable),
-                        .offset(32'h4),
-                        .rights("RW"));
-    intr_test = spi_device_reg_intr_test::type_id::create("intr_test");
-    intr_test.configure(.blk_parent(this));
-    intr_test.build();
-    default_map.add_reg(.rg(intr_test),
-                        .offset(32'h8),
-                        .rights("WO"));
-    control = spi_device_reg_control::type_id::create("control");
-    control.configure(.blk_parent(this));
-    control.build();
-    default_map.add_reg(.rg(control),
-                        .offset(32'hc),
-                        .rights("RW"));
-    cfg = spi_device_reg_cfg::type_id::create("cfg");
-    cfg.configure(.blk_parent(this));
-    cfg.build();
-    default_map.add_reg(.rg(cfg),
-                        .offset(32'h10),
-                        .rights("RW"));
-    fifo_level = spi_device_reg_fifo_level::type_id::create("fifo_level");
-    fifo_level.configure(.blk_parent(this));
-    fifo_level.build();
-    default_map.add_reg(.rg(fifo_level),
-                        .offset(32'h14),
-                        .rights("RW"));
-    async_fifo_level = spi_device_reg_async_fifo_level::type_id::create("async_fifo_level");
-    async_fifo_level.configure(.blk_parent(this));
-    async_fifo_level.build();
-    default_map.add_reg(.rg(async_fifo_level),
-                        .offset(32'h18),
-                        .rights("RO"));
-    status = spi_device_reg_status::type_id::create("status");
-    status.configure(.blk_parent(this));
-    status.build();
-    default_map.add_reg(.rg(status),
-                        .offset(32'h1c),
-                        .rights("RO"));
-    rxf_ptr = spi_device_reg_rxf_ptr::type_id::create("rxf_ptr");
-    rxf_ptr.configure(.blk_parent(this));
-    rxf_ptr.build();
-    default_map.add_reg(.rg(rxf_ptr),
-                        .offset(32'h20),
-                        .rights("RW"));
-    txf_ptr = spi_device_reg_txf_ptr::type_id::create("txf_ptr");
-    txf_ptr.configure(.blk_parent(this));
-    txf_ptr.build();
-    default_map.add_reg(.rg(txf_ptr),
-                        .offset(32'h24),
-                        .rights("RW"));
-    rxf_addr = spi_device_reg_rxf_addr::type_id::create("rxf_addr");
-    rxf_addr.configure(.blk_parent(this));
-    rxf_addr.build();
-    default_map.add_reg(.rg(rxf_addr),
-                        .offset(32'h28),
-                        .rights("RW"));
-    txf_addr = spi_device_reg_txf_addr::type_id::create("txf_addr");
-    txf_addr.configure(.blk_parent(this));
-    txf_addr.build();
-    default_map.add_reg(.rg(txf_addr),
-                        .offset(32'h2c),
-                        .rights("RW"));
-
-    // create memories
-    buffer = spi_device_mem_buffer::type_id::create("buffer");
-    buffer.configure(.parent(this));
-    default_map.add_mem(.mem(buffer),
-                        .offset(32'h800),
-                        .rights("RW"));
-  endfunction : build
-
-endclass : spi_device_reg_block
-
-// Block: rv_timer
-// Class: rv_timer_reg_ctrl
-class rv_timer_reg_ctrl extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field active0;
-
-  `uvm_object_utils(rv_timer_reg_ctrl)
-
-  function new(string       name = "rv_timer_reg_ctrl",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    active0 = dv_base_reg_field::type_id::create("active0");
-    active0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_ctrl
-
-// Class: rv_timer_reg_cfg0
-class rv_timer_reg_cfg0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prescale;
-  rand dv_base_reg_field step;
-
-  `uvm_object_utils(rv_timer_reg_cfg0)
-
-  function new(string       name = "rv_timer_reg_cfg0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    prescale = dv_base_reg_field::type_id::create("prescale");
-    prescale.configure(
-      .parent(this),
-      .size(12),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    step = dv_base_reg_field::type_id::create("step");
-    step.configure(
-      .parent(this),
-      .size(8),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(1),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_cfg0
-
-// Class: rv_timer_reg_timer_v_lower0
-class rv_timer_reg_timer_v_lower0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field v;
-
-  `uvm_object_utils(rv_timer_reg_timer_v_lower0)
-
-  function new(string       name = "rv_timer_reg_timer_v_lower0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    v = dv_base_reg_field::type_id::create("v");
-    v.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_timer_v_lower0
-
-// Class: rv_timer_reg_timer_v_upper0
-class rv_timer_reg_timer_v_upper0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field v;
-
-  `uvm_object_utils(rv_timer_reg_timer_v_upper0)
-
-  function new(string       name = "rv_timer_reg_timer_v_upper0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    v = dv_base_reg_field::type_id::create("v");
-    v.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_timer_v_upper0
-
-// Class: rv_timer_reg_compare_lower0_0
-class rv_timer_reg_compare_lower0_0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field v;
-
-  `uvm_object_utils(rv_timer_reg_compare_lower0_0)
-
-  function new(string       name = "rv_timer_reg_compare_lower0_0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    v = dv_base_reg_field::type_id::create("v");
-    v.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(4294967295),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_compare_lower0_0
-
-// Class: rv_timer_reg_compare_upper0_0
-class rv_timer_reg_compare_upper0_0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field v;
-
-  `uvm_object_utils(rv_timer_reg_compare_upper0_0)
-
-  function new(string       name = "rv_timer_reg_compare_upper0_0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    v = dv_base_reg_field::type_id::create("v");
-    v.configure(
-      .parent(this),
-      .size(32),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(4294967295),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_compare_upper0_0
-
-// Class: rv_timer_reg_intr_enable0
-class rv_timer_reg_intr_enable0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field ie0;
-
-  `uvm_object_utils(rv_timer_reg_intr_enable0)
-
-  function new(string       name = "rv_timer_reg_intr_enable0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    ie0 = dv_base_reg_field::type_id::create("ie0");
-    ie0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_intr_enable0
-
-// Class: rv_timer_reg_intr_state0
-class rv_timer_reg_intr_state0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field is0;
-
-  `uvm_object_utils(rv_timer_reg_intr_state0)
-
-  function new(string       name = "rv_timer_reg_intr_state0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    is0 = dv_base_reg_field::type_id::create("is0");
-    is0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("W1C"),
-      .volatile(1),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_intr_state0
-
-// Class: rv_timer_reg_intr_test0
-class rv_timer_reg_intr_test0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field t0;
-
-  `uvm_object_utils(rv_timer_reg_intr_test0)
-
-  function new(string       name = "rv_timer_reg_intr_test0",
-               int unsigned n_bits = 32,
-               int          has_coverage = UVM_NO_COVERAGE);
-    super.new(name, n_bits, has_coverage);
-  endfunction : new
-
-  virtual function void build();
-    // create fields
-    t0 = dv_base_reg_field::type_id::create("t0");
-    t0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("WO"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_timer_reg_intr_test0
-
-// Class: rv_timer_reg_block
-class rv_timer_reg_block extends dv_base_reg_block;
-  // registers
-  rand rv_timer_reg_ctrl ctrl;
-  rand rv_timer_reg_cfg0 cfg0;
-  rand rv_timer_reg_timer_v_lower0 timer_v_lower0;
-  rand rv_timer_reg_timer_v_upper0 timer_v_upper0;
-  rand rv_timer_reg_compare_lower0_0 compare_lower0_0;
-  rand rv_timer_reg_compare_upper0_0 compare_upper0_0;
-  rand rv_timer_reg_intr_enable0 intr_enable0;
-  rand rv_timer_reg_intr_state0 intr_state0;
-  rand rv_timer_reg_intr_test0 intr_test0;
-
-  `uvm_object_utils(rv_timer_reg_block)
-
-  function new(string name = "rv_timer_reg_block",
-               int    has_coverage = UVM_NO_COVERAGE);
-    super.new(name, has_coverage);
-  endfunction : new
-
-  virtual function void build(uvm_reg_addr_t base_addr);
-    // create default map
-    this.default_map = create_map(.name("default_map"),
-                                  .base_addr(base_addr),
-                                  .n_bytes(4),
-                                  .endian(UVM_LITTLE_ENDIAN));
-
-    // create registers
-    ctrl = rv_timer_reg_ctrl::type_id::create("ctrl");
-    ctrl.configure(.blk_parent(this));
-    ctrl.build();
-    default_map.add_reg(.rg(ctrl),
-                        .offset(32'h0),
-                        .rights("RW"));
-    cfg0 = rv_timer_reg_cfg0::type_id::create("cfg0");
-    cfg0.configure(.blk_parent(this));
-    cfg0.build();
-    default_map.add_reg(.rg(cfg0),
-                        .offset(32'h100),
-                        .rights("RW"));
-    timer_v_lower0 = rv_timer_reg_timer_v_lower0::type_id::create("timer_v_lower0");
-    timer_v_lower0.configure(.blk_parent(this));
-    timer_v_lower0.build();
-    default_map.add_reg(.rg(timer_v_lower0),
-                        .offset(32'h104),
-                        .rights("RW"));
-    timer_v_upper0 = rv_timer_reg_timer_v_upper0::type_id::create("timer_v_upper0");
-    timer_v_upper0.configure(.blk_parent(this));
-    timer_v_upper0.build();
-    default_map.add_reg(.rg(timer_v_upper0),
-                        .offset(32'h108),
-                        .rights("RW"));
-    compare_lower0_0 = rv_timer_reg_compare_lower0_0::type_id::create("compare_lower0_0");
-    compare_lower0_0.configure(.blk_parent(this));
-    compare_lower0_0.build();
-    default_map.add_reg(.rg(compare_lower0_0),
-                        .offset(32'h10c),
-                        .rights("RW"));
-    compare_upper0_0 = rv_timer_reg_compare_upper0_0::type_id::create("compare_upper0_0");
-    compare_upper0_0.configure(.blk_parent(this));
-    compare_upper0_0.build();
-    default_map.add_reg(.rg(compare_upper0_0),
-                        .offset(32'h110),
-                        .rights("RW"));
-    intr_enable0 = rv_timer_reg_intr_enable0::type_id::create("intr_enable0");
-    intr_enable0.configure(.blk_parent(this));
-    intr_enable0.build();
-    default_map.add_reg(.rg(intr_enable0),
-                        .offset(32'h114),
-                        .rights("RW"));
-    intr_state0 = rv_timer_reg_intr_state0::type_id::create("intr_state0");
-    intr_state0.configure(.blk_parent(this));
-    intr_state0.build();
-    default_map.add_reg(.rg(intr_state0),
-                        .offset(32'h118),
-                        .rights("RW"));
-    intr_test0 = rv_timer_reg_intr_test0::type_id::create("intr_test0");
-    intr_test0.configure(.blk_parent(this));
-    intr_test0.build();
-    default_map.add_reg(.rg(intr_test0),
-                        .offset(32'h11c),
-                        .rights("WO"));
-  endfunction : build
-
-endclass : rv_timer_reg_block
-
 // Block: rv_plic
 // Class: rv_plic_reg_ip0
 class rv_plic_reg_ip0 extends dv_base_reg;
@@ -9985,12 +10157,12 @@
 // Class: chip_reg_block
 class chip_reg_block extends dv_base_reg_block;
   // sub blocks
-  rand hmac_reg_block hmac;
-  rand gpio_reg_block gpio;
-  rand flash_ctrl_reg_block flash_ctrl;
-  rand uart_reg_block uart;
   rand spi_device_reg_block spi_device;
+  rand flash_ctrl_reg_block flash_ctrl;
   rand rv_timer_reg_block rv_timer;
+  rand gpio_reg_block gpio;
+  rand hmac_reg_block hmac;
+  rand uart_reg_block uart;
   rand rv_plic_reg_block rv_plic;
   // memories
   rand chip_mem_rom rom;
@@ -10012,36 +10184,36 @@
                                   .endian(UVM_LITTLE_ENDIAN));
 
     // create sub blocks and add their maps
-    hmac = hmac_reg_block::type_id::create("hmac");
-    hmac.configure(.parent(this));
-    hmac.build(.base_addr(base_addr + 32'h40120000));
-    default_map.add_submap(.child_map(hmac.default_map),
-                           .offset(base_addr + 32'h40120000));
-    gpio = gpio_reg_block::type_id::create("gpio");
-    gpio.configure(.parent(this));
-    gpio.build(.base_addr(base_addr + 32'h40010000));
-    default_map.add_submap(.child_map(gpio.default_map),
-                           .offset(base_addr + 32'h40010000));
-    flash_ctrl = flash_ctrl_reg_block::type_id::create("flash_ctrl");
-    flash_ctrl.configure(.parent(this));
-    flash_ctrl.build(.base_addr(base_addr + 32'h40030000));
-    default_map.add_submap(.child_map(flash_ctrl.default_map),
-                           .offset(base_addr + 32'h40030000));
-    uart = uart_reg_block::type_id::create("uart");
-    uart.configure(.parent(this));
-    uart.build(.base_addr(base_addr + 32'h40000000));
-    default_map.add_submap(.child_map(uart.default_map),
-                           .offset(base_addr + 32'h40000000));
     spi_device = spi_device_reg_block::type_id::create("spi_device");
     spi_device.configure(.parent(this));
     spi_device.build(.base_addr(base_addr + 32'h40020000));
     default_map.add_submap(.child_map(spi_device.default_map),
                            .offset(base_addr + 32'h40020000));
+    flash_ctrl = flash_ctrl_reg_block::type_id::create("flash_ctrl");
+    flash_ctrl.configure(.parent(this));
+    flash_ctrl.build(.base_addr(base_addr + 32'h40030000));
+    default_map.add_submap(.child_map(flash_ctrl.default_map),
+                           .offset(base_addr + 32'h40030000));
     rv_timer = rv_timer_reg_block::type_id::create("rv_timer");
     rv_timer.configure(.parent(this));
     rv_timer.build(.base_addr(base_addr + 32'h40080000));
     default_map.add_submap(.child_map(rv_timer.default_map),
                            .offset(base_addr + 32'h40080000));
+    gpio = gpio_reg_block::type_id::create("gpio");
+    gpio.configure(.parent(this));
+    gpio.build(.base_addr(base_addr + 32'h40010000));
+    default_map.add_submap(.child_map(gpio.default_map),
+                           .offset(base_addr + 32'h40010000));
+    hmac = hmac_reg_block::type_id::create("hmac");
+    hmac.configure(.parent(this));
+    hmac.build(.base_addr(base_addr + 32'h40120000));
+    default_map.add_submap(.child_map(hmac.default_map),
+                           .offset(base_addr + 32'h40120000));
+    uart = uart_reg_block::type_id::create("uart");
+    uart.configure(.parent(this));
+    uart.build(.base_addr(base_addr + 32'h40000000));
+    default_map.add_submap(.child_map(uart.default_map),
+                           .offset(base_addr + 32'h40000000));
     rv_plic = rv_plic_reg_block::type_id::create("rv_plic");
     rv_plic.configure(.parent(this));
     rv_plic.build(.base_addr(base_addr + 32'h40090000));
diff --git a/util/reggen/validate.py b/util/reggen/validate.py
index 6f256c5..08e70a2 100644
--- a/util/reggen/validate.py
+++ b/util/reggen/validate.py
@@ -431,6 +431,13 @@
                                 " base instance."]
                      }
 multireg_optional = reg_optional
+multireg_optional.update({
+    'regwen_incr': [
+        's', "If true, regwen term increments along with current multireg " +
+        "count "
+    ],
+})
+
 multireg_added = {'genregs': ['l',
                               "generated list of registers with required "\
                               "and added keys"]
@@ -891,6 +898,15 @@
         mreg, mrname)
     error += derr
 
+    # multireg specific default validation
+    regwen_incr = False
+    if 'regwen_incr' not in mreg or 'regwen' not in mreg:
+        mreg['regwen_incr'] = 'false'
+    else:
+        regwen_incr, derr = check_bool(mreg['regwen_incr'],
+                                       mrname + " multireg increment")
+        error += derr
+
     # if there was an error before this then can't trust anything!
     if error > 0:
         log.info(mrname + "@" + hex(offset) + " " + str(error) +
@@ -927,7 +943,14 @@
             genreg['hwext'] = mreg['hwext']
             genreg['hwqe'] = mreg['hwqe']
             genreg['hwre'] = mreg['hwre']
-            genreg['regwen'] = mreg['regwen']
+            genreg['swaccess'] = mreg['swaccess']
+            genreg['hwaccess'] = mreg['hwaccess']
+
+            if regwen_incr:
+                genreg['regwen'] = mreg['regwen'] + str(rnum)
+            else:
+                genreg['regwen'] = mreg['regwen']
+
             resval = 0
             resmask = 0
             bits_used = 0
@@ -969,20 +992,22 @@
             closereg = True
 
         if closereg:
-            genreg['genresval'] = resval
-            genreg['genresmask'] = resmask
-            genreg['genbitsused'] = bits_used
-            genreg['genbasebits'] = bused
-            genreg['genoffset'] = offset + (rnum * addrsep)
-            genreg['gendvrights'] = parse_dvrights(default_sw)
-            genfields.sort(key=get_bits)
             genreg['fields'] = genfields
+            genreg['genbasebits'] = bused
+            error += validate_register(genreg, offset + (rnum * addrsep),
+                                       width, top)
+            if error:
+                return (error, 0)
             rnum += 1
             bpos = 0
             rlist.append(genreg)
-            top['genrnames'].append(genreg['name'].lower())
+    # there is only one entry, so the index is unnecessary.  Pop and re-assign names
+    # associated with the index
     if len(rlist) == 1:
+        # TODO really should make the following a function that reverses the last node inserted
+        # may have more properties than just genrnames in the future
         rlist[0]['name'] = mrname
+        rlist[0]['regwen'] = mreg['regwen']
         top['genrnames'].pop()
     mreg['genregs'] = rlist
     top['genrnames'].append(mrname.lower())
@@ -1151,31 +1176,55 @@
 
     return error, nextoff
 
+""" Check that terms specified for regwen exist
 
+Regwen can be individual registers or fields within a register.  The function
+below checks for both and additional regwen properties.
+"""
 def check_wen_regs(regs):
     error = 0
-    for x in regs['genwennames']:
-        if not x.lower() in regs['genrnames']:
-            error += 1
-            log.error(x + " used as regwen but is not defined")
-        else:
-            for reg in regs['registers']:
-                if ('name' in reg):
-                    if (reg['name'] == x):
-                        break
+    idx = 0
 
-            if reg['genbitsused'] != 1:
-                error += 1
-                log.error(x + " used as regwen fails requirement to only " +
-                          "define bit 0")
-            elif reg['genresval'] != 1:
-                error += 1
-                log.error(x + " used as regwen fails requirement to default " +
-                          "to 1")
-            elif reg['fields'][0]['genswaccess'] != SwAccess.W1C:
-                error += 1
-                log.error(x + " used as regwen fails requirement to be " +
-                          "rw1c")
+    # Construct Tuple
+    # 0 - name
+    # 1 - reset value
+    # 2 - sw access
+    tuple_name = 0
+    tuple_rstval = 1
+    tuple_swaccess = 2
+
+    reg_list = [(reg['name'].lower(), reg['genresval'], reg['swaccess'])
+                for reg in regs['registers'] if 'name' in reg]
+    mreg_list = [
+        reg['multireg'] for reg in regs['registers'] if 'multireg' in reg
+    ]
+    field_list = [((reg['name'] + "_" + field['name']).lower(),
+                   field['genresval'], field['swaccess']) for mreg in mreg_list
+                  for reg in mreg['genregs'] for field in reg['fields']]
+
+    # Need to check in register names and field list in case of multireg
+    reg_list.extend(field_list)
+
+    # check for reset value
+    # both w1c and w0c are acceptable
+    for x in regs['genwennames']:
+        target = x.lower()
+        log.info("check_wen_regs::Searching for %s" % target)
+        try:
+            idx = [r[tuple_name] for r in reg_list].index(target)
+        except ValueError:
+            log.error("Could not find register name matching %s" % target)
+
+        if not reg_list[idx][tuple_rstval]:
+            error += 1
+            log.error(x + " used as regwen fails requirement to default " +
+                      "to 1")
+
+        if not reg_list[idx][tuple_swaccess] in ["rw0c", "rw1c"]:
+            error += 1
+            log.error(x +
+                      " used as regwen fails requirement to be W1C or W0C ")
+
     return error