[top/earlgrey] Software Initialization Code

Adding `pinmux_init()` to bootrom code and hello_world code. This init
code configures PINMUX to the same as previous build mapping GPIO0..31
to internal gpio ports.
diff --git a/hw/ip/pinmux/data/pinmux.hjson.tpl b/hw/ip/pinmux/data/pinmux.hjson.tpl
index b431571..fb774fe 100644
--- a/hw/ip/pinmux/data/pinmux.hjson.tpl
+++ b/hw/ip/pinmux/data/pinmux.hjson.tpl
@@ -44,6 +44,7 @@
       fields: [
         {
             bits:   "0",
+            name: "wen",
             desc: ''' When true, all configuration registers can be modified.
             When false, they become read-only. Defaults true, write zero to clear.
             '''
diff --git a/hw/top_earlgrey/doc/top_earlgrey.h.tpl b/hw/top_earlgrey/doc/top_earlgrey.h.tpl
index 43f93b6..6981ad6 100644
--- a/hw/top_earlgrey/doc/top_earlgrey.h.tpl
+++ b/hw/top_earlgrey/doc/top_earlgrey.h.tpl
@@ -5,6 +5,9 @@
 #ifndef _TOP_EARLGREY_H_
 #define _TOP_EARLGREY_H_
 
+#define PINMUX_PERIPH_INSEL_IDX_OFFSET 2
+#define PINMUX_PERIPH_OUTSEL_IDX_OFFSET 2
+
 // PERIPH_INSEL ranges from 0 to NUM_MIO + 2 -1}
 //  0 and 1 are tied to value 0 and 1
 #define NUM_MIO ${top["pinmux"]["num_mio"]}
@@ -38,4 +41,4 @@
   % endif
 % endfor
 
-#endif // _TOP_EARLGREY_H_
+#endif  // _TOP_EARLGREY_H_
diff --git a/hw/top_earlgrey/dv/env/chip_reg_block.sv b/hw/top_earlgrey/dv/env/chip_reg_block.sv
index 1b5d72e..7bdf89f 100644
--- a/hw/top_earlgrey/dv/env/chip_reg_block.sv
+++ b/hw/top_earlgrey/dv/env/chip_reg_block.sv
@@ -4333,6 +4333,1208 @@
 
 `endif
 
+// Block: pinmux
+`ifndef PINMUX_REG_BLOCK__SV
+`define PINMUX_REG_BLOCK__SV
+
+// Forward declare all register/memory/block classes
+typedef class pinmux_reg_regen;
+typedef class pinmux_reg_periph_insel0;
+typedef class pinmux_reg_periph_insel1;
+typedef class pinmux_reg_periph_insel2;
+typedef class pinmux_reg_periph_insel3;
+typedef class pinmux_reg_periph_insel4;
+typedef class pinmux_reg_periph_insel5;
+typedef class pinmux_reg_periph_insel6;
+typedef class pinmux_reg_mio_outsel0;
+typedef class pinmux_reg_mio_outsel1;
+typedef class pinmux_reg_mio_outsel2;
+typedef class pinmux_reg_mio_outsel3;
+typedef class pinmux_reg_mio_outsel4;
+typedef class pinmux_reg_mio_outsel5;
+typedef class pinmux_reg_mio_outsel6;
+typedef class pinmux_reg_block;
+
+// Class: pinmux_reg_regen
+class pinmux_reg_regen extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field wen;
+
+  `uvm_object_utils(pinmux_reg_regen)
+
+  function new(string       name = "pinmux_reg_regen",
+               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
+    wen = dv_base_reg_field::type_id::create("wen");
+    wen.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(0),
+      .access("W0C"),
+      .volatile(1),
+      .reset(32'h1),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_regen
+
+// Class: pinmux_reg_periph_insel0
+class pinmux_reg_periph_insel0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in0;
+  rand dv_base_reg_field in1;
+  rand dv_base_reg_field in2;
+  rand dv_base_reg_field in3;
+  rand dv_base_reg_field in4;
+
+  `uvm_object_utils(pinmux_reg_periph_insel0)
+
+  function new(string       name = "pinmux_reg_periph_insel0",
+               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
+    in0 = dv_base_reg_field::type_id::create("in0");
+    in0.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in1 = dv_base_reg_field::type_id::create("in1");
+    in1.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in2 = dv_base_reg_field::type_id::create("in2");
+    in2.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in3 = dv_base_reg_field::type_id::create("in3");
+    in3.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in4 = dv_base_reg_field::type_id::create("in4");
+    in4.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel0
+
+// Class: pinmux_reg_periph_insel1
+class pinmux_reg_periph_insel1 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in5;
+  rand dv_base_reg_field in6;
+  rand dv_base_reg_field in7;
+  rand dv_base_reg_field in8;
+  rand dv_base_reg_field in9;
+
+  `uvm_object_utils(pinmux_reg_periph_insel1)
+
+  function new(string       name = "pinmux_reg_periph_insel1",
+               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
+    in5 = dv_base_reg_field::type_id::create("in5");
+    in5.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in6 = dv_base_reg_field::type_id::create("in6");
+    in6.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in7 = dv_base_reg_field::type_id::create("in7");
+    in7.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in8 = dv_base_reg_field::type_id::create("in8");
+    in8.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in9 = dv_base_reg_field::type_id::create("in9");
+    in9.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel1
+
+// Class: pinmux_reg_periph_insel2
+class pinmux_reg_periph_insel2 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in10;
+  rand dv_base_reg_field in11;
+  rand dv_base_reg_field in12;
+  rand dv_base_reg_field in13;
+  rand dv_base_reg_field in14;
+
+  `uvm_object_utils(pinmux_reg_periph_insel2)
+
+  function new(string       name = "pinmux_reg_periph_insel2",
+               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
+    in10 = dv_base_reg_field::type_id::create("in10");
+    in10.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in11 = dv_base_reg_field::type_id::create("in11");
+    in11.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in12 = dv_base_reg_field::type_id::create("in12");
+    in12.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in13 = dv_base_reg_field::type_id::create("in13");
+    in13.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in14 = dv_base_reg_field::type_id::create("in14");
+    in14.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel2
+
+// Class: pinmux_reg_periph_insel3
+class pinmux_reg_periph_insel3 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in15;
+  rand dv_base_reg_field in16;
+  rand dv_base_reg_field in17;
+  rand dv_base_reg_field in18;
+  rand dv_base_reg_field in19;
+
+  `uvm_object_utils(pinmux_reg_periph_insel3)
+
+  function new(string       name = "pinmux_reg_periph_insel3",
+               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
+    in15 = dv_base_reg_field::type_id::create("in15");
+    in15.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in16 = dv_base_reg_field::type_id::create("in16");
+    in16.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in17 = dv_base_reg_field::type_id::create("in17");
+    in17.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in18 = dv_base_reg_field::type_id::create("in18");
+    in18.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in19 = dv_base_reg_field::type_id::create("in19");
+    in19.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel3
+
+// Class: pinmux_reg_periph_insel4
+class pinmux_reg_periph_insel4 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in20;
+  rand dv_base_reg_field in21;
+  rand dv_base_reg_field in22;
+  rand dv_base_reg_field in23;
+  rand dv_base_reg_field in24;
+
+  `uvm_object_utils(pinmux_reg_periph_insel4)
+
+  function new(string       name = "pinmux_reg_periph_insel4",
+               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
+    in20 = dv_base_reg_field::type_id::create("in20");
+    in20.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in21 = dv_base_reg_field::type_id::create("in21");
+    in21.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in22 = dv_base_reg_field::type_id::create("in22");
+    in22.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in23 = dv_base_reg_field::type_id::create("in23");
+    in23.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in24 = dv_base_reg_field::type_id::create("in24");
+    in24.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel4
+
+// Class: pinmux_reg_periph_insel5
+class pinmux_reg_periph_insel5 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in25;
+  rand dv_base_reg_field in26;
+  rand dv_base_reg_field in27;
+  rand dv_base_reg_field in28;
+  rand dv_base_reg_field in29;
+
+  `uvm_object_utils(pinmux_reg_periph_insel5)
+
+  function new(string       name = "pinmux_reg_periph_insel5",
+               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
+    in25 = dv_base_reg_field::type_id::create("in25");
+    in25.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in26 = dv_base_reg_field::type_id::create("in26");
+    in26.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in27 = dv_base_reg_field::type_id::create("in27");
+    in27.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in28 = dv_base_reg_field::type_id::create("in28");
+    in28.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in29 = dv_base_reg_field::type_id::create("in29");
+    in29.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel5
+
+// Class: pinmux_reg_periph_insel6
+class pinmux_reg_periph_insel6 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field in30;
+  rand dv_base_reg_field in31;
+
+  `uvm_object_utils(pinmux_reg_periph_insel6)
+
+  function new(string       name = "pinmux_reg_periph_insel6",
+               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
+    in30 = dv_base_reg_field::type_id::create("in30");
+    in30.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    in31 = dv_base_reg_field::type_id::create("in31");
+    in31.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_periph_insel6
+
+// Class: pinmux_reg_mio_outsel0
+class pinmux_reg_mio_outsel0 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out0;
+  rand dv_base_reg_field out1;
+  rand dv_base_reg_field out2;
+  rand dv_base_reg_field out3;
+  rand dv_base_reg_field out4;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel0)
+
+  function new(string       name = "pinmux_reg_mio_outsel0",
+               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
+    out0 = dv_base_reg_field::type_id::create("out0");
+    out0.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out1 = dv_base_reg_field::type_id::create("out1");
+    out1.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out2 = dv_base_reg_field::type_id::create("out2");
+    out2.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out3 = dv_base_reg_field::type_id::create("out3");
+    out3.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out4 = dv_base_reg_field::type_id::create("out4");
+    out4.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel0
+
+// Class: pinmux_reg_mio_outsel1
+class pinmux_reg_mio_outsel1 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out5;
+  rand dv_base_reg_field out6;
+  rand dv_base_reg_field out7;
+  rand dv_base_reg_field out8;
+  rand dv_base_reg_field out9;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel1)
+
+  function new(string       name = "pinmux_reg_mio_outsel1",
+               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
+    out5 = dv_base_reg_field::type_id::create("out5");
+    out5.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out6 = dv_base_reg_field::type_id::create("out6");
+    out6.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out7 = dv_base_reg_field::type_id::create("out7");
+    out7.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out8 = dv_base_reg_field::type_id::create("out8");
+    out8.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out9 = dv_base_reg_field::type_id::create("out9");
+    out9.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel1
+
+// Class: pinmux_reg_mio_outsel2
+class pinmux_reg_mio_outsel2 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out10;
+  rand dv_base_reg_field out11;
+  rand dv_base_reg_field out12;
+  rand dv_base_reg_field out13;
+  rand dv_base_reg_field out14;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel2)
+
+  function new(string       name = "pinmux_reg_mio_outsel2",
+               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
+    out10 = dv_base_reg_field::type_id::create("out10");
+    out10.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out11 = dv_base_reg_field::type_id::create("out11");
+    out11.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out12 = dv_base_reg_field::type_id::create("out12");
+    out12.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out13 = dv_base_reg_field::type_id::create("out13");
+    out13.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out14 = dv_base_reg_field::type_id::create("out14");
+    out14.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel2
+
+// Class: pinmux_reg_mio_outsel3
+class pinmux_reg_mio_outsel3 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out15;
+  rand dv_base_reg_field out16;
+  rand dv_base_reg_field out17;
+  rand dv_base_reg_field out18;
+  rand dv_base_reg_field out19;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel3)
+
+  function new(string       name = "pinmux_reg_mio_outsel3",
+               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
+    out15 = dv_base_reg_field::type_id::create("out15");
+    out15.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out16 = dv_base_reg_field::type_id::create("out16");
+    out16.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out17 = dv_base_reg_field::type_id::create("out17");
+    out17.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out18 = dv_base_reg_field::type_id::create("out18");
+    out18.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out19 = dv_base_reg_field::type_id::create("out19");
+    out19.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel3
+
+// Class: pinmux_reg_mio_outsel4
+class pinmux_reg_mio_outsel4 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out20;
+  rand dv_base_reg_field out21;
+  rand dv_base_reg_field out22;
+  rand dv_base_reg_field out23;
+  rand dv_base_reg_field out24;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel4)
+
+  function new(string       name = "pinmux_reg_mio_outsel4",
+               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
+    out20 = dv_base_reg_field::type_id::create("out20");
+    out20.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out21 = dv_base_reg_field::type_id::create("out21");
+    out21.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out22 = dv_base_reg_field::type_id::create("out22");
+    out22.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out23 = dv_base_reg_field::type_id::create("out23");
+    out23.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out24 = dv_base_reg_field::type_id::create("out24");
+    out24.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel4
+
+// Class: pinmux_reg_mio_outsel5
+class pinmux_reg_mio_outsel5 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out25;
+  rand dv_base_reg_field out26;
+  rand dv_base_reg_field out27;
+  rand dv_base_reg_field out28;
+  rand dv_base_reg_field out29;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel5)
+
+  function new(string       name = "pinmux_reg_mio_outsel5",
+               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
+    out25 = dv_base_reg_field::type_id::create("out25");
+    out25.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out26 = dv_base_reg_field::type_id::create("out26");
+    out26.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out27 = dv_base_reg_field::type_id::create("out27");
+    out27.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(12),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out28 = dv_base_reg_field::type_id::create("out28");
+    out28.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(18),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out29 = dv_base_reg_field::type_id::create("out29");
+    out29.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(24),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel5
+
+// Class: pinmux_reg_mio_outsel6
+class pinmux_reg_mio_outsel6 extends dv_base_reg;
+  // fields
+  rand dv_base_reg_field out30;
+  rand dv_base_reg_field out31;
+
+  `uvm_object_utils(pinmux_reg_mio_outsel6)
+
+  function new(string       name = "pinmux_reg_mio_outsel6",
+               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
+    out30 = dv_base_reg_field::type_id::create("out30");
+    out30.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(0),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    out31 = dv_base_reg_field::type_id::create("out31");
+    out31.configure(
+      .parent(this),
+      .size(6),
+      .lsb_pos(6),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h2),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+  endfunction : build
+
+endclass : pinmux_reg_mio_outsel6
+
+// Class: pinmux_reg_block
+class pinmux_reg_block extends dv_base_reg_block;
+  // registers
+  rand pinmux_reg_regen regen;
+  rand pinmux_reg_periph_insel0 periph_insel0;
+  rand pinmux_reg_periph_insel1 periph_insel1;
+  rand pinmux_reg_periph_insel2 periph_insel2;
+  rand pinmux_reg_periph_insel3 periph_insel3;
+  rand pinmux_reg_periph_insel4 periph_insel4;
+  rand pinmux_reg_periph_insel5 periph_insel5;
+  rand pinmux_reg_periph_insel6 periph_insel6;
+  rand pinmux_reg_mio_outsel0 mio_outsel0;
+  rand pinmux_reg_mio_outsel1 mio_outsel1;
+  rand pinmux_reg_mio_outsel2 mio_outsel2;
+  rand pinmux_reg_mio_outsel3 mio_outsel3;
+  rand pinmux_reg_mio_outsel4 mio_outsel4;
+  rand pinmux_reg_mio_outsel5 mio_outsel5;
+  rand pinmux_reg_mio_outsel6 mio_outsel6;
+
+  `uvm_object_utils(pinmux_reg_block)
+
+  function new(string name = "pinmux_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
+    regen = pinmux_reg_regen::type_id::create("regen");
+    regen.configure(.blk_parent(this));
+    regen.build();
+    default_map.add_reg(.rg(regen),
+                        .offset(32'h0),
+                        .rights("RW"));
+    periph_insel0 = pinmux_reg_periph_insel0::type_id::create("periph_insel0");
+    periph_insel0.configure(.blk_parent(this));
+    periph_insel0.build();
+    default_map.add_reg(.rg(periph_insel0),
+                        .offset(32'h4),
+                        .rights("RW"));
+    periph_insel1 = pinmux_reg_periph_insel1::type_id::create("periph_insel1");
+    periph_insel1.configure(.blk_parent(this));
+    periph_insel1.build();
+    default_map.add_reg(.rg(periph_insel1),
+                        .offset(32'h8),
+                        .rights("RW"));
+    periph_insel2 = pinmux_reg_periph_insel2::type_id::create("periph_insel2");
+    periph_insel2.configure(.blk_parent(this));
+    periph_insel2.build();
+    default_map.add_reg(.rg(periph_insel2),
+                        .offset(32'hc),
+                        .rights("RW"));
+    periph_insel3 = pinmux_reg_periph_insel3::type_id::create("periph_insel3");
+    periph_insel3.configure(.blk_parent(this));
+    periph_insel3.build();
+    default_map.add_reg(.rg(periph_insel3),
+                        .offset(32'h10),
+                        .rights("RW"));
+    periph_insel4 = pinmux_reg_periph_insel4::type_id::create("periph_insel4");
+    periph_insel4.configure(.blk_parent(this));
+    periph_insel4.build();
+    default_map.add_reg(.rg(periph_insel4),
+                        .offset(32'h14),
+                        .rights("RW"));
+    periph_insel5 = pinmux_reg_periph_insel5::type_id::create("periph_insel5");
+    periph_insel5.configure(.blk_parent(this));
+    periph_insel5.build();
+    default_map.add_reg(.rg(periph_insel5),
+                        .offset(32'h18),
+                        .rights("RW"));
+    periph_insel6 = pinmux_reg_periph_insel6::type_id::create("periph_insel6");
+    periph_insel6.configure(.blk_parent(this));
+    periph_insel6.build();
+    default_map.add_reg(.rg(periph_insel6),
+                        .offset(32'h1c),
+                        .rights("RW"));
+    mio_outsel0 = pinmux_reg_mio_outsel0::type_id::create("mio_outsel0");
+    mio_outsel0.configure(.blk_parent(this));
+    mio_outsel0.build();
+    default_map.add_reg(.rg(mio_outsel0),
+                        .offset(32'h20),
+                        .rights("RW"));
+    mio_outsel1 = pinmux_reg_mio_outsel1::type_id::create("mio_outsel1");
+    mio_outsel1.configure(.blk_parent(this));
+    mio_outsel1.build();
+    default_map.add_reg(.rg(mio_outsel1),
+                        .offset(32'h24),
+                        .rights("RW"));
+    mio_outsel2 = pinmux_reg_mio_outsel2::type_id::create("mio_outsel2");
+    mio_outsel2.configure(.blk_parent(this));
+    mio_outsel2.build();
+    default_map.add_reg(.rg(mio_outsel2),
+                        .offset(32'h28),
+                        .rights("RW"));
+    mio_outsel3 = pinmux_reg_mio_outsel3::type_id::create("mio_outsel3");
+    mio_outsel3.configure(.blk_parent(this));
+    mio_outsel3.build();
+    default_map.add_reg(.rg(mio_outsel3),
+                        .offset(32'h2c),
+                        .rights("RW"));
+    mio_outsel4 = pinmux_reg_mio_outsel4::type_id::create("mio_outsel4");
+    mio_outsel4.configure(.blk_parent(this));
+    mio_outsel4.build();
+    default_map.add_reg(.rg(mio_outsel4),
+                        .offset(32'h30),
+                        .rights("RW"));
+    mio_outsel5 = pinmux_reg_mio_outsel5::type_id::create("mio_outsel5");
+    mio_outsel5.configure(.blk_parent(this));
+    mio_outsel5.build();
+    default_map.add_reg(.rg(mio_outsel5),
+                        .offset(32'h34),
+                        .rights("RW"));
+    mio_outsel6 = pinmux_reg_mio_outsel6::type_id::create("mio_outsel6");
+    mio_outsel6.configure(.blk_parent(this));
+    mio_outsel6.build();
+    default_map.add_reg(.rg(mio_outsel6),
+                        .offset(32'h38),
+                        .rights("RW"));
+  endfunction : build
+
+endclass : pinmux_reg_block
+
+`endif
+
 // Block: rv_timer
 `ifndef RV_TIMER_REG_BLOCK__SV
 `define RV_TIMER_REG_BLOCK__SV
@@ -5232,7 +6434,7 @@
     p32 = dv_base_reg_field::type_id::create("p32");
     p32.configure(
       .parent(this),
-      .size(32),
+      .size(1),
       .lsb_pos(0),
       .access("RO"),
       .volatile(1),
@@ -5364,8 +6566,8 @@
     p44 = dv_base_reg_field::type_id::create("p44");
     p44.configure(
       .parent(this),
-      .size(32),
-      .lsb_pos(0),
+      .size(1),
+      .lsb_pos(12),
       .access("RO"),
       .volatile(1),
       .reset(32'h0),
@@ -5375,8 +6577,8 @@
     p45 = dv_base_reg_field::type_id::create("p45");
     p45.configure(
       .parent(this),
-      .size(32),
-      .lsb_pos(0),
+      .size(1),
+      .lsb_pos(13),
       .access("RO"),
       .volatile(1),
       .reset(32'h0),
@@ -5386,8 +6588,8 @@
     p46 = dv_base_reg_field::type_id::create("p46");
     p46.configure(
       .parent(this),
-      .size(32),
-      .lsb_pos(0),
+      .size(1),
+      .lsb_pos(14),
       .access("RO"),
       .volatile(1),
       .reset(32'h0),
@@ -5397,8 +6599,8 @@
     p47 = dv_base_reg_field::type_id::create("p47");
     p47.configure(
       .parent(this),
-      .size(32),
-      .lsb_pos(0),
+      .size(1),
+      .lsb_pos(15),
       .access("RO"),
       .volatile(1),
       .reset(32'h0),
@@ -5419,9 +6621,9 @@
     p49 = dv_base_reg_field::type_id::create("p49");
     p49.configure(
       .parent(this),
-      .size(3),
-      .lsb_pos(1),
-      .access("RW"),
+      .size(1),
+      .lsb_pos(17),
+      .access("RO"),
       .volatile(1),
       .reset(32'h0),
       .has_reset(1),
@@ -5453,8 +6655,8 @@
     p52.configure(
       .parent(this),
       .size(1),
-      .lsb_pos(0),
-      .access("RW"),
+      .lsb_pos(20),
+      .access("RO"),
       .volatile(1),
       .reset(32'h0),
       .has_reset(1),
@@ -5464,8 +6666,8 @@
     p53.configure(
       .parent(this),
       .size(1),
-      .lsb_pos(1),
-      .access("RW"),
+      .lsb_pos(21),
+      .access("RO"),
       .volatile(1),
       .reset(32'h0),
       .has_reset(1),
@@ -5475,8 +6677,8 @@
     p54.configure(
       .parent(this),
       .size(1),
-      .lsb_pos(2),
-      .access("RW"),
+      .lsb_pos(22),
+      .access("RO"),
       .volatile(1),
       .reset(32'h0),
       .has_reset(1),
@@ -6590,8 +7792,8 @@
     prio13 = dv_base_reg_field::type_id::create("prio13");
     prio13.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(23),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6620,8 +7822,8 @@
     prio14 = dv_base_reg_field::type_id::create("prio14");
     prio14.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(24),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6650,8 +7852,8 @@
     prio15 = dv_base_reg_field::type_id::create("prio15");
     prio15.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(25),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6680,8 +7882,8 @@
     prio16 = dv_base_reg_field::type_id::create("prio16");
     prio16.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(26),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6710,8 +7912,8 @@
     prio17 = dv_base_reg_field::type_id::create("prio17");
     prio17.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(27),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6740,8 +7942,8 @@
     prio18 = dv_base_reg_field::type_id::create("prio18");
     prio18.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(28),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6770,8 +7972,8 @@
     prio19 = dv_base_reg_field::type_id::create("prio19");
     prio19.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(29),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6800,8 +8002,8 @@
     prio20 = dv_base_reg_field::type_id::create("prio20");
     prio20.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(30),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6830,8 +8032,8 @@
     prio21 = dv_base_reg_field::type_id::create("prio21");
     prio21.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(31),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6860,7 +8062,7 @@
     prio22 = dv_base_reg_field::type_id::create("prio22");
     prio22.configure(
       .parent(this),
-      .size(1),
+      .size(2),
       .lsb_pos(0),
       .access("RW"),
       .volatile(0),
@@ -6890,8 +8092,8 @@
     prio23 = dv_base_reg_field::type_id::create("prio23");
     prio23.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(1),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6920,8 +8122,8 @@
     prio24 = dv_base_reg_field::type_id::create("prio24");
     prio24.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(2),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6950,8 +8152,8 @@
     prio25 = dv_base_reg_field::type_id::create("prio25");
     prio25.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(3),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -6980,8 +8182,8 @@
     prio26 = dv_base_reg_field::type_id::create("prio26");
     prio26.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(4),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7010,8 +8212,8 @@
     prio27 = dv_base_reg_field::type_id::create("prio27");
     prio27.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(5),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7040,8 +8242,8 @@
     prio28 = dv_base_reg_field::type_id::create("prio28");
     prio28.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(6),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7070,8 +8272,8 @@
     prio29 = dv_base_reg_field::type_id::create("prio29");
     prio29.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(7),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7100,8 +8302,8 @@
     prio30 = dv_base_reg_field::type_id::create("prio30");
     prio30.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(8),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7130,8 +8332,8 @@
     prio31 = dv_base_reg_field::type_id::create("prio31");
     prio31.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(9),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7160,8 +8362,8 @@
     prio32 = dv_base_reg_field::type_id::create("prio32");
     prio32.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(10),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7190,8 +8392,8 @@
     prio33 = dv_base_reg_field::type_id::create("prio33");
     prio33.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(11),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7220,8 +8422,8 @@
     prio34 = dv_base_reg_field::type_id::create("prio34");
     prio34.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(12),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -7250,107 +8452,8 @@
     prio35 = dv_base_reg_field::type_id::create("prio35");
     prio35.configure(
       .parent(this),
-      .size(1),
-      .lsb_pos(13),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le46 = dv_base_reg_field::type_id::create("le46");
-    le46.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(14),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le47 = dv_base_reg_field::type_id::create("le47");
-    le47.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(15),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le48 = dv_base_reg_field::type_id::create("le48");
-    le48.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(16),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le49 = dv_base_reg_field::type_id::create("le49");
-    le49.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(17),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le50 = dv_base_reg_field::type_id::create("le50");
-    le50.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le51 = dv_base_reg_field::type_id::create("le51");
-    le51.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(19),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le52 = dv_base_reg_field::type_id::create("le52");
-    le52.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(20),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le53 = dv_base_reg_field::type_id::create("le53");
-    le53.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(21),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    le54 = dv_base_reg_field::type_id::create("le54");
-    le54.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(22),
+      .size(2),
+      .lsb_pos(0),
       .access("RW"),
       .volatile(0),
       .reset(32'h0),
@@ -8156,560 +9259,6 @@
     e16 = dv_base_reg_field::type_id::create("e16");
     e16.configure(
       .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio45
-
-// Class: rv_plic_reg_prio46
-class rv_plic_reg_prio46 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio46;
-
-  `uvm_object_utils(rv_plic_reg_prio46)
-
-  function new(string       name = "rv_plic_reg_prio46",
-               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
-    prio46 = dv_base_reg_field::type_id::create("prio46");
-    prio46.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio46
-
-// Class: rv_plic_reg_prio47
-class rv_plic_reg_prio47 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio47;
-
-  `uvm_object_utils(rv_plic_reg_prio47)
-
-  function new(string       name = "rv_plic_reg_prio47",
-               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
-    prio47 = dv_base_reg_field::type_id::create("prio47");
-    prio47.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio47
-
-// Class: rv_plic_reg_prio48
-class rv_plic_reg_prio48 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio48;
-
-  `uvm_object_utils(rv_plic_reg_prio48)
-
-  function new(string       name = "rv_plic_reg_prio48",
-               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
-    prio48 = dv_base_reg_field::type_id::create("prio48");
-    prio48.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio48
-
-// Class: rv_plic_reg_prio49
-class rv_plic_reg_prio49 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio49;
-
-  `uvm_object_utils(rv_plic_reg_prio49)
-
-  function new(string       name = "rv_plic_reg_prio49",
-               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
-    prio49 = dv_base_reg_field::type_id::create("prio49");
-    prio49.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio49
-
-// Class: rv_plic_reg_prio50
-class rv_plic_reg_prio50 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio50;
-
-  `uvm_object_utils(rv_plic_reg_prio50)
-
-  function new(string       name = "rv_plic_reg_prio50",
-               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
-    prio50 = dv_base_reg_field::type_id::create("prio50");
-    prio50.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio50
-
-// Class: rv_plic_reg_prio51
-class rv_plic_reg_prio51 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio51;
-
-  `uvm_object_utils(rv_plic_reg_prio51)
-
-  function new(string       name = "rv_plic_reg_prio51",
-               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
-    prio51 = dv_base_reg_field::type_id::create("prio51");
-    prio51.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio51
-
-// Class: rv_plic_reg_prio52
-class rv_plic_reg_prio52 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio52;
-
-  `uvm_object_utils(rv_plic_reg_prio52)
-
-  function new(string       name = "rv_plic_reg_prio52",
-               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
-    prio52 = dv_base_reg_field::type_id::create("prio52");
-    prio52.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio52
-
-// Class: rv_plic_reg_prio53
-class rv_plic_reg_prio53 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field prio53;
-
-  `uvm_object_utils(rv_plic_reg_prio53)
-
-  function new(string       name = "rv_plic_reg_prio53",
-               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
-    prio53 = dv_base_reg_field::type_id::create("prio53");
-    prio53.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e25 = dv_base_reg_field::type_id::create("e25");
-    e25.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(25),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e26 = dv_base_reg_field::type_id::create("e26");
-    e26.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(26),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e27 = dv_base_reg_field::type_id::create("e27");
-    e27.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(27),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e28 = dv_base_reg_field::type_id::create("e28");
-    e28.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(28),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e29 = dv_base_reg_field::type_id::create("e29");
-    e29.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(29),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e30 = dv_base_reg_field::type_id::create("e30");
-    e30.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(30),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e31 = dv_base_reg_field::type_id::create("e31");
-    e31.configure(
-      .parent(this),
-      .size(2),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : rv_plic_reg_prio54
-
-// Class: rv_plic_reg_ie00
-class rv_plic_reg_ie00 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field e0;
-  rand dv_base_reg_field e1;
-  rand dv_base_reg_field e2;
-  rand dv_base_reg_field e3;
-  rand dv_base_reg_field e4;
-  rand dv_base_reg_field e5;
-  rand dv_base_reg_field e6;
-  rand dv_base_reg_field e7;
-  rand dv_base_reg_field e8;
-  rand dv_base_reg_field e9;
-  rand dv_base_reg_field e10;
-  rand dv_base_reg_field e11;
-  rand dv_base_reg_field e12;
-  rand dv_base_reg_field e13;
-  rand dv_base_reg_field e14;
-  rand dv_base_reg_field e15;
-  rand dv_base_reg_field e16;
-  rand dv_base_reg_field e17;
-  rand dv_base_reg_field e18;
-  rand dv_base_reg_field e19;
-  rand dv_base_reg_field e20;
-  rand dv_base_reg_field e21;
-  rand dv_base_reg_field e22;
-  rand dv_base_reg_field e23;
-  rand dv_base_reg_field e24;
-  rand dv_base_reg_field e25;
-  rand dv_base_reg_field e26;
-  rand dv_base_reg_field e27;
-  rand dv_base_reg_field e28;
-  rand dv_base_reg_field e29;
-  rand dv_base_reg_field e30;
-  rand dv_base_reg_field e31;
-
-  `uvm_object_utils(rv_plic_reg_ie00)
-
-  function new(string       name = "rv_plic_reg_ie00",
-               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
-    e0 = dv_base_reg_field::type_id::create("e0");
-    e0.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e1 = dv_base_reg_field::type_id::create("e1");
-    e1.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(1),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e2 = dv_base_reg_field::type_id::create("e2");
-    e2.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(2),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e3 = dv_base_reg_field::type_id::create("e3");
-    e3.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(3),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e4 = dv_base_reg_field::type_id::create("e4");
-    e4.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(4),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e5 = dv_base_reg_field::type_id::create("e5");
-    e5.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(5),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e6 = dv_base_reg_field::type_id::create("e6");
-    e6.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e7 = dv_base_reg_field::type_id::create("e7");
-    e7.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(7),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e8 = dv_base_reg_field::type_id::create("e8");
-    e8.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(8),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e9 = dv_base_reg_field::type_id::create("e9");
-    e9.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(9),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e10 = dv_base_reg_field::type_id::create("e10");
-    e10.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(10),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e11 = dv_base_reg_field::type_id::create("e11");
-    e11.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(11),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e12 = dv_base_reg_field::type_id::create("e12");
-    e12.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e13 = dv_base_reg_field::type_id::create("e13");
-    e13.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(13),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e14 = dv_base_reg_field::type_id::create("e14");
-    e14.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(14),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e15 = dv_base_reg_field::type_id::create("e15");
-    e15.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(15),
-      .access("RW"),
-      .volatile(0),
-      .reset(32'h0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    e16 = dv_base_reg_field::type_id::create("e16");
-    e16.configure(
-      .parent(this),
       .size(1),
       .lsb_pos(16),
       .access("RW"),
@@ -8801,7 +9350,84 @@
       .size(1),
       .lsb_pos(24),
       .access("RW"),
-      .volatile(1),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e25 = dv_base_reg_field::type_id::create("e25");
+    e25.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(25),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e26 = dv_base_reg_field::type_id::create("e26");
+    e26.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(26),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e27 = dv_base_reg_field::type_id::create("e27");
+    e27.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(27),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e28 = dv_base_reg_field::type_id::create("e28");
+    e28.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(28),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e29 = dv_base_reg_field::type_id::create("e29");
+    e29.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(29),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e30 = dv_base_reg_field::type_id::create("e30");
+    e30.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(30),
+      .access("RW"),
+      .volatile(0),
+      .reset(32'h0),
+      .has_reset(1),
+      .is_rand(1),
+      .individually_accessible(1));
+    e31 = dv_base_reg_field::type_id::create("e31");
+    e31.configure(
+      .parent(this),
+      .size(1),
+      .lsb_pos(31),
+      .access("RW"),
+      .volatile(0),
       .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
@@ -8865,7 +9491,7 @@
       .lsb_pos(1),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8876,7 +9502,7 @@
       .lsb_pos(2),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8887,7 +9513,7 @@
       .lsb_pos(3),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8898,7 +9524,7 @@
       .lsb_pos(4),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8909,7 +9535,7 @@
       .lsb_pos(5),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8920,7 +9546,7 @@
       .lsb_pos(6),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8931,7 +9557,7 @@
       .lsb_pos(7),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8942,7 +9568,7 @@
       .lsb_pos(8),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8953,7 +9579,7 @@
       .lsb_pos(9),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8964,7 +9590,7 @@
       .lsb_pos(10),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8975,7 +9601,7 @@
       .lsb_pos(11),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8986,7 +9612,7 @@
       .lsb_pos(12),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -8997,7 +9623,7 @@
       .lsb_pos(13),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9008,7 +9634,7 @@
       .lsb_pos(14),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9019,7 +9645,7 @@
       .lsb_pos(15),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9030,7 +9656,7 @@
       .lsb_pos(16),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9041,7 +9667,7 @@
       .lsb_pos(17),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9052,7 +9678,7 @@
       .lsb_pos(18),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9063,7 +9689,7 @@
       .lsb_pos(19),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9074,7 +9700,7 @@
       .lsb_pos(20),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9085,7 +9711,7 @@
       .lsb_pos(21),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9096,7 +9722,7 @@
       .lsb_pos(22),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9126,7 +9752,7 @@
       .lsb_pos(0),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9156,7 +9782,7 @@
       .lsb_pos(0),
       .access("RW"),
       .volatile(1),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9186,7 +9812,7 @@
       .lsb_pos(0),
       .access("RW"),
       .volatile(0),
-      .reset(0),
+      .reset(32'h0),
       .has_reset(1),
       .is_rand(1),
       .individually_accessible(1));
@@ -9664,1184 +10290,6 @@
   endfunction : build
 
 endclass : rv_plic_reg_block
-// Block: pinmux
-// Class: pinmux_reg_regen
-class pinmux_reg_regen extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field regen;
-
-  `uvm_object_utils(pinmux_reg_regen)
-
-  function new(string       name = "pinmux_reg_regen",
-               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
-    regen = dv_base_reg_field::type_id::create("regen");
-    regen.configure(
-      .parent(this),
-      .size(1),
-      .lsb_pos(0),
-      .access("W0C"),
-      .volatile(1),
-      .reset(1),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_regen
-
-// Class: pinmux_reg_periph_insel0
-class pinmux_reg_periph_insel0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in0;
-  rand dv_base_reg_field in1;
-  rand dv_base_reg_field in2;
-  rand dv_base_reg_field in3;
-  rand dv_base_reg_field in4;
-
-  `uvm_object_utils(pinmux_reg_periph_insel0)
-
-  function new(string       name = "pinmux_reg_periph_insel0",
-               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
-    in0 = dv_base_reg_field::type_id::create("in0");
-    in0.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in1 = dv_base_reg_field::type_id::create("in1");
-    in1.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in2 = dv_base_reg_field::type_id::create("in2");
-    in2.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in3 = dv_base_reg_field::type_id::create("in3");
-    in3.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in4 = dv_base_reg_field::type_id::create("in4");
-    in4.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel0
-
-// Class: pinmux_reg_periph_insel1
-class pinmux_reg_periph_insel1 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in5;
-  rand dv_base_reg_field in6;
-  rand dv_base_reg_field in7;
-  rand dv_base_reg_field in8;
-  rand dv_base_reg_field in9;
-
-  `uvm_object_utils(pinmux_reg_periph_insel1)
-
-  function new(string       name = "pinmux_reg_periph_insel1",
-               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
-    in5 = dv_base_reg_field::type_id::create("in5");
-    in5.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in6 = dv_base_reg_field::type_id::create("in6");
-    in6.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in7 = dv_base_reg_field::type_id::create("in7");
-    in7.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in8 = dv_base_reg_field::type_id::create("in8");
-    in8.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in9 = dv_base_reg_field::type_id::create("in9");
-    in9.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel1
-
-// Class: pinmux_reg_periph_insel2
-class pinmux_reg_periph_insel2 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in10;
-  rand dv_base_reg_field in11;
-  rand dv_base_reg_field in12;
-  rand dv_base_reg_field in13;
-  rand dv_base_reg_field in14;
-
-  `uvm_object_utils(pinmux_reg_periph_insel2)
-
-  function new(string       name = "pinmux_reg_periph_insel2",
-               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
-    in10 = dv_base_reg_field::type_id::create("in10");
-    in10.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in11 = dv_base_reg_field::type_id::create("in11");
-    in11.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in12 = dv_base_reg_field::type_id::create("in12");
-    in12.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in13 = dv_base_reg_field::type_id::create("in13");
-    in13.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in14 = dv_base_reg_field::type_id::create("in14");
-    in14.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel2
-
-// Class: pinmux_reg_periph_insel3
-class pinmux_reg_periph_insel3 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in15;
-  rand dv_base_reg_field in16;
-  rand dv_base_reg_field in17;
-  rand dv_base_reg_field in18;
-  rand dv_base_reg_field in19;
-
-  `uvm_object_utils(pinmux_reg_periph_insel3)
-
-  function new(string       name = "pinmux_reg_periph_insel3",
-               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
-    in15 = dv_base_reg_field::type_id::create("in15");
-    in15.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in16 = dv_base_reg_field::type_id::create("in16");
-    in16.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in17 = dv_base_reg_field::type_id::create("in17");
-    in17.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in18 = dv_base_reg_field::type_id::create("in18");
-    in18.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in19 = dv_base_reg_field::type_id::create("in19");
-    in19.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel3
-
-// Class: pinmux_reg_periph_insel4
-class pinmux_reg_periph_insel4 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in20;
-  rand dv_base_reg_field in21;
-  rand dv_base_reg_field in22;
-  rand dv_base_reg_field in23;
-  rand dv_base_reg_field in24;
-
-  `uvm_object_utils(pinmux_reg_periph_insel4)
-
-  function new(string       name = "pinmux_reg_periph_insel4",
-               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
-    in20 = dv_base_reg_field::type_id::create("in20");
-    in20.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in21 = dv_base_reg_field::type_id::create("in21");
-    in21.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in22 = dv_base_reg_field::type_id::create("in22");
-    in22.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in23 = dv_base_reg_field::type_id::create("in23");
-    in23.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in24 = dv_base_reg_field::type_id::create("in24");
-    in24.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel4
-
-// Class: pinmux_reg_periph_insel5
-class pinmux_reg_periph_insel5 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in25;
-  rand dv_base_reg_field in26;
-  rand dv_base_reg_field in27;
-  rand dv_base_reg_field in28;
-  rand dv_base_reg_field in29;
-
-  `uvm_object_utils(pinmux_reg_periph_insel5)
-
-  function new(string       name = "pinmux_reg_periph_insel5",
-               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
-    in25 = dv_base_reg_field::type_id::create("in25");
-    in25.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in26 = dv_base_reg_field::type_id::create("in26");
-    in26.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in27 = dv_base_reg_field::type_id::create("in27");
-    in27.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in28 = dv_base_reg_field::type_id::create("in28");
-    in28.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in29 = dv_base_reg_field::type_id::create("in29");
-    in29.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel5
-
-// Class: pinmux_reg_periph_insel6
-class pinmux_reg_periph_insel6 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field in30;
-  rand dv_base_reg_field in31;
-
-  `uvm_object_utils(pinmux_reg_periph_insel6)
-
-  function new(string       name = "pinmux_reg_periph_insel6",
-               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
-    in30 = dv_base_reg_field::type_id::create("in30");
-    in30.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    in31 = dv_base_reg_field::type_id::create("in31");
-    in31.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(0),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_periph_insel6
-
-// Class: pinmux_reg_mio_outsel0
-class pinmux_reg_mio_outsel0 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out0;
-  rand dv_base_reg_field out1;
-  rand dv_base_reg_field out2;
-  rand dv_base_reg_field out3;
-  rand dv_base_reg_field out4;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel0)
-
-  function new(string       name = "pinmux_reg_mio_outsel0",
-               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
-    out0 = dv_base_reg_field::type_id::create("out0");
-    out0.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out1 = dv_base_reg_field::type_id::create("out1");
-    out1.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out2 = dv_base_reg_field::type_id::create("out2");
-    out2.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out3 = dv_base_reg_field::type_id::create("out3");
-    out3.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out4 = dv_base_reg_field::type_id::create("out4");
-    out4.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel0
-
-// Class: pinmux_reg_mio_outsel1
-class pinmux_reg_mio_outsel1 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out5;
-  rand dv_base_reg_field out6;
-  rand dv_base_reg_field out7;
-  rand dv_base_reg_field out8;
-  rand dv_base_reg_field out9;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel1)
-
-  function new(string       name = "pinmux_reg_mio_outsel1",
-               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
-    out5 = dv_base_reg_field::type_id::create("out5");
-    out5.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out6 = dv_base_reg_field::type_id::create("out6");
-    out6.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out7 = dv_base_reg_field::type_id::create("out7");
-    out7.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out8 = dv_base_reg_field::type_id::create("out8");
-    out8.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out9 = dv_base_reg_field::type_id::create("out9");
-    out9.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel1
-
-// Class: pinmux_reg_mio_outsel2
-class pinmux_reg_mio_outsel2 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out10;
-  rand dv_base_reg_field out11;
-  rand dv_base_reg_field out12;
-  rand dv_base_reg_field out13;
-  rand dv_base_reg_field out14;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel2)
-
-  function new(string       name = "pinmux_reg_mio_outsel2",
-               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
-    out10 = dv_base_reg_field::type_id::create("out10");
-    out10.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out11 = dv_base_reg_field::type_id::create("out11");
-    out11.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out12 = dv_base_reg_field::type_id::create("out12");
-    out12.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out13 = dv_base_reg_field::type_id::create("out13");
-    out13.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out14 = dv_base_reg_field::type_id::create("out14");
-    out14.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel2
-
-// Class: pinmux_reg_mio_outsel3
-class pinmux_reg_mio_outsel3 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out15;
-  rand dv_base_reg_field out16;
-  rand dv_base_reg_field out17;
-  rand dv_base_reg_field out18;
-  rand dv_base_reg_field out19;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel3)
-
-  function new(string       name = "pinmux_reg_mio_outsel3",
-               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
-    out15 = dv_base_reg_field::type_id::create("out15");
-    out15.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out16 = dv_base_reg_field::type_id::create("out16");
-    out16.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out17 = dv_base_reg_field::type_id::create("out17");
-    out17.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out18 = dv_base_reg_field::type_id::create("out18");
-    out18.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out19 = dv_base_reg_field::type_id::create("out19");
-    out19.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel3
-
-// Class: pinmux_reg_mio_outsel4
-class pinmux_reg_mio_outsel4 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out20;
-  rand dv_base_reg_field out21;
-  rand dv_base_reg_field out22;
-  rand dv_base_reg_field out23;
-  rand dv_base_reg_field out24;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel4)
-
-  function new(string       name = "pinmux_reg_mio_outsel4",
-               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
-    out20 = dv_base_reg_field::type_id::create("out20");
-    out20.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out21 = dv_base_reg_field::type_id::create("out21");
-    out21.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out22 = dv_base_reg_field::type_id::create("out22");
-    out22.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out23 = dv_base_reg_field::type_id::create("out23");
-    out23.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out24 = dv_base_reg_field::type_id::create("out24");
-    out24.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel4
-
-// Class: pinmux_reg_mio_outsel5
-class pinmux_reg_mio_outsel5 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out25;
-  rand dv_base_reg_field out26;
-  rand dv_base_reg_field out27;
-  rand dv_base_reg_field out28;
-  rand dv_base_reg_field out29;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel5)
-
-  function new(string       name = "pinmux_reg_mio_outsel5",
-               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
-    out25 = dv_base_reg_field::type_id::create("out25");
-    out25.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out26 = dv_base_reg_field::type_id::create("out26");
-    out26.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out27 = dv_base_reg_field::type_id::create("out27");
-    out27.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(12),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out28 = dv_base_reg_field::type_id::create("out28");
-    out28.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(18),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out29 = dv_base_reg_field::type_id::create("out29");
-    out29.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(24),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel5
-
-// Class: pinmux_reg_mio_outsel6
-class pinmux_reg_mio_outsel6 extends dv_base_reg;
-  // fields
-  rand dv_base_reg_field out30;
-  rand dv_base_reg_field out31;
-
-  `uvm_object_utils(pinmux_reg_mio_outsel6)
-
-  function new(string       name = "pinmux_reg_mio_outsel6",
-               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
-    out30 = dv_base_reg_field::type_id::create("out30");
-    out30.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(0),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-    out31 = dv_base_reg_field::type_id::create("out31");
-    out31.configure(
-      .parent(this),
-      .size(6),
-      .lsb_pos(6),
-      .access("RW"),
-      .volatile(0),
-      .reset(2),
-      .has_reset(1),
-      .is_rand(1),
-      .individually_accessible(1));
-  endfunction : build
-
-endclass : pinmux_reg_mio_outsel6
-
-// Class: pinmux_reg_block
-class pinmux_reg_block extends dv_base_reg_block;
-  // registers
-  rand pinmux_reg_regen regen;
-  rand pinmux_reg_periph_insel0 periph_insel0;
-  rand pinmux_reg_periph_insel1 periph_insel1;
-  rand pinmux_reg_periph_insel2 periph_insel2;
-  rand pinmux_reg_periph_insel3 periph_insel3;
-  rand pinmux_reg_periph_insel4 periph_insel4;
-  rand pinmux_reg_periph_insel5 periph_insel5;
-  rand pinmux_reg_periph_insel6 periph_insel6;
-  rand pinmux_reg_mio_outsel0 mio_outsel0;
-  rand pinmux_reg_mio_outsel1 mio_outsel1;
-  rand pinmux_reg_mio_outsel2 mio_outsel2;
-  rand pinmux_reg_mio_outsel3 mio_outsel3;
-  rand pinmux_reg_mio_outsel4 mio_outsel4;
-  rand pinmux_reg_mio_outsel5 mio_outsel5;
-  rand pinmux_reg_mio_outsel6 mio_outsel6;
-
-  `uvm_object_utils(pinmux_reg_block)
-
-  function new(string name = "pinmux_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
-    regen = pinmux_reg_regen::type_id::create("regen");
-    regen.configure(.blk_parent(this));
-    regen.build();
-    default_map.add_reg(.rg(regen),
-                        .offset(32'h0),
-                        .rights("RW"));
-    periph_insel0 = pinmux_reg_periph_insel0::type_id::create("periph_insel0");
-    periph_insel0.configure(.blk_parent(this));
-    periph_insel0.build();
-    default_map.add_reg(.rg(periph_insel0),
-                        .offset(32'h4),
-                        .rights("RW"));
-    periph_insel1 = pinmux_reg_periph_insel1::type_id::create("periph_insel1");
-    periph_insel1.configure(.blk_parent(this));
-    periph_insel1.build();
-    default_map.add_reg(.rg(periph_insel1),
-                        .offset(32'h8),
-                        .rights("RW"));
-    periph_insel2 = pinmux_reg_periph_insel2::type_id::create("periph_insel2");
-    periph_insel2.configure(.blk_parent(this));
-    periph_insel2.build();
-    default_map.add_reg(.rg(periph_insel2),
-                        .offset(32'hc),
-                        .rights("RW"));
-    periph_insel3 = pinmux_reg_periph_insel3::type_id::create("periph_insel3");
-    periph_insel3.configure(.blk_parent(this));
-    periph_insel3.build();
-    default_map.add_reg(.rg(periph_insel3),
-                        .offset(32'h10),
-                        .rights("RW"));
-    periph_insel4 = pinmux_reg_periph_insel4::type_id::create("periph_insel4");
-    periph_insel4.configure(.blk_parent(this));
-    periph_insel4.build();
-    default_map.add_reg(.rg(periph_insel4),
-                        .offset(32'h14),
-                        .rights("RW"));
-    periph_insel5 = pinmux_reg_periph_insel5::type_id::create("periph_insel5");
-    periph_insel5.configure(.blk_parent(this));
-    periph_insel5.build();
-    default_map.add_reg(.rg(periph_insel5),
-                        .offset(32'h18),
-                        .rights("RW"));
-    periph_insel6 = pinmux_reg_periph_insel6::type_id::create("periph_insel6");
-    periph_insel6.configure(.blk_parent(this));
-    periph_insel6.build();
-    default_map.add_reg(.rg(periph_insel6),
-                        .offset(32'h1c),
-                        .rights("RW"));
-    mio_outsel0 = pinmux_reg_mio_outsel0::type_id::create("mio_outsel0");
-    mio_outsel0.configure(.blk_parent(this));
-    mio_outsel0.build();
-    default_map.add_reg(.rg(mio_outsel0),
-                        .offset(32'h20),
-                        .rights("RW"));
-    mio_outsel1 = pinmux_reg_mio_outsel1::type_id::create("mio_outsel1");
-    mio_outsel1.configure(.blk_parent(this));
-    mio_outsel1.build();
-    default_map.add_reg(.rg(mio_outsel1),
-                        .offset(32'h24),
-                        .rights("RW"));
-    mio_outsel2 = pinmux_reg_mio_outsel2::type_id::create("mio_outsel2");
-    mio_outsel2.configure(.blk_parent(this));
-    mio_outsel2.build();
-    default_map.add_reg(.rg(mio_outsel2),
-                        .offset(32'h28),
-                        .rights("RW"));
-    mio_outsel3 = pinmux_reg_mio_outsel3::type_id::create("mio_outsel3");
-    mio_outsel3.configure(.blk_parent(this));
-    mio_outsel3.build();
-    default_map.add_reg(.rg(mio_outsel3),
-                        .offset(32'h2c),
-                        .rights("RW"));
-    threshold0 = rv_plic_reg_threshold0::type_id::create("threshold0");
-    threshold0.configure(.blk_parent(this));
-    threshold0.build();
-    default_map.add_reg(.rg(threshold0),
-                        .offset(32'h108),
-                        .rights("RW"));
-    cc0 = rv_plic_reg_cc0::type_id::create("cc0");
-    cc0.configure(.blk_parent(this));
-    cc0.build();
-    default_map.add_reg(.rg(cc0),
-                        .offset(32'h10c),
-                        .rights("RW"));
-    msip0 = rv_plic_reg_msip0::type_id::create("msip0");
-    msip0.configure(.blk_parent(this));
-    msip0.build();
-    default_map.add_reg(.rg(msip0),
-                        .offset(32'h110),
-                        .rights("RW"));
-  endfunction : build
-
-endclass : rv_plic_reg_block
 
 `endif
 
@@ -12946,8 +12394,8 @@
   rand gpio_reg_block gpio;
   rand spi_device_reg_block spi_device;
   rand flash_ctrl_reg_block flash_ctrl;
+  rand pinmux_reg_block pinmux;
   rand rv_timer_reg_block rv_timer;
-  rand aes_reg_block aes;
   rand rv_plic_reg_block rv_plic;
   rand aes_reg_block aes;
   rand hmac_reg_block hmac;
@@ -12991,16 +12439,16 @@
     flash_ctrl.build(.base_addr(base_addr + 32'h40030000));
     default_map.add_submap(.child_map(flash_ctrl.default_map),
                            .offset(base_addr + 32'h40030000));
+    pinmux = pinmux_reg_block::type_id::create("pinmux");
+    pinmux.configure(.parent(this));
+    pinmux.build(.base_addr(base_addr + 32'h40070000));
+    default_map.add_submap(.child_map(pinmux.default_map),
+                           .offset(base_addr + 32'h40070000));
     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));
-    aes = aes_reg_block::type_id::create("aes");
-    aes.configure(.parent(this));
-    aes.build(.base_addr(base_addr + 32'h40110000));
-    default_map.add_submap(.child_map(aes.default_map),
-                           .offset(base_addr + 32'h40110000));
     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/hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson b/hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson
index 1669106..5a4f1d5 100644
--- a/hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson
+++ b/hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson
@@ -52,6 +52,7 @@
       fields: [
         {
             bits:   "0",
+            name: "wen",
             desc: ''' When true, all configuration registers can be modified.
             When false, they become read-only. Defaults true, write zero to clear.
             '''
diff --git a/hw/top_earlgrey/ip/xbar/doc/autogen/xbar_main.gen.hjson b/hw/top_earlgrey/ip/xbar/doc/autogen/xbar_main.gen.hjson
index 9b26130..1481cb5 100644
--- a/hw/top_earlgrey/ip/xbar/doc/autogen/xbar_main.gen.hjson
+++ b/hw/top_earlgrey/ip/xbar/doc/autogen/xbar_main.gen.hjson
@@ -216,4 +216,5 @@
     }
   ]
   clock: main
+  type: xbar
 }
\ No newline at end of file
diff --git a/hw/top_earlgrey/sw/autogen/top_earlgrey.h b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
index 067b74e..e22adfb 100644
--- a/hw/top_earlgrey/sw/autogen/top_earlgrey.h
+++ b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
@@ -5,6 +5,9 @@
 #ifndef _TOP_EARLGREY_H_
 #define _TOP_EARLGREY_H_
 
+#define PINMUX_PERIPH_INSEL_IDX_OFFSET 2
+#define PINMUX_PERIPH_OUTSEL_IDX_OFFSET 2
+
 // PERIPH_INSEL ranges from 0 to NUM_MIO + 2 -1}
 //  0 and 1 are tied to value 0 and 1
 #define NUM_MIO 32
@@ -79,4 +82,4 @@
 #define PINMUX_GPIO_GPIO_30_OUT 33
 #define PINMUX_GPIO_GPIO_31_OUT 34
 
-#endif // _TOP_EARLGREY_H_
+#endif  // _TOP_EARLGREY_H_
diff --git a/meson.build b/meson.build
index 279b5ad..6607110 100644
--- a/meson.build
+++ b/meson.build
@@ -80,5 +80,6 @@
 hw_ip_rv_timer_reg_h = gen_hw_hdr.process('hw/ip/rv_timer/data/rv_timer.hjson')
 hw_ip_uart_reg_h = gen_hw_hdr.process('hw/ip/uart/data/uart.hjson')
 hw_ip_usbdev_reg_h = gen_hw_hdr.process('hw/ip/usbdev/data/usbdev.hjson')
+hw_top_earlgrey_pinmux_h = gen_hw_hdr.process('hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson')
 
 subdir('sw')
diff --git a/sw/device/boot_rom/boot_rom.c b/sw/device/boot_rom/boot_rom.c
index d0ac43f..d1f5055 100644
--- a/sw/device/boot_rom/boot_rom.c
+++ b/sw/device/boot_rom/boot_rom.c
@@ -8,6 +8,7 @@
 #include "sw/device/lib/common.h"
 #include "sw/device/lib/flash_ctrl.h"
 #include "sw/device/lib/gpio.h"
+#include "sw/device/lib/pinmux.h"
 #include "sw/device/lib/spi_device.h"
 #include "sw/device/lib/uart.h"
 
@@ -22,6 +23,7 @@
 }
 
 int main(int argc, char **argv) {
+  pinmux_init();
   uart_init(UART_BAUD_RATE);
   uart_send_str((char *)chip_info);
 
diff --git a/sw/device/boot_rom/meson.build b/sw/device/boot_rom/meson.build
index 9bdf160..32619c5 100644
--- a/sw/device/boot_rom/meson.build
+++ b/sw/device/boot_rom/meson.build
@@ -31,6 +31,7 @@
     link_depends: rom_link_deps,
     dependencies: [
       sw_lib_flash_ctrl,
+      sw_lib_pinmux,
       sw_lib_gpio,
       sw_lib_hmac,
       sw_lib_spi_device,
diff --git a/sw/device/examples/hello_world/hello_world.c b/sw/device/examples/hello_world/hello_world.c
index a02158d..bd9aecf 100644
--- a/sw/device/examples/hello_world/hello_world.c
+++ b/sw/device/examples/hello_world/hello_world.c
@@ -4,6 +4,7 @@
 
 #include "sw/device/lib/common.h"
 #include "sw/device/lib/gpio.h"
+#include "sw/device/lib/pinmux.h"
 #include "sw/device/lib/spi_device.h"
 #include "sw/device/lib/uart.h"
 
@@ -53,6 +54,7 @@
 int main(int argc, char **argv) {
   uart_init(UART_BAUD_RATE);
 
+  pinmux_init();
   // Enable GPIO: 0-7 and 16 is input, 8-15 is output
   gpio_init(0xFF00);
 
diff --git a/sw/device/examples/hello_world/meson.build b/sw/device/examples/hello_world/meson.build
index 646b1d4..2e62097 100644
--- a/sw/device/examples/hello_world/meson.build
+++ b/sw/device/examples/hello_world/meson.build
@@ -12,6 +12,7 @@
     link_args: riscv_link_args,
     link_depends: riscv_link_deps,
     dependencies: [
+      sw_lib_pinmux,
       sw_lib_gpio,
       sw_lib_irq,
       sw_lib_spi_device,
diff --git a/sw/device/lib/meson.build b/sw/device/lib/meson.build
index 09e1436..1acd153 100644
--- a/sw/device/lib/meson.build
+++ b/sw/device/lib/meson.build
@@ -39,6 +39,18 @@
   )
 )
 
+# PINMUX library (sw_lib_pinmux)
+sw_lib_pinmux = declare_dependency(
+  sources: [hw_top_earlgrey_pinmux_h],
+  link_with: static_library(
+    'pinmux_ot',
+    sources: [
+      hw_top_earlgrey_pinmux_h,
+      'pinmux.c',
+    ]
+  )
+)
+
 # HMAC library (sw_lib_hmac)
 sw_lib_hmac = declare_dependency(
   sources: [hw_ip_hmac_reg_h],
diff --git a/sw/device/lib/pinmux.c b/sw/device/lib/pinmux.c
new file mode 100644
index 0000000..4886c83
--- /dev/null
+++ b/sw/device/lib/pinmux.c
@@ -0,0 +1,41 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#include "sw/device/lib/pinmux.h"
+
+#include "hw/top_earlgrey/sw/autogen/top_earlgrey.h"
+#include "sw/device/lib/common.h"
+
+#define PINMUX0_BASE_ADDR 0x40070000
+
+static void init_pinmux_reg(uint32_t reg, uint32_t size, uint32_t num_fields,
+                            uint32_t mask, uint32_t start_v) {
+  uint32_t reg_value = 0;
+  uint32_t reg_offset = 0;
+
+  for (uint32_t i = 0; i < NUM_MIO; ++i) {
+    reg_value |= ((i + start_v) & mask) << (size * (i % num_fields));
+    if ((i % num_fields) == (num_fields - 1)) {
+      REG32(reg + reg_offset) = reg_value;
+      reg_value = 0;
+      reg_offset += 4;
+    }
+  }
+
+  REG32(reg + reg_offset) = reg_value;
+}
+
+void pinmux_init(void) {
+  // input: assign MIO0..MIO31 to GPIO0..GPIO31
+  init_pinmux_reg(PINMUX_PERIPH_INSEL0(0), PINMUX_PERIPH_INSEL0_IN1_OFFSET,
+                  32 / PINMUX_PERIPH_INSEL0_IN1_OFFSET,
+                  PINMUX_PERIPH_INSEL0_IN0_MASK,
+                  PINMUX_PERIPH_INSEL_IDX_OFFSET);
+
+  // output: assign GPIO0..GPIO31 to MIO0..MIO31
+  init_pinmux_reg(PINMUX_MIO_OUTSEL0(0), PINMUX_MIO_OUTSEL0_OUT1_OFFSET,
+                  32 / PINMUX_MIO_OUTSEL0_OUT1_OFFSET,
+                  PINMUX_MIO_OUTSEL0_OUT0_MASK,
+                  PINMUX_PERIPH_OUTSEL_IDX_OFFSET);
+}
diff --git a/sw/device/lib/pinmux.h b/sw/device/lib/pinmux.h
new file mode 100644
index 0000000..b523a65
--- /dev/null
+++ b/sw/device/lib/pinmux.h
@@ -0,0 +1,17 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+#ifndef _PINMUX_H_
+#define _PINMUX_H_
+
+#include <stdint.h>
+
+#include "pinmux_regs.h"  // Generated.
+
+/**
+ * PINMUX default initialization.
+ */
+void pinmux_init(void);
+
+#endif  // _PINMUX_H_
diff --git a/sw/device/lib/srcs.mk b/sw/device/lib/srcs.mk
index 3431149..b3c8466 100644
--- a/sw/device/lib/srcs.mk
+++ b/sw/device/lib/srcs.mk
@@ -3,7 +3,7 @@
 # SPDX-License-Identifier: Apache-2.0
 
 GEN_HEADERS       += $(LIB_LOC_DIF_SRCS:.c=_regs.h) sw/device/boot_rom/chip_info.h
-LIB_LOC_DIF_SRCS  += uart.c gpio.c spi_device.c flash_ctrl.c hmac.c usbdev.c rv_timer.c
+LIB_LOC_DIF_SRCS  += uart.c gpio.c spi_device.c flash_ctrl.c hmac.c usbdev.c rv_timer.c pinmux.c
 LIB_LOC_EXT_SRCS  += usb_controlep.c usb_simpleserial.c irq.c handler.c irq_vectors.S
 
 LIB_SRCS          += $(addprefix $(LIB_DIR)/, $(LIB_LOC_DIF_SRCS) $(LIB_LOC_EXT_SRCS))
diff --git a/sw/device/rules.mk b/sw/device/rules.mk
index fd23373..4c1b69f 100644
--- a/sw/device/rules.mk
+++ b/sw/device/rules.mk
@@ -114,6 +114,9 @@
 	$(CC) $(CFLAGS) -E -MMD -c $(INCS) -o $@ $<
 
 # regtool
+$(LIB_BUILD_DIR)/pinmux_regs.h: $(SW_ROOT_DIR)/../hw/top_earlgrey/ip/pinmux/data/autogen/pinmux.hjson
+	$(REGTOOL) -D -o $@ $<
+
 $(LIB_BUILD_DIR)/%_regs.h: $(SW_ROOT_DIR)/../hw/ip/$$*/data/$$*.hjson
 	$(REGTOOL) -D -o $@ $<