[top] Integrate usbdev using topgen

This commit integrates the USB device (usbdev) into the Earlgrey top
using topgen. The previous, manually maintained, top_earlgrey_usb
versions of the top level are removed and the hello_usbdev example is
added to CI as a first sanity check.

This commit also contains work from Srikrishna Iyer <sriyer@google.com>.
This resolves lowRISC/OpenTitan#52 and lowRISC/OpenTitan#1007.

Signed-off-by: Pirmin Vogel <vogelpi@lowrisc.org>
diff --git a/ci/run_verilator_pytest.sh b/ci/run_verilator_pytest.sh
index ad58b48..4ff4fa7 100755
--- a/ci/run_verilator_pytest.sh
+++ b/ci/run_verilator_pytest.sh
@@ -15,6 +15,7 @@
 BOOT_ROM_TARGET="boot_rom/boot_rom.elf"
 
 TEST_TARGETS=(
+  "examples/hello_usbdev/hello_usbdev.elf"
   "tests/aes/aes_test.elf"
   "tests/flash_ctrl/flash_test.elf"
   "tests/hmac/sha256_test.elf"
@@ -24,6 +25,7 @@
 if [[ ! -z ${MAKE_BUILD+x} ]]; then
   BOOT_ROM_TARGET="sw/device/sim/boot_rom/rom.elf"
   TEST_TARGETS=(
+    "sw/device/sim/examples/hello_usbdev.elf"
     "sw/device/sim/tests/aes/sw.elf"
     "sw/device/sim/tests/flash_ctrl/sw.elf"
     "sw/device/sim/tests/hmac/sw.elf"
diff --git a/hw/dv/dpi/usbdpi/usbdpi.c b/hw/dv/dpi/usbdpi/usbdpi.c
index 491bea2..1ba3f07 100644
--- a/hw/dv/dpi/usbdpi/usbdpi.c
+++ b/hw/dv/dpi/usbdpi/usbdpi.c
@@ -21,10 +21,6 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#if TOOL_VERILATOR
-#include "verilator_sim_ctrl.h"
-#endif
-
 static const char *st_states[] = {"ST_IDLE 0", "ST_SEND 1", "ST_GET 2",
                                   "ST_SYNC 3", "ST_EOP 4",  "ST_EOP0 5"};
 
@@ -626,19 +622,6 @@
   }
   switch (ctx->state) {
     case ST_IDLE:
-#if TOOL_VERILATOR
-      if (ctx->frame == 35) {
-        printf("USB: usbdpi done, frame: %d, success: %d, state: %d\n",
-               ctx->frame, ctx->baudrate_set_successfully, ctx->state);
-
-        // If we were able to set the BAUD rate sucessfully, the DUT
-        // provided reasonable responses to our requests. Ideally, we
-        // would have a more advanced test here.
-        VerilatorSimCtrl::GetInstance().RequestStop(
-            ctx->baudrate_set_successfully);
-      }
-#endif
-
       switch (ctx->frame) {
         case 1:
           setDeviceAddress(ctx);
diff --git a/hw/ip/usbdev/data/usbdev.hjson b/hw/ip/usbdev/data/usbdev.hjson
index 19d575c..343e157 100644
--- a/hw/ip/usbdev/data/usbdev.hjson
+++ b/hw/ip/usbdev/data/usbdev.hjson
@@ -2,19 +2,22 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 { name: "usbdev",
-  clock_primary: "clk_fixed",
-  other_clock_list: [ "clk_48MHz" ]
+  clock_primary: "clk_i",
+  other_clock_list: [ "clk_usb_48mhz_i" ]
+  reset_primary: "rst_ni",
+  other_reset_list: [ "rst_usb_48mhz_ni" ]
   bus_device: "tlul",
   bus_host: "none",
   available_inout_list: [
-    { name: "usb_dp", desc: "USB data D+" }
-    { name: "usb_dn", desc: "USB data D-" }
+    #{ name: "d", desc: "USB data differential" }
+    { name: "dp", desc: "USB data D+" }
+    { name: "dn", desc: "USB data D-" }
   ],
   available_input_list: [
-    {  name: "usb_sense", desc: "USB host VBUS sense" }
+    {  name: "sense", desc: "USB host VBUS sense" }
   ],
   available_output_list: [
-    { name: "usb_pullup", desc: "USB Full Speed pullup control" }
+    { name: "pullup", desc: "USB Full Speed pullup control" }
   ],
   param_list: [
     { name:    "NEndpoints",
diff --git a/hw/ip/usbdev/data/usbdev.prj.hjson b/hw/ip/usbdev/data/usbdev.prj.hjson
new file mode 100644
index 0000000..1c5a066
--- /dev/null
+++ b/hw/ip/usbdev/data/usbdev.prj.hjson
@@ -0,0 +1,11 @@
+// Copyright lowRISC contributors.
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+{
+    name:               "usbdev",
+    version:            "0.5",
+    life_stage:         "L1",
+    design_stage:       "D0",
+    verification_stage: "V0",
+}
diff --git a/hw/ip/usbdev/doc/_index.md b/hw/ip/usbdev/doc/_index.md
index 0b8cc4c..1515350 100644
--- a/hw/ip/usbdev/doc/_index.md
+++ b/hw/ip/usbdev/doc/_index.md
@@ -73,7 +73,7 @@
 
 |External Pin|Internal Signal|Notes|
 |------------|---------------|-----|
-|USB D+, USB D-|usb_d_i, usb_dp_i, usb_dn_i, usb_d_o, usb_se0_o|Interface to a differential USB transceiver. This interface can be selected by writing 1 to {{< regref "phy_config.rx_differential_mode" >}} and {{< regref "phy_config.tx_differential_mode" >}}.|
+|USB D+, USB D-|usb_d_i, usb_dp_i, usb_dn_i, usb_d_o, usb_se0_o|Interface to a differential USB transceiver. This interface can be selected by writing 1 to {{< regref "phy_config.rx_differential_mode" >}} and {{< regref "phy_config.tx_differential_mode" >}}. In differential mode, the single-ended signals usb_dp_i and usb_dn_i are used to detect the SE0 state.|
 |USB D+, USB D-|usb_dp_i, usb_dn_i, usb_dp_o, usb_dn_o|Single-ended interface to regular IO cells. This interface can be used for prototyping on an FPGA, but will probably not be USB compliant. This interface can be selected by writing 0 to {{< regref "phy_config.rx_differential_mode" >}} and {{< regref "phy_config.tx_differential_mode" >}}.|
 ||usb_oe_o|Enable driving the external pins.|
 |[usb_pullup]|usb_pullup_o|When the usb_pullup_o asserts a 1.5k pullup resistor should be connected to D+. This can be done inside the chip or with an external pin. A permanently connected resistor can also be used.|
diff --git a/hw/ip/usbdev/dv/tb/tb.sv b/hw/ip/usbdev/dv/tb/tb.sv
index c649e28..194584c 100644
--- a/hw/ip/usbdev/dv/tb/tb.sv
+++ b/hw/ip/usbdev/dv/tb/tb.sv
@@ -49,7 +49,7 @@
     .rst_ni               (rst_n      ),
 
     .clk_usb_48mhz_i      (usb_clk    ),
-    .rst_usb_ni           (usb_rst_n  ),
+    .rst_usb_48mhz_ni     (usb_rst_n  ),
 
     .tl_i                 (tl_if.h2d  ),
     .tl_o                 (tl_if.d2h  ),
@@ -57,20 +57,20 @@
 
     // USB Interface
     // TOOD: need to hook up an interface
-    .cio_usb_d_i          (1'b0),
-    .cio_usb_dp_i         (1'b1),
-    .cio_usb_dn_i         (1'b0),
+    .cio_d_i              (1'b0),
+    .cio_dp_i             (1'b1),
+    .cio_dn_i             (1'b0),
 
-    .cio_usb_d_o          (),
-    .cio_usb_se0_o        (),
-    .cio_usb_dp_o         (),
-    .cio_usb_dn_o         (),
-    .cio_usb_oe_o         (),
+    .cio_d_o              (),
+    .cio_se0_o            (),
+    .cio_dp_o             (),
+    .cio_dn_o             (),
+    .cio_oe_o             (),
 
-    .cio_usb_tx_mode_se_o (),
-    .cio_usb_sense_i      (1'b0),
-    .cio_usb_pullup_en_o  (),
-    .cio_usb_suspend_o    (),
+    .cio_tx_mode_se_o     (),
+    .cio_sense_i          (1'b0),
+    .cio_pullup_en_o      (),
+    .cio_suspend_o        (),
 
     // Interrupts
     .intr_pkt_received_o    (intr_pkt_received    ),
diff --git a/hw/ip/usbdev/rtl/usbdev.sv b/hw/ip/usbdev/rtl/usbdev.sv
index b3557e7..8a0a724 100644
--- a/hw/ip/usbdev/rtl/usbdev.sv
+++ b/hw/ip/usbdev/rtl/usbdev.sv
@@ -11,27 +11,27 @@
   input  logic       clk_i,
   input  logic       rst_ni,
   input  logic       clk_usb_48mhz_i, // use usb_ prefix for signals in this clk
-  input  logic       rst_usb_ni, // async reset, with relase sync to clk_usb_48_mhz_i
+  input  logic       rst_usb_48mhz_ni, // async reset, with relase sync to clk_usb_48_mhz_i
 
   // Register interface
   input  tlul_pkg::tl_h2d_t tl_i,
   output tlul_pkg::tl_d2h_t tl_o,
 
   // USB Interface
-  input  logic       cio_usb_d_i,
-  input  logic       cio_usb_dp_i,
-  input  logic       cio_usb_dn_i,
+  input  logic       cio_d_i,
+  input  logic       cio_dp_i,
+  input  logic       cio_dn_i,
 
-  output logic       cio_usb_d_o,
-  output logic       cio_usb_se0_o,
-  output logic       cio_usb_dp_o,
-  output logic       cio_usb_dn_o,
-  output logic       cio_usb_oe_o,
+  output logic       cio_d_o,
+  output logic       cio_se0_o,
+  output logic       cio_dp_o,
+  output logic       cio_dn_o,
+  output logic       cio_oe_o,
 
-  output logic       cio_usb_tx_mode_se_o,
-  input  logic       cio_usb_sense_i,
-  output logic       cio_usb_pullup_en_o,
-  output logic       cio_usb_suspend_o,
+  output logic       cio_tx_mode_se_o,
+  input  logic       cio_sense_i,
+  output logic       cio_pullup_en_o,
+  output logic       cio_suspend_o,
 
   // Interrupts
   output logic       intr_pkt_received_o, // Packet received
@@ -165,7 +165,7 @@
     .wdepth    (hw2reg.usbstat.av_depth.d),
 
     .clk_rd_i  (clk_usb_48mhz_i),
-    .rst_rd_ni (rst_usb_ni),
+    .rst_rd_ni (rst_usb_48mhz_ni),
     .rvalid    (usb_av_rvalid),
     .rready    (usb_av_rready),
     .rdata     (usb_av_rdata),
@@ -177,7 +177,7 @@
     .Depth(RXFifoDepth)
   ) usbdev_rxfifo (
     .clk_wr_i  (clk_usb_48mhz_i),
-    .rst_wr_ni (rst_usb_ni),
+    .rst_wr_ni (rst_usb_48mhz_ni),
 
     .wvalid    (usb_rx_wvalid),
     .wready    (usb_rx_wready),
@@ -236,7 +236,7 @@
     .Width(3*NEndpoints)
   ) usbdev_sync_ep_cfg (
     .clk_i  (clk_usb_48mhz_i),
-    .rst_ni (rst_usb_ni),
+    .rst_ni (rst_usb_48mhz_ni),
     .d      ({enable_setup, enable_out, ep_stall}),
     .q      ({usb_enable_setup, usb_enable_out, usb_ep_stall})
   );
@@ -266,7 +266,7 @@
     .Width (NEndpoints)
   ) usbdev_rdysync (
     .clk_i  (clk_usb_48mhz_i),
-    .rst_ni (rst_usb_ni),
+    .rst_ni (rst_usb_48mhz_ni),
     .d      (in_rdy_async),
     .q      (usb_in_rdy)
   );
@@ -277,7 +277,7 @@
     .clk_src_i   (clk_i),
     .clk_dst_i   (clk_usb_48mhz_i),
     .rst_src_ni  (rst_ni),
-    .rst_dst_ni  (rst_usb_ni),
+    .rst_dst_ni  (rst_usb_48mhz_ni),
     .src_pulse_i (reg2hw.data_toggle_clear[0].qe),
     .dst_pulse_o (usb_data_toggle_clear_en)
   );
@@ -297,7 +297,7 @@
   prim_pulse_sync usbdev_setsent (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_set_sent),
     .dst_pulse_o (set_sent)
@@ -322,7 +322,7 @@
   prim_pulse_sync usbdev_sync_in_err (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_in_err),
     .dst_pulse_o (event_in_err)
@@ -331,7 +331,7 @@
   prim_pulse_sync usbdev_outrdyclr (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_setup_received),
     .dst_pulse_o (setup_received)
@@ -340,7 +340,7 @@
   prim_pulse_sync sync_usb_event_rx_crc_err (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_rx_crc_err),
     .dst_pulse_o (event_rx_crc_err)
@@ -349,7 +349,7 @@
   prim_pulse_sync sync_usb_event_rx_pid_err (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_rx_pid_err),
     .dst_pulse_o (event_rx_pid_err)
@@ -358,7 +358,7 @@
   prim_pulse_sync sync_usb_event_rx_bitstuff_err (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_rx_bitstuff_err),
     .dst_pulse_o (event_rx_bitstuff_err)
@@ -367,7 +367,7 @@
   prim_pulse_sync sync_usb_event_frame (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_frame),
     .dst_pulse_o (event_frame)
@@ -375,8 +375,8 @@
 
   logic event_link_reset_q;
 
-  always_ff @(posedge clk_usb_48mhz_i or negedge rst_usb_ni) begin
-    if (!rst_usb_ni) begin
+  always_ff @(posedge clk_usb_48mhz_i or negedge rst_usb_48mhz_ni) begin
+    if (!rst_usb_48mhz_ni) begin
       event_link_reset_q <= 0;
     end else begin
       event_link_reset_q <= event_link_reset;
@@ -431,7 +431,7 @@
     .SramAw         (SramAw)
   ) usbdev_impl (
     .clk_48mhz_i          (clk_usb_48mhz_i),
-    .rst_ni               (rst_usb_ni),
+    .rst_ni               (rst_usb_48mhz_ni),
 
     // Pins
     .usb_d_i              (usb_rx_d),
@@ -517,7 +517,7 @@
     .Width      (1+7)
   ) cdc_sys_to_usb (
     .clk_i  (clk_usb_48mhz_i),
-    .rst_ni (rst_usb_ni),
+    .rst_ni (rst_usb_48mhz_ni),
     .d      ({reg2hw.usbctrl.enable.q, reg2hw.usbctrl.device_address.q}),
     .q      ({usb_enable,              usb_device_addr})
   );
@@ -537,7 +537,7 @@
   prim_pulse_sync usbdev_resume (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_link_resume),
     .dst_pulse_o (event_link_resume)
@@ -549,7 +549,7 @@
   prim_pulse_sync usbdev_devclr (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_clr_devaddr),
     .dst_pulse_o (hw2reg.usbctrl.device_address.de)
@@ -560,7 +560,7 @@
   prim_pulse_sync sync_usb_event_av_empty (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_av_empty),
     .dst_pulse_o (event_av_empty)
@@ -570,7 +570,7 @@
   prim_pulse_sync sync_usb_event_rx_full (
     .clk_src_i   (clk_usb_48mhz_i),
     .clk_dst_i   (clk_i),
-    .rst_src_ni  (rst_usb_ni),
+    .rst_src_ni  (rst_usb_48mhz_ni),
     .rst_dst_ni  (rst_ni),
     .src_pulse_i (usb_event_rx_full),
     .dst_pulse_o (event_rx_full)
@@ -634,7 +634,7 @@
     .clk_a_i    (clk_i),
     .clk_b_i    (clk_usb_48mhz_i),
     .rst_a_ni   (rst_ni),
-    .rst_b_ni   (rst_usb_ni),
+    .rst_b_ni   (rst_usb_48mhz_ni),
     .a_req_i    (mem_a_req),
     .a_write_i  (mem_a_write),
     .a_addr_i   (mem_a_addr),
@@ -854,25 +854,25 @@
     .clk_i                  (clk_i),
     .rst_ni                 (rst_ni),
     .clk_usb_48mhz_i        (clk_usb_48mhz_i),
-    .rst_usb_ni             (rst_usb_ni),
+    .rst_usb_48mhz_ni             (rst_usb_48mhz_ni),
     .rx_differential_mode_i (reg2hw.phy_config.rx_differential_mode),
     .tx_differential_mode_i (reg2hw.phy_config.tx_differential_mode),
     .sys_reg2hw_config_i    (reg2hw.phy_config),
     .sys_usb_sense_o        (hw2reg.usbstat.usb_sense.d),
 
     // Chip IO
-    .cio_usb_d_i            (cio_usb_d_i),
-    .cio_usb_dp_i           (cio_usb_dp_i),
-    .cio_usb_dn_i           (cio_usb_dn_i),
-    .cio_usb_d_o            (cio_usb_d_o),
-    .cio_usb_se0_o          (cio_usb_se0_o),
-    .cio_usb_dp_o           (cio_usb_dp_o),
-    .cio_usb_dn_o           (cio_usb_dn_o),
-    .cio_usb_oe_o           (cio_usb_oe_o),
-    .cio_usb_tx_mode_se_o   (cio_usb_tx_mode_se_o),
-    .cio_usb_sense_i        (cio_usb_sense_i),
-    .cio_usb_pullup_en_o    (cio_usb_pullup_en_o),
-    .cio_usb_suspend_o      (cio_usb_suspend_o),
+    .cio_usb_d_i            (cio_d_i),
+    .cio_usb_dp_i           (cio_dp_i),
+    .cio_usb_dn_i           (cio_dn_i),
+    .cio_usb_d_o            (cio_d_o),
+    .cio_usb_se0_o          (cio_se0_o),
+    .cio_usb_dp_o           (cio_dp_o),
+    .cio_usb_dn_o           (cio_dn_o),
+    .cio_usb_oe_o           (cio_oe_o),
+    .cio_usb_tx_mode_se_o   (cio_tx_mode_se_o),
+    .cio_usb_sense_i        (cio_sense_i),
+    .cio_usb_pullup_en_o    (cio_pullup_en_o),
+    .cio_usb_suspend_o      (cio_suspend_o),
 
     // Internal interface
     .usb_rx_d_o             (usb_rx_d),
diff --git a/hw/ip/usbdev/rtl/usbdev_iomux.sv b/hw/ip/usbdev/rtl/usbdev_iomux.sv
index 732ef53..826cb8e 100644
--- a/hw/ip/usbdev/rtl/usbdev_iomux.sv
+++ b/hw/ip/usbdev/rtl/usbdev_iomux.sv
@@ -15,7 +15,7 @@
   input  logic                          clk_i,
   input  logic                          rst_ni,
   input  logic                          clk_usb_48mhz_i, // use usb_ prefix for signals in this clk
-  input  logic                          rst_usb_ni,
+  input  logic                          rst_usb_48mhz_ni,
 
   // Configuration (quasi-static)
   input  logic                          rx_differential_mode_i,
@@ -83,7 +83,7 @@
     .Width (4)
   ) cdc_io_to_usb (
     .clk_i  (clk_usb_48mhz_i),
-    .rst_ni (rst_usb_ni),
+    .rst_ni (rst_usb_48mhz_ni),
     .d      ({cio_usb_dp_i,
               cio_usb_dn_i,
               cio_usb_d_i,
diff --git a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
index 272d144..934957f 100644
--- a/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
+++ b/hw/top_earlgrey/data/autogen/top_earlgrey.gen.hjson
@@ -19,6 +19,10 @@
       name: fixed
       freq: "100000000"
     }
+    {
+      name: usb
+      freq: "48000000"
+    }
   ]
   resets:
   [
@@ -44,6 +48,12 @@
       root: sys
       clk: fixed
     }
+    {
+      name: usb
+      type: leaf
+      root: sys
+      clk: usb
+    }
   ]
   num_cores: "1"
   module:
@@ -534,6 +544,138 @@
       alert_list: []
       scan: "false"
     }
+    {
+      name: usbdev
+      type: usbdev
+      clock_connections:
+      {
+        clk_i: fixed
+        clk_usb_48mhz_i: usb
+      }
+      reset_connections:
+      {
+        rst_ni: sys_fixed
+        rst_usb_48mhz_ni: usb
+      }
+      base_addr: 0x40150000
+      size: 0x1000
+      bus_device: tlul
+      bus_host: none
+      available_input_list:
+      [
+        {
+          name: sense
+          width: 1
+          type: input
+        }
+      ]
+      available_output_list:
+      [
+        {
+          name: pullup
+          width: 1
+          type: output
+        }
+      ]
+      available_inout_list:
+      [
+        {
+          name: dp
+          width: 1
+          type: inout
+        }
+        {
+          name: dn
+          width: 1
+          type: inout
+        }
+      ]
+      interrupt_list:
+      [
+        {
+          name: pkt_received
+          width: 1
+          type: interrupt
+        }
+        {
+          name: pkt_sent
+          width: 1
+          type: interrupt
+        }
+        {
+          name: disconnected
+          width: 1
+          type: interrupt
+        }
+        {
+          name: host_lost
+          width: 1
+          type: interrupt
+        }
+        {
+          name: link_reset
+          width: 1
+          type: interrupt
+        }
+        {
+          name: link_suspend
+          width: 1
+          type: interrupt
+        }
+        {
+          name: link_resume
+          width: 1
+          type: interrupt
+        }
+        {
+          name: av_empty
+          width: 1
+          type: interrupt
+        }
+        {
+          name: rx_full
+          width: 1
+          type: interrupt
+        }
+        {
+          name: av_overflow
+          width: 1
+          type: interrupt
+        }
+        {
+          name: link_in_err
+          width: 1
+          type: interrupt
+        }
+        {
+          name: rx_crc_err
+          width: 1
+          type: interrupt
+        }
+        {
+          name: rx_pid_err
+          width: 1
+          type: interrupt
+        }
+        {
+          name: rx_bitstuff_err
+          width: 1
+          type: interrupt
+        }
+        {
+          name: frame
+          width: 1
+          type: interrupt
+        }
+        {
+          name: connected
+          width: 1
+          type: interrupt
+        }
+      ]
+      alert_list: []
+      scan: "false"
+    }
   ]
   memory:
   [
@@ -760,6 +902,10 @@
               base_addr: 0x40080000
               size_byte: 0x1000
             }
+            {
+              base_addr: 0x40150000
+              size_byte: 0x1000
+            }
           ]
         }
         {
@@ -901,6 +1047,7 @@
           gpio
           spi_device
           rv_timer
+          usbdev
         ]
       }
       nodes:
@@ -983,6 +1130,23 @@
           xbar: false
           pipeline_byp: "true"
         }
+        {
+          name: usbdev
+          type: device
+          clock: clk_peri_i
+          reset: rst_peri_ni
+          pipeline: "false"
+          inst_type: usbdev
+          addr_range:
+          [
+            {
+              base_addr: 0x40150000
+              size_byte: 0x1000
+            }
+          ]
+          xbar: false
+          pipeline_byp: "true"
+        }
       ]
       clock: clk_peri_i
     }
@@ -996,6 +1160,7 @@
     hmac
     alert_handler
     nmi_gen
+    usbdev
   ]
   interrupt:
   [
@@ -1159,6 +1324,86 @@
       width: 1
       type: interrupt
     }
+    {
+      name: usbdev_pkt_received
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_pkt_sent
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_disconnected
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_host_lost
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_link_reset
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_link_suspend
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_link_resume
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_av_empty
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_rx_full
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_av_overflow
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_link_in_err
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_rx_crc_err
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_rx_pid_err
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_rx_bitstuff_err
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_frame
+      width: 1
+      type: interrupt
+    }
+    {
+      name: usbdev_connected
+      width: 1
+      type: interrupt
+    }
   ]
   alert_module:
   [
@@ -1192,6 +1437,13 @@
           ChA[0..1]
         ]
       }
+      {
+        name: usbdev
+        pad:
+        [
+          ChC[0..3]
+        ]
+      }
     ]
     mio_modules:
     [
@@ -1277,6 +1529,54 @@
           }
         ]
       }
+      {
+        name: usbdev_sense
+        width: 1
+        type: input
+        pad:
+        [
+          {
+            name: ChC
+            index: 0
+          }
+        ]
+      }
+      {
+        name: usbdev_pullup
+        width: 1
+        type: output
+        pad:
+        [
+          {
+            name: ChC
+            index: 1
+          }
+        ]
+      }
+      {
+        name: usbdev_dp
+        width: 1
+        type: inout
+        pad:
+        [
+          {
+            name: ChC
+            index: 2
+          }
+        ]
+      }
+      {
+        name: usbdev_dn
+        width: 1
+        type: inout
+        pad:
+        [
+          {
+            name: ChC
+            index: 3
+          }
+        ]
+      }
     ]
     inputs: []
     outputs: []
@@ -1312,6 +1612,16 @@
           WEAK
         ]
       }
+      {
+        name: ChC
+        type: IO_33V
+        count: 4
+        attr:
+        [
+          KEEP
+          STRONG
+        ]
+      }
     ]
   }
 }
\ No newline at end of file
diff --git a/hw/top_earlgrey/data/pins_artys7.xdc b/hw/top_earlgrey/data/pins_artys7.xdc
index 0b38752..e60fe40 100644
--- a/hw/top_earlgrey/data/pins_artys7.xdc
+++ b/hw/top_earlgrey/data/pins_artys7.xdc
@@ -11,6 +11,11 @@
 set_property -dict { PACKAGE_PIN R2    IOSTANDARD SSTL135 } [get_ports { IO_CLK }]; #IO_L12P_T1_MRCC_34 Sch=ddr3_clk[200]
 create_clock -add -name sys_clk_pin -period 10.000 -waveform {0 5.000}  [get_ports { IO_CLK }];
 
+## Clock Domain Crossings
+create_generated_clock -name clk_50_unbuf -source [get_pin clkgen/pll/CLKIN1] [get_pin clkgen/pll/CLKOUT0]
+create_generated_clock -name clk_48_unbuf -source [get_pin clkgen/pll/CLKIN1] [get_pin clkgen/pll/CLKOUT1]
+set_clock_groups -group clk_50_unbuf -group clk_48_unbuf -asynchronous
+
 ## Switches
 set_property -dict { PACKAGE_PIN H14   IOSTANDARD LVCMOS33 } [get_ports { IO_GP4 }]; #IO_L20N_T3_A19_15 Sch=sw[0]
 set_property -dict { PACKAGE_PIN H18   IOSTANDARD LVCMOS33 } [get_ports { IO_GP5 }]; #IO_L21P_T3_DQS_15 Sch=sw[1]
@@ -48,10 +53,10 @@
 #set_property -dict { PACKAGE_PIN N18   IOSTANDARD LVCMOS33 } [get_ports { ja[7] }]; #IO_L8N_T1_D12_14 Sch=ja_n[4]
 
 ## PMOD Header JB
-#set_property -dict { PACKAGE_PIN P17   IOSTANDARD LVCMOS33 } [get_ports { jb[0] }]; #IO_L9P_T1_DQS_14 Sch=jb_p[1]
-#set_property -dict { PACKAGE_PIN P18   IOSTANDARD LVCMOS33 } [get_ports { jb[1] }]; #IO_L9N_T1_DQS_D13_14 Sch=jb_n[1]
-#set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { jb[2] }]; #IO_L10P_T1_D14_14 Sch=jb_p[2]
-#set_property -dict { PACKAGE_PIN T18   IOSTANDARD LVCMOS33 } [get_ports { jb[3] }]; #IO_L10N_T1_D15_14 Sch=jb_n[2]
+set_property -dict { PACKAGE_PIN P17   IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DP0 }]; #IO_L9P_T1_DQS_14 Sch=jb_p[1]
+set_property -dict { PACKAGE_PIN P18   IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DN0 }]; #IO_L9N_T1_DQS_D13_14 Sch=jb_n[1]
+set_property -dict { PACKAGE_PIN R18   IOSTANDARD LVCMOS33 } [get_ports { IO_USB_PULLUP0 }]; #IO_L10P_T1_D14_14 Sch=jb_p[2]
+set_property -dict { PACKAGE_PIN T18   IOSTANDARD LVCMOS33 } [get_ports { IO_USB_SENSE0 }]; #IO_L10N_T1_D15_14 Sch=jb_n[2]
 #set_property -dict { PACKAGE_PIN P14   IOSTANDARD LVCMOS33 } [get_ports { jb[4] }]; #IO_L11P_T1_SRCC_14 Sch=jb_p[3]
 #set_property -dict { PACKAGE_PIN P15   IOSTANDARD LVCMOS33 } [get_ports { jb[5] }]; #IO_L11N_T1_SRCC_14 Sch=jb_n[3]
 #set_property -dict { PACKAGE_PIN N15   IOSTANDARD LVCMOS33 } [get_ports { jb[6] }]; #IO_L12P_T1_MRCC_14 Sch=jb_p[4]
diff --git a/hw/top_earlgrey/data/pins_nexysvideo.xdc b/hw/top_earlgrey/data/pins_nexysvideo.xdc
index d9ec661..005f23e 100644
--- a/hw/top_earlgrey/data/pins_nexysvideo.xdc
+++ b/hw/top_earlgrey/data/pins_nexysvideo.xdc
@@ -6,6 +6,11 @@
 set_property -dict { PACKAGE_PIN R4    IOSTANDARD LVCMOS33 } [get_ports { IO_CLK }]; #IO_L13P_T2_MRCC_34 Sch=sysclk
 create_clock -add -name sys_clk_pin -period 10.00 -waveform {0 5} [get_ports IO_CLK]
 
+## Clock Domain Crossings
+create_generated_clock -name clk_50_unbuf -source [get_pin clkgen/pll/CLKIN1] [get_pin clkgen/pll/CLKOUT0]
+create_generated_clock -name clk_48_unbuf -source [get_pin clkgen/pll/CLKIN1] [get_pin clkgen/pll/CLKOUT1]
+set_clock_groups -group clk_50_unbuf -group clk_48_unbuf -asynchronous
+
 #set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets IO_SDCK_IBUF]; # SDCK clock to be ignored
 
 ## FMC Transceiver clocks (Must be set to value provided by Mezzanine card, currently set to 156.25 MHz)
@@ -121,10 +126,10 @@
 set_property -dict { PACKAGE_PIN V8    IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DN0 }]; #IO_L21N_T3_DQS_34 Sch=jb_n[1]
 set_property -dict { PACKAGE_PIN V7    IOSTANDARD LVCMOS33 } [get_ports { IO_USB_PULLUP0 }]; #IO_L19P_T3_34 Sch=jb_p[2]
 set_property -dict { PACKAGE_PIN W7    IOSTANDARD LVCMOS33 } [get_ports { IO_USB_SENSE0 }]; #IO_L19N_T3_VREF_34 Sch=jb_n[2]
-set_property -dict { PACKAGE_PIN W9    IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DP1 }]; #IO_L24P_T3_34 Sch=jb_p[3]
-set_property -dict { PACKAGE_PIN Y9    IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DN1 }]; #IO_L24N_T3_34 Sch=jb_n[3]
-set_property -dict { PACKAGE_PIN Y8    IOSTANDARD LVCMOS33 } [get_ports { IO_USB_PULLUP1 }]; #IO_L23P_T3_34 Sch=jb_p[4]
-set_property -dict { PACKAGE_PIN Y7    IOSTANDARD LVCMOS33 } [get_ports { IO_USB_SENSE1 }]; #IO_L23N_T3_34 Sch=jb_n[4]
+#set_property -dict { PACKAGE_PIN W9    IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DP1 }]; #IO_L24P_T3_34 Sch=jb_p[3]
+#set_property -dict { PACKAGE_PIN Y9    IOSTANDARD LVCMOS33 DRIVE 8 SLEW FAST } [get_ports { IO_USB_DN1 }]; #IO_L24N_T3_34 Sch=jb_n[3]
+#set_property -dict { PACKAGE_PIN Y8    IOSTANDARD LVCMOS33 } [get_ports { IO_USB_PULLUP1 }]; #IO_L23P_T3_34 Sch=jb_p[4]
+#set_property -dict { PACKAGE_PIN Y7    IOSTANDARD LVCMOS33 } [get_ports { IO_USB_SENSE1 }]; #IO_L23N_T3_34 Sch=jb_n[4]
 
 
 ## Pmod header JC
@@ -132,7 +137,7 @@
 #set_property -dict { PACKAGE_PIN AA6   IOSTANDARD LVCMOS33 } [get_ports { IO_SDCSB  }]; #IO_L18N_T2_34 Sch=jc_n[1]
 #set_property -dict { PACKAGE_PIN AA8   IOSTANDARD LVCMOS33 } [get_ports { IO_SDMOSI }]; #IO_L22P_T3_34 Sch=jc_p[2]
 #set_property -dict { PACKAGE_PIN AB8   IOSTANDARD LVCMOS33 } [get_ports { IO_SDMISO }]; #IO_L22N_T3_34 Sch=jc_n[2]
-set_property -dict { PACKAGE_PIN Y6    IOSTANDARD LVCMOS33 } [get_ports { IO_OBS }]; #IO_L18P_T2_34 Sch=jc_p[1]
+#set_property -dict { PACKAGE_PIN Y6    IOSTANDARD LVCMOS33 } [get_ports { IO_OBS }]; #IO_L18P_T2_34 Sch=jc_p[1]
 #set_property -dict { PACKAGE_PIN AA6   IOSTANDARD LVCMOS33 } [get_ports { jc[1] }]; #IO_L18N_T2_34 Sch=jc_n[1]
 #set_property -dict { PACKAGE_PIN AA8   IOSTANDARD LVCMOS33 } [get_ports { jc[2] }]; #IO_L22P_T3_34 Sch=jc_p[2]
 #set_property -dict { PACKAGE_PIN AB8   IOSTANDARD LVCMOS33 } [get_ports { jc[3] }]; #IO_L22N_T3_34 Sch=jc_n[2]
diff --git a/hw/top_earlgrey/data/top_earlgrey.hjson b/hw/top_earlgrey/data/top_earlgrey.hjson
index aa0c919..a93fc75 100644
--- a/hw/top_earlgrey/data/top_earlgrey.hjson
+++ b/hw/top_earlgrey/data/top_earlgrey.hjson
@@ -11,6 +11,7 @@
   clocks: [
     { name: "main", freq: "100000000" }
     { name: "fixed", freq: "100000000" }
+    { name: "usb", freq: "48000000" }
   ]
 
   // Reset attributes
@@ -23,6 +24,7 @@
     { name: "sys", type: "root", clk: "main"}
     { name: "sys_fixed", type: "leaf", root: "sys", clk: "fixed"}
     { name: "spi_device", type: "leaf", root: "sys", clk: "fixed"}
+    { name: "usb", type: "leaf", root: "sys", clk: "usb"}
   ]
 
   // Number of cores: used in rv_plic and timer
@@ -120,6 +122,12 @@
       reset_connections: {rst_ni: "sys"},
       base_addr: "0x40140000",
     }
+    { name: "usbdev",
+      type: "usbdev",
+      clock_connections: {clk_i: "fixed", clk_usb_48mhz_i: "usb"},
+      reset_connections: {rst_ni: "sys_fixed", rst_usb_48mhz_ni: "usb"},
+      base_addr: "0x40150000",
+    },
   ]
 
   // Memories (ROM, RAM, eFlash) are defined at the top.
@@ -170,7 +178,7 @@
   // and include every modules.
   // first item goes to LSB of the interrupt source
   interrupt_module: ["gpio", "uart", "spi_device", "flash_ctrl",
-                     "hmac", "alert_handler", "nmi_gen" ]
+                     "hmac", "alert_handler", "nmi_gen", "usbdev" ]
 
   // RV_PLIC has two searching algorithm internally to pick the most highest priority interrupt
   // source. "sequential" is smaller but slower, "matrix" is larger but faster.
@@ -205,6 +213,7 @@
       //{ name: "uart.tx", pad: ["ChA[0]"]},
       { name: "uart", pad: ["ChA[0..1]"]},
       // { name: "dio_module.signal_input", pad: ["ChA[31]"] }
+      { name: "usbdev", pad: ["ChC[0..3]"]},
     ],
 
     // Multiplexing IO modules. The in/out ports of the modules below are
@@ -240,6 +249,7 @@
     pads: [
       { name: "ChA" type: "IO_33V", count: 32 }, // Accessing as ChA[0] .. ChA[31]
       { name: "ChB" type: "IO_33V", count: 4, attr: ["KEEP", "WEAK"]},
+      { name: "ChC" type: "IO_33V", count: 4, attr: ["KEEP", "STRONG"]},
     ]
   }
 
diff --git a/hw/top_earlgrey/data/top_earlgrey.sv.tpl b/hw/top_earlgrey/data/top_earlgrey.sv.tpl
index f41c7a1..21e38c4 100644
--- a/hw/top_earlgrey/data/top_earlgrey.sv.tpl
+++ b/hw/top_earlgrey/data/top_earlgrey.sv.tpl
@@ -26,6 +26,9 @@
   input               clk_i,
   input               rst_ni,
 
+  // USB clock
+  input               clk_usb_48mhz_i,
+
   // JTAG interface
   input               jtag_tck_i,
   input               jtag_tms_i,
@@ -195,11 +198,16 @@
   end
 % endif
 
-  // clock assignments
+  // Clock assignments
 % for clock in top['clocks']:
+  % if clock['name'] != "usb" :
   assign ${clock['name']}_clk = clk_i;
+  % endif
 % endfor
 
+  // Separate clock input for USB clock
+  assign usb_clk = clk_usb_48mhz_i;
+
   // Non-debug module reset == reset for everything except for the debug module
   logic ndmreset_req;
 
@@ -209,13 +217,20 @@
   assign lc_rst_n = rst_ni;
   assign sys_rst_n = (scanmode_i) ? lc_rst_n : ~ndmreset_req & lc_rst_n;
 
-  //non-root reset assignments
+  // Non-root reset assignments
 % for reset in top['resets']:
-  % if reset['type'] in ['leaf']:
+  % if reset['type'] in ['leaf'] and reset['name'] != "usb" :
   assign ${reset['name']}_rst_n = ${reset['root']}_rst_n;
   % endif
 % endfor
 
+  // Reset synchronizer for USB
+  logic [1:0] usb_rst_q;
+  always_ff @(posedge usb_clk) begin
+    usb_rst_q <= {usb_rst_q[0], sys_rst_n};
+  end
+  assign usb_rst_n = sys_rst_n & usb_rst_q[1];
+
   // debug request from rv_dm to core
   logic debug_req;
 
@@ -522,21 +537,42 @@
       .tl_h_o (tl_${m["name"]}_h_h2d),
       .tl_h_i (tl_${m["name"]}_h_d2h),
     % endif
-    % for p_in in m["available_input_list"] + m["available_inout_list"]:
-      % if loop.first:
+    % if m["type"] == "usbdev":
+
+      // Differential data - Currently not used.
+      .cio_d_i          (1'b0),
+      .cio_d_o          (),
+      .cio_se0_o        (),
+
+      // Single-ended data
+      .cio_dp_i         (cio_usbdev_dp_p2d),
+      .cio_dn_i         (cio_usbdev_dn_p2d),
+      .cio_dp_o         (cio_usbdev_dp_d2p),
+      .cio_dn_o         (cio_usbdev_dn_d2p),
+
+      // Non-data I/O
+      .cio_sense_i      (cio_usbdev_sense_p2d),
+      .cio_oe_o         (cio_usbdev_dp_en_d2p),
+      .cio_tx_mode_se_o (),
+      .cio_pullup_en_o  (cio_usbdev_pullup_en_d2p),
+      .cio_suspend_o    (),
+    % else:
+      % for p_in in m["available_input_list"] + m["available_inout_list"]:
+        % if loop.first:
 
       // Input
-      % endif
+        % endif
       .${lib.ljust("cio_"+p_in["name"]+"_i",max_sigwidth+9)} (cio_${m["name"]}_${p_in["name"]}_p2d),
-    % endfor
-    % for p_out in m["available_output_list"] + m["available_inout_list"]:
-      % if loop.first:
+      % endfor
+      % for p_out in m["available_output_list"] + m["available_inout_list"]:
+        % if loop.first:
 
       // Output
-      % endif
+        % endif
       .${lib.ljust("cio_"+p_out["name"]+"_o",   max_sigwidth+9)} (cio_${m["name"]}_${p_out["name"]}_d2p),
       .${lib.ljust("cio_"+p_out["name"]+"_en_o",max_sigwidth+9)} (cio_${m["name"]}_${p_out["name"]}_en_d2p),
-    % endfor
+      % endfor
+    % endif
     % for intr in m["interrupt_list"] if "interrupt_list" in m else []:
       % if loop.first:
 
@@ -608,6 +644,10 @@
   );
 
 % endfor
+  // USB assignments
+  assign cio_usbdev_dn_en_d2p = cio_usbdev_dp_en_d2p; // have a single output enable only
+  assign cio_usbdev_pullup_d2p = 1'b1;
+
   // interrupt assignments
   assign intr_vector = {
   % for intr in top["interrupt"][::-1]:
diff --git a/hw/top_earlgrey/data/xbar_peri.hjson b/hw/top_earlgrey/data/xbar_peri.hjson
index 0786baa..fe300a2 100644
--- a/hw/top_earlgrey/data/xbar_peri.hjson
+++ b/hw/top_earlgrey/data/xbar_peri.hjson
@@ -35,9 +35,15 @@
       clock:     "clk_peri_i",
       reset:     "rst_peri_ni",
       pipeline: "false"
+    },
+    { name:      "usbdev",
+      type:      "device",
+      clock:     "clk_peri_i",
+      reset:     "rst_peri_ni",
+      pipeline: "false"
     }
   ],
   connections: {
-    main:  ["uart", "gpio", "spi_device", "rv_timer"],
+    main:  ["uart", "gpio", "spi_device", "rv_timer", "usbdev"],
   },
 }
diff --git a/hw/top_earlgrey/dv/tb/tb.sv b/hw/top_earlgrey/dv/tb/tb.sv
index 5d6ddd3..19656ba 100644
--- a/hw/top_earlgrey/dv/tb/tb.sv
+++ b/hw/top_earlgrey/dv/tb/tb.sv
@@ -16,13 +16,14 @@
   `include "dv_macros.svh"
   `include "chip_hier_macros.svh"
 
-  wire clk, rst_n;
+  wire clk, clk_usb_48mhz, rst_n;
   wire [NUM_GPIOS-1:0] gpio_pins;
   wire jtag_tck;
   wire jtag_tms;
   wire jtag_trst_n;
   wire jtag_tdi;
   wire jtag_tdo;
+  wire usb_dp0, usb_dn0, usb_sense0, usb_pullup0;
 
   bit stub_cpu;
 
@@ -33,6 +34,13 @@
   uart_if uart_if();
   jtag_if jtag_if();
 
+  // USB-related signals
+  assign clk_usb_48mhz = clk; // TODO: Generate the 48MHz clock
+  assign usb_dp0 = 1'bz; // TODO: Do something more reasonable, is I/O
+  assign usb_dn0 = 1'bz; // TODO: Do something more reasonable, is I/O
+  assign usb_sense0 = 1'bz; // TODO: Do something more reasonable, is I/O
+  // TODO: Do something reasonable with usb_pullup0
+
   // backdoors
   bind `ROM_HIER mem_bkdr_if rom_mem_bkdr_if();
   bind `FLASH0_MEM_HIER mem_bkdr_if flash0_mem_bkdr_if();
@@ -40,34 +48,40 @@
 
   top_earlgrey_asic dut (
     // Clock and Reset
-    .IO_CLK     (clk),
-    .IO_RST_N   (rst_n),
+    .IO_CLK           (clk),
+    .IO_RST_N         (rst_n),
+    .IO_CLK_USB_48MHZ (clk_usb_48mhz),
     // JTAG interface
-    .IO_JTCK    (jtag_tck),
-    .IO_JTMS    (jtag_tms),
-    .IO_JTRST_N (jtag_trst_n),
-    .IO_JTDI    (jtag_tdi),
-    .IO_JTDO    (jtag_tdo),
+    .IO_JTCK          (jtag_tck),
+    .IO_JTMS          (jtag_tms),
+    .IO_JTRST_N       (jtag_trst_n),
+    .IO_JTDI          (jtag_tdi),
+    .IO_JTDO          (jtag_tdo),
     // UART interface
-    .IO_URX     (uart_if.uart_rx),
-    .IO_UTX     (uart_if.uart_tx),
+    .IO_URX           (uart_if.uart_rx),
+    .IO_UTX           (uart_if.uart_tx),
+    // USB interface
+    .IO_USB_DP0       (usb_dp0),
+    .IO_USB_DN0       (usb_dn0),
+    .IO_USB_SENSE0    (usb_sense0),
+    .IO_USB_PULLUP0   (usb_pullup0),
     // GPIO x 16 interface
-    .IO_GP0     (gpio_pins[0 ]),
-    .IO_GP1     (gpio_pins[1 ]),
-    .IO_GP2     (gpio_pins[2 ]),
-    .IO_GP3     (gpio_pins[3 ]),
-    .IO_GP4     (gpio_pins[4 ]),
-    .IO_GP5     (gpio_pins[5 ]),
-    .IO_GP6     (gpio_pins[6 ]),
-    .IO_GP7     (gpio_pins[7 ]),
-    .IO_GP8     (gpio_pins[8 ]),
-    .IO_GP9     (gpio_pins[9 ]),
-    .IO_GP10    (gpio_pins[10]),
-    .IO_GP11    (gpio_pins[11]),
-    .IO_GP12    (gpio_pins[12]),
-    .IO_GP13    (gpio_pins[13]),
-    .IO_GP14    (gpio_pins[14]),
-    .IO_GP15    (gpio_pins[15])
+    .IO_GP0           (gpio_pins[0 ]),
+    .IO_GP1           (gpio_pins[1 ]),
+    .IO_GP2           (gpio_pins[2 ]),
+    .IO_GP3           (gpio_pins[3 ]),
+    .IO_GP4           (gpio_pins[4 ]),
+    .IO_GP5           (gpio_pins[5 ]),
+    .IO_GP6           (gpio_pins[6 ]),
+    .IO_GP7           (gpio_pins[7 ]),
+    .IO_GP8           (gpio_pins[8 ]),
+    .IO_GP9           (gpio_pins[9 ]),
+    .IO_GP10          (gpio_pins[10]),
+    .IO_GP11          (gpio_pins[11]),
+    .IO_GP12          (gpio_pins[12]),
+    .IO_GP13          (gpio_pins[13]),
+    .IO_GP14          (gpio_pins[14]),
+    .IO_GP15          (gpio_pins[15])
   );
 
   // connect sw_msg_monitor
diff --git a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
index 56ad460..c5c4f44 100644
--- a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
@@ -7,18 +7,18 @@
 package alert_handler_reg_pkg;
 
   // Param list
-  localparam int NAlerts = 1;
-  localparam int EscCntDw = 32;
-  localparam int AccuCntDw = 16;
-  localparam int LfsrSeed = 2147483647;
-  localparam logic [NAlerts-1:0] AsyncOn = 1'b0;
-  localparam int N_CLASSES = 4;
-  localparam int N_ESC_SEV = 4;
-  localparam int N_PHASES = 4;
-  localparam int N_LOC_ALERT = 4;
-  localparam int PING_CNT_DW = 24;
-  localparam int PHASE_DW = 2;
-  localparam int CLASS_DW = 2;
+  parameter int NAlerts = 1;
+  parameter int EscCntDw = 32;
+  parameter int AccuCntDw = 16;
+  parameter int LfsrSeed = 2147483647;
+  parameter logic [NAlerts-1:0] AsyncOn = 1'b0;
+  parameter int N_CLASSES = 4;
+  parameter int N_ESC_SEV = 4;
+  parameter int N_PHASES = 4;
+  parameter int N_LOC_ALERT = 4;
+  parameter int PING_CNT_DW = 24;
+  parameter int PHASE_DW = 2;
+  parameter int CLASS_DW = 2;
 
   ////////////////////////////
   // Typedefs for registers //
@@ -526,65 +526,65 @@
   } alert_handler_hw2reg_t;
 
   // Register Address
-  parameter ALERT_HANDLER_INTR_STATE_OFFSET = 8'h 0;
-  parameter ALERT_HANDLER_INTR_ENABLE_OFFSET = 8'h 4;
-  parameter ALERT_HANDLER_INTR_TEST_OFFSET = 8'h 8;
-  parameter ALERT_HANDLER_REGEN_OFFSET = 8'h c;
-  parameter ALERT_HANDLER_PING_TIMEOUT_CYC_OFFSET = 8'h 10;
-  parameter ALERT_HANDLER_ALERT_EN_OFFSET = 8'h 14;
-  parameter ALERT_HANDLER_ALERT_CLASS_OFFSET = 8'h 18;
-  parameter ALERT_HANDLER_ALERT_CAUSE_OFFSET = 8'h 1c;
-  parameter ALERT_HANDLER_LOC_ALERT_EN_OFFSET = 8'h 20;
-  parameter ALERT_HANDLER_LOC_ALERT_CLASS_OFFSET = 8'h 24;
-  parameter ALERT_HANDLER_LOC_ALERT_CAUSE_OFFSET = 8'h 28;
-  parameter ALERT_HANDLER_CLASSA_CTRL_OFFSET = 8'h 2c;
-  parameter ALERT_HANDLER_CLASSA_CLREN_OFFSET = 8'h 30;
-  parameter ALERT_HANDLER_CLASSA_CLR_OFFSET = 8'h 34;
-  parameter ALERT_HANDLER_CLASSA_ACCUM_CNT_OFFSET = 8'h 38;
-  parameter ALERT_HANDLER_CLASSA_ACCUM_THRESH_OFFSET = 8'h 3c;
-  parameter ALERT_HANDLER_CLASSA_TIMEOUT_CYC_OFFSET = 8'h 40;
-  parameter ALERT_HANDLER_CLASSA_PHASE0_CYC_OFFSET = 8'h 44;
-  parameter ALERT_HANDLER_CLASSA_PHASE1_CYC_OFFSET = 8'h 48;
-  parameter ALERT_HANDLER_CLASSA_PHASE2_CYC_OFFSET = 8'h 4c;
-  parameter ALERT_HANDLER_CLASSA_PHASE3_CYC_OFFSET = 8'h 50;
-  parameter ALERT_HANDLER_CLASSA_ESC_CNT_OFFSET = 8'h 54;
-  parameter ALERT_HANDLER_CLASSA_STATE_OFFSET = 8'h 58;
-  parameter ALERT_HANDLER_CLASSB_CTRL_OFFSET = 8'h 5c;
-  parameter ALERT_HANDLER_CLASSB_CLREN_OFFSET = 8'h 60;
-  parameter ALERT_HANDLER_CLASSB_CLR_OFFSET = 8'h 64;
-  parameter ALERT_HANDLER_CLASSB_ACCUM_CNT_OFFSET = 8'h 68;
-  parameter ALERT_HANDLER_CLASSB_ACCUM_THRESH_OFFSET = 8'h 6c;
-  parameter ALERT_HANDLER_CLASSB_TIMEOUT_CYC_OFFSET = 8'h 70;
-  parameter ALERT_HANDLER_CLASSB_PHASE0_CYC_OFFSET = 8'h 74;
-  parameter ALERT_HANDLER_CLASSB_PHASE1_CYC_OFFSET = 8'h 78;
-  parameter ALERT_HANDLER_CLASSB_PHASE2_CYC_OFFSET = 8'h 7c;
-  parameter ALERT_HANDLER_CLASSB_PHASE3_CYC_OFFSET = 8'h 80;
-  parameter ALERT_HANDLER_CLASSB_ESC_CNT_OFFSET = 8'h 84;
-  parameter ALERT_HANDLER_CLASSB_STATE_OFFSET = 8'h 88;
-  parameter ALERT_HANDLER_CLASSC_CTRL_OFFSET = 8'h 8c;
-  parameter ALERT_HANDLER_CLASSC_CLREN_OFFSET = 8'h 90;
-  parameter ALERT_HANDLER_CLASSC_CLR_OFFSET = 8'h 94;
-  parameter ALERT_HANDLER_CLASSC_ACCUM_CNT_OFFSET = 8'h 98;
-  parameter ALERT_HANDLER_CLASSC_ACCUM_THRESH_OFFSET = 8'h 9c;
-  parameter ALERT_HANDLER_CLASSC_TIMEOUT_CYC_OFFSET = 8'h a0;
-  parameter ALERT_HANDLER_CLASSC_PHASE0_CYC_OFFSET = 8'h a4;
-  parameter ALERT_HANDLER_CLASSC_PHASE1_CYC_OFFSET = 8'h a8;
-  parameter ALERT_HANDLER_CLASSC_PHASE2_CYC_OFFSET = 8'h ac;
-  parameter ALERT_HANDLER_CLASSC_PHASE3_CYC_OFFSET = 8'h b0;
-  parameter ALERT_HANDLER_CLASSC_ESC_CNT_OFFSET = 8'h b4;
-  parameter ALERT_HANDLER_CLASSC_STATE_OFFSET = 8'h b8;
-  parameter ALERT_HANDLER_CLASSD_CTRL_OFFSET = 8'h bc;
-  parameter ALERT_HANDLER_CLASSD_CLREN_OFFSET = 8'h c0;
-  parameter ALERT_HANDLER_CLASSD_CLR_OFFSET = 8'h c4;
-  parameter ALERT_HANDLER_CLASSD_ACCUM_CNT_OFFSET = 8'h c8;
-  parameter ALERT_HANDLER_CLASSD_ACCUM_THRESH_OFFSET = 8'h cc;
-  parameter ALERT_HANDLER_CLASSD_TIMEOUT_CYC_OFFSET = 8'h d0;
-  parameter ALERT_HANDLER_CLASSD_PHASE0_CYC_OFFSET = 8'h d4;
-  parameter ALERT_HANDLER_CLASSD_PHASE1_CYC_OFFSET = 8'h d8;
-  parameter ALERT_HANDLER_CLASSD_PHASE2_CYC_OFFSET = 8'h dc;
-  parameter ALERT_HANDLER_CLASSD_PHASE3_CYC_OFFSET = 8'h e0;
-  parameter ALERT_HANDLER_CLASSD_ESC_CNT_OFFSET = 8'h e4;
-  parameter ALERT_HANDLER_CLASSD_STATE_OFFSET = 8'h e8;
+  parameter logic [7:0] ALERT_HANDLER_INTR_STATE_OFFSET = 8'h 0;
+  parameter logic [7:0] ALERT_HANDLER_INTR_ENABLE_OFFSET = 8'h 4;
+  parameter logic [7:0] ALERT_HANDLER_INTR_TEST_OFFSET = 8'h 8;
+  parameter logic [7:0] ALERT_HANDLER_REGEN_OFFSET = 8'h c;
+  parameter logic [7:0] ALERT_HANDLER_PING_TIMEOUT_CYC_OFFSET = 8'h 10;
+  parameter logic [7:0] ALERT_HANDLER_ALERT_EN_OFFSET = 8'h 14;
+  parameter logic [7:0] ALERT_HANDLER_ALERT_CLASS_OFFSET = 8'h 18;
+  parameter logic [7:0] ALERT_HANDLER_ALERT_CAUSE_OFFSET = 8'h 1c;
+  parameter logic [7:0] ALERT_HANDLER_LOC_ALERT_EN_OFFSET = 8'h 20;
+  parameter logic [7:0] ALERT_HANDLER_LOC_ALERT_CLASS_OFFSET = 8'h 24;
+  parameter logic [7:0] ALERT_HANDLER_LOC_ALERT_CAUSE_OFFSET = 8'h 28;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_CTRL_OFFSET = 8'h 2c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_CLREN_OFFSET = 8'h 30;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_CLR_OFFSET = 8'h 34;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_ACCUM_CNT_OFFSET = 8'h 38;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_ACCUM_THRESH_OFFSET = 8'h 3c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_TIMEOUT_CYC_OFFSET = 8'h 40;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_PHASE0_CYC_OFFSET = 8'h 44;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_PHASE1_CYC_OFFSET = 8'h 48;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_PHASE2_CYC_OFFSET = 8'h 4c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_PHASE3_CYC_OFFSET = 8'h 50;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_ESC_CNT_OFFSET = 8'h 54;
+  parameter logic [7:0] ALERT_HANDLER_CLASSA_STATE_OFFSET = 8'h 58;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_CTRL_OFFSET = 8'h 5c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_CLREN_OFFSET = 8'h 60;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_CLR_OFFSET = 8'h 64;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_ACCUM_CNT_OFFSET = 8'h 68;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_ACCUM_THRESH_OFFSET = 8'h 6c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_TIMEOUT_CYC_OFFSET = 8'h 70;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_PHASE0_CYC_OFFSET = 8'h 74;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_PHASE1_CYC_OFFSET = 8'h 78;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_PHASE2_CYC_OFFSET = 8'h 7c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_PHASE3_CYC_OFFSET = 8'h 80;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_ESC_CNT_OFFSET = 8'h 84;
+  parameter logic [7:0] ALERT_HANDLER_CLASSB_STATE_OFFSET = 8'h 88;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_CTRL_OFFSET = 8'h 8c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_CLREN_OFFSET = 8'h 90;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_CLR_OFFSET = 8'h 94;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_ACCUM_CNT_OFFSET = 8'h 98;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_ACCUM_THRESH_OFFSET = 8'h 9c;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_TIMEOUT_CYC_OFFSET = 8'h a0;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_PHASE0_CYC_OFFSET = 8'h a4;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_PHASE1_CYC_OFFSET = 8'h a8;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_PHASE2_CYC_OFFSET = 8'h ac;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_PHASE3_CYC_OFFSET = 8'h b0;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_ESC_CNT_OFFSET = 8'h b4;
+  parameter logic [7:0] ALERT_HANDLER_CLASSC_STATE_OFFSET = 8'h b8;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_CTRL_OFFSET = 8'h bc;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_CLREN_OFFSET = 8'h c0;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_CLR_OFFSET = 8'h c4;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_ACCUM_CNT_OFFSET = 8'h c8;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_ACCUM_THRESH_OFFSET = 8'h cc;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_TIMEOUT_CYC_OFFSET = 8'h d0;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_PHASE0_CYC_OFFSET = 8'h d4;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_PHASE1_CYC_OFFSET = 8'h d8;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_PHASE2_CYC_OFFSET = 8'h dc;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_PHASE3_CYC_OFFSET = 8'h e0;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_ESC_CNT_OFFSET = 8'h e4;
+  parameter logic [7:0] ALERT_HANDLER_CLASSD_STATE_OFFSET = 8'h e8;
 
 
   // Register Index
@@ -651,7 +651,7 @@
   } alert_handler_id_e;
 
   // Register width information to check illegal writes
-  localparam logic [3:0] ALERT_HANDLER_PERMIT [59] = '{
+  parameter logic [3:0] ALERT_HANDLER_PERMIT [59] = '{
     4'b 0001, // index[ 0] ALERT_HANDLER_INTR_STATE
     4'b 0001, // index[ 1] ALERT_HANDLER_INTR_ENABLE
     4'b 0001, // index[ 2] ALERT_HANDLER_INTR_TEST
diff --git a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
index b267bb6..0194ed8 100644
--- a/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
+++ b/hw/top_earlgrey/ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
@@ -21,9 +21,9 @@
 
   import alert_handler_reg_pkg::* ;
 
-  localparam AW = 8;
-  localparam DW = 32;
-  localparam DBW = DW/8;                    // Byte Width
+  localparam int AW = 8;
+  localparam int DW = 32;
+  localparam int DBW = DW/8;                    // Byte Width
 
   // register signals
   logic           reg_we;
diff --git a/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_pkg.sv b/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_pkg.sv
index a157c1a..e5199d3 100644
--- a/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_pkg.sv
@@ -7,9 +7,9 @@
 package pinmux_reg_pkg;
 
   // Param list
-  localparam int NPeriphIn = 32;
-  localparam int NPeriphOut = 32;
-  localparam int NMioPads = 32;
+  parameter int NPeriphIn = 32;
+  parameter int NPeriphOut = 32;
+  parameter int NMioPads = 32;
 
   ////////////////////////////
   // Typedefs for registers //
@@ -37,21 +37,21 @@
   ///////////////////////////////////////
 
   // Register Address
-  parameter PINMUX_REGEN_OFFSET = 6'h 0;
-  parameter PINMUX_PERIPH_INSEL0_OFFSET = 6'h 4;
-  parameter PINMUX_PERIPH_INSEL1_OFFSET = 6'h 8;
-  parameter PINMUX_PERIPH_INSEL2_OFFSET = 6'h c;
-  parameter PINMUX_PERIPH_INSEL3_OFFSET = 6'h 10;
-  parameter PINMUX_PERIPH_INSEL4_OFFSET = 6'h 14;
-  parameter PINMUX_PERIPH_INSEL5_OFFSET = 6'h 18;
-  parameter PINMUX_PERIPH_INSEL6_OFFSET = 6'h 1c;
-  parameter PINMUX_MIO_OUTSEL0_OFFSET = 6'h 20;
-  parameter PINMUX_MIO_OUTSEL1_OFFSET = 6'h 24;
-  parameter PINMUX_MIO_OUTSEL2_OFFSET = 6'h 28;
-  parameter PINMUX_MIO_OUTSEL3_OFFSET = 6'h 2c;
-  parameter PINMUX_MIO_OUTSEL4_OFFSET = 6'h 30;
-  parameter PINMUX_MIO_OUTSEL5_OFFSET = 6'h 34;
-  parameter PINMUX_MIO_OUTSEL6_OFFSET = 6'h 38;
+  parameter logic [5:0] PINMUX_REGEN_OFFSET = 6'h 0;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL0_OFFSET = 6'h 4;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL1_OFFSET = 6'h 8;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL2_OFFSET = 6'h c;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL3_OFFSET = 6'h 10;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL4_OFFSET = 6'h 14;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL5_OFFSET = 6'h 18;
+  parameter logic [5:0] PINMUX_PERIPH_INSEL6_OFFSET = 6'h 1c;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL0_OFFSET = 6'h 20;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL1_OFFSET = 6'h 24;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL2_OFFSET = 6'h 28;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL3_OFFSET = 6'h 2c;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL4_OFFSET = 6'h 30;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL5_OFFSET = 6'h 34;
+  parameter logic [5:0] PINMUX_MIO_OUTSEL6_OFFSET = 6'h 38;
 
 
   // Register Index
@@ -74,7 +74,7 @@
   } pinmux_id_e;
 
   // Register width information to check illegal writes
-  localparam logic [3:0] PINMUX_PERMIT [15] = '{
+  parameter logic [3:0] PINMUX_PERMIT [15] = '{
     4'b 0001, // index[ 0] PINMUX_REGEN
     4'b 1111, // index[ 1] PINMUX_PERIPH_INSEL0
     4'b 1111, // index[ 2] PINMUX_PERIPH_INSEL1
diff --git a/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv b/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv
index 984d096..58f3a5d 100644
--- a/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv
+++ b/hw/top_earlgrey/ip/pinmux/rtl/autogen/pinmux_reg_top.sv
@@ -20,9 +20,9 @@
 
   import pinmux_reg_pkg::* ;
 
-  localparam AW = 6;
-  localparam DW = 32;
-  localparam DBW = DW/8;                    // Byte Width
+  localparam int AW = 6;
+  localparam int DW = 32;
+  localparam int DBW = DW/8;                    // Byte Width
 
   // register signals
   logic           reg_we;
diff --git a/hw/top_earlgrey/ip/rv_plic/data/autogen/rv_plic.hjson b/hw/top_earlgrey/ip/rv_plic/data/autogen/rv_plic.hjson
index 2106f27..111e014 100644
--- a/hw/top_earlgrey/ip/rv_plic/data/autogen/rv_plic.hjson
+++ b/hw/top_earlgrey/ip/rv_plic/data/autogen/rv_plic.hjson
@@ -25,7 +25,7 @@
     { name: "NumSrc",
       desc: "Number of interrupt sources",
       type: "int",
-      default: "63",
+      default: "79",
       local: "true"
     },
     { name: "NumTarget",
@@ -565,6 +565,134 @@
         { bits: "1:0" }
       ],
     }
+    { name: "PRIO63",
+      desc: "Interrupt Source 63 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO64",
+      desc: "Interrupt Source 64 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO65",
+      desc: "Interrupt Source 65 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO66",
+      desc: "Interrupt Source 66 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO67",
+      desc: "Interrupt Source 67 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO68",
+      desc: "Interrupt Source 68 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO69",
+      desc: "Interrupt Source 69 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO70",
+      desc: "Interrupt Source 70 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO71",
+      desc: "Interrupt Source 71 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO72",
+      desc: "Interrupt Source 72 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO73",
+      desc: "Interrupt Source 73 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO74",
+      desc: "Interrupt Source 74 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO75",
+      desc: "Interrupt Source 75 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO76",
+      desc: "Interrupt Source 76 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO77",
+      desc: "Interrupt Source 77 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
+    { name: "PRIO78",
+      desc: "Interrupt Source 78 Priority",
+      swaccess: "rw",
+      hwaccess: "hro",
+      fields: [
+        { bits: "1:0" }
+      ],
+    }
     { skipto: "512" }
     { multireg: {
         name: "IE0",
@@ -595,7 +723,7 @@
       hwqe: "true",
       hwre: "true",
       fields: [
-        { bits: "5:0" }
+        { bits: "6:0" }
       ],
     }
     { name: "MSIP0",
diff --git a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic.sv b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic.sv
index 28acb95..22acd2b 100644
--- a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic.sv
+++ b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic.sv
@@ -159,11 +159,27 @@
   assign prio[60] = reg2hw.prio60.q;
   assign prio[61] = reg2hw.prio61.q;
   assign prio[62] = reg2hw.prio62.q;
+  assign prio[63] = reg2hw.prio63.q;
+  assign prio[64] = reg2hw.prio64.q;
+  assign prio[65] = reg2hw.prio65.q;
+  assign prio[66] = reg2hw.prio66.q;
+  assign prio[67] = reg2hw.prio67.q;
+  assign prio[68] = reg2hw.prio68.q;
+  assign prio[69] = reg2hw.prio69.q;
+  assign prio[70] = reg2hw.prio70.q;
+  assign prio[71] = reg2hw.prio71.q;
+  assign prio[72] = reg2hw.prio72.q;
+  assign prio[73] = reg2hw.prio73.q;
+  assign prio[74] = reg2hw.prio74.q;
+  assign prio[75] = reg2hw.prio75.q;
+  assign prio[76] = reg2hw.prio76.q;
+  assign prio[77] = reg2hw.prio77.q;
+  assign prio[78] = reg2hw.prio78.q;
 
   //////////////////////
   // Interrupt Enable //
   //////////////////////
-  for (genvar s = 0; s < 63; s++) begin : gen_ie0
+  for (genvar s = 0; s < 79; s++) begin : gen_ie0
     assign ie[0][s] = reg2hw.ie0[s].q;
   end
 
@@ -189,7 +205,7 @@
   ////////
   // IP //
   ////////
-  for (genvar s = 0; s < 63; s++) begin : gen_ip
+  for (genvar s = 0; s < 79; s++) begin : gen_ip
     assign hw2reg.ip[s].de = 1'b1; // Always write
     assign hw2reg.ip[s].d  = ip[s];
   end
@@ -197,7 +213,7 @@
   ///////////////////////////////////
   // Detection:: 0: Level, 1: Edge //
   ///////////////////////////////////
-  for (genvar s = 0; s < 63; s++) begin : gen_le
+  for (genvar s = 0; s < 79; s++) begin : gen_le
     assign le[s] = reg2hw.le[s].q;
   end
 
diff --git a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_pkg.sv b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_pkg.sv
index dabca79..265daf1 100644
--- a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_pkg.sv
+++ b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_pkg.sv
@@ -7,8 +7,8 @@
 package rv_plic_reg_pkg;
 
   // Param list
-  localparam int NumSrc = 63;
-  localparam int NumTarget = 1;
+  parameter int NumSrc = 79;
+  parameter int NumTarget = 1;
 
   ////////////////////////////
   // Typedefs for registers //
@@ -270,6 +270,70 @@
   } rv_plic_reg2hw_prio62_reg_t;
 
   typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio63_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio64_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio65_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio66_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio67_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio68_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio69_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio70_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio71_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio72_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio73_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio74_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio75_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio76_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio77_reg_t;
+
+  typedef struct packed {
+    logic [1:0]  q;
+  } rv_plic_reg2hw_prio78_reg_t;
+
+  typedef struct packed {
     logic        q;
   } rv_plic_reg2hw_ie0_mreg_t;
 
@@ -278,7 +342,7 @@
   } rv_plic_reg2hw_threshold0_reg_t;
 
   typedef struct packed {
-    logic [5:0]  q;
+    logic [6:0]  q;
     logic        qe;
     logic        re;
   } rv_plic_reg2hw_cc0_reg_t;
@@ -294,7 +358,7 @@
   } rv_plic_hw2reg_ip_mreg_t;
 
   typedef struct packed {
-    logic [5:0]  d;
+    logic [6:0]  d;
   } rv_plic_hw2reg_cc0_reg_t;
 
 
@@ -302,73 +366,89 @@
   // Register to internal design logic //
   ///////////////////////////////////////
   typedef struct packed {
-    rv_plic_reg2hw_le_mreg_t [62:0] le; // [262:200]
-    rv_plic_reg2hw_prio0_reg_t prio0; // [199:198]
-    rv_plic_reg2hw_prio1_reg_t prio1; // [197:196]
-    rv_plic_reg2hw_prio2_reg_t prio2; // [195:194]
-    rv_plic_reg2hw_prio3_reg_t prio3; // [193:192]
-    rv_plic_reg2hw_prio4_reg_t prio4; // [191:190]
-    rv_plic_reg2hw_prio5_reg_t prio5; // [189:188]
-    rv_plic_reg2hw_prio6_reg_t prio6; // [187:186]
-    rv_plic_reg2hw_prio7_reg_t prio7; // [185:184]
-    rv_plic_reg2hw_prio8_reg_t prio8; // [183:182]
-    rv_plic_reg2hw_prio9_reg_t prio9; // [181:180]
-    rv_plic_reg2hw_prio10_reg_t prio10; // [179:178]
-    rv_plic_reg2hw_prio11_reg_t prio11; // [177:176]
-    rv_plic_reg2hw_prio12_reg_t prio12; // [175:174]
-    rv_plic_reg2hw_prio13_reg_t prio13; // [173:172]
-    rv_plic_reg2hw_prio14_reg_t prio14; // [171:170]
-    rv_plic_reg2hw_prio15_reg_t prio15; // [169:168]
-    rv_plic_reg2hw_prio16_reg_t prio16; // [167:166]
-    rv_plic_reg2hw_prio17_reg_t prio17; // [165:164]
-    rv_plic_reg2hw_prio18_reg_t prio18; // [163:162]
-    rv_plic_reg2hw_prio19_reg_t prio19; // [161:160]
-    rv_plic_reg2hw_prio20_reg_t prio20; // [159:158]
-    rv_plic_reg2hw_prio21_reg_t prio21; // [157:156]
-    rv_plic_reg2hw_prio22_reg_t prio22; // [155:154]
-    rv_plic_reg2hw_prio23_reg_t prio23; // [153:152]
-    rv_plic_reg2hw_prio24_reg_t prio24; // [151:150]
-    rv_plic_reg2hw_prio25_reg_t prio25; // [149:148]
-    rv_plic_reg2hw_prio26_reg_t prio26; // [147:146]
-    rv_plic_reg2hw_prio27_reg_t prio27; // [145:144]
-    rv_plic_reg2hw_prio28_reg_t prio28; // [143:142]
-    rv_plic_reg2hw_prio29_reg_t prio29; // [141:140]
-    rv_plic_reg2hw_prio30_reg_t prio30; // [139:138]
-    rv_plic_reg2hw_prio31_reg_t prio31; // [137:136]
-    rv_plic_reg2hw_prio32_reg_t prio32; // [135:134]
-    rv_plic_reg2hw_prio33_reg_t prio33; // [133:132]
-    rv_plic_reg2hw_prio34_reg_t prio34; // [131:130]
-    rv_plic_reg2hw_prio35_reg_t prio35; // [129:128]
-    rv_plic_reg2hw_prio36_reg_t prio36; // [127:126]
-    rv_plic_reg2hw_prio37_reg_t prio37; // [125:124]
-    rv_plic_reg2hw_prio38_reg_t prio38; // [123:122]
-    rv_plic_reg2hw_prio39_reg_t prio39; // [121:120]
-    rv_plic_reg2hw_prio40_reg_t prio40; // [119:118]
-    rv_plic_reg2hw_prio41_reg_t prio41; // [117:116]
-    rv_plic_reg2hw_prio42_reg_t prio42; // [115:114]
-    rv_plic_reg2hw_prio43_reg_t prio43; // [113:112]
-    rv_plic_reg2hw_prio44_reg_t prio44; // [111:110]
-    rv_plic_reg2hw_prio45_reg_t prio45; // [109:108]
-    rv_plic_reg2hw_prio46_reg_t prio46; // [107:106]
-    rv_plic_reg2hw_prio47_reg_t prio47; // [105:104]
-    rv_plic_reg2hw_prio48_reg_t prio48; // [103:102]
-    rv_plic_reg2hw_prio49_reg_t prio49; // [101:100]
-    rv_plic_reg2hw_prio50_reg_t prio50; // [99:98]
-    rv_plic_reg2hw_prio51_reg_t prio51; // [97:96]
-    rv_plic_reg2hw_prio52_reg_t prio52; // [95:94]
-    rv_plic_reg2hw_prio53_reg_t prio53; // [93:92]
-    rv_plic_reg2hw_prio54_reg_t prio54; // [91:90]
-    rv_plic_reg2hw_prio55_reg_t prio55; // [89:88]
-    rv_plic_reg2hw_prio56_reg_t prio56; // [87:86]
-    rv_plic_reg2hw_prio57_reg_t prio57; // [85:84]
-    rv_plic_reg2hw_prio58_reg_t prio58; // [83:82]
-    rv_plic_reg2hw_prio59_reg_t prio59; // [81:80]
-    rv_plic_reg2hw_prio60_reg_t prio60; // [79:78]
-    rv_plic_reg2hw_prio61_reg_t prio61; // [77:76]
-    rv_plic_reg2hw_prio62_reg_t prio62; // [75:74]
-    rv_plic_reg2hw_ie0_mreg_t [62:0] ie0; // [73:11]
-    rv_plic_reg2hw_threshold0_reg_t threshold0; // [10:9]
-    rv_plic_reg2hw_cc0_reg_t cc0; // [8:1]
+    rv_plic_reg2hw_le_mreg_t [78:0] le; // [327:249]
+    rv_plic_reg2hw_prio0_reg_t prio0; // [248:247]
+    rv_plic_reg2hw_prio1_reg_t prio1; // [246:245]
+    rv_plic_reg2hw_prio2_reg_t prio2; // [244:243]
+    rv_plic_reg2hw_prio3_reg_t prio3; // [242:241]
+    rv_plic_reg2hw_prio4_reg_t prio4; // [240:239]
+    rv_plic_reg2hw_prio5_reg_t prio5; // [238:237]
+    rv_plic_reg2hw_prio6_reg_t prio6; // [236:235]
+    rv_plic_reg2hw_prio7_reg_t prio7; // [234:233]
+    rv_plic_reg2hw_prio8_reg_t prio8; // [232:231]
+    rv_plic_reg2hw_prio9_reg_t prio9; // [230:229]
+    rv_plic_reg2hw_prio10_reg_t prio10; // [228:227]
+    rv_plic_reg2hw_prio11_reg_t prio11; // [226:225]
+    rv_plic_reg2hw_prio12_reg_t prio12; // [224:223]
+    rv_plic_reg2hw_prio13_reg_t prio13; // [222:221]
+    rv_plic_reg2hw_prio14_reg_t prio14; // [220:219]
+    rv_plic_reg2hw_prio15_reg_t prio15; // [218:217]
+    rv_plic_reg2hw_prio16_reg_t prio16; // [216:215]
+    rv_plic_reg2hw_prio17_reg_t prio17; // [214:213]
+    rv_plic_reg2hw_prio18_reg_t prio18; // [212:211]
+    rv_plic_reg2hw_prio19_reg_t prio19; // [210:209]
+    rv_plic_reg2hw_prio20_reg_t prio20; // [208:207]
+    rv_plic_reg2hw_prio21_reg_t prio21; // [206:205]
+    rv_plic_reg2hw_prio22_reg_t prio22; // [204:203]
+    rv_plic_reg2hw_prio23_reg_t prio23; // [202:201]
+    rv_plic_reg2hw_prio24_reg_t prio24; // [200:199]
+    rv_plic_reg2hw_prio25_reg_t prio25; // [198:197]
+    rv_plic_reg2hw_prio26_reg_t prio26; // [196:195]
+    rv_plic_reg2hw_prio27_reg_t prio27; // [194:193]
+    rv_plic_reg2hw_prio28_reg_t prio28; // [192:191]
+    rv_plic_reg2hw_prio29_reg_t prio29; // [190:189]
+    rv_plic_reg2hw_prio30_reg_t prio30; // [188:187]
+    rv_plic_reg2hw_prio31_reg_t prio31; // [186:185]
+    rv_plic_reg2hw_prio32_reg_t prio32; // [184:183]
+    rv_plic_reg2hw_prio33_reg_t prio33; // [182:181]
+    rv_plic_reg2hw_prio34_reg_t prio34; // [180:179]
+    rv_plic_reg2hw_prio35_reg_t prio35; // [178:177]
+    rv_plic_reg2hw_prio36_reg_t prio36; // [176:175]
+    rv_plic_reg2hw_prio37_reg_t prio37; // [174:173]
+    rv_plic_reg2hw_prio38_reg_t prio38; // [172:171]
+    rv_plic_reg2hw_prio39_reg_t prio39; // [170:169]
+    rv_plic_reg2hw_prio40_reg_t prio40; // [168:167]
+    rv_plic_reg2hw_prio41_reg_t prio41; // [166:165]
+    rv_plic_reg2hw_prio42_reg_t prio42; // [164:163]
+    rv_plic_reg2hw_prio43_reg_t prio43; // [162:161]
+    rv_plic_reg2hw_prio44_reg_t prio44; // [160:159]
+    rv_plic_reg2hw_prio45_reg_t prio45; // [158:157]
+    rv_plic_reg2hw_prio46_reg_t prio46; // [156:155]
+    rv_plic_reg2hw_prio47_reg_t prio47; // [154:153]
+    rv_plic_reg2hw_prio48_reg_t prio48; // [152:151]
+    rv_plic_reg2hw_prio49_reg_t prio49; // [150:149]
+    rv_plic_reg2hw_prio50_reg_t prio50; // [148:147]
+    rv_plic_reg2hw_prio51_reg_t prio51; // [146:145]
+    rv_plic_reg2hw_prio52_reg_t prio52; // [144:143]
+    rv_plic_reg2hw_prio53_reg_t prio53; // [142:141]
+    rv_plic_reg2hw_prio54_reg_t prio54; // [140:139]
+    rv_plic_reg2hw_prio55_reg_t prio55; // [138:137]
+    rv_plic_reg2hw_prio56_reg_t prio56; // [136:135]
+    rv_plic_reg2hw_prio57_reg_t prio57; // [134:133]
+    rv_plic_reg2hw_prio58_reg_t prio58; // [132:131]
+    rv_plic_reg2hw_prio59_reg_t prio59; // [130:129]
+    rv_plic_reg2hw_prio60_reg_t prio60; // [128:127]
+    rv_plic_reg2hw_prio61_reg_t prio61; // [126:125]
+    rv_plic_reg2hw_prio62_reg_t prio62; // [124:123]
+    rv_plic_reg2hw_prio63_reg_t prio63; // [122:121]
+    rv_plic_reg2hw_prio64_reg_t prio64; // [120:119]
+    rv_plic_reg2hw_prio65_reg_t prio65; // [118:117]
+    rv_plic_reg2hw_prio66_reg_t prio66; // [116:115]
+    rv_plic_reg2hw_prio67_reg_t prio67; // [114:113]
+    rv_plic_reg2hw_prio68_reg_t prio68; // [112:111]
+    rv_plic_reg2hw_prio69_reg_t prio69; // [110:109]
+    rv_plic_reg2hw_prio70_reg_t prio70; // [108:107]
+    rv_plic_reg2hw_prio71_reg_t prio71; // [106:105]
+    rv_plic_reg2hw_prio72_reg_t prio72; // [104:103]
+    rv_plic_reg2hw_prio73_reg_t prio73; // [102:101]
+    rv_plic_reg2hw_prio74_reg_t prio74; // [100:99]
+    rv_plic_reg2hw_prio75_reg_t prio75; // [98:97]
+    rv_plic_reg2hw_prio76_reg_t prio76; // [96:95]
+    rv_plic_reg2hw_prio77_reg_t prio77; // [94:93]
+    rv_plic_reg2hw_prio78_reg_t prio78; // [92:91]
+    rv_plic_reg2hw_ie0_mreg_t [78:0] ie0; // [90:12]
+    rv_plic_reg2hw_threshold0_reg_t threshold0; // [11:10]
+    rv_plic_reg2hw_cc0_reg_t cc0; // [9:1]
     rv_plic_reg2hw_msip0_reg_t msip0; // [0:0]
   } rv_plic_reg2hw_t;
 
@@ -376,91 +456,112 @@
   // Internal design logic to register //
   ///////////////////////////////////////
   typedef struct packed {
-    rv_plic_hw2reg_ip_mreg_t [62:0] ip; // [131:6]
-    rv_plic_hw2reg_cc0_reg_t cc0; // [5:-2]
+    rv_plic_hw2reg_ip_mreg_t [78:0] ip; // [164:7]
+    rv_plic_hw2reg_cc0_reg_t cc0; // [6:-2]
   } rv_plic_hw2reg_t;
 
   // Register Address
-  parameter RV_PLIC_IP0_OFFSET = 10'h 0;
-  parameter RV_PLIC_IP1_OFFSET = 10'h 4;
-  parameter RV_PLIC_LE0_OFFSET = 10'h 8;
-  parameter RV_PLIC_LE1_OFFSET = 10'h c;
-  parameter RV_PLIC_PRIO0_OFFSET = 10'h 10;
-  parameter RV_PLIC_PRIO1_OFFSET = 10'h 14;
-  parameter RV_PLIC_PRIO2_OFFSET = 10'h 18;
-  parameter RV_PLIC_PRIO3_OFFSET = 10'h 1c;
-  parameter RV_PLIC_PRIO4_OFFSET = 10'h 20;
-  parameter RV_PLIC_PRIO5_OFFSET = 10'h 24;
-  parameter RV_PLIC_PRIO6_OFFSET = 10'h 28;
-  parameter RV_PLIC_PRIO7_OFFSET = 10'h 2c;
-  parameter RV_PLIC_PRIO8_OFFSET = 10'h 30;
-  parameter RV_PLIC_PRIO9_OFFSET = 10'h 34;
-  parameter RV_PLIC_PRIO10_OFFSET = 10'h 38;
-  parameter RV_PLIC_PRIO11_OFFSET = 10'h 3c;
-  parameter RV_PLIC_PRIO12_OFFSET = 10'h 40;
-  parameter RV_PLIC_PRIO13_OFFSET = 10'h 44;
-  parameter RV_PLIC_PRIO14_OFFSET = 10'h 48;
-  parameter RV_PLIC_PRIO15_OFFSET = 10'h 4c;
-  parameter RV_PLIC_PRIO16_OFFSET = 10'h 50;
-  parameter RV_PLIC_PRIO17_OFFSET = 10'h 54;
-  parameter RV_PLIC_PRIO18_OFFSET = 10'h 58;
-  parameter RV_PLIC_PRIO19_OFFSET = 10'h 5c;
-  parameter RV_PLIC_PRIO20_OFFSET = 10'h 60;
-  parameter RV_PLIC_PRIO21_OFFSET = 10'h 64;
-  parameter RV_PLIC_PRIO22_OFFSET = 10'h 68;
-  parameter RV_PLIC_PRIO23_OFFSET = 10'h 6c;
-  parameter RV_PLIC_PRIO24_OFFSET = 10'h 70;
-  parameter RV_PLIC_PRIO25_OFFSET = 10'h 74;
-  parameter RV_PLIC_PRIO26_OFFSET = 10'h 78;
-  parameter RV_PLIC_PRIO27_OFFSET = 10'h 7c;
-  parameter RV_PLIC_PRIO28_OFFSET = 10'h 80;
-  parameter RV_PLIC_PRIO29_OFFSET = 10'h 84;
-  parameter RV_PLIC_PRIO30_OFFSET = 10'h 88;
-  parameter RV_PLIC_PRIO31_OFFSET = 10'h 8c;
-  parameter RV_PLIC_PRIO32_OFFSET = 10'h 90;
-  parameter RV_PLIC_PRIO33_OFFSET = 10'h 94;
-  parameter RV_PLIC_PRIO34_OFFSET = 10'h 98;
-  parameter RV_PLIC_PRIO35_OFFSET = 10'h 9c;
-  parameter RV_PLIC_PRIO36_OFFSET = 10'h a0;
-  parameter RV_PLIC_PRIO37_OFFSET = 10'h a4;
-  parameter RV_PLIC_PRIO38_OFFSET = 10'h a8;
-  parameter RV_PLIC_PRIO39_OFFSET = 10'h ac;
-  parameter RV_PLIC_PRIO40_OFFSET = 10'h b0;
-  parameter RV_PLIC_PRIO41_OFFSET = 10'h b4;
-  parameter RV_PLIC_PRIO42_OFFSET = 10'h b8;
-  parameter RV_PLIC_PRIO43_OFFSET = 10'h bc;
-  parameter RV_PLIC_PRIO44_OFFSET = 10'h c0;
-  parameter RV_PLIC_PRIO45_OFFSET = 10'h c4;
-  parameter RV_PLIC_PRIO46_OFFSET = 10'h c8;
-  parameter RV_PLIC_PRIO47_OFFSET = 10'h cc;
-  parameter RV_PLIC_PRIO48_OFFSET = 10'h d0;
-  parameter RV_PLIC_PRIO49_OFFSET = 10'h d4;
-  parameter RV_PLIC_PRIO50_OFFSET = 10'h d8;
-  parameter RV_PLIC_PRIO51_OFFSET = 10'h dc;
-  parameter RV_PLIC_PRIO52_OFFSET = 10'h e0;
-  parameter RV_PLIC_PRIO53_OFFSET = 10'h e4;
-  parameter RV_PLIC_PRIO54_OFFSET = 10'h e8;
-  parameter RV_PLIC_PRIO55_OFFSET = 10'h ec;
-  parameter RV_PLIC_PRIO56_OFFSET = 10'h f0;
-  parameter RV_PLIC_PRIO57_OFFSET = 10'h f4;
-  parameter RV_PLIC_PRIO58_OFFSET = 10'h f8;
-  parameter RV_PLIC_PRIO59_OFFSET = 10'h fc;
-  parameter RV_PLIC_PRIO60_OFFSET = 10'h 100;
-  parameter RV_PLIC_PRIO61_OFFSET = 10'h 104;
-  parameter RV_PLIC_PRIO62_OFFSET = 10'h 108;
-  parameter RV_PLIC_IE00_OFFSET = 10'h 200;
-  parameter RV_PLIC_IE01_OFFSET = 10'h 204;
-  parameter RV_PLIC_THRESHOLD0_OFFSET = 10'h 208;
-  parameter RV_PLIC_CC0_OFFSET = 10'h 20c;
-  parameter RV_PLIC_MSIP0_OFFSET = 10'h 210;
+  parameter logic [9:0] RV_PLIC_IP0_OFFSET = 10'h 0;
+  parameter logic [9:0] RV_PLIC_IP1_OFFSET = 10'h 4;
+  parameter logic [9:0] RV_PLIC_IP2_OFFSET = 10'h 8;
+  parameter logic [9:0] RV_PLIC_LE0_OFFSET = 10'h c;
+  parameter logic [9:0] RV_PLIC_LE1_OFFSET = 10'h 10;
+  parameter logic [9:0] RV_PLIC_LE2_OFFSET = 10'h 14;
+  parameter logic [9:0] RV_PLIC_PRIO0_OFFSET = 10'h 18;
+  parameter logic [9:0] RV_PLIC_PRIO1_OFFSET = 10'h 1c;
+  parameter logic [9:0] RV_PLIC_PRIO2_OFFSET = 10'h 20;
+  parameter logic [9:0] RV_PLIC_PRIO3_OFFSET = 10'h 24;
+  parameter logic [9:0] RV_PLIC_PRIO4_OFFSET = 10'h 28;
+  parameter logic [9:0] RV_PLIC_PRIO5_OFFSET = 10'h 2c;
+  parameter logic [9:0] RV_PLIC_PRIO6_OFFSET = 10'h 30;
+  parameter logic [9:0] RV_PLIC_PRIO7_OFFSET = 10'h 34;
+  parameter logic [9:0] RV_PLIC_PRIO8_OFFSET = 10'h 38;
+  parameter logic [9:0] RV_PLIC_PRIO9_OFFSET = 10'h 3c;
+  parameter logic [9:0] RV_PLIC_PRIO10_OFFSET = 10'h 40;
+  parameter logic [9:0] RV_PLIC_PRIO11_OFFSET = 10'h 44;
+  parameter logic [9:0] RV_PLIC_PRIO12_OFFSET = 10'h 48;
+  parameter logic [9:0] RV_PLIC_PRIO13_OFFSET = 10'h 4c;
+  parameter logic [9:0] RV_PLIC_PRIO14_OFFSET = 10'h 50;
+  parameter logic [9:0] RV_PLIC_PRIO15_OFFSET = 10'h 54;
+  parameter logic [9:0] RV_PLIC_PRIO16_OFFSET = 10'h 58;
+  parameter logic [9:0] RV_PLIC_PRIO17_OFFSET = 10'h 5c;
+  parameter logic [9:0] RV_PLIC_PRIO18_OFFSET = 10'h 60;
+  parameter logic [9:0] RV_PLIC_PRIO19_OFFSET = 10'h 64;
+  parameter logic [9:0] RV_PLIC_PRIO20_OFFSET = 10'h 68;
+  parameter logic [9:0] RV_PLIC_PRIO21_OFFSET = 10'h 6c;
+  parameter logic [9:0] RV_PLIC_PRIO22_OFFSET = 10'h 70;
+  parameter logic [9:0] RV_PLIC_PRIO23_OFFSET = 10'h 74;
+  parameter logic [9:0] RV_PLIC_PRIO24_OFFSET = 10'h 78;
+  parameter logic [9:0] RV_PLIC_PRIO25_OFFSET = 10'h 7c;
+  parameter logic [9:0] RV_PLIC_PRIO26_OFFSET = 10'h 80;
+  parameter logic [9:0] RV_PLIC_PRIO27_OFFSET = 10'h 84;
+  parameter logic [9:0] RV_PLIC_PRIO28_OFFSET = 10'h 88;
+  parameter logic [9:0] RV_PLIC_PRIO29_OFFSET = 10'h 8c;
+  parameter logic [9:0] RV_PLIC_PRIO30_OFFSET = 10'h 90;
+  parameter logic [9:0] RV_PLIC_PRIO31_OFFSET = 10'h 94;
+  parameter logic [9:0] RV_PLIC_PRIO32_OFFSET = 10'h 98;
+  parameter logic [9:0] RV_PLIC_PRIO33_OFFSET = 10'h 9c;
+  parameter logic [9:0] RV_PLIC_PRIO34_OFFSET = 10'h a0;
+  parameter logic [9:0] RV_PLIC_PRIO35_OFFSET = 10'h a4;
+  parameter logic [9:0] RV_PLIC_PRIO36_OFFSET = 10'h a8;
+  parameter logic [9:0] RV_PLIC_PRIO37_OFFSET = 10'h ac;
+  parameter logic [9:0] RV_PLIC_PRIO38_OFFSET = 10'h b0;
+  parameter logic [9:0] RV_PLIC_PRIO39_OFFSET = 10'h b4;
+  parameter logic [9:0] RV_PLIC_PRIO40_OFFSET = 10'h b8;
+  parameter logic [9:0] RV_PLIC_PRIO41_OFFSET = 10'h bc;
+  parameter logic [9:0] RV_PLIC_PRIO42_OFFSET = 10'h c0;
+  parameter logic [9:0] RV_PLIC_PRIO43_OFFSET = 10'h c4;
+  parameter logic [9:0] RV_PLIC_PRIO44_OFFSET = 10'h c8;
+  parameter logic [9:0] RV_PLIC_PRIO45_OFFSET = 10'h cc;
+  parameter logic [9:0] RV_PLIC_PRIO46_OFFSET = 10'h d0;
+  parameter logic [9:0] RV_PLIC_PRIO47_OFFSET = 10'h d4;
+  parameter logic [9:0] RV_PLIC_PRIO48_OFFSET = 10'h d8;
+  parameter logic [9:0] RV_PLIC_PRIO49_OFFSET = 10'h dc;
+  parameter logic [9:0] RV_PLIC_PRIO50_OFFSET = 10'h e0;
+  parameter logic [9:0] RV_PLIC_PRIO51_OFFSET = 10'h e4;
+  parameter logic [9:0] RV_PLIC_PRIO52_OFFSET = 10'h e8;
+  parameter logic [9:0] RV_PLIC_PRIO53_OFFSET = 10'h ec;
+  parameter logic [9:0] RV_PLIC_PRIO54_OFFSET = 10'h f0;
+  parameter logic [9:0] RV_PLIC_PRIO55_OFFSET = 10'h f4;
+  parameter logic [9:0] RV_PLIC_PRIO56_OFFSET = 10'h f8;
+  parameter logic [9:0] RV_PLIC_PRIO57_OFFSET = 10'h fc;
+  parameter logic [9:0] RV_PLIC_PRIO58_OFFSET = 10'h 100;
+  parameter logic [9:0] RV_PLIC_PRIO59_OFFSET = 10'h 104;
+  parameter logic [9:0] RV_PLIC_PRIO60_OFFSET = 10'h 108;
+  parameter logic [9:0] RV_PLIC_PRIO61_OFFSET = 10'h 10c;
+  parameter logic [9:0] RV_PLIC_PRIO62_OFFSET = 10'h 110;
+  parameter logic [9:0] RV_PLIC_PRIO63_OFFSET = 10'h 114;
+  parameter logic [9:0] RV_PLIC_PRIO64_OFFSET = 10'h 118;
+  parameter logic [9:0] RV_PLIC_PRIO65_OFFSET = 10'h 11c;
+  parameter logic [9:0] RV_PLIC_PRIO66_OFFSET = 10'h 120;
+  parameter logic [9:0] RV_PLIC_PRIO67_OFFSET = 10'h 124;
+  parameter logic [9:0] RV_PLIC_PRIO68_OFFSET = 10'h 128;
+  parameter logic [9:0] RV_PLIC_PRIO69_OFFSET = 10'h 12c;
+  parameter logic [9:0] RV_PLIC_PRIO70_OFFSET = 10'h 130;
+  parameter logic [9:0] RV_PLIC_PRIO71_OFFSET = 10'h 134;
+  parameter logic [9:0] RV_PLIC_PRIO72_OFFSET = 10'h 138;
+  parameter logic [9:0] RV_PLIC_PRIO73_OFFSET = 10'h 13c;
+  parameter logic [9:0] RV_PLIC_PRIO74_OFFSET = 10'h 140;
+  parameter logic [9:0] RV_PLIC_PRIO75_OFFSET = 10'h 144;
+  parameter logic [9:0] RV_PLIC_PRIO76_OFFSET = 10'h 148;
+  parameter logic [9:0] RV_PLIC_PRIO77_OFFSET = 10'h 14c;
+  parameter logic [9:0] RV_PLIC_PRIO78_OFFSET = 10'h 150;
+  parameter logic [9:0] RV_PLIC_IE00_OFFSET = 10'h 200;
+  parameter logic [9:0] RV_PLIC_IE01_OFFSET = 10'h 204;
+  parameter logic [9:0] RV_PLIC_IE02_OFFSET = 10'h 208;
+  parameter logic [9:0] RV_PLIC_THRESHOLD0_OFFSET = 10'h 20c;
+  parameter logic [9:0] RV_PLIC_CC0_OFFSET = 10'h 210;
+  parameter logic [9:0] RV_PLIC_MSIP0_OFFSET = 10'h 214;
 
 
   // Register Index
   typedef enum int {
     RV_PLIC_IP0,
     RV_PLIC_IP1,
+    RV_PLIC_IP2,
     RV_PLIC_LE0,
     RV_PLIC_LE1,
+    RV_PLIC_LE2,
     RV_PLIC_PRIO0,
     RV_PLIC_PRIO1,
     RV_PLIC_PRIO2,
@@ -524,87 +625,123 @@
     RV_PLIC_PRIO60,
     RV_PLIC_PRIO61,
     RV_PLIC_PRIO62,
+    RV_PLIC_PRIO63,
+    RV_PLIC_PRIO64,
+    RV_PLIC_PRIO65,
+    RV_PLIC_PRIO66,
+    RV_PLIC_PRIO67,
+    RV_PLIC_PRIO68,
+    RV_PLIC_PRIO69,
+    RV_PLIC_PRIO70,
+    RV_PLIC_PRIO71,
+    RV_PLIC_PRIO72,
+    RV_PLIC_PRIO73,
+    RV_PLIC_PRIO74,
+    RV_PLIC_PRIO75,
+    RV_PLIC_PRIO76,
+    RV_PLIC_PRIO77,
+    RV_PLIC_PRIO78,
     RV_PLIC_IE00,
     RV_PLIC_IE01,
+    RV_PLIC_IE02,
     RV_PLIC_THRESHOLD0,
     RV_PLIC_CC0,
     RV_PLIC_MSIP0
   } rv_plic_id_e;
 
   // Register width information to check illegal writes
-  localparam logic [3:0] RV_PLIC_PERMIT [72] = '{
+  parameter logic [3:0] RV_PLIC_PERMIT [91] = '{
     4'b 1111, // index[ 0] RV_PLIC_IP0
     4'b 1111, // index[ 1] RV_PLIC_IP1
-    4'b 1111, // index[ 2] RV_PLIC_LE0
-    4'b 1111, // index[ 3] RV_PLIC_LE1
-    4'b 0001, // index[ 4] RV_PLIC_PRIO0
-    4'b 0001, // index[ 5] RV_PLIC_PRIO1
-    4'b 0001, // index[ 6] RV_PLIC_PRIO2
-    4'b 0001, // index[ 7] RV_PLIC_PRIO3
-    4'b 0001, // index[ 8] RV_PLIC_PRIO4
-    4'b 0001, // index[ 9] RV_PLIC_PRIO5
-    4'b 0001, // index[10] RV_PLIC_PRIO6
-    4'b 0001, // index[11] RV_PLIC_PRIO7
-    4'b 0001, // index[12] RV_PLIC_PRIO8
-    4'b 0001, // index[13] RV_PLIC_PRIO9
-    4'b 0001, // index[14] RV_PLIC_PRIO10
-    4'b 0001, // index[15] RV_PLIC_PRIO11
-    4'b 0001, // index[16] RV_PLIC_PRIO12
-    4'b 0001, // index[17] RV_PLIC_PRIO13
-    4'b 0001, // index[18] RV_PLIC_PRIO14
-    4'b 0001, // index[19] RV_PLIC_PRIO15
-    4'b 0001, // index[20] RV_PLIC_PRIO16
-    4'b 0001, // index[21] RV_PLIC_PRIO17
-    4'b 0001, // index[22] RV_PLIC_PRIO18
-    4'b 0001, // index[23] RV_PLIC_PRIO19
-    4'b 0001, // index[24] RV_PLIC_PRIO20
-    4'b 0001, // index[25] RV_PLIC_PRIO21
-    4'b 0001, // index[26] RV_PLIC_PRIO22
-    4'b 0001, // index[27] RV_PLIC_PRIO23
-    4'b 0001, // index[28] RV_PLIC_PRIO24
-    4'b 0001, // index[29] RV_PLIC_PRIO25
-    4'b 0001, // index[30] RV_PLIC_PRIO26
-    4'b 0001, // index[31] RV_PLIC_PRIO27
-    4'b 0001, // index[32] RV_PLIC_PRIO28
-    4'b 0001, // index[33] RV_PLIC_PRIO29
-    4'b 0001, // index[34] RV_PLIC_PRIO30
-    4'b 0001, // index[35] RV_PLIC_PRIO31
-    4'b 0001, // index[36] RV_PLIC_PRIO32
-    4'b 0001, // index[37] RV_PLIC_PRIO33
-    4'b 0001, // index[38] RV_PLIC_PRIO34
-    4'b 0001, // index[39] RV_PLIC_PRIO35
-    4'b 0001, // index[40] RV_PLIC_PRIO36
-    4'b 0001, // index[41] RV_PLIC_PRIO37
-    4'b 0001, // index[42] RV_PLIC_PRIO38
-    4'b 0001, // index[43] RV_PLIC_PRIO39
-    4'b 0001, // index[44] RV_PLIC_PRIO40
-    4'b 0001, // index[45] RV_PLIC_PRIO41
-    4'b 0001, // index[46] RV_PLIC_PRIO42
-    4'b 0001, // index[47] RV_PLIC_PRIO43
-    4'b 0001, // index[48] RV_PLIC_PRIO44
-    4'b 0001, // index[49] RV_PLIC_PRIO45
-    4'b 0001, // index[50] RV_PLIC_PRIO46
-    4'b 0001, // index[51] RV_PLIC_PRIO47
-    4'b 0001, // index[52] RV_PLIC_PRIO48
-    4'b 0001, // index[53] RV_PLIC_PRIO49
-    4'b 0001, // index[54] RV_PLIC_PRIO50
-    4'b 0001, // index[55] RV_PLIC_PRIO51
-    4'b 0001, // index[56] RV_PLIC_PRIO52
-    4'b 0001, // index[57] RV_PLIC_PRIO53
-    4'b 0001, // index[58] RV_PLIC_PRIO54
-    4'b 0001, // index[59] RV_PLIC_PRIO55
-    4'b 0001, // index[60] RV_PLIC_PRIO56
-    4'b 0001, // index[61] RV_PLIC_PRIO57
-    4'b 0001, // index[62] RV_PLIC_PRIO58
-    4'b 0001, // index[63] RV_PLIC_PRIO59
-    4'b 0001, // index[64] RV_PLIC_PRIO60
-    4'b 0001, // index[65] RV_PLIC_PRIO61
-    4'b 0001, // index[66] RV_PLIC_PRIO62
-    4'b 1111, // index[67] RV_PLIC_IE00
-    4'b 1111, // index[68] RV_PLIC_IE01
-    4'b 0001, // index[69] RV_PLIC_THRESHOLD0
-    4'b 0001, // index[70] RV_PLIC_CC0
-    4'b 0001  // index[71] RV_PLIC_MSIP0
+    4'b 0011, // index[ 2] RV_PLIC_IP2
+    4'b 1111, // index[ 3] RV_PLIC_LE0
+    4'b 1111, // index[ 4] RV_PLIC_LE1
+    4'b 0011, // index[ 5] RV_PLIC_LE2
+    4'b 0001, // index[ 6] RV_PLIC_PRIO0
+    4'b 0001, // index[ 7] RV_PLIC_PRIO1
+    4'b 0001, // index[ 8] RV_PLIC_PRIO2
+    4'b 0001, // index[ 9] RV_PLIC_PRIO3
+    4'b 0001, // index[10] RV_PLIC_PRIO4
+    4'b 0001, // index[11] RV_PLIC_PRIO5
+    4'b 0001, // index[12] RV_PLIC_PRIO6
+    4'b 0001, // index[13] RV_PLIC_PRIO7
+    4'b 0001, // index[14] RV_PLIC_PRIO8
+    4'b 0001, // index[15] RV_PLIC_PRIO9
+    4'b 0001, // index[16] RV_PLIC_PRIO10
+    4'b 0001, // index[17] RV_PLIC_PRIO11
+    4'b 0001, // index[18] RV_PLIC_PRIO12
+    4'b 0001, // index[19] RV_PLIC_PRIO13
+    4'b 0001, // index[20] RV_PLIC_PRIO14
+    4'b 0001, // index[21] RV_PLIC_PRIO15
+    4'b 0001, // index[22] RV_PLIC_PRIO16
+    4'b 0001, // index[23] RV_PLIC_PRIO17
+    4'b 0001, // index[24] RV_PLIC_PRIO18
+    4'b 0001, // index[25] RV_PLIC_PRIO19
+    4'b 0001, // index[26] RV_PLIC_PRIO20
+    4'b 0001, // index[27] RV_PLIC_PRIO21
+    4'b 0001, // index[28] RV_PLIC_PRIO22
+    4'b 0001, // index[29] RV_PLIC_PRIO23
+    4'b 0001, // index[30] RV_PLIC_PRIO24
+    4'b 0001, // index[31] RV_PLIC_PRIO25
+    4'b 0001, // index[32] RV_PLIC_PRIO26
+    4'b 0001, // index[33] RV_PLIC_PRIO27
+    4'b 0001, // index[34] RV_PLIC_PRIO28
+    4'b 0001, // index[35] RV_PLIC_PRIO29
+    4'b 0001, // index[36] RV_PLIC_PRIO30
+    4'b 0001, // index[37] RV_PLIC_PRIO31
+    4'b 0001, // index[38] RV_PLIC_PRIO32
+    4'b 0001, // index[39] RV_PLIC_PRIO33
+    4'b 0001, // index[40] RV_PLIC_PRIO34
+    4'b 0001, // index[41] RV_PLIC_PRIO35
+    4'b 0001, // index[42] RV_PLIC_PRIO36
+    4'b 0001, // index[43] RV_PLIC_PRIO37
+    4'b 0001, // index[44] RV_PLIC_PRIO38
+    4'b 0001, // index[45] RV_PLIC_PRIO39
+    4'b 0001, // index[46] RV_PLIC_PRIO40
+    4'b 0001, // index[47] RV_PLIC_PRIO41
+    4'b 0001, // index[48] RV_PLIC_PRIO42
+    4'b 0001, // index[49] RV_PLIC_PRIO43
+    4'b 0001, // index[50] RV_PLIC_PRIO44
+    4'b 0001, // index[51] RV_PLIC_PRIO45
+    4'b 0001, // index[52] RV_PLIC_PRIO46
+    4'b 0001, // index[53] RV_PLIC_PRIO47
+    4'b 0001, // index[54] RV_PLIC_PRIO48
+    4'b 0001, // index[55] RV_PLIC_PRIO49
+    4'b 0001, // index[56] RV_PLIC_PRIO50
+    4'b 0001, // index[57] RV_PLIC_PRIO51
+    4'b 0001, // index[58] RV_PLIC_PRIO52
+    4'b 0001, // index[59] RV_PLIC_PRIO53
+    4'b 0001, // index[60] RV_PLIC_PRIO54
+    4'b 0001, // index[61] RV_PLIC_PRIO55
+    4'b 0001, // index[62] RV_PLIC_PRIO56
+    4'b 0001, // index[63] RV_PLIC_PRIO57
+    4'b 0001, // index[64] RV_PLIC_PRIO58
+    4'b 0001, // index[65] RV_PLIC_PRIO59
+    4'b 0001, // index[66] RV_PLIC_PRIO60
+    4'b 0001, // index[67] RV_PLIC_PRIO61
+    4'b 0001, // index[68] RV_PLIC_PRIO62
+    4'b 0001, // index[69] RV_PLIC_PRIO63
+    4'b 0001, // index[70] RV_PLIC_PRIO64
+    4'b 0001, // index[71] RV_PLIC_PRIO65
+    4'b 0001, // index[72] RV_PLIC_PRIO66
+    4'b 0001, // index[73] RV_PLIC_PRIO67
+    4'b 0001, // index[74] RV_PLIC_PRIO68
+    4'b 0001, // index[75] RV_PLIC_PRIO69
+    4'b 0001, // index[76] RV_PLIC_PRIO70
+    4'b 0001, // index[77] RV_PLIC_PRIO71
+    4'b 0001, // index[78] RV_PLIC_PRIO72
+    4'b 0001, // index[79] RV_PLIC_PRIO73
+    4'b 0001, // index[80] RV_PLIC_PRIO74
+    4'b 0001, // index[81] RV_PLIC_PRIO75
+    4'b 0001, // index[82] RV_PLIC_PRIO76
+    4'b 0001, // index[83] RV_PLIC_PRIO77
+    4'b 0001, // index[84] RV_PLIC_PRIO78
+    4'b 1111, // index[85] RV_PLIC_IE00
+    4'b 1111, // index[86] RV_PLIC_IE01
+    4'b 0011, // index[87] RV_PLIC_IE02
+    4'b 0001, // index[88] RV_PLIC_THRESHOLD0
+    4'b 0001, // index[89] RV_PLIC_CC0
+    4'b 0001  // index[90] RV_PLIC_MSIP0
   };
 endpackage
 
diff --git a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
index f9138ae..b3659bd 100644
--- a/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
+++ b/hw/top_earlgrey/ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
@@ -21,9 +21,9 @@
 
   import rv_plic_reg_pkg::* ;
 
-  localparam AW = 10;
-  localparam DW = 32;
-  localparam DBW = DW/8;                    // Byte Width
+  localparam int AW = 10;
+  localparam int DW = 32;
+  localparam int DBW = DW/8;                    // Byte Width
 
   // register signals
   logic           reg_we;
@@ -132,6 +132,22 @@
   logic ip1_p60_qs;
   logic ip1_p61_qs;
   logic ip1_p62_qs;
+  logic ip1_p63_qs;
+  logic ip2_p64_qs;
+  logic ip2_p65_qs;
+  logic ip2_p66_qs;
+  logic ip2_p67_qs;
+  logic ip2_p68_qs;
+  logic ip2_p69_qs;
+  logic ip2_p70_qs;
+  logic ip2_p71_qs;
+  logic ip2_p72_qs;
+  logic ip2_p73_qs;
+  logic ip2_p74_qs;
+  logic ip2_p75_qs;
+  logic ip2_p76_qs;
+  logic ip2_p77_qs;
+  logic ip2_p78_qs;
   logic le0_le0_qs;
   logic le0_le0_wd;
   logic le0_le0_we;
@@ -321,6 +337,54 @@
   logic le1_le62_qs;
   logic le1_le62_wd;
   logic le1_le62_we;
+  logic le1_le63_qs;
+  logic le1_le63_wd;
+  logic le1_le63_we;
+  logic le2_le64_qs;
+  logic le2_le64_wd;
+  logic le2_le64_we;
+  logic le2_le65_qs;
+  logic le2_le65_wd;
+  logic le2_le65_we;
+  logic le2_le66_qs;
+  logic le2_le66_wd;
+  logic le2_le66_we;
+  logic le2_le67_qs;
+  logic le2_le67_wd;
+  logic le2_le67_we;
+  logic le2_le68_qs;
+  logic le2_le68_wd;
+  logic le2_le68_we;
+  logic le2_le69_qs;
+  logic le2_le69_wd;
+  logic le2_le69_we;
+  logic le2_le70_qs;
+  logic le2_le70_wd;
+  logic le2_le70_we;
+  logic le2_le71_qs;
+  logic le2_le71_wd;
+  logic le2_le71_we;
+  logic le2_le72_qs;
+  logic le2_le72_wd;
+  logic le2_le72_we;
+  logic le2_le73_qs;
+  logic le2_le73_wd;
+  logic le2_le73_we;
+  logic le2_le74_qs;
+  logic le2_le74_wd;
+  logic le2_le74_we;
+  logic le2_le75_qs;
+  logic le2_le75_wd;
+  logic le2_le75_we;
+  logic le2_le76_qs;
+  logic le2_le76_wd;
+  logic le2_le76_we;
+  logic le2_le77_qs;
+  logic le2_le77_wd;
+  logic le2_le77_we;
+  logic le2_le78_qs;
+  logic le2_le78_wd;
+  logic le2_le78_we;
   logic [1:0] prio0_qs;
   logic [1:0] prio0_wd;
   logic prio0_we;
@@ -510,6 +574,54 @@
   logic [1:0] prio62_qs;
   logic [1:0] prio62_wd;
   logic prio62_we;
+  logic [1:0] prio63_qs;
+  logic [1:0] prio63_wd;
+  logic prio63_we;
+  logic [1:0] prio64_qs;
+  logic [1:0] prio64_wd;
+  logic prio64_we;
+  logic [1:0] prio65_qs;
+  logic [1:0] prio65_wd;
+  logic prio65_we;
+  logic [1:0] prio66_qs;
+  logic [1:0] prio66_wd;
+  logic prio66_we;
+  logic [1:0] prio67_qs;
+  logic [1:0] prio67_wd;
+  logic prio67_we;
+  logic [1:0] prio68_qs;
+  logic [1:0] prio68_wd;
+  logic prio68_we;
+  logic [1:0] prio69_qs;
+  logic [1:0] prio69_wd;
+  logic prio69_we;
+  logic [1:0] prio70_qs;
+  logic [1:0] prio70_wd;
+  logic prio70_we;
+  logic [1:0] prio71_qs;
+  logic [1:0] prio71_wd;
+  logic prio71_we;
+  logic [1:0] prio72_qs;
+  logic [1:0] prio72_wd;
+  logic prio72_we;
+  logic [1:0] prio73_qs;
+  logic [1:0] prio73_wd;
+  logic prio73_we;
+  logic [1:0] prio74_qs;
+  logic [1:0] prio74_wd;
+  logic prio74_we;
+  logic [1:0] prio75_qs;
+  logic [1:0] prio75_wd;
+  logic prio75_we;
+  logic [1:0] prio76_qs;
+  logic [1:0] prio76_wd;
+  logic prio76_we;
+  logic [1:0] prio77_qs;
+  logic [1:0] prio77_wd;
+  logic prio77_we;
+  logic [1:0] prio78_qs;
+  logic [1:0] prio78_wd;
+  logic prio78_we;
   logic ie00_e0_qs;
   logic ie00_e0_wd;
   logic ie00_e0_we;
@@ -699,11 +811,59 @@
   logic ie01_e62_qs;
   logic ie01_e62_wd;
   logic ie01_e62_we;
+  logic ie01_e63_qs;
+  logic ie01_e63_wd;
+  logic ie01_e63_we;
+  logic ie02_e64_qs;
+  logic ie02_e64_wd;
+  logic ie02_e64_we;
+  logic ie02_e65_qs;
+  logic ie02_e65_wd;
+  logic ie02_e65_we;
+  logic ie02_e66_qs;
+  logic ie02_e66_wd;
+  logic ie02_e66_we;
+  logic ie02_e67_qs;
+  logic ie02_e67_wd;
+  logic ie02_e67_we;
+  logic ie02_e68_qs;
+  logic ie02_e68_wd;
+  logic ie02_e68_we;
+  logic ie02_e69_qs;
+  logic ie02_e69_wd;
+  logic ie02_e69_we;
+  logic ie02_e70_qs;
+  logic ie02_e70_wd;
+  logic ie02_e70_we;
+  logic ie02_e71_qs;
+  logic ie02_e71_wd;
+  logic ie02_e71_we;
+  logic ie02_e72_qs;
+  logic ie02_e72_wd;
+  logic ie02_e72_we;
+  logic ie02_e73_qs;
+  logic ie02_e73_wd;
+  logic ie02_e73_we;
+  logic ie02_e74_qs;
+  logic ie02_e74_wd;
+  logic ie02_e74_we;
+  logic ie02_e75_qs;
+  logic ie02_e75_wd;
+  logic ie02_e75_we;
+  logic ie02_e76_qs;
+  logic ie02_e76_wd;
+  logic ie02_e76_we;
+  logic ie02_e77_qs;
+  logic ie02_e77_wd;
+  logic ie02_e77_we;
+  logic ie02_e78_qs;
+  logic ie02_e78_wd;
+  logic ie02_e78_we;
   logic [1:0] threshold0_qs;
   logic [1:0] threshold0_wd;
   logic threshold0_we;
-  logic [5:0] cc0_qs;
-  logic [5:0] cc0_wd;
+  logic [6:0] cc0_qs;
+  logic [6:0] cc0_wd;
   logic cc0_we;
   logic cc0_re;
   logic msip0_qs;
@@ -2293,6 +2453,409 @@
   );
 
 
+  // F[p63]: 31:31
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip1_p63 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[63].de),
+    .d      (hw2reg.ip[63].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip1_p63_qs)
+  );
+
+
+  // Subregister 64 of Multireg ip
+  // R[ip2]: V(False)
+
+  // F[p64]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p64 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[64].de),
+    .d      (hw2reg.ip[64].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p64_qs)
+  );
+
+
+  // F[p65]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p65 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[65].de),
+    .d      (hw2reg.ip[65].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p65_qs)
+  );
+
+
+  // F[p66]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p66 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[66].de),
+    .d      (hw2reg.ip[66].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p66_qs)
+  );
+
+
+  // F[p67]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p67 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[67].de),
+    .d      (hw2reg.ip[67].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p67_qs)
+  );
+
+
+  // F[p68]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p68 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[68].de),
+    .d      (hw2reg.ip[68].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p68_qs)
+  );
+
+
+  // F[p69]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p69 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[69].de),
+    .d      (hw2reg.ip[69].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p69_qs)
+  );
+
+
+  // F[p70]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p70 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[70].de),
+    .d      (hw2reg.ip[70].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p70_qs)
+  );
+
+
+  // F[p71]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p71 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[71].de),
+    .d      (hw2reg.ip[71].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p71_qs)
+  );
+
+
+  // F[p72]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p72 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[72].de),
+    .d      (hw2reg.ip[72].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p72_qs)
+  );
+
+
+  // F[p73]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p73 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[73].de),
+    .d      (hw2reg.ip[73].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p73_qs)
+  );
+
+
+  // F[p74]: 10:10
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p74 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[74].de),
+    .d      (hw2reg.ip[74].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p74_qs)
+  );
+
+
+  // F[p75]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p75 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[75].de),
+    .d      (hw2reg.ip[75].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p75_qs)
+  );
+
+
+  // F[p76]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p76 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[76].de),
+    .d      (hw2reg.ip[76].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p76_qs)
+  );
+
+
+  // F[p77]: 13:13
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p77 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[77].de),
+    .d      (hw2reg.ip[77].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p77_qs)
+  );
+
+
+  // F[p78]: 14:14
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RO"),
+    .RESVAL  (1'h0)
+  ) u_ip2_p78 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    .we     (1'b0),
+    .wd     ('0  ),
+
+    // from internal hardware
+    .de     (hw2reg.ip[78].de),
+    .d      (hw2reg.ip[78].d ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (),
+
+    // to register interface (read)
+    .qs     (ip2_p78_qs)
+  );
+
+
 
 
   // Subregister 0 of Multireg le
@@ -3939,6 +4502,425 @@
   );
 
 
+  // F[le63]: 31:31
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le1_le63 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le1_le63_we),
+    .wd     (le1_le63_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[63].q ),
+
+    // to register interface (read)
+    .qs     (le1_le63_qs)
+  );
+
+
+  // Subregister 64 of Multireg le
+  // R[le2]: V(False)
+
+  // F[le64]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le64 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le64_we),
+    .wd     (le2_le64_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[64].q ),
+
+    // to register interface (read)
+    .qs     (le2_le64_qs)
+  );
+
+
+  // F[le65]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le65 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le65_we),
+    .wd     (le2_le65_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[65].q ),
+
+    // to register interface (read)
+    .qs     (le2_le65_qs)
+  );
+
+
+  // F[le66]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le66 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le66_we),
+    .wd     (le2_le66_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[66].q ),
+
+    // to register interface (read)
+    .qs     (le2_le66_qs)
+  );
+
+
+  // F[le67]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le67 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le67_we),
+    .wd     (le2_le67_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[67].q ),
+
+    // to register interface (read)
+    .qs     (le2_le67_qs)
+  );
+
+
+  // F[le68]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le68 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le68_we),
+    .wd     (le2_le68_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[68].q ),
+
+    // to register interface (read)
+    .qs     (le2_le68_qs)
+  );
+
+
+  // F[le69]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le69 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le69_we),
+    .wd     (le2_le69_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[69].q ),
+
+    // to register interface (read)
+    .qs     (le2_le69_qs)
+  );
+
+
+  // F[le70]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le70 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le70_we),
+    .wd     (le2_le70_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[70].q ),
+
+    // to register interface (read)
+    .qs     (le2_le70_qs)
+  );
+
+
+  // F[le71]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le71 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le71_we),
+    .wd     (le2_le71_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[71].q ),
+
+    // to register interface (read)
+    .qs     (le2_le71_qs)
+  );
+
+
+  // F[le72]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le72 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le72_we),
+    .wd     (le2_le72_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[72].q ),
+
+    // to register interface (read)
+    .qs     (le2_le72_qs)
+  );
+
+
+  // F[le73]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le73 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le73_we),
+    .wd     (le2_le73_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[73].q ),
+
+    // to register interface (read)
+    .qs     (le2_le73_qs)
+  );
+
+
+  // F[le74]: 10:10
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le74 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le74_we),
+    .wd     (le2_le74_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[74].q ),
+
+    // to register interface (read)
+    .qs     (le2_le74_qs)
+  );
+
+
+  // F[le75]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le75 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le75_we),
+    .wd     (le2_le75_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[75].q ),
+
+    // to register interface (read)
+    .qs     (le2_le75_qs)
+  );
+
+
+  // F[le76]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le76 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le76_we),
+    .wd     (le2_le76_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[76].q ),
+
+    // to register interface (read)
+    .qs     (le2_le76_qs)
+  );
+
+
+  // F[le77]: 13:13
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le77 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le77_we),
+    .wd     (le2_le77_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[77].q ),
+
+    // to register interface (read)
+    .qs     (le2_le77_qs)
+  );
+
+
+  // F[le78]: 14:14
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_le2_le78 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (le2_le78_we),
+    .wd     (le2_le78_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.le[78].q ),
+
+    // to register interface (read)
+    .qs     (le2_le78_qs)
+  );
+
+
 
   // R[prio0]: V(False)
 
@@ -5641,6 +6623,438 @@
   );
 
 
+  // R[prio63]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio63 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio63_we),
+    .wd     (prio63_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio63.q ),
+
+    // to register interface (read)
+    .qs     (prio63_qs)
+  );
+
+
+  // R[prio64]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio64 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio64_we),
+    .wd     (prio64_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio64.q ),
+
+    // to register interface (read)
+    .qs     (prio64_qs)
+  );
+
+
+  // R[prio65]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio65 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio65_we),
+    .wd     (prio65_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio65.q ),
+
+    // to register interface (read)
+    .qs     (prio65_qs)
+  );
+
+
+  // R[prio66]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio66 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio66_we),
+    .wd     (prio66_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio66.q ),
+
+    // to register interface (read)
+    .qs     (prio66_qs)
+  );
+
+
+  // R[prio67]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio67 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio67_we),
+    .wd     (prio67_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio67.q ),
+
+    // to register interface (read)
+    .qs     (prio67_qs)
+  );
+
+
+  // R[prio68]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio68 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio68_we),
+    .wd     (prio68_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio68.q ),
+
+    // to register interface (read)
+    .qs     (prio68_qs)
+  );
+
+
+  // R[prio69]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio69 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio69_we),
+    .wd     (prio69_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio69.q ),
+
+    // to register interface (read)
+    .qs     (prio69_qs)
+  );
+
+
+  // R[prio70]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio70 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio70_we),
+    .wd     (prio70_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio70.q ),
+
+    // to register interface (read)
+    .qs     (prio70_qs)
+  );
+
+
+  // R[prio71]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio71 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio71_we),
+    .wd     (prio71_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio71.q ),
+
+    // to register interface (read)
+    .qs     (prio71_qs)
+  );
+
+
+  // R[prio72]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio72 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio72_we),
+    .wd     (prio72_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio72.q ),
+
+    // to register interface (read)
+    .qs     (prio72_qs)
+  );
+
+
+  // R[prio73]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio73 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio73_we),
+    .wd     (prio73_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio73.q ),
+
+    // to register interface (read)
+    .qs     (prio73_qs)
+  );
+
+
+  // R[prio74]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio74 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio74_we),
+    .wd     (prio74_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio74.q ),
+
+    // to register interface (read)
+    .qs     (prio74_qs)
+  );
+
+
+  // R[prio75]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio75 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio75_we),
+    .wd     (prio75_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio75.q ),
+
+    // to register interface (read)
+    .qs     (prio75_qs)
+  );
+
+
+  // R[prio76]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio76 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio76_we),
+    .wd     (prio76_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio76.q ),
+
+    // to register interface (read)
+    .qs     (prio76_qs)
+  );
+
+
+  // R[prio77]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio77 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio77_we),
+    .wd     (prio77_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio77.q ),
+
+    // to register interface (read)
+    .qs     (prio77_qs)
+  );
+
+
+  // R[prio78]: V(False)
+
+  prim_subreg #(
+    .DW      (2),
+    .SWACCESS("RW"),
+    .RESVAL  (2'h0)
+  ) u_prio78 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (prio78_we),
+    .wd     (prio78_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.prio78.q ),
+
+    // to register interface (read)
+    .qs     (prio78_qs)
+  );
+
+
 
   // Subregister 0 of Multireg ie0
   // R[ie00]: V(False)
@@ -7286,6 +8700,425 @@
   );
 
 
+  // F[e63]: 31:31
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie01_e63 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie01_e63_we),
+    .wd     (ie01_e63_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[63].q ),
+
+    // to register interface (read)
+    .qs     (ie01_e63_qs)
+  );
+
+
+  // Subregister 64 of Multireg ie0
+  // R[ie02]: V(False)
+
+  // F[e64]: 0:0
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e64 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e64_we),
+    .wd     (ie02_e64_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[64].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e64_qs)
+  );
+
+
+  // F[e65]: 1:1
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e65 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e65_we),
+    .wd     (ie02_e65_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[65].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e65_qs)
+  );
+
+
+  // F[e66]: 2:2
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e66 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e66_we),
+    .wd     (ie02_e66_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[66].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e66_qs)
+  );
+
+
+  // F[e67]: 3:3
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e67 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e67_we),
+    .wd     (ie02_e67_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[67].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e67_qs)
+  );
+
+
+  // F[e68]: 4:4
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e68 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e68_we),
+    .wd     (ie02_e68_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[68].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e68_qs)
+  );
+
+
+  // F[e69]: 5:5
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e69 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e69_we),
+    .wd     (ie02_e69_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[69].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e69_qs)
+  );
+
+
+  // F[e70]: 6:6
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e70 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e70_we),
+    .wd     (ie02_e70_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[70].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e70_qs)
+  );
+
+
+  // F[e71]: 7:7
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e71 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e71_we),
+    .wd     (ie02_e71_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[71].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e71_qs)
+  );
+
+
+  // F[e72]: 8:8
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e72 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e72_we),
+    .wd     (ie02_e72_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[72].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e72_qs)
+  );
+
+
+  // F[e73]: 9:9
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e73 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e73_we),
+    .wd     (ie02_e73_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[73].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e73_qs)
+  );
+
+
+  // F[e74]: 10:10
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e74 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e74_we),
+    .wd     (ie02_e74_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[74].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e74_qs)
+  );
+
+
+  // F[e75]: 11:11
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e75 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e75_we),
+    .wd     (ie02_e75_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[75].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e75_qs)
+  );
+
+
+  // F[e76]: 12:12
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e76 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e76_we),
+    .wd     (ie02_e76_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[76].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e76_qs)
+  );
+
+
+  // F[e77]: 13:13
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e77 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e77_we),
+    .wd     (ie02_e77_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[77].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e77_qs)
+  );
+
+
+  // F[e78]: 14:14
+  prim_subreg #(
+    .DW      (1),
+    .SWACCESS("RW"),
+    .RESVAL  (1'h0)
+  ) u_ie02_e78 (
+    .clk_i   (clk_i    ),
+    .rst_ni  (rst_ni  ),
+
+    // from register interface
+    .we     (ie02_e78_we),
+    .wd     (ie02_e78_wd),
+
+    // from internal hardware
+    .de     (1'b0),
+    .d      ('0  ),
+
+    // to internal hardware
+    .qe     (),
+    .q      (reg2hw.ie0[78].q ),
+
+    // to register interface (read)
+    .qs     (ie02_e78_qs)
+  );
+
+
 
   // R[threshold0]: V(False)
 
@@ -7317,7 +9150,7 @@
   // R[cc0]: V(True)
 
   prim_subreg_ext #(
-    .DW    (6)
+    .DW    (7)
   ) u_cc0 (
     .re     (cc0_re),
     .we     (cc0_we),
@@ -7359,81 +9192,100 @@
 
 
 
-  logic [71:0] addr_hit;
+  logic [90:0] addr_hit;
   always_comb begin
     addr_hit = '0;
     addr_hit[ 0] = (reg_addr == RV_PLIC_IP0_OFFSET);
     addr_hit[ 1] = (reg_addr == RV_PLIC_IP1_OFFSET);
-    addr_hit[ 2] = (reg_addr == RV_PLIC_LE0_OFFSET);
-    addr_hit[ 3] = (reg_addr == RV_PLIC_LE1_OFFSET);
-    addr_hit[ 4] = (reg_addr == RV_PLIC_PRIO0_OFFSET);
-    addr_hit[ 5] = (reg_addr == RV_PLIC_PRIO1_OFFSET);
-    addr_hit[ 6] = (reg_addr == RV_PLIC_PRIO2_OFFSET);
-    addr_hit[ 7] = (reg_addr == RV_PLIC_PRIO3_OFFSET);
-    addr_hit[ 8] = (reg_addr == RV_PLIC_PRIO4_OFFSET);
-    addr_hit[ 9] = (reg_addr == RV_PLIC_PRIO5_OFFSET);
-    addr_hit[10] = (reg_addr == RV_PLIC_PRIO6_OFFSET);
-    addr_hit[11] = (reg_addr == RV_PLIC_PRIO7_OFFSET);
-    addr_hit[12] = (reg_addr == RV_PLIC_PRIO8_OFFSET);
-    addr_hit[13] = (reg_addr == RV_PLIC_PRIO9_OFFSET);
-    addr_hit[14] = (reg_addr == RV_PLIC_PRIO10_OFFSET);
-    addr_hit[15] = (reg_addr == RV_PLIC_PRIO11_OFFSET);
-    addr_hit[16] = (reg_addr == RV_PLIC_PRIO12_OFFSET);
-    addr_hit[17] = (reg_addr == RV_PLIC_PRIO13_OFFSET);
-    addr_hit[18] = (reg_addr == RV_PLIC_PRIO14_OFFSET);
-    addr_hit[19] = (reg_addr == RV_PLIC_PRIO15_OFFSET);
-    addr_hit[20] = (reg_addr == RV_PLIC_PRIO16_OFFSET);
-    addr_hit[21] = (reg_addr == RV_PLIC_PRIO17_OFFSET);
-    addr_hit[22] = (reg_addr == RV_PLIC_PRIO18_OFFSET);
-    addr_hit[23] = (reg_addr == RV_PLIC_PRIO19_OFFSET);
-    addr_hit[24] = (reg_addr == RV_PLIC_PRIO20_OFFSET);
-    addr_hit[25] = (reg_addr == RV_PLIC_PRIO21_OFFSET);
-    addr_hit[26] = (reg_addr == RV_PLIC_PRIO22_OFFSET);
-    addr_hit[27] = (reg_addr == RV_PLIC_PRIO23_OFFSET);
-    addr_hit[28] = (reg_addr == RV_PLIC_PRIO24_OFFSET);
-    addr_hit[29] = (reg_addr == RV_PLIC_PRIO25_OFFSET);
-    addr_hit[30] = (reg_addr == RV_PLIC_PRIO26_OFFSET);
-    addr_hit[31] = (reg_addr == RV_PLIC_PRIO27_OFFSET);
-    addr_hit[32] = (reg_addr == RV_PLIC_PRIO28_OFFSET);
-    addr_hit[33] = (reg_addr == RV_PLIC_PRIO29_OFFSET);
-    addr_hit[34] = (reg_addr == RV_PLIC_PRIO30_OFFSET);
-    addr_hit[35] = (reg_addr == RV_PLIC_PRIO31_OFFSET);
-    addr_hit[36] = (reg_addr == RV_PLIC_PRIO32_OFFSET);
-    addr_hit[37] = (reg_addr == RV_PLIC_PRIO33_OFFSET);
-    addr_hit[38] = (reg_addr == RV_PLIC_PRIO34_OFFSET);
-    addr_hit[39] = (reg_addr == RV_PLIC_PRIO35_OFFSET);
-    addr_hit[40] = (reg_addr == RV_PLIC_PRIO36_OFFSET);
-    addr_hit[41] = (reg_addr == RV_PLIC_PRIO37_OFFSET);
-    addr_hit[42] = (reg_addr == RV_PLIC_PRIO38_OFFSET);
-    addr_hit[43] = (reg_addr == RV_PLIC_PRIO39_OFFSET);
-    addr_hit[44] = (reg_addr == RV_PLIC_PRIO40_OFFSET);
-    addr_hit[45] = (reg_addr == RV_PLIC_PRIO41_OFFSET);
-    addr_hit[46] = (reg_addr == RV_PLIC_PRIO42_OFFSET);
-    addr_hit[47] = (reg_addr == RV_PLIC_PRIO43_OFFSET);
-    addr_hit[48] = (reg_addr == RV_PLIC_PRIO44_OFFSET);
-    addr_hit[49] = (reg_addr == RV_PLIC_PRIO45_OFFSET);
-    addr_hit[50] = (reg_addr == RV_PLIC_PRIO46_OFFSET);
-    addr_hit[51] = (reg_addr == RV_PLIC_PRIO47_OFFSET);
-    addr_hit[52] = (reg_addr == RV_PLIC_PRIO48_OFFSET);
-    addr_hit[53] = (reg_addr == RV_PLIC_PRIO49_OFFSET);
-    addr_hit[54] = (reg_addr == RV_PLIC_PRIO50_OFFSET);
-    addr_hit[55] = (reg_addr == RV_PLIC_PRIO51_OFFSET);
-    addr_hit[56] = (reg_addr == RV_PLIC_PRIO52_OFFSET);
-    addr_hit[57] = (reg_addr == RV_PLIC_PRIO53_OFFSET);
-    addr_hit[58] = (reg_addr == RV_PLIC_PRIO54_OFFSET);
-    addr_hit[59] = (reg_addr == RV_PLIC_PRIO55_OFFSET);
-    addr_hit[60] = (reg_addr == RV_PLIC_PRIO56_OFFSET);
-    addr_hit[61] = (reg_addr == RV_PLIC_PRIO57_OFFSET);
-    addr_hit[62] = (reg_addr == RV_PLIC_PRIO58_OFFSET);
-    addr_hit[63] = (reg_addr == RV_PLIC_PRIO59_OFFSET);
-    addr_hit[64] = (reg_addr == RV_PLIC_PRIO60_OFFSET);
-    addr_hit[65] = (reg_addr == RV_PLIC_PRIO61_OFFSET);
-    addr_hit[66] = (reg_addr == RV_PLIC_PRIO62_OFFSET);
-    addr_hit[67] = (reg_addr == RV_PLIC_IE00_OFFSET);
-    addr_hit[68] = (reg_addr == RV_PLIC_IE01_OFFSET);
-    addr_hit[69] = (reg_addr == RV_PLIC_THRESHOLD0_OFFSET);
-    addr_hit[70] = (reg_addr == RV_PLIC_CC0_OFFSET);
-    addr_hit[71] = (reg_addr == RV_PLIC_MSIP0_OFFSET);
+    addr_hit[ 2] = (reg_addr == RV_PLIC_IP2_OFFSET);
+    addr_hit[ 3] = (reg_addr == RV_PLIC_LE0_OFFSET);
+    addr_hit[ 4] = (reg_addr == RV_PLIC_LE1_OFFSET);
+    addr_hit[ 5] = (reg_addr == RV_PLIC_LE2_OFFSET);
+    addr_hit[ 6] = (reg_addr == RV_PLIC_PRIO0_OFFSET);
+    addr_hit[ 7] = (reg_addr == RV_PLIC_PRIO1_OFFSET);
+    addr_hit[ 8] = (reg_addr == RV_PLIC_PRIO2_OFFSET);
+    addr_hit[ 9] = (reg_addr == RV_PLIC_PRIO3_OFFSET);
+    addr_hit[10] = (reg_addr == RV_PLIC_PRIO4_OFFSET);
+    addr_hit[11] = (reg_addr == RV_PLIC_PRIO5_OFFSET);
+    addr_hit[12] = (reg_addr == RV_PLIC_PRIO6_OFFSET);
+    addr_hit[13] = (reg_addr == RV_PLIC_PRIO7_OFFSET);
+    addr_hit[14] = (reg_addr == RV_PLIC_PRIO8_OFFSET);
+    addr_hit[15] = (reg_addr == RV_PLIC_PRIO9_OFFSET);
+    addr_hit[16] = (reg_addr == RV_PLIC_PRIO10_OFFSET);
+    addr_hit[17] = (reg_addr == RV_PLIC_PRIO11_OFFSET);
+    addr_hit[18] = (reg_addr == RV_PLIC_PRIO12_OFFSET);
+    addr_hit[19] = (reg_addr == RV_PLIC_PRIO13_OFFSET);
+    addr_hit[20] = (reg_addr == RV_PLIC_PRIO14_OFFSET);
+    addr_hit[21] = (reg_addr == RV_PLIC_PRIO15_OFFSET);
+    addr_hit[22] = (reg_addr == RV_PLIC_PRIO16_OFFSET);
+    addr_hit[23] = (reg_addr == RV_PLIC_PRIO17_OFFSET);
+    addr_hit[24] = (reg_addr == RV_PLIC_PRIO18_OFFSET);
+    addr_hit[25] = (reg_addr == RV_PLIC_PRIO19_OFFSET);
+    addr_hit[26] = (reg_addr == RV_PLIC_PRIO20_OFFSET);
+    addr_hit[27] = (reg_addr == RV_PLIC_PRIO21_OFFSET);
+    addr_hit[28] = (reg_addr == RV_PLIC_PRIO22_OFFSET);
+    addr_hit[29] = (reg_addr == RV_PLIC_PRIO23_OFFSET);
+    addr_hit[30] = (reg_addr == RV_PLIC_PRIO24_OFFSET);
+    addr_hit[31] = (reg_addr == RV_PLIC_PRIO25_OFFSET);
+    addr_hit[32] = (reg_addr == RV_PLIC_PRIO26_OFFSET);
+    addr_hit[33] = (reg_addr == RV_PLIC_PRIO27_OFFSET);
+    addr_hit[34] = (reg_addr == RV_PLIC_PRIO28_OFFSET);
+    addr_hit[35] = (reg_addr == RV_PLIC_PRIO29_OFFSET);
+    addr_hit[36] = (reg_addr == RV_PLIC_PRIO30_OFFSET);
+    addr_hit[37] = (reg_addr == RV_PLIC_PRIO31_OFFSET);
+    addr_hit[38] = (reg_addr == RV_PLIC_PRIO32_OFFSET);
+    addr_hit[39] = (reg_addr == RV_PLIC_PRIO33_OFFSET);
+    addr_hit[40] = (reg_addr == RV_PLIC_PRIO34_OFFSET);
+    addr_hit[41] = (reg_addr == RV_PLIC_PRIO35_OFFSET);
+    addr_hit[42] = (reg_addr == RV_PLIC_PRIO36_OFFSET);
+    addr_hit[43] = (reg_addr == RV_PLIC_PRIO37_OFFSET);
+    addr_hit[44] = (reg_addr == RV_PLIC_PRIO38_OFFSET);
+    addr_hit[45] = (reg_addr == RV_PLIC_PRIO39_OFFSET);
+    addr_hit[46] = (reg_addr == RV_PLIC_PRIO40_OFFSET);
+    addr_hit[47] = (reg_addr == RV_PLIC_PRIO41_OFFSET);
+    addr_hit[48] = (reg_addr == RV_PLIC_PRIO42_OFFSET);
+    addr_hit[49] = (reg_addr == RV_PLIC_PRIO43_OFFSET);
+    addr_hit[50] = (reg_addr == RV_PLIC_PRIO44_OFFSET);
+    addr_hit[51] = (reg_addr == RV_PLIC_PRIO45_OFFSET);
+    addr_hit[52] = (reg_addr == RV_PLIC_PRIO46_OFFSET);
+    addr_hit[53] = (reg_addr == RV_PLIC_PRIO47_OFFSET);
+    addr_hit[54] = (reg_addr == RV_PLIC_PRIO48_OFFSET);
+    addr_hit[55] = (reg_addr == RV_PLIC_PRIO49_OFFSET);
+    addr_hit[56] = (reg_addr == RV_PLIC_PRIO50_OFFSET);
+    addr_hit[57] = (reg_addr == RV_PLIC_PRIO51_OFFSET);
+    addr_hit[58] = (reg_addr == RV_PLIC_PRIO52_OFFSET);
+    addr_hit[59] = (reg_addr == RV_PLIC_PRIO53_OFFSET);
+    addr_hit[60] = (reg_addr == RV_PLIC_PRIO54_OFFSET);
+    addr_hit[61] = (reg_addr == RV_PLIC_PRIO55_OFFSET);
+    addr_hit[62] = (reg_addr == RV_PLIC_PRIO56_OFFSET);
+    addr_hit[63] = (reg_addr == RV_PLIC_PRIO57_OFFSET);
+    addr_hit[64] = (reg_addr == RV_PLIC_PRIO58_OFFSET);
+    addr_hit[65] = (reg_addr == RV_PLIC_PRIO59_OFFSET);
+    addr_hit[66] = (reg_addr == RV_PLIC_PRIO60_OFFSET);
+    addr_hit[67] = (reg_addr == RV_PLIC_PRIO61_OFFSET);
+    addr_hit[68] = (reg_addr == RV_PLIC_PRIO62_OFFSET);
+    addr_hit[69] = (reg_addr == RV_PLIC_PRIO63_OFFSET);
+    addr_hit[70] = (reg_addr == RV_PLIC_PRIO64_OFFSET);
+    addr_hit[71] = (reg_addr == RV_PLIC_PRIO65_OFFSET);
+    addr_hit[72] = (reg_addr == RV_PLIC_PRIO66_OFFSET);
+    addr_hit[73] = (reg_addr == RV_PLIC_PRIO67_OFFSET);
+    addr_hit[74] = (reg_addr == RV_PLIC_PRIO68_OFFSET);
+    addr_hit[75] = (reg_addr == RV_PLIC_PRIO69_OFFSET);
+    addr_hit[76] = (reg_addr == RV_PLIC_PRIO70_OFFSET);
+    addr_hit[77] = (reg_addr == RV_PLIC_PRIO71_OFFSET);
+    addr_hit[78] = (reg_addr == RV_PLIC_PRIO72_OFFSET);
+    addr_hit[79] = (reg_addr == RV_PLIC_PRIO73_OFFSET);
+    addr_hit[80] = (reg_addr == RV_PLIC_PRIO74_OFFSET);
+    addr_hit[81] = (reg_addr == RV_PLIC_PRIO75_OFFSET);
+    addr_hit[82] = (reg_addr == RV_PLIC_PRIO76_OFFSET);
+    addr_hit[83] = (reg_addr == RV_PLIC_PRIO77_OFFSET);
+    addr_hit[84] = (reg_addr == RV_PLIC_PRIO78_OFFSET);
+    addr_hit[85] = (reg_addr == RV_PLIC_IE00_OFFSET);
+    addr_hit[86] = (reg_addr == RV_PLIC_IE01_OFFSET);
+    addr_hit[87] = (reg_addr == RV_PLIC_IE02_OFFSET);
+    addr_hit[88] = (reg_addr == RV_PLIC_THRESHOLD0_OFFSET);
+    addr_hit[89] = (reg_addr == RV_PLIC_CC0_OFFSET);
+    addr_hit[90] = (reg_addr == RV_PLIC_MSIP0_OFFSET);
   end
 
   assign addrmiss = (reg_re || reg_we) ? ~|addr_hit : 1'b0 ;
@@ -7513,6 +9365,25 @@
     if (addr_hit[69] && reg_we && (RV_PLIC_PERMIT[69] != (RV_PLIC_PERMIT[69] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[70] && reg_we && (RV_PLIC_PERMIT[70] != (RV_PLIC_PERMIT[70] & reg_be))) wr_err = 1'b1 ;
     if (addr_hit[71] && reg_we && (RV_PLIC_PERMIT[71] != (RV_PLIC_PERMIT[71] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[72] && reg_we && (RV_PLIC_PERMIT[72] != (RV_PLIC_PERMIT[72] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[73] && reg_we && (RV_PLIC_PERMIT[73] != (RV_PLIC_PERMIT[73] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[74] && reg_we && (RV_PLIC_PERMIT[74] != (RV_PLIC_PERMIT[74] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[75] && reg_we && (RV_PLIC_PERMIT[75] != (RV_PLIC_PERMIT[75] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[76] && reg_we && (RV_PLIC_PERMIT[76] != (RV_PLIC_PERMIT[76] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[77] && reg_we && (RV_PLIC_PERMIT[77] != (RV_PLIC_PERMIT[77] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[78] && reg_we && (RV_PLIC_PERMIT[78] != (RV_PLIC_PERMIT[78] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[79] && reg_we && (RV_PLIC_PERMIT[79] != (RV_PLIC_PERMIT[79] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[80] && reg_we && (RV_PLIC_PERMIT[80] != (RV_PLIC_PERMIT[80] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[81] && reg_we && (RV_PLIC_PERMIT[81] != (RV_PLIC_PERMIT[81] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[82] && reg_we && (RV_PLIC_PERMIT[82] != (RV_PLIC_PERMIT[82] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[83] && reg_we && (RV_PLIC_PERMIT[83] != (RV_PLIC_PERMIT[83] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[84] && reg_we && (RV_PLIC_PERMIT[84] != (RV_PLIC_PERMIT[84] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[85] && reg_we && (RV_PLIC_PERMIT[85] != (RV_PLIC_PERMIT[85] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[86] && reg_we && (RV_PLIC_PERMIT[86] != (RV_PLIC_PERMIT[86] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[87] && reg_we && (RV_PLIC_PERMIT[87] != (RV_PLIC_PERMIT[87] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[88] && reg_we && (RV_PLIC_PERMIT[88] != (RV_PLIC_PERMIT[88] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[89] && reg_we && (RV_PLIC_PERMIT[89] != (RV_PLIC_PERMIT[89] & reg_be))) wr_err = 1'b1 ;
+    if (addr_hit[90] && reg_we && (RV_PLIC_PERMIT[90] != (RV_PLIC_PERMIT[90] & reg_be))) wr_err = 1'b1 ;
   end
 
 
@@ -7578,581 +9449,741 @@
 
 
 
-  assign le0_le0_we = addr_hit[2] & reg_we & ~wr_err;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+  assign le0_le0_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le0_wd = reg_wdata[0];
 
-  assign le0_le1_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le1_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le1_wd = reg_wdata[1];
 
-  assign le0_le2_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le2_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le2_wd = reg_wdata[2];
 
-  assign le0_le3_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le3_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le3_wd = reg_wdata[3];
 
-  assign le0_le4_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le4_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le4_wd = reg_wdata[4];
 
-  assign le0_le5_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le5_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le5_wd = reg_wdata[5];
 
-  assign le0_le6_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le6_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le6_wd = reg_wdata[6];
 
-  assign le0_le7_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le7_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le7_wd = reg_wdata[7];
 
-  assign le0_le8_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le8_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le8_wd = reg_wdata[8];
 
-  assign le0_le9_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le9_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le9_wd = reg_wdata[9];
 
-  assign le0_le10_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le10_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le10_wd = reg_wdata[10];
 
-  assign le0_le11_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le11_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le11_wd = reg_wdata[11];
 
-  assign le0_le12_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le12_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le12_wd = reg_wdata[12];
 
-  assign le0_le13_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le13_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le13_wd = reg_wdata[13];
 
-  assign le0_le14_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le14_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le14_wd = reg_wdata[14];
 
-  assign le0_le15_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le15_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le15_wd = reg_wdata[15];
 
-  assign le0_le16_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le16_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le16_wd = reg_wdata[16];
 
-  assign le0_le17_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le17_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le17_wd = reg_wdata[17];
 
-  assign le0_le18_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le18_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le18_wd = reg_wdata[18];
 
-  assign le0_le19_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le19_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le19_wd = reg_wdata[19];
 
-  assign le0_le20_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le20_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le20_wd = reg_wdata[20];
 
-  assign le0_le21_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le21_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le21_wd = reg_wdata[21];
 
-  assign le0_le22_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le22_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le22_wd = reg_wdata[22];
 
-  assign le0_le23_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le23_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le23_wd = reg_wdata[23];
 
-  assign le0_le24_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le24_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le24_wd = reg_wdata[24];
 
-  assign le0_le25_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le25_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le25_wd = reg_wdata[25];
 
-  assign le0_le26_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le26_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le26_wd = reg_wdata[26];
 
-  assign le0_le27_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le27_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le27_wd = reg_wdata[27];
 
-  assign le0_le28_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le28_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le28_wd = reg_wdata[28];
 
-  assign le0_le29_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le29_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le29_wd = reg_wdata[29];
 
-  assign le0_le30_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le30_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le30_wd = reg_wdata[30];
 
-  assign le0_le31_we = addr_hit[2] & reg_we & ~wr_err;
+  assign le0_le31_we = addr_hit[3] & reg_we & ~wr_err;
   assign le0_le31_wd = reg_wdata[31];
 
-  assign le1_le32_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le32_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le32_wd = reg_wdata[0];
 
-  assign le1_le33_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le33_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le33_wd = reg_wdata[1];
 
-  assign le1_le34_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le34_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le34_wd = reg_wdata[2];
 
-  assign le1_le35_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le35_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le35_wd = reg_wdata[3];
 
-  assign le1_le36_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le36_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le36_wd = reg_wdata[4];
 
-  assign le1_le37_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le37_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le37_wd = reg_wdata[5];
 
-  assign le1_le38_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le38_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le38_wd = reg_wdata[6];
 
-  assign le1_le39_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le39_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le39_wd = reg_wdata[7];
 
-  assign le1_le40_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le40_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le40_wd = reg_wdata[8];
 
-  assign le1_le41_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le41_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le41_wd = reg_wdata[9];
 
-  assign le1_le42_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le42_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le42_wd = reg_wdata[10];
 
-  assign le1_le43_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le43_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le43_wd = reg_wdata[11];
 
-  assign le1_le44_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le44_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le44_wd = reg_wdata[12];
 
-  assign le1_le45_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le45_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le45_wd = reg_wdata[13];
 
-  assign le1_le46_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le46_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le46_wd = reg_wdata[14];
 
-  assign le1_le47_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le47_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le47_wd = reg_wdata[15];
 
-  assign le1_le48_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le48_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le48_wd = reg_wdata[16];
 
-  assign le1_le49_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le49_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le49_wd = reg_wdata[17];
 
-  assign le1_le50_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le50_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le50_wd = reg_wdata[18];
 
-  assign le1_le51_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le51_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le51_wd = reg_wdata[19];
 
-  assign le1_le52_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le52_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le52_wd = reg_wdata[20];
 
-  assign le1_le53_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le53_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le53_wd = reg_wdata[21];
 
-  assign le1_le54_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le54_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le54_wd = reg_wdata[22];
 
-  assign le1_le55_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le55_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le55_wd = reg_wdata[23];
 
-  assign le1_le56_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le56_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le56_wd = reg_wdata[24];
 
-  assign le1_le57_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le57_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le57_wd = reg_wdata[25];
 
-  assign le1_le58_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le58_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le58_wd = reg_wdata[26];
 
-  assign le1_le59_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le59_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le59_wd = reg_wdata[27];
 
-  assign le1_le60_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le60_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le60_wd = reg_wdata[28];
 
-  assign le1_le61_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le61_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le61_wd = reg_wdata[29];
 
-  assign le1_le62_we = addr_hit[3] & reg_we & ~wr_err;
+  assign le1_le62_we = addr_hit[4] & reg_we & ~wr_err;
   assign le1_le62_wd = reg_wdata[30];
 
-  assign prio0_we = addr_hit[4] & reg_we & ~wr_err;
+  assign le1_le63_we = addr_hit[4] & reg_we & ~wr_err;
+  assign le1_le63_wd = reg_wdata[31];
+
+  assign le2_le64_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le64_wd = reg_wdata[0];
+
+  assign le2_le65_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le65_wd = reg_wdata[1];
+
+  assign le2_le66_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le66_wd = reg_wdata[2];
+
+  assign le2_le67_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le67_wd = reg_wdata[3];
+
+  assign le2_le68_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le68_wd = reg_wdata[4];
+
+  assign le2_le69_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le69_wd = reg_wdata[5];
+
+  assign le2_le70_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le70_wd = reg_wdata[6];
+
+  assign le2_le71_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le71_wd = reg_wdata[7];
+
+  assign le2_le72_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le72_wd = reg_wdata[8];
+
+  assign le2_le73_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le73_wd = reg_wdata[9];
+
+  assign le2_le74_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le74_wd = reg_wdata[10];
+
+  assign le2_le75_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le75_wd = reg_wdata[11];
+
+  assign le2_le76_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le76_wd = reg_wdata[12];
+
+  assign le2_le77_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le77_wd = reg_wdata[13];
+
+  assign le2_le78_we = addr_hit[5] & reg_we & ~wr_err;
+  assign le2_le78_wd = reg_wdata[14];
+
+  assign prio0_we = addr_hit[6] & reg_we & ~wr_err;
   assign prio0_wd = reg_wdata[1:0];
 
-  assign prio1_we = addr_hit[5] & reg_we & ~wr_err;
+  assign prio1_we = addr_hit[7] & reg_we & ~wr_err;
   assign prio1_wd = reg_wdata[1:0];
 
-  assign prio2_we = addr_hit[6] & reg_we & ~wr_err;
+  assign prio2_we = addr_hit[8] & reg_we & ~wr_err;
   assign prio2_wd = reg_wdata[1:0];
 
-  assign prio3_we = addr_hit[7] & reg_we & ~wr_err;
+  assign prio3_we = addr_hit[9] & reg_we & ~wr_err;
   assign prio3_wd = reg_wdata[1:0];
 
-  assign prio4_we = addr_hit[8] & reg_we & ~wr_err;
+  assign prio4_we = addr_hit[10] & reg_we & ~wr_err;
   assign prio4_wd = reg_wdata[1:0];
 
-  assign prio5_we = addr_hit[9] & reg_we & ~wr_err;
+  assign prio5_we = addr_hit[11] & reg_we & ~wr_err;
   assign prio5_wd = reg_wdata[1:0];
 
-  assign prio6_we = addr_hit[10] & reg_we & ~wr_err;
+  assign prio6_we = addr_hit[12] & reg_we & ~wr_err;
   assign prio6_wd = reg_wdata[1:0];
 
-  assign prio7_we = addr_hit[11] & reg_we & ~wr_err;
+  assign prio7_we = addr_hit[13] & reg_we & ~wr_err;
   assign prio7_wd = reg_wdata[1:0];
 
-  assign prio8_we = addr_hit[12] & reg_we & ~wr_err;
+  assign prio8_we = addr_hit[14] & reg_we & ~wr_err;
   assign prio8_wd = reg_wdata[1:0];
 
-  assign prio9_we = addr_hit[13] & reg_we & ~wr_err;
+  assign prio9_we = addr_hit[15] & reg_we & ~wr_err;
   assign prio9_wd = reg_wdata[1:0];
 
-  assign prio10_we = addr_hit[14] & reg_we & ~wr_err;
+  assign prio10_we = addr_hit[16] & reg_we & ~wr_err;
   assign prio10_wd = reg_wdata[1:0];
 
-  assign prio11_we = addr_hit[15] & reg_we & ~wr_err;
+  assign prio11_we = addr_hit[17] & reg_we & ~wr_err;
   assign prio11_wd = reg_wdata[1:0];
 
-  assign prio12_we = addr_hit[16] & reg_we & ~wr_err;
+  assign prio12_we = addr_hit[18] & reg_we & ~wr_err;
   assign prio12_wd = reg_wdata[1:0];
 
-  assign prio13_we = addr_hit[17] & reg_we & ~wr_err;
+  assign prio13_we = addr_hit[19] & reg_we & ~wr_err;
   assign prio13_wd = reg_wdata[1:0];
 
-  assign prio14_we = addr_hit[18] & reg_we & ~wr_err;
+  assign prio14_we = addr_hit[20] & reg_we & ~wr_err;
   assign prio14_wd = reg_wdata[1:0];
 
-  assign prio15_we = addr_hit[19] & reg_we & ~wr_err;
+  assign prio15_we = addr_hit[21] & reg_we & ~wr_err;
   assign prio15_wd = reg_wdata[1:0];
 
-  assign prio16_we = addr_hit[20] & reg_we & ~wr_err;
+  assign prio16_we = addr_hit[22] & reg_we & ~wr_err;
   assign prio16_wd = reg_wdata[1:0];
 
-  assign prio17_we = addr_hit[21] & reg_we & ~wr_err;
+  assign prio17_we = addr_hit[23] & reg_we & ~wr_err;
   assign prio17_wd = reg_wdata[1:0];
 
-  assign prio18_we = addr_hit[22] & reg_we & ~wr_err;
+  assign prio18_we = addr_hit[24] & reg_we & ~wr_err;
   assign prio18_wd = reg_wdata[1:0];
 
-  assign prio19_we = addr_hit[23] & reg_we & ~wr_err;
+  assign prio19_we = addr_hit[25] & reg_we & ~wr_err;
   assign prio19_wd = reg_wdata[1:0];
 
-  assign prio20_we = addr_hit[24] & reg_we & ~wr_err;
+  assign prio20_we = addr_hit[26] & reg_we & ~wr_err;
   assign prio20_wd = reg_wdata[1:0];
 
-  assign prio21_we = addr_hit[25] & reg_we & ~wr_err;
+  assign prio21_we = addr_hit[27] & reg_we & ~wr_err;
   assign prio21_wd = reg_wdata[1:0];
 
-  assign prio22_we = addr_hit[26] & reg_we & ~wr_err;
+  assign prio22_we = addr_hit[28] & reg_we & ~wr_err;
   assign prio22_wd = reg_wdata[1:0];
 
-  assign prio23_we = addr_hit[27] & reg_we & ~wr_err;
+  assign prio23_we = addr_hit[29] & reg_we & ~wr_err;
   assign prio23_wd = reg_wdata[1:0];
 
-  assign prio24_we = addr_hit[28] & reg_we & ~wr_err;
+  assign prio24_we = addr_hit[30] & reg_we & ~wr_err;
   assign prio24_wd = reg_wdata[1:0];
 
-  assign prio25_we = addr_hit[29] & reg_we & ~wr_err;
+  assign prio25_we = addr_hit[31] & reg_we & ~wr_err;
   assign prio25_wd = reg_wdata[1:0];
 
-  assign prio26_we = addr_hit[30] & reg_we & ~wr_err;
+  assign prio26_we = addr_hit[32] & reg_we & ~wr_err;
   assign prio26_wd = reg_wdata[1:0];
 
-  assign prio27_we = addr_hit[31] & reg_we & ~wr_err;
+  assign prio27_we = addr_hit[33] & reg_we & ~wr_err;
   assign prio27_wd = reg_wdata[1:0];
 
-  assign prio28_we = addr_hit[32] & reg_we & ~wr_err;
+  assign prio28_we = addr_hit[34] & reg_we & ~wr_err;
   assign prio28_wd = reg_wdata[1:0];
 
-  assign prio29_we = addr_hit[33] & reg_we & ~wr_err;
+  assign prio29_we = addr_hit[35] & reg_we & ~wr_err;
   assign prio29_wd = reg_wdata[1:0];
 
-  assign prio30_we = addr_hit[34] & reg_we & ~wr_err;
+  assign prio30_we = addr_hit[36] & reg_we & ~wr_err;
   assign prio30_wd = reg_wdata[1:0];
 
-  assign prio31_we = addr_hit[35] & reg_we & ~wr_err;
+  assign prio31_we = addr_hit[37] & reg_we & ~wr_err;
   assign prio31_wd = reg_wdata[1:0];
 
-  assign prio32_we = addr_hit[36] & reg_we & ~wr_err;
+  assign prio32_we = addr_hit[38] & reg_we & ~wr_err;
   assign prio32_wd = reg_wdata[1:0];
 
-  assign prio33_we = addr_hit[37] & reg_we & ~wr_err;
+  assign prio33_we = addr_hit[39] & reg_we & ~wr_err;
   assign prio33_wd = reg_wdata[1:0];
 
-  assign prio34_we = addr_hit[38] & reg_we & ~wr_err;
+  assign prio34_we = addr_hit[40] & reg_we & ~wr_err;
   assign prio34_wd = reg_wdata[1:0];
 
-  assign prio35_we = addr_hit[39] & reg_we & ~wr_err;
+  assign prio35_we = addr_hit[41] & reg_we & ~wr_err;
   assign prio35_wd = reg_wdata[1:0];
 
-  assign prio36_we = addr_hit[40] & reg_we & ~wr_err;
+  assign prio36_we = addr_hit[42] & reg_we & ~wr_err;
   assign prio36_wd = reg_wdata[1:0];
 
-  assign prio37_we = addr_hit[41] & reg_we & ~wr_err;
+  assign prio37_we = addr_hit[43] & reg_we & ~wr_err;
   assign prio37_wd = reg_wdata[1:0];
 
-  assign prio38_we = addr_hit[42] & reg_we & ~wr_err;
+  assign prio38_we = addr_hit[44] & reg_we & ~wr_err;
   assign prio38_wd = reg_wdata[1:0];
 
-  assign prio39_we = addr_hit[43] & reg_we & ~wr_err;
+  assign prio39_we = addr_hit[45] & reg_we & ~wr_err;
   assign prio39_wd = reg_wdata[1:0];
 
-  assign prio40_we = addr_hit[44] & reg_we & ~wr_err;
+  assign prio40_we = addr_hit[46] & reg_we & ~wr_err;
   assign prio40_wd = reg_wdata[1:0];
 
-  assign prio41_we = addr_hit[45] & reg_we & ~wr_err;
+  assign prio41_we = addr_hit[47] & reg_we & ~wr_err;
   assign prio41_wd = reg_wdata[1:0];
 
-  assign prio42_we = addr_hit[46] & reg_we & ~wr_err;
+  assign prio42_we = addr_hit[48] & reg_we & ~wr_err;
   assign prio42_wd = reg_wdata[1:0];
 
-  assign prio43_we = addr_hit[47] & reg_we & ~wr_err;
+  assign prio43_we = addr_hit[49] & reg_we & ~wr_err;
   assign prio43_wd = reg_wdata[1:0];
 
-  assign prio44_we = addr_hit[48] & reg_we & ~wr_err;
+  assign prio44_we = addr_hit[50] & reg_we & ~wr_err;
   assign prio44_wd = reg_wdata[1:0];
 
-  assign prio45_we = addr_hit[49] & reg_we & ~wr_err;
+  assign prio45_we = addr_hit[51] & reg_we & ~wr_err;
   assign prio45_wd = reg_wdata[1:0];
 
-  assign prio46_we = addr_hit[50] & reg_we & ~wr_err;
+  assign prio46_we = addr_hit[52] & reg_we & ~wr_err;
   assign prio46_wd = reg_wdata[1:0];
 
-  assign prio47_we = addr_hit[51] & reg_we & ~wr_err;
+  assign prio47_we = addr_hit[53] & reg_we & ~wr_err;
   assign prio47_wd = reg_wdata[1:0];
 
-  assign prio48_we = addr_hit[52] & reg_we & ~wr_err;
+  assign prio48_we = addr_hit[54] & reg_we & ~wr_err;
   assign prio48_wd = reg_wdata[1:0];
 
-  assign prio49_we = addr_hit[53] & reg_we & ~wr_err;
+  assign prio49_we = addr_hit[55] & reg_we & ~wr_err;
   assign prio49_wd = reg_wdata[1:0];
 
-  assign prio50_we = addr_hit[54] & reg_we & ~wr_err;
+  assign prio50_we = addr_hit[56] & reg_we & ~wr_err;
   assign prio50_wd = reg_wdata[1:0];
 
-  assign prio51_we = addr_hit[55] & reg_we & ~wr_err;
+  assign prio51_we = addr_hit[57] & reg_we & ~wr_err;
   assign prio51_wd = reg_wdata[1:0];
 
-  assign prio52_we = addr_hit[56] & reg_we & ~wr_err;
+  assign prio52_we = addr_hit[58] & reg_we & ~wr_err;
   assign prio52_wd = reg_wdata[1:0];
 
-  assign prio53_we = addr_hit[57] & reg_we & ~wr_err;
+  assign prio53_we = addr_hit[59] & reg_we & ~wr_err;
   assign prio53_wd = reg_wdata[1:0];
 
-  assign prio54_we = addr_hit[58] & reg_we & ~wr_err;
+  assign prio54_we = addr_hit[60] & reg_we & ~wr_err;
   assign prio54_wd = reg_wdata[1:0];
 
-  assign prio55_we = addr_hit[59] & reg_we & ~wr_err;
+  assign prio55_we = addr_hit[61] & reg_we & ~wr_err;
   assign prio55_wd = reg_wdata[1:0];
 
-  assign prio56_we = addr_hit[60] & reg_we & ~wr_err;
+  assign prio56_we = addr_hit[62] & reg_we & ~wr_err;
   assign prio56_wd = reg_wdata[1:0];
 
-  assign prio57_we = addr_hit[61] & reg_we & ~wr_err;
+  assign prio57_we = addr_hit[63] & reg_we & ~wr_err;
   assign prio57_wd = reg_wdata[1:0];
 
-  assign prio58_we = addr_hit[62] & reg_we & ~wr_err;
+  assign prio58_we = addr_hit[64] & reg_we & ~wr_err;
   assign prio58_wd = reg_wdata[1:0];
 
-  assign prio59_we = addr_hit[63] & reg_we & ~wr_err;
+  assign prio59_we = addr_hit[65] & reg_we & ~wr_err;
   assign prio59_wd = reg_wdata[1:0];
 
-  assign prio60_we = addr_hit[64] & reg_we & ~wr_err;
+  assign prio60_we = addr_hit[66] & reg_we & ~wr_err;
   assign prio60_wd = reg_wdata[1:0];
 
-  assign prio61_we = addr_hit[65] & reg_we & ~wr_err;
+  assign prio61_we = addr_hit[67] & reg_we & ~wr_err;
   assign prio61_wd = reg_wdata[1:0];
 
-  assign prio62_we = addr_hit[66] & reg_we & ~wr_err;
+  assign prio62_we = addr_hit[68] & reg_we & ~wr_err;
   assign prio62_wd = reg_wdata[1:0];
 
-  assign ie00_e0_we = addr_hit[67] & reg_we & ~wr_err;
+  assign prio63_we = addr_hit[69] & reg_we & ~wr_err;
+  assign prio63_wd = reg_wdata[1:0];
+
+  assign prio64_we = addr_hit[70] & reg_we & ~wr_err;
+  assign prio64_wd = reg_wdata[1:0];
+
+  assign prio65_we = addr_hit[71] & reg_we & ~wr_err;
+  assign prio65_wd = reg_wdata[1:0];
+
+  assign prio66_we = addr_hit[72] & reg_we & ~wr_err;
+  assign prio66_wd = reg_wdata[1:0];
+
+  assign prio67_we = addr_hit[73] & reg_we & ~wr_err;
+  assign prio67_wd = reg_wdata[1:0];
+
+  assign prio68_we = addr_hit[74] & reg_we & ~wr_err;
+  assign prio68_wd = reg_wdata[1:0];
+
+  assign prio69_we = addr_hit[75] & reg_we & ~wr_err;
+  assign prio69_wd = reg_wdata[1:0];
+
+  assign prio70_we = addr_hit[76] & reg_we & ~wr_err;
+  assign prio70_wd = reg_wdata[1:0];
+
+  assign prio71_we = addr_hit[77] & reg_we & ~wr_err;
+  assign prio71_wd = reg_wdata[1:0];
+
+  assign prio72_we = addr_hit[78] & reg_we & ~wr_err;
+  assign prio72_wd = reg_wdata[1:0];
+
+  assign prio73_we = addr_hit[79] & reg_we & ~wr_err;
+  assign prio73_wd = reg_wdata[1:0];
+
+  assign prio74_we = addr_hit[80] & reg_we & ~wr_err;
+  assign prio74_wd = reg_wdata[1:0];
+
+  assign prio75_we = addr_hit[81] & reg_we & ~wr_err;
+  assign prio75_wd = reg_wdata[1:0];
+
+  assign prio76_we = addr_hit[82] & reg_we & ~wr_err;
+  assign prio76_wd = reg_wdata[1:0];
+
+  assign prio77_we = addr_hit[83] & reg_we & ~wr_err;
+  assign prio77_wd = reg_wdata[1:0];
+
+  assign prio78_we = addr_hit[84] & reg_we & ~wr_err;
+  assign prio78_wd = reg_wdata[1:0];
+
+  assign ie00_e0_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e0_wd = reg_wdata[0];
 
-  assign ie00_e1_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e1_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e1_wd = reg_wdata[1];
 
-  assign ie00_e2_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e2_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e2_wd = reg_wdata[2];
 
-  assign ie00_e3_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e3_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e3_wd = reg_wdata[3];
 
-  assign ie00_e4_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e4_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e4_wd = reg_wdata[4];
 
-  assign ie00_e5_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e5_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e5_wd = reg_wdata[5];
 
-  assign ie00_e6_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e6_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e6_wd = reg_wdata[6];
 
-  assign ie00_e7_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e7_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e7_wd = reg_wdata[7];
 
-  assign ie00_e8_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e8_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e8_wd = reg_wdata[8];
 
-  assign ie00_e9_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e9_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e9_wd = reg_wdata[9];
 
-  assign ie00_e10_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e10_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e10_wd = reg_wdata[10];
 
-  assign ie00_e11_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e11_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e11_wd = reg_wdata[11];
 
-  assign ie00_e12_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e12_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e12_wd = reg_wdata[12];
 
-  assign ie00_e13_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e13_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e13_wd = reg_wdata[13];
 
-  assign ie00_e14_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e14_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e14_wd = reg_wdata[14];
 
-  assign ie00_e15_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e15_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e15_wd = reg_wdata[15];
 
-  assign ie00_e16_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e16_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e16_wd = reg_wdata[16];
 
-  assign ie00_e17_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e17_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e17_wd = reg_wdata[17];
 
-  assign ie00_e18_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e18_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e18_wd = reg_wdata[18];
 
-  assign ie00_e19_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e19_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e19_wd = reg_wdata[19];
 
-  assign ie00_e20_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e20_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e20_wd = reg_wdata[20];
 
-  assign ie00_e21_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e21_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e21_wd = reg_wdata[21];
 
-  assign ie00_e22_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e22_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e22_wd = reg_wdata[22];
 
-  assign ie00_e23_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e23_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e23_wd = reg_wdata[23];
 
-  assign ie00_e24_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e24_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e24_wd = reg_wdata[24];
 
-  assign ie00_e25_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e25_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e25_wd = reg_wdata[25];
 
-  assign ie00_e26_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e26_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e26_wd = reg_wdata[26];
 
-  assign ie00_e27_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e27_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e27_wd = reg_wdata[27];
 
-  assign ie00_e28_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e28_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e28_wd = reg_wdata[28];
 
-  assign ie00_e29_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e29_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e29_wd = reg_wdata[29];
 
-  assign ie00_e30_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e30_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e30_wd = reg_wdata[30];
 
-  assign ie00_e31_we = addr_hit[67] & reg_we & ~wr_err;
+  assign ie00_e31_we = addr_hit[85] & reg_we & ~wr_err;
   assign ie00_e31_wd = reg_wdata[31];
 
-  assign ie01_e32_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e32_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e32_wd = reg_wdata[0];
 
-  assign ie01_e33_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e33_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e33_wd = reg_wdata[1];
 
-  assign ie01_e34_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e34_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e34_wd = reg_wdata[2];
 
-  assign ie01_e35_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e35_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e35_wd = reg_wdata[3];
 
-  assign ie01_e36_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e36_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e36_wd = reg_wdata[4];
 
-  assign ie01_e37_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e37_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e37_wd = reg_wdata[5];
 
-  assign ie01_e38_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e38_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e38_wd = reg_wdata[6];
 
-  assign ie01_e39_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e39_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e39_wd = reg_wdata[7];
 
-  assign ie01_e40_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e40_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e40_wd = reg_wdata[8];
 
-  assign ie01_e41_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e41_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e41_wd = reg_wdata[9];
 
-  assign ie01_e42_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e42_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e42_wd = reg_wdata[10];
 
-  assign ie01_e43_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e43_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e43_wd = reg_wdata[11];
 
-  assign ie01_e44_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e44_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e44_wd = reg_wdata[12];
 
-  assign ie01_e45_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e45_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e45_wd = reg_wdata[13];
 
-  assign ie01_e46_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e46_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e46_wd = reg_wdata[14];
 
-  assign ie01_e47_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e47_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e47_wd = reg_wdata[15];
 
-  assign ie01_e48_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e48_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e48_wd = reg_wdata[16];
 
-  assign ie01_e49_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e49_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e49_wd = reg_wdata[17];
 
-  assign ie01_e50_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e50_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e50_wd = reg_wdata[18];
 
-  assign ie01_e51_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e51_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e51_wd = reg_wdata[19];
 
-  assign ie01_e52_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e52_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e52_wd = reg_wdata[20];
 
-  assign ie01_e53_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e53_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e53_wd = reg_wdata[21];
 
-  assign ie01_e54_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e54_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e54_wd = reg_wdata[22];
 
-  assign ie01_e55_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e55_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e55_wd = reg_wdata[23];
 
-  assign ie01_e56_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e56_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e56_wd = reg_wdata[24];
 
-  assign ie01_e57_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e57_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e57_wd = reg_wdata[25];
 
-  assign ie01_e58_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e58_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e58_wd = reg_wdata[26];
 
-  assign ie01_e59_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e59_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e59_wd = reg_wdata[27];
 
-  assign ie01_e60_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e60_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e60_wd = reg_wdata[28];
 
-  assign ie01_e61_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e61_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e61_wd = reg_wdata[29];
 
-  assign ie01_e62_we = addr_hit[68] & reg_we & ~wr_err;
+  assign ie01_e62_we = addr_hit[86] & reg_we & ~wr_err;
   assign ie01_e62_wd = reg_wdata[30];
 
-  assign threshold0_we = addr_hit[69] & reg_we & ~wr_err;
+  assign ie01_e63_we = addr_hit[86] & reg_we & ~wr_err;
+  assign ie01_e63_wd = reg_wdata[31];
+
+  assign ie02_e64_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e64_wd = reg_wdata[0];
+
+  assign ie02_e65_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e65_wd = reg_wdata[1];
+
+  assign ie02_e66_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e66_wd = reg_wdata[2];
+
+  assign ie02_e67_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e67_wd = reg_wdata[3];
+
+  assign ie02_e68_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e68_wd = reg_wdata[4];
+
+  assign ie02_e69_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e69_wd = reg_wdata[5];
+
+  assign ie02_e70_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e70_wd = reg_wdata[6];
+
+  assign ie02_e71_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e71_wd = reg_wdata[7];
+
+  assign ie02_e72_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e72_wd = reg_wdata[8];
+
+  assign ie02_e73_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e73_wd = reg_wdata[9];
+
+  assign ie02_e74_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e74_wd = reg_wdata[10];
+
+  assign ie02_e75_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e75_wd = reg_wdata[11];
+
+  assign ie02_e76_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e76_wd = reg_wdata[12];
+
+  assign ie02_e77_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e77_wd = reg_wdata[13];
+
+  assign ie02_e78_we = addr_hit[87] & reg_we & ~wr_err;
+  assign ie02_e78_wd = reg_wdata[14];
+
+  assign threshold0_we = addr_hit[88] & reg_we & ~wr_err;
   assign threshold0_wd = reg_wdata[1:0];
 
-  assign cc0_we = addr_hit[70] & reg_we & ~wr_err;
-  assign cc0_wd = reg_wdata[5:0];
-  assign cc0_re = addr_hit[70] && reg_re;
+  assign cc0_we = addr_hit[89] & reg_we & ~wr_err;
+  assign cc0_wd = reg_wdata[6:0];
+  assign cc0_re = addr_hit[89] && reg_re;
 
-  assign msip0_we = addr_hit[71] & reg_we & ~wr_err;
+  assign msip0_we = addr_hit[90] & reg_we & ~wr_err;
   assign msip0_wd = reg_wdata[0];
 
   // Read data return
@@ -8226,9 +10257,28 @@
         reg_rdata_next[28] = ip1_p60_qs;
         reg_rdata_next[29] = ip1_p61_qs;
         reg_rdata_next[30] = ip1_p62_qs;
+        reg_rdata_next[31] = ip1_p63_qs;
       end
 
       addr_hit[2]: begin
+        reg_rdata_next[0] = ip2_p64_qs;
+        reg_rdata_next[1] = ip2_p65_qs;
+        reg_rdata_next[2] = ip2_p66_qs;
+        reg_rdata_next[3] = ip2_p67_qs;
+        reg_rdata_next[4] = ip2_p68_qs;
+        reg_rdata_next[5] = ip2_p69_qs;
+        reg_rdata_next[6] = ip2_p70_qs;
+        reg_rdata_next[7] = ip2_p71_qs;
+        reg_rdata_next[8] = ip2_p72_qs;
+        reg_rdata_next[9] = ip2_p73_qs;
+        reg_rdata_next[10] = ip2_p74_qs;
+        reg_rdata_next[11] = ip2_p75_qs;
+        reg_rdata_next[12] = ip2_p76_qs;
+        reg_rdata_next[13] = ip2_p77_qs;
+        reg_rdata_next[14] = ip2_p78_qs;
+      end
+
+      addr_hit[3]: begin
         reg_rdata_next[0] = le0_le0_qs;
         reg_rdata_next[1] = le0_le1_qs;
         reg_rdata_next[2] = le0_le2_qs;
@@ -8263,7 +10313,7 @@
         reg_rdata_next[31] = le0_le31_qs;
       end
 
-      addr_hit[3]: begin
+      addr_hit[4]: begin
         reg_rdata_next[0] = le1_le32_qs;
         reg_rdata_next[1] = le1_le33_qs;
         reg_rdata_next[2] = le1_le34_qs;
@@ -8295,261 +10345,344 @@
         reg_rdata_next[28] = le1_le60_qs;
         reg_rdata_next[29] = le1_le61_qs;
         reg_rdata_next[30] = le1_le62_qs;
-      end
-
-      addr_hit[4]: begin
-        reg_rdata_next[1:0] = prio0_qs;
+        reg_rdata_next[31] = le1_le63_qs;
       end
 
       addr_hit[5]: begin
-        reg_rdata_next[1:0] = prio1_qs;
+        reg_rdata_next[0] = le2_le64_qs;
+        reg_rdata_next[1] = le2_le65_qs;
+        reg_rdata_next[2] = le2_le66_qs;
+        reg_rdata_next[3] = le2_le67_qs;
+        reg_rdata_next[4] = le2_le68_qs;
+        reg_rdata_next[5] = le2_le69_qs;
+        reg_rdata_next[6] = le2_le70_qs;
+        reg_rdata_next[7] = le2_le71_qs;
+        reg_rdata_next[8] = le2_le72_qs;
+        reg_rdata_next[9] = le2_le73_qs;
+        reg_rdata_next[10] = le2_le74_qs;
+        reg_rdata_next[11] = le2_le75_qs;
+        reg_rdata_next[12] = le2_le76_qs;
+        reg_rdata_next[13] = le2_le77_qs;
+        reg_rdata_next[14] = le2_le78_qs;
       end
 
       addr_hit[6]: begin
-        reg_rdata_next[1:0] = prio2_qs;
+        reg_rdata_next[1:0] = prio0_qs;
       end
 
       addr_hit[7]: begin
-        reg_rdata_next[1:0] = prio3_qs;
+        reg_rdata_next[1:0] = prio1_qs;
       end
 
       addr_hit[8]: begin
-        reg_rdata_next[1:0] = prio4_qs;
+        reg_rdata_next[1:0] = prio2_qs;
       end
 
       addr_hit[9]: begin
-        reg_rdata_next[1:0] = prio5_qs;
+        reg_rdata_next[1:0] = prio3_qs;
       end
 
       addr_hit[10]: begin
-        reg_rdata_next[1:0] = prio6_qs;
+        reg_rdata_next[1:0] = prio4_qs;
       end
 
       addr_hit[11]: begin
-        reg_rdata_next[1:0] = prio7_qs;
+        reg_rdata_next[1:0] = prio5_qs;
       end
 
       addr_hit[12]: begin
-        reg_rdata_next[1:0] = prio8_qs;
+        reg_rdata_next[1:0] = prio6_qs;
       end
 
       addr_hit[13]: begin
-        reg_rdata_next[1:0] = prio9_qs;
+        reg_rdata_next[1:0] = prio7_qs;
       end
 
       addr_hit[14]: begin
-        reg_rdata_next[1:0] = prio10_qs;
+        reg_rdata_next[1:0] = prio8_qs;
       end
 
       addr_hit[15]: begin
-        reg_rdata_next[1:0] = prio11_qs;
+        reg_rdata_next[1:0] = prio9_qs;
       end
 
       addr_hit[16]: begin
-        reg_rdata_next[1:0] = prio12_qs;
+        reg_rdata_next[1:0] = prio10_qs;
       end
 
       addr_hit[17]: begin
-        reg_rdata_next[1:0] = prio13_qs;
+        reg_rdata_next[1:0] = prio11_qs;
       end
 
       addr_hit[18]: begin
-        reg_rdata_next[1:0] = prio14_qs;
+        reg_rdata_next[1:0] = prio12_qs;
       end
 
       addr_hit[19]: begin
-        reg_rdata_next[1:0] = prio15_qs;
+        reg_rdata_next[1:0] = prio13_qs;
       end
 
       addr_hit[20]: begin
-        reg_rdata_next[1:0] = prio16_qs;
+        reg_rdata_next[1:0] = prio14_qs;
       end
 
       addr_hit[21]: begin
-        reg_rdata_next[1:0] = prio17_qs;
+        reg_rdata_next[1:0] = prio15_qs;
       end
 
       addr_hit[22]: begin
-        reg_rdata_next[1:0] = prio18_qs;
+        reg_rdata_next[1:0] = prio16_qs;
       end
 
       addr_hit[23]: begin
-        reg_rdata_next[1:0] = prio19_qs;
+        reg_rdata_next[1:0] = prio17_qs;
       end
 
       addr_hit[24]: begin
-        reg_rdata_next[1:0] = prio20_qs;
+        reg_rdata_next[1:0] = prio18_qs;
       end
 
       addr_hit[25]: begin
-        reg_rdata_next[1:0] = prio21_qs;
+        reg_rdata_next[1:0] = prio19_qs;
       end
 
       addr_hit[26]: begin
-        reg_rdata_next[1:0] = prio22_qs;
+        reg_rdata_next[1:0] = prio20_qs;
       end
 
       addr_hit[27]: begin
-        reg_rdata_next[1:0] = prio23_qs;
+        reg_rdata_next[1:0] = prio21_qs;
       end
 
       addr_hit[28]: begin
-        reg_rdata_next[1:0] = prio24_qs;
+        reg_rdata_next[1:0] = prio22_qs;
       end
 
       addr_hit[29]: begin
-        reg_rdata_next[1:0] = prio25_qs;
+        reg_rdata_next[1:0] = prio23_qs;
       end
 
       addr_hit[30]: begin
-        reg_rdata_next[1:0] = prio26_qs;
+        reg_rdata_next[1:0] = prio24_qs;
       end
 
       addr_hit[31]: begin
-        reg_rdata_next[1:0] = prio27_qs;
+        reg_rdata_next[1:0] = prio25_qs;
       end
 
       addr_hit[32]: begin
-        reg_rdata_next[1:0] = prio28_qs;
+        reg_rdata_next[1:0] = prio26_qs;
       end
 
       addr_hit[33]: begin
-        reg_rdata_next[1:0] = prio29_qs;
+        reg_rdata_next[1:0] = prio27_qs;
       end
 
       addr_hit[34]: begin
-        reg_rdata_next[1:0] = prio30_qs;
+        reg_rdata_next[1:0] = prio28_qs;
       end
 
       addr_hit[35]: begin
-        reg_rdata_next[1:0] = prio31_qs;
+        reg_rdata_next[1:0] = prio29_qs;
       end
 
       addr_hit[36]: begin
-        reg_rdata_next[1:0] = prio32_qs;
+        reg_rdata_next[1:0] = prio30_qs;
       end
 
       addr_hit[37]: begin
-        reg_rdata_next[1:0] = prio33_qs;
+        reg_rdata_next[1:0] = prio31_qs;
       end
 
       addr_hit[38]: begin
-        reg_rdata_next[1:0] = prio34_qs;
+        reg_rdata_next[1:0] = prio32_qs;
       end
 
       addr_hit[39]: begin
-        reg_rdata_next[1:0] = prio35_qs;
+        reg_rdata_next[1:0] = prio33_qs;
       end
 
       addr_hit[40]: begin
-        reg_rdata_next[1:0] = prio36_qs;
+        reg_rdata_next[1:0] = prio34_qs;
       end
 
       addr_hit[41]: begin
-        reg_rdata_next[1:0] = prio37_qs;
+        reg_rdata_next[1:0] = prio35_qs;
       end
 
       addr_hit[42]: begin
-        reg_rdata_next[1:0] = prio38_qs;
+        reg_rdata_next[1:0] = prio36_qs;
       end
 
       addr_hit[43]: begin
-        reg_rdata_next[1:0] = prio39_qs;
+        reg_rdata_next[1:0] = prio37_qs;
       end
 
       addr_hit[44]: begin
-        reg_rdata_next[1:0] = prio40_qs;
+        reg_rdata_next[1:0] = prio38_qs;
       end
 
       addr_hit[45]: begin
-        reg_rdata_next[1:0] = prio41_qs;
+        reg_rdata_next[1:0] = prio39_qs;
       end
 
       addr_hit[46]: begin
-        reg_rdata_next[1:0] = prio42_qs;
+        reg_rdata_next[1:0] = prio40_qs;
       end
 
       addr_hit[47]: begin
-        reg_rdata_next[1:0] = prio43_qs;
+        reg_rdata_next[1:0] = prio41_qs;
       end
 
       addr_hit[48]: begin
-        reg_rdata_next[1:0] = prio44_qs;
+        reg_rdata_next[1:0] = prio42_qs;
       end
 
       addr_hit[49]: begin
-        reg_rdata_next[1:0] = prio45_qs;
+        reg_rdata_next[1:0] = prio43_qs;
       end
 
       addr_hit[50]: begin
-        reg_rdata_next[1:0] = prio46_qs;
+        reg_rdata_next[1:0] = prio44_qs;
       end
 
       addr_hit[51]: begin
-        reg_rdata_next[1:0] = prio47_qs;
+        reg_rdata_next[1:0] = prio45_qs;
       end
 
       addr_hit[52]: begin
-        reg_rdata_next[1:0] = prio48_qs;
+        reg_rdata_next[1:0] = prio46_qs;
       end
 
       addr_hit[53]: begin
-        reg_rdata_next[1:0] = prio49_qs;
+        reg_rdata_next[1:0] = prio47_qs;
       end
 
       addr_hit[54]: begin
-        reg_rdata_next[1:0] = prio50_qs;
+        reg_rdata_next[1:0] = prio48_qs;
       end
 
       addr_hit[55]: begin
-        reg_rdata_next[1:0] = prio51_qs;
+        reg_rdata_next[1:0] = prio49_qs;
       end
 
       addr_hit[56]: begin
-        reg_rdata_next[1:0] = prio52_qs;
+        reg_rdata_next[1:0] = prio50_qs;
       end
 
       addr_hit[57]: begin
-        reg_rdata_next[1:0] = prio53_qs;
+        reg_rdata_next[1:0] = prio51_qs;
       end
 
       addr_hit[58]: begin
-        reg_rdata_next[1:0] = prio54_qs;
+        reg_rdata_next[1:0] = prio52_qs;
       end
 
       addr_hit[59]: begin
-        reg_rdata_next[1:0] = prio55_qs;
+        reg_rdata_next[1:0] = prio53_qs;
       end
 
       addr_hit[60]: begin
-        reg_rdata_next[1:0] = prio56_qs;
+        reg_rdata_next[1:0] = prio54_qs;
       end
 
       addr_hit[61]: begin
-        reg_rdata_next[1:0] = prio57_qs;
+        reg_rdata_next[1:0] = prio55_qs;
       end
 
       addr_hit[62]: begin
-        reg_rdata_next[1:0] = prio58_qs;
+        reg_rdata_next[1:0] = prio56_qs;
       end
 
       addr_hit[63]: begin
-        reg_rdata_next[1:0] = prio59_qs;
+        reg_rdata_next[1:0] = prio57_qs;
       end
 
       addr_hit[64]: begin
-        reg_rdata_next[1:0] = prio60_qs;
+        reg_rdata_next[1:0] = prio58_qs;
       end
 
       addr_hit[65]: begin
-        reg_rdata_next[1:0] = prio61_qs;
+        reg_rdata_next[1:0] = prio59_qs;
       end
 
       addr_hit[66]: begin
-        reg_rdata_next[1:0] = prio62_qs;
+        reg_rdata_next[1:0] = prio60_qs;
       end
 
       addr_hit[67]: begin
+        reg_rdata_next[1:0] = prio61_qs;
+      end
+
+      addr_hit[68]: begin
+        reg_rdata_next[1:0] = prio62_qs;
+      end
+
+      addr_hit[69]: begin
+        reg_rdata_next[1:0] = prio63_qs;
+      end
+
+      addr_hit[70]: begin
+        reg_rdata_next[1:0] = prio64_qs;
+      end
+
+      addr_hit[71]: begin
+        reg_rdata_next[1:0] = prio65_qs;
+      end
+
+      addr_hit[72]: begin
+        reg_rdata_next[1:0] = prio66_qs;
+      end
+
+      addr_hit[73]: begin
+        reg_rdata_next[1:0] = prio67_qs;
+      end
+
+      addr_hit[74]: begin
+        reg_rdata_next[1:0] = prio68_qs;
+      end
+
+      addr_hit[75]: begin
+        reg_rdata_next[1:0] = prio69_qs;
+      end
+
+      addr_hit[76]: begin
+        reg_rdata_next[1:0] = prio70_qs;
+      end
+
+      addr_hit[77]: begin
+        reg_rdata_next[1:0] = prio71_qs;
+      end
+
+      addr_hit[78]: begin
+        reg_rdata_next[1:0] = prio72_qs;
+      end
+
+      addr_hit[79]: begin
+        reg_rdata_next[1:0] = prio73_qs;
+      end
+
+      addr_hit[80]: begin
+        reg_rdata_next[1:0] = prio74_qs;
+      end
+
+      addr_hit[81]: begin
+        reg_rdata_next[1:0] = prio75_qs;
+      end
+
+      addr_hit[82]: begin
+        reg_rdata_next[1:0] = prio76_qs;
+      end
+
+      addr_hit[83]: begin
+        reg_rdata_next[1:0] = prio77_qs;
+      end
+
+      addr_hit[84]: begin
+        reg_rdata_next[1:0] = prio78_qs;
+      end
+
+      addr_hit[85]: begin
         reg_rdata_next[0] = ie00_e0_qs;
         reg_rdata_next[1] = ie00_e1_qs;
         reg_rdata_next[2] = ie00_e2_qs;
@@ -8584,7 +10717,7 @@
         reg_rdata_next[31] = ie00_e31_qs;
       end
 
-      addr_hit[68]: begin
+      addr_hit[86]: begin
         reg_rdata_next[0] = ie01_e32_qs;
         reg_rdata_next[1] = ie01_e33_qs;
         reg_rdata_next[2] = ie01_e34_qs;
@@ -8616,17 +10749,36 @@
         reg_rdata_next[28] = ie01_e60_qs;
         reg_rdata_next[29] = ie01_e61_qs;
         reg_rdata_next[30] = ie01_e62_qs;
+        reg_rdata_next[31] = ie01_e63_qs;
       end
 
-      addr_hit[69]: begin
+      addr_hit[87]: begin
+        reg_rdata_next[0] = ie02_e64_qs;
+        reg_rdata_next[1] = ie02_e65_qs;
+        reg_rdata_next[2] = ie02_e66_qs;
+        reg_rdata_next[3] = ie02_e67_qs;
+        reg_rdata_next[4] = ie02_e68_qs;
+        reg_rdata_next[5] = ie02_e69_qs;
+        reg_rdata_next[6] = ie02_e70_qs;
+        reg_rdata_next[7] = ie02_e71_qs;
+        reg_rdata_next[8] = ie02_e72_qs;
+        reg_rdata_next[9] = ie02_e73_qs;
+        reg_rdata_next[10] = ie02_e74_qs;
+        reg_rdata_next[11] = ie02_e75_qs;
+        reg_rdata_next[12] = ie02_e76_qs;
+        reg_rdata_next[13] = ie02_e77_qs;
+        reg_rdata_next[14] = ie02_e78_qs;
+      end
+
+      addr_hit[88]: begin
         reg_rdata_next[1:0] = threshold0_qs;
       end
 
-      addr_hit[70]: begin
-        reg_rdata_next[5:0] = cc0_qs;
+      addr_hit[89]: begin
+        reg_rdata_next[6:0] = cc0_qs;
       end
 
-      addr_hit[71]: begin
+      addr_hit[90]: begin
         reg_rdata_next[0] = msip0_qs;
       end
 
diff --git a/hw/top_earlgrey/ip/xbar_main/data/autogen/xbar_main.gen.hjson b/hw/top_earlgrey/ip/xbar_main/data/autogen/xbar_main.gen.hjson
index c75e474..2688c3f 100644
--- a/hw/top_earlgrey/ip/xbar_main/data/autogen/xbar_main.gen.hjson
+++ b/hw/top_earlgrey/ip/xbar_main/data/autogen/xbar_main.gen.hjson
@@ -176,6 +176,10 @@
           base_addr: 0x40080000
           size_byte: 0x1000
         }
+        {
+          base_addr: 0x40150000
+          size_byte: 0x1000
+        }
       ]
     }
     {
diff --git a/hw/top_earlgrey/ip/xbar_main/dv/autogen/xbar_env_pkg__params.sv b/hw/top_earlgrey/ip/xbar_main/dv/autogen/xbar_env_pkg__params.sv
index 73ef87d..3bf0637 100644
--- a/hw/top_earlgrey/ip/xbar_main/dv/autogen/xbar_env_pkg__params.sv
+++ b/hw/top_earlgrey/ip/xbar_main/dv/autogen/xbar_env_pkg__params.sv
@@ -21,7 +21,8 @@
     }},
     '{"peri", '{
         '{32'h40000000, 32'h40020fff},
-        '{32'h40080000, 32'h40080fff}
+        '{32'h40080000, 32'h40080fff},
+        '{32'h40150000, 32'h40150fff}
     }},
     '{"flash_ctrl", '{
         '{32'h40030000, 32'h40030fff}
diff --git a/hw/top_earlgrey/ip/xbar_main/rtl/autogen/tl_main_pkg.sv b/hw/top_earlgrey/ip/xbar_main/rtl/autogen/tl_main_pkg.sv
index 15573dd..84f3b59 100644
--- a/hw/top_earlgrey/ip/xbar_main/rtl/autogen/tl_main_pkg.sv
+++ b/hw/top_earlgrey/ip/xbar_main/rtl/autogen/tl_main_pkg.sv
@@ -10,9 +10,10 @@
   localparam logic [31:0] ADDR_SPACE_DEBUG_MEM     = 32'h 1a110000;
   localparam logic [31:0] ADDR_SPACE_RAM_MAIN      = 32'h 10000000;
   localparam logic [31:0] ADDR_SPACE_EFLASH        = 32'h 20000000;
-  localparam logic [1:0][31:0] ADDR_SPACE_PERI          = {
+  localparam logic [2:0][31:0] ADDR_SPACE_PERI          = {
     32'h 40000000,
-    32'h 40080000
+    32'h 40080000,
+    32'h 40150000
   };
   localparam logic [31:0] ADDR_SPACE_FLASH_CTRL    = 32'h 40030000;
   localparam logic [31:0] ADDR_SPACE_HMAC          = 32'h 40120000;
@@ -26,8 +27,9 @@
   localparam logic [31:0] ADDR_MASK_DEBUG_MEM     = 32'h 00000fff;
   localparam logic [31:0] ADDR_MASK_RAM_MAIN      = 32'h 0000ffff;
   localparam logic [31:0] ADDR_MASK_EFLASH        = 32'h 0007ffff;
-  localparam logic [1:0][31:0] ADDR_MASK_PERI          = {
+  localparam logic [2:0][31:0] ADDR_MASK_PERI          = {
     32'h 00020fff,
+    32'h 00000fff,
     32'h 00000fff
   };
   localparam logic [31:0] ADDR_MASK_FLASH_CTRL    = 32'h 00000fff;
diff --git a/hw/top_earlgrey/ip/xbar_main/rtl/autogen/xbar_main.sv b/hw/top_earlgrey/ip/xbar_main/rtl/autogen/xbar_main.sv
index 592566e..b091744 100644
--- a/hw/top_earlgrey/ip/xbar_main/rtl/autogen/xbar_main.sv
+++ b/hw/top_earlgrey/ip/xbar_main/rtl/autogen/xbar_main.sv
@@ -406,7 +406,9 @@
       ((tl_s1n_20_us_h2d.a_address <= (ADDR_MASK_PERI[0] + ADDR_SPACE_PERI[0])) &&
        (tl_s1n_20_us_h2d.a_address >= ADDR_SPACE_PERI[0])) ||
       ((tl_s1n_20_us_h2d.a_address <= (ADDR_MASK_PERI[1] + ADDR_SPACE_PERI[1])) &&
-       (tl_s1n_20_us_h2d.a_address >= ADDR_SPACE_PERI[1]))
+       (tl_s1n_20_us_h2d.a_address >= ADDR_SPACE_PERI[1])) ||
+      ((tl_s1n_20_us_h2d.a_address <= (ADDR_MASK_PERI[2] + ADDR_SPACE_PERI[2])) &&
+       (tl_s1n_20_us_h2d.a_address >= ADDR_SPACE_PERI[2]))
     ) begin
       dev_sel_s1n_20 = 4'd4;
     
@@ -449,7 +451,9 @@
       ((tl_s1n_30_us_h2d.a_address <= (ADDR_MASK_PERI[0] + ADDR_SPACE_PERI[0])) &&
        (tl_s1n_30_us_h2d.a_address >= ADDR_SPACE_PERI[0])) ||
       ((tl_s1n_30_us_h2d.a_address <= (ADDR_MASK_PERI[1] + ADDR_SPACE_PERI[1])) &&
-       (tl_s1n_30_us_h2d.a_address >= ADDR_SPACE_PERI[1]))
+       (tl_s1n_30_us_h2d.a_address >= ADDR_SPACE_PERI[1])) ||
+      ((tl_s1n_30_us_h2d.a_address <= (ADDR_MASK_PERI[2] + ADDR_SPACE_PERI[2])) &&
+       (tl_s1n_30_us_h2d.a_address >= ADDR_SPACE_PERI[2]))
     ) begin
       dev_sel_s1n_30 = 4'd3;
     
diff --git a/hw/top_earlgrey/ip/xbar_peri/data/autogen/xbar_peri.gen.hjson b/hw/top_earlgrey/ip/xbar_peri/data/autogen/xbar_peri.gen.hjson
index 01d05a4..0f79f6f 100644
--- a/hw/top_earlgrey/ip/xbar_peri/data/autogen/xbar_peri.gen.hjson
+++ b/hw/top_earlgrey/ip/xbar_peri/data/autogen/xbar_peri.gen.hjson
@@ -25,6 +25,7 @@
       gpio
       spi_device
       rv_timer
+      usbdev
     ]
   }
   nodes:
@@ -107,6 +108,23 @@
       xbar: false
       pipeline_byp: "true"
     }
+    {
+      name: usbdev
+      type: device
+      clock: clk_peri_i
+      reset: rst_peri_ni
+      pipeline: "false"
+      inst_type: usbdev
+      addr_range:
+      [
+        {
+          base_addr: 0x40150000
+          size_byte: 0x1000
+        }
+      ]
+      xbar: false
+      pipeline_byp: "true"
+    }
   ]
   clock: clk_peri_i
   type: xbar
diff --git a/hw/top_earlgrey/ip/xbar_peri/dv/autogen/tb__xbar_connect.sv b/hw/top_earlgrey/ip/xbar_peri/dv/autogen/tb__xbar_connect.sv
index 740f688..cf39b07 100644
--- a/hw/top_earlgrey/ip/xbar_peri/dv/autogen/tb__xbar_connect.sv
+++ b/hw/top_earlgrey/ip/xbar_peri/dv/autogen/tb__xbar_connect.sv
@@ -19,3 +19,4 @@
 `CONNECT_TL_DEVICE_IF(gpio)
 `CONNECT_TL_DEVICE_IF(spi_device)
 `CONNECT_TL_DEVICE_IF(rv_timer)
+`CONNECT_TL_DEVICE_IF(usbdev)
diff --git a/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_env_pkg__params.sv b/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_env_pkg__params.sv
index 6c40c09..82ac3aa 100644
--- a/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_env_pkg__params.sv
+++ b/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_env_pkg__params.sv
@@ -18,6 +18,9 @@
     }},
     '{"rv_timer", '{
         '{32'h40080000, 32'h40080fff}
+    }},
+    '{"usbdev", '{
+        '{32'h40150000, 32'h40150fff}
 }}};
 
   // List of Xbar hosts
@@ -26,5 +29,6 @@
         "uart",
         "gpio",
         "spi_device",
-        "rv_timer"}}
+        "rv_timer",
+        "usbdev"}}
 };
diff --git a/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_peri_bind.sv b/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_peri_bind.sv
index 380c458..4df62a7 100644
--- a/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_peri_bind.sv
+++ b/hw/top_earlgrey/ip/xbar_peri/dv/autogen/xbar_peri_bind.sv
@@ -38,5 +38,11 @@
     .h2d    (tl_rv_timer_o),
     .d2h    (tl_rv_timer_i)
   );
+  bind xbar_peri tlul_assert #(.EndpointType("Host")) tlul_assert_device_usbdev (
+    .clk_i  (clk_peri_i),
+    .rst_ni (rst_peri_ni),
+    .h2d    (tl_usbdev_o),
+    .d2h    (tl_usbdev_i)
+  );
 
 endmodule
diff --git a/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/tl_peri_pkg.sv b/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/tl_peri_pkg.sv
index 3f303fa..f95de98 100644
--- a/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/tl_peri_pkg.sv
+++ b/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/tl_peri_pkg.sv
@@ -10,20 +10,23 @@
   localparam logic [31:0] ADDR_SPACE_GPIO       = 32'h 40010000;
   localparam logic [31:0] ADDR_SPACE_SPI_DEVICE = 32'h 40020000;
   localparam logic [31:0] ADDR_SPACE_RV_TIMER   = 32'h 40080000;
+  localparam logic [31:0] ADDR_SPACE_USBDEV     = 32'h 40150000;
 
   localparam logic [31:0] ADDR_MASK_UART       = 32'h 00000fff;
   localparam logic [31:0] ADDR_MASK_GPIO       = 32'h 00000fff;
   localparam logic [31:0] ADDR_MASK_SPI_DEVICE = 32'h 00000fff;
   localparam logic [31:0] ADDR_MASK_RV_TIMER   = 32'h 00000fff;
+  localparam logic [31:0] ADDR_MASK_USBDEV     = 32'h 00000fff;
 
   localparam int N_HOST   = 1;
-  localparam int N_DEVICE = 4;
+  localparam int N_DEVICE = 5;
 
   typedef enum int {
     TlUart = 0,
     TlGpio = 1,
     TlSpiDevice = 2,
-    TlRvTimer = 3
+    TlRvTimer = 3,
+    TlUsbdev = 4
   } tl_device_e;
 
   typedef enum int {
diff --git a/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/xbar_peri.sv b/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/xbar_peri.sv
index 4ee2010..d1775af 100644
--- a/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/xbar_peri.sv
+++ b/hw/top_earlgrey/ip/xbar_peri/rtl/autogen/xbar_peri.sv
@@ -7,11 +7,12 @@
 //
 // Interconnect
 // main
-//   -> s1n_5
+//   -> s1n_6
 //     -> uart
 //     -> gpio
 //     -> spi_device
 //     -> rv_timer
+//     -> usbdev
 
 module xbar_peri (
   input clk_peri_i,
@@ -30,6 +31,8 @@
   input  tlul_pkg::tl_d2h_t tl_spi_device_i,
   output tlul_pkg::tl_h2d_t tl_rv_timer_o,
   input  tlul_pkg::tl_d2h_t tl_rv_timer_i,
+  output tlul_pkg::tl_h2d_t tl_usbdev_o,
+  input  tlul_pkg::tl_d2h_t tl_usbdev_i,
 
   input scanmode_i
 );
@@ -42,47 +45,53 @@
   logic unused_scanmode;
   assign unused_scanmode = scanmode_i;
 
-  tl_h2d_t tl_s1n_5_us_h2d ;
-  tl_d2h_t tl_s1n_5_us_d2h ;
+  tl_h2d_t tl_s1n_6_us_h2d ;
+  tl_d2h_t tl_s1n_6_us_d2h ;
 
 
-  tl_h2d_t tl_s1n_5_ds_h2d [4];
-  tl_d2h_t tl_s1n_5_ds_d2h [4];
+  tl_h2d_t tl_s1n_6_ds_h2d [5];
+  tl_d2h_t tl_s1n_6_ds_d2h [5];
 
   // Create steering signal
-  logic [2:0] dev_sel_s1n_5;
+  logic [2:0] dev_sel_s1n_6;
 
 
 
-  assign tl_uart_o = tl_s1n_5_ds_h2d[0];
-  assign tl_s1n_5_ds_d2h[0] = tl_uart_i;
+  assign tl_uart_o = tl_s1n_6_ds_h2d[0];
+  assign tl_s1n_6_ds_d2h[0] = tl_uart_i;
 
-  assign tl_gpio_o = tl_s1n_5_ds_h2d[1];
-  assign tl_s1n_5_ds_d2h[1] = tl_gpio_i;
+  assign tl_gpio_o = tl_s1n_6_ds_h2d[1];
+  assign tl_s1n_6_ds_d2h[1] = tl_gpio_i;
 
-  assign tl_spi_device_o = tl_s1n_5_ds_h2d[2];
-  assign tl_s1n_5_ds_d2h[2] = tl_spi_device_i;
+  assign tl_spi_device_o = tl_s1n_6_ds_h2d[2];
+  assign tl_s1n_6_ds_d2h[2] = tl_spi_device_i;
 
-  assign tl_rv_timer_o = tl_s1n_5_ds_h2d[3];
-  assign tl_s1n_5_ds_d2h[3] = tl_rv_timer_i;
+  assign tl_rv_timer_o = tl_s1n_6_ds_h2d[3];
+  assign tl_s1n_6_ds_d2h[3] = tl_rv_timer_i;
 
-  assign tl_s1n_5_us_h2d = tl_main_i;
-  assign tl_main_o = tl_s1n_5_us_d2h;
+  assign tl_usbdev_o = tl_s1n_6_ds_h2d[4];
+  assign tl_s1n_6_ds_d2h[4] = tl_usbdev_i;
+
+  assign tl_s1n_6_us_h2d = tl_main_i;
+  assign tl_main_o = tl_s1n_6_us_d2h;
 
   always_comb begin
     // default steering to generate error response if address is not within the range
-    dev_sel_s1n_5 = 3'd4;
-    if ((tl_s1n_5_us_h2d.a_address & ~(ADDR_MASK_UART)) == ADDR_SPACE_UART) begin
-      dev_sel_s1n_5 = 3'd0;
+    dev_sel_s1n_6 = 3'd5;
+    if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_UART)) == ADDR_SPACE_UART) begin
+      dev_sel_s1n_6 = 3'd0;
     
-    end else if ((tl_s1n_5_us_h2d.a_address & ~(ADDR_MASK_GPIO)) == ADDR_SPACE_GPIO) begin
-      dev_sel_s1n_5 = 3'd1;
+    end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_GPIO)) == ADDR_SPACE_GPIO) begin
+      dev_sel_s1n_6 = 3'd1;
     
-    end else if ((tl_s1n_5_us_h2d.a_address & ~(ADDR_MASK_SPI_DEVICE)) == ADDR_SPACE_SPI_DEVICE) begin
-      dev_sel_s1n_5 = 3'd2;
+    end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_SPI_DEVICE)) == ADDR_SPACE_SPI_DEVICE) begin
+      dev_sel_s1n_6 = 3'd2;
     
-    end else if ((tl_s1n_5_us_h2d.a_address & ~(ADDR_MASK_RV_TIMER)) == ADDR_SPACE_RV_TIMER) begin
-      dev_sel_s1n_5 = 3'd3;
+    end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_RV_TIMER)) == ADDR_SPACE_RV_TIMER) begin
+      dev_sel_s1n_6 = 3'd3;
+    
+    end else if ((tl_s1n_6_us_h2d.a_address & ~(ADDR_MASK_USBDEV)) == ADDR_SPACE_USBDEV) begin
+      dev_sel_s1n_6 = 3'd4;
     end
   end
 
@@ -91,17 +100,17 @@
   tlul_socket_1n #(
     .HReqDepth (4'h0),
     .HRspDepth (4'h0),
-    .DReqDepth ({4{4'h0}}),
-    .DRspDepth ({4{4'h0}}),
-    .N         (4)
-  ) u_s1n_5 (
+    .DReqDepth ({5{4'h0}}),
+    .DRspDepth ({5{4'h0}}),
+    .N         (5)
+  ) u_s1n_6 (
     .clk_i        (clk_peri_i),
     .rst_ni       (rst_peri_ni),
-    .tl_h_i       (tl_s1n_5_us_h2d),
-    .tl_h_o       (tl_s1n_5_us_d2h),
-    .tl_d_o       (tl_s1n_5_ds_h2d),
-    .tl_d_i       (tl_s1n_5_ds_d2h),
-    .dev_select   (dev_sel_s1n_5)
+    .tl_h_i       (tl_s1n_6_us_h2d),
+    .tl_h_o       (tl_s1n_6_us_d2h),
+    .tl_d_o       (tl_s1n_6_ds_h2d),
+    .tl_d_i       (tl_s1n_6_ds_d2h),
+    .dev_select   (dev_sel_s1n_6)
   );
 
 endmodule
diff --git a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
index 73d19d4..5ced781 100644
--- a/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
+++ b/hw/top_earlgrey/rtl/autogen/top_earlgrey.sv
@@ -9,6 +9,9 @@
   input               clk_i,
   input               rst_ni,
 
+  // USB clock
+  input               clk_usb_48mhz_i,
+
   // JTAG interface
   input               jtag_tck_i,
   input               jtag_tms_i,
@@ -30,6 +33,15 @@
   input               dio_uart_rx_i,
   output logic        dio_uart_tx_o,
   output logic        dio_uart_tx_en_o,
+  input               dio_usbdev_sense_i,
+  output logic        dio_usbdev_pullup_o,
+  output logic        dio_usbdev_pullup_en_o,
+  input               dio_usbdev_dp_i,
+  output logic        dio_usbdev_dp_o,
+  output logic        dio_usbdev_dp_en_o,
+  input               dio_usbdev_dn_i,
+  output logic        dio_usbdev_dn_o,
+  output logic        dio_usbdev_dn_en_o,
 
   input               scanmode_i  // 1 for Scan
 );
@@ -85,6 +97,8 @@
   tl_d2h_t  tl_alert_handler_d_d2h;
   tl_h2d_t  tl_nmi_gen_d_h2d;
   tl_d2h_t  tl_nmi_gen_d_d2h;
+  tl_h2d_t  tl_usbdev_d_h2d;
+  tl_d2h_t  tl_usbdev_d_d2h;
 
   tl_h2d_t tl_rom_d_h2d;
   tl_d2h_t tl_rom_d_d2h;
@@ -106,10 +120,12 @@
   logic sys_rst_n;
   logic sys_fixed_rst_n;
   logic spi_device_rst_n;
+  logic usb_rst_n;
 
   //clock wires declaration
   logic main_clk;
   logic fixed_clk;
+  logic usb_clk;
 
   // Signals
   logic [31:0] m2p;
@@ -137,9 +153,19 @@
   // pinmux
   // alert_handler
   // nmi_gen
+  // usbdev
+  logic        cio_usbdev_sense_p2d;
+  logic        cio_usbdev_dp_p2d;
+  logic        cio_usbdev_dn_p2d;
+  logic        cio_usbdev_pullup_d2p;
+  logic        cio_usbdev_pullup_en_d2p;
+  logic        cio_usbdev_dp_d2p;
+  logic        cio_usbdev_dp_en_d2p;
+  logic        cio_usbdev_dn_d2p;
+  logic        cio_usbdev_dn_en_d2p;
 
 
-  logic [62:0]  intr_vector;
+  logic [78:0]  intr_vector;
   // Interrupt source list
   logic intr_uart_tx_watermark;
   logic intr_uart_rx_watermark;
@@ -174,13 +200,29 @@
   logic intr_nmi_gen_esc1;
   logic intr_nmi_gen_esc2;
   logic intr_nmi_gen_esc3;
+  logic intr_usbdev_pkt_received;
+  logic intr_usbdev_pkt_sent;
+  logic intr_usbdev_disconnected;
+  logic intr_usbdev_host_lost;
+  logic intr_usbdev_link_reset;
+  logic intr_usbdev_link_suspend;
+  logic intr_usbdev_link_resume;
+  logic intr_usbdev_av_empty;
+  logic intr_usbdev_rx_full;
+  logic intr_usbdev_av_overflow;
+  logic intr_usbdev_link_in_err;
+  logic intr_usbdev_rx_crc_err;
+  logic intr_usbdev_rx_pid_err;
+  logic intr_usbdev_rx_bitstuff_err;
+  logic intr_usbdev_frame;
+  logic intr_usbdev_connected;
 
 
   
   logic [0:0] irq_plic;
   logic [0:0] msip;
-  logic [5:0] irq_id[1];
-  logic [5:0] unused_irq_id[1];
+  logic [6:0] irq_id[1];
+  logic [6:0] unused_irq_id[1];
 
   // this avoids lint errors
   assign unused_irq_id = irq_id;
@@ -193,10 +235,13 @@
   prim_pkg::esc_rx_t [alert_pkg::N_ESC_SEV-1:0]  esc_rx;
 
 
-  // clock assignments
+  // Clock assignments
   assign main_clk = clk_i;
   assign fixed_clk = clk_i;
 
+  // Separate clock input for USB clock
+  assign usb_clk = clk_usb_48mhz_i;
+
   // Non-debug module reset == reset for everything except for the debug module
   logic ndmreset_req;
 
@@ -206,10 +251,17 @@
   assign lc_rst_n = rst_ni;
   assign sys_rst_n = (scanmode_i) ? lc_rst_n : ~ndmreset_req & lc_rst_n;
 
-  //non-root reset assignments
+  // Non-root reset assignments
   assign sys_fixed_rst_n = sys_rst_n;
   assign spi_device_rst_n = sys_rst_n;
 
+  // Reset synchronizer for USB
+  logic [1:0] usb_rst_q;
+  always_ff @(posedge usb_clk) begin
+    usb_rst_q <= {usb_rst_q[0], sys_rst_n};
+  end
+  assign usb_rst_n = sys_rst_n & usb_rst_q[1];
+
   // debug request from rv_dm to core
   logic debug_req;
 
@@ -619,8 +671,74 @@
       .rst_ni (sys_rst_n)
   );
 
+  usbdev usbdev (
+      .tl_i (tl_usbdev_d_h2d),
+      .tl_o (tl_usbdev_d_d2h),
+
+      // Differential data - Currently not used.
+      .cio_d_i          (1'b0),
+      .cio_d_o          (),
+      .cio_se0_o        (),
+
+      // Single-ended data
+      .cio_dp_i         (cio_usbdev_dp_p2d),
+      .cio_dn_i         (cio_usbdev_dn_p2d),
+      .cio_dp_o         (cio_usbdev_dp_d2p),
+      .cio_dn_o         (cio_usbdev_dn_d2p),
+
+      // Non-data I/O
+      .cio_sense_i      (cio_usbdev_sense_p2d),
+      .cio_oe_o         (cio_usbdev_dp_en_d2p),
+      .cio_tx_mode_se_o (),
+      .cio_pullup_en_o  (cio_usbdev_pullup_en_d2p),
+      .cio_suspend_o    (),
+
+      // Interrupt
+      .intr_pkt_received_o    (intr_usbdev_pkt_received),
+      .intr_pkt_sent_o        (intr_usbdev_pkt_sent),
+      .intr_disconnected_o    (intr_usbdev_disconnected),
+      .intr_host_lost_o       (intr_usbdev_host_lost),
+      .intr_link_reset_o      (intr_usbdev_link_reset),
+      .intr_link_suspend_o    (intr_usbdev_link_suspend),
+      .intr_link_resume_o     (intr_usbdev_link_resume),
+      .intr_av_empty_o        (intr_usbdev_av_empty),
+      .intr_rx_full_o         (intr_usbdev_rx_full),
+      .intr_av_overflow_o     (intr_usbdev_av_overflow),
+      .intr_link_in_err_o     (intr_usbdev_link_in_err),
+      .intr_rx_crc_err_o      (intr_usbdev_rx_crc_err),
+      .intr_rx_pid_err_o      (intr_usbdev_rx_pid_err),
+      .intr_rx_bitstuff_err_o (intr_usbdev_rx_bitstuff_err),
+      .intr_frame_o           (intr_usbdev_frame),
+      .intr_connected_o       (intr_usbdev_connected),
+
+      .clk_i (fixed_clk),
+      .clk_usb_48mhz_i (usb_clk),
+      .rst_ni (sys_fixed_rst_n),
+      .rst_usb_48mhz_ni (usb_rst_n)
+  );
+
+  // USB assignments
+  assign cio_usbdev_dn_en_d2p = cio_usbdev_dp_en_d2p; // have a single output enable only
+  assign cio_usbdev_pullup_d2p = 1'b1;
+
   // interrupt assignments
   assign intr_vector = {
+      intr_usbdev_connected,
+      intr_usbdev_frame,
+      intr_usbdev_rx_bitstuff_err,
+      intr_usbdev_rx_pid_err,
+      intr_usbdev_rx_crc_err,
+      intr_usbdev_link_in_err,
+      intr_usbdev_av_overflow,
+      intr_usbdev_rx_full,
+      intr_usbdev_av_empty,
+      intr_usbdev_link_resume,
+      intr_usbdev_link_suspend,
+      intr_usbdev_link_reset,
+      intr_usbdev_host_lost,
+      intr_usbdev_disconnected,
+      intr_usbdev_pkt_sent,
+      intr_usbdev_pkt_received,
       intr_nmi_gen_esc3,
       intr_nmi_gen_esc2,
       intr_nmi_gen_esc1,
@@ -707,6 +825,8 @@
     .tl_spi_device_i (tl_spi_device_d_d2h),
     .tl_rv_timer_o   (tl_rv_timer_d_h2d),
     .tl_rv_timer_i   (tl_rv_timer_d_d2h),
+    .tl_usbdev_o     (tl_usbdev_d_h2d),
+    .tl_usbdev_i     (tl_usbdev_d_d2h),
 
     .scanmode_i
   );
@@ -730,6 +850,15 @@
   assign cio_uart_rx_p2d          = dio_uart_rx_i;
   assign dio_uart_tx_o            = cio_uart_tx_d2p;
   assign dio_uart_tx_en_o         = cio_uart_tx_en_d2p;
+  assign cio_usbdev_sense_p2d     = dio_usbdev_sense_i;
+  assign dio_usbdev_pullup_o      = cio_usbdev_pullup_d2p;
+  assign dio_usbdev_pullup_en_o   = cio_usbdev_pullup_en_d2p;
+  assign cio_usbdev_dp_p2d        = dio_usbdev_dp_i;
+  assign dio_usbdev_dp_o          = cio_usbdev_dp_d2p;
+  assign dio_usbdev_dp_en_o       = cio_usbdev_dp_en_d2p;
+  assign cio_usbdev_dn_p2d        = dio_usbdev_dn_i;
+  assign dio_usbdev_dn_o          = cio_usbdev_dn_d2p;
+  assign dio_usbdev_dn_en_o       = cio_usbdev_dn_en_d2p;
 
   // make sure scanmode_i is never X (including during reset)
   `ASSERT_KNOWN(scanmodeKnown, scanmode_i, clk_i, 0)
diff --git a/hw/top_earlgrey/rtl/padctl.sv b/hw/top_earlgrey/rtl/padctl.sv
index bdef783..89f737d 100644
--- a/hw/top_earlgrey/rtl/padctl.sv
+++ b/hw/top_earlgrey/rtl/padctl.sv
@@ -31,6 +31,21 @@
   inout   IO_GP13,
   inout   IO_GP14,
   inout   IO_GP15,
+  // USB device side
+  output cio_usbdev_sense_p2d,
+  input  cio_usbdev_pullup_d2p,
+  input  cio_usbdev_pullup_en_d2p,
+  output cio_usbdev_dp_p2d,
+  input  cio_usbdev_dp_d2p,
+  input  cio_usbdev_dp_en_d2p,
+  output cio_usbdev_dn_p2d,
+  input  cio_usbdev_dn_d2p,
+  input  cio_usbdev_dn_en_d2p,
+  // USB pads
+  inout  IO_USB_DP0,
+  inout  IO_USB_DN0,
+  input  IO_USB_SENSE0,
+  output IO_USB_PULLUP0,
 
   // SPI device interface
   output cio_spi_device_sck_p2d,
@@ -56,6 +71,19 @@
   input  IO_DPS7
 );
 
+  // USB
+  assign cio_usbdev_sense_p2d = IO_USB_SENSE0;
+  assign IO_USB_PULLUP0       = cio_usbdev_pullup_en_d2p ? cio_usbdev_pullup_d2p : 1'bz;
+
+  assign IO_USB_DP0 = cio_usbdev_dp_en_d2p ? cio_usbdev_dp_d2p : 1'bz;
+  assign IO_USB_DN0 = cio_usbdev_dn_en_d2p ? cio_usbdev_dn_d2p : 1'bz;
+
+  // Note that while transmitting, the receive (p2d) line must be fixed.
+  // Otherwise you are trying to regenerate the bit clock from the bit
+  // clock you are regenerating, rather than just holding the phase.
+  assign cio_usbdev_dp_p2d = cio_usbdev_dp_en_d2p ? 1'b1 : IO_USB_DP0;
+  assign cio_usbdev_dn_p2d = cio_usbdev_dn_en_d2p ? 1'b0 : IO_USB_DN0;
+
   // JTAG or SPI mux to the FTDI MSEE pins DPS0-DPS6
   logic    jtag_spi_n, dps2, dps2_en;
   logic    boot_strap;
diff --git a/hw/top_earlgrey/rtl/padctl_usb.sv b/hw/top_earlgrey/rtl/padctl_usb.sv
deleted file mode 100644
index d470c6e..0000000
--- a/hw/top_earlgrey/rtl/padctl_usb.sv
+++ /dev/null
@@ -1,158 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-module padctl_usb (
-  // UART device side
-  input   cio_uart_tx_d2p,
-  input   cio_uart_tx_en_d2p,
-  output  cio_uart_rx_p2d,
-  // USB device side
-  output        cio_usb_dp_p2d[2],
-  input         cio_usb_dp_d2p[2],
-  input         cio_usb_dp_en_d2p[2],
-  output        cio_usb_dn_p2d[2],
-  input         cio_usb_dn_d2p[2],
-  input         cio_usb_dn_en_d2p[2],
-  output        cio_usb_sense_p2d[2],
-  input         cio_usb_pullup_d2p[2],
-  input         cio_usb_pullup_en_d2p[2],
-
-  // UART pads
-  input   IO_URX,
-  output  IO_UTX,
-
-  // USB pads
-  inout         IO_USB_DP0,
-  inout         IO_USB_DN0,
-  input         IO_USB_SENSE0,
-  output        IO_USB_PULLUP0,
-  inout         IO_USB_DP1,
-  inout         IO_USB_DN1,
-  input         IO_USB_SENSE1,
-  output        IO_USB_PULLUP1,
-  // GPIO device side
-  input [31:0]  cio_gpio_d2p,
-  input [31:0]  cio_gpio_en_d2p,
-  output [31:0] cio_gpio_p2d,
-  // GPIO pads
-  inout         IO_GP0,
-  inout         IO_GP1,
-  inout         IO_GP2,
-  inout         IO_GP3,
-  inout         IO_GP4,
-  inout         IO_GP5,
-  inout         IO_GP6,
-  inout         IO_GP7,
-  inout         IO_GP8,
-  inout         IO_GP9,
-  inout         IO_GP10,
-  inout         IO_GP11,
-  inout         IO_GP12,
-  inout         IO_GP13,
-  inout         IO_GP14,
-  inout         IO_GP15,
-
-  // SPI device interface
-  output        cio_spi_device_sck_p2d,
-  output        cio_spi_device_csb_p2d,
-  output        cio_spi_device_mosi_p2d,
-  input         cio_spi_device_miso_d2p,
-  input         cio_spi_device_miso_en_d2p,
-  // JTAG interface
-  output        cio_jtag_tck_p2d,
-  output        cio_jtag_tms_p2d,
-  output        cio_jtag_trst_n_p2d,
-  output        cio_jtag_srst_n_p2d,
-  output        cio_jtag_tdi_p2d,
-  input         cio_jtag_tdo_d2p,
-  // FTDI MSEE pins shared between JTAG and SPI
-  input         IO_DPS0,
-  input         IO_DPS1,
-  output        IO_DPS2,
-  input         IO_DPS3,
-  input         IO_DPS4,
-  input         IO_DPS5,
-  input         IO_DPS6
-);
-
-  // Important that the rx (p2d) line is fixed when transmitting
-  // Otherwise you are trying to regenerate the bit clock from
-  // the bit clock you are regenerating, rather than just holding the phase
-  assign IO_USB_DP0 = cio_usb_dp_en_d2p[0] ? cio_usb_dp_d2p[0] : 1'bz;
-  assign cio_usb_dp_p2d[0] = cio_usb_dp_en_d2p[0] ? 1'b1 : IO_USB_DP0;
-
-  assign IO_USB_DN0 = cio_usb_dn_en_d2p[0] ? cio_usb_dn_d2p[0] : 1'bz;
-  assign cio_usb_dn_p2d[0] = cio_usb_dn_en_d2p[0] ? 1'b0 : IO_USB_DN0;
-
-  assign IO_USB_PULLUP0 = cio_usb_pullup_en_d2p[0] ? cio_usb_pullup_d2p[0] : 1'bz;
-  assign cio_usb_sense_p2d[0] = IO_USB_SENSE0;
-
-  assign IO_USB_DP1 = cio_usb_dp_en_d2p[1] ? cio_usb_dp_d2p[1] : 1'bz;
-  assign cio_usb_dp_p2d[1] = cio_usb_dp_en_d2p[1] ? 1'b1 : IO_USB_DP1;
-
-  assign IO_USB_DN1 = cio_usb_dn_en_d2p[1] ? cio_usb_dn_d2p[1] : 1'bz;
-  assign cio_usb_dn_p2d[1] = cio_usb_dn_en_d2p[1] ? 1'b0 : IO_USB_DN1;
-
-  assign IO_USB_PULLUP1 = cio_usb_pullup_en_d2p[1] ? cio_usb_pullup_d2p[1] : 1'bz;
-  assign cio_usb_sense_p2d[1] = IO_USB_SENSE1;
-
-  // JTAG or SPI mux to the FTDI MSEE pins DPS0-DPS6
-  logic    jtag_spi_n, dps2, dps2_en;
-
-  assign  cio_gpio_p2d = {
-      15'h0,    // unpopulated
-      jtag_spi_n, // Use GPIO16 to pass SPI/JTAG control flag
-      IO_GP15,
-      IO_GP14,
-      IO_GP13,
-      IO_GP12,
-      IO_GP11,
-      IO_GP10,
-      IO_GP9,
-      IO_GP8,
-      IO_GP7,
-      IO_GP6,
-      IO_GP5,
-      IO_GP4,
-      IO_GP3,
-      IO_GP2,
-      IO_GP1,
-      IO_GP0
-  };
-
-  assign  IO_GP0  = cio_gpio_en_d2p[0]  ? cio_gpio_d2p[0]  : 1'bz;
-  assign  IO_GP1  = cio_gpio_en_d2p[1]  ? cio_gpio_d2p[1]  : 1'bz;
-  assign  IO_GP2  = cio_gpio_en_d2p[2]  ? cio_gpio_d2p[2]  : 1'bz;
-  assign  IO_GP3  = cio_gpio_en_d2p[3]  ? cio_gpio_d2p[3]  : 1'bz;
-  assign  IO_GP4  = cio_gpio_en_d2p[4]  ? cio_gpio_d2p[4]  : 1'bz;
-  assign  IO_GP5  = cio_gpio_en_d2p[5]  ? cio_gpio_d2p[5]  : 1'bz;
-  assign  IO_GP6  = cio_gpio_en_d2p[6]  ? cio_gpio_d2p[6]  : 1'bz;
-  assign  IO_GP7  = cio_gpio_en_d2p[7]  ? cio_gpio_d2p[7]  : 1'bz;
-  assign  IO_GP8  = cio_gpio_en_d2p[8]  ? cio_gpio_d2p[8]  : 1'bz;
-  assign  IO_GP9  = cio_gpio_en_d2p[9]  ? cio_gpio_d2p[9]  : 1'bz;
-  assign  IO_GP10 = cio_gpio_en_d2p[10] ? cio_gpio_d2p[10] : 1'bz;
-  assign  IO_GP11 = cio_gpio_en_d2p[11] ? cio_gpio_d2p[11] : 1'bz;
-  assign  IO_GP12 = cio_gpio_en_d2p[12] ? cio_gpio_d2p[12] : 1'bz;
-  assign  IO_GP13 = cio_gpio_en_d2p[13] ? cio_gpio_d2p[13] : 1'bz;
-  assign  IO_GP14 = cio_gpio_en_d2p[14] ? cio_gpio_d2p[14] : 1'bz;
-  assign  IO_GP15 = cio_gpio_en_d2p[15] ? cio_gpio_d2p[15] : 1'bz;
-
-  assign jtag_spi_n = IO_DPS6;
-
-  assign cio_spi_device_sck_p2d  = jtag_spi_n ?  0         : IO_DPS0;
-  assign cio_jtag_tck_p2d        = jtag_spi_n ?  IO_DPS0   : 0;
-  assign cio_spi_device_mosi_p2d = jtag_spi_n ?  0         : IO_DPS1;
-  assign cio_jtag_tdi_p2d        = jtag_spi_n ?  IO_DPS1   : 0;
-
-  assign dps2    = jtag_spi_n ?    cio_jtag_tdi_p2d : cio_spi_device_miso_d2p;
-  assign dps2_en = jtag_spi_n ?    1                : cio_spi_device_miso_en_d2p;
-  assign IO_DPS2 = dps2_en ? dps2 : 1'bz;
-
-  assign cio_spi_device_csb_p2d  = jtag_spi_n ?  1         : IO_DPS3;
-  assign cio_jtag_tms_p2d        = jtag_spi_n ?  IO_DPS3   : 0;
-
-  assign cio_jtag_trst_n_p2d     = jtag_spi_n ?  IO_DPS4   : 1;
-  assign cio_jtag_srst_n_p2d     = jtag_spi_n ?  IO_DPS5   : 1;
-
-endmodule
diff --git a/hw/top_earlgrey/rtl/tlul_xbar_usb.sv b/hw/top_earlgrey/rtl/tlul_xbar_usb.sv
deleted file mode 100644
index 9440f6f..0000000
--- a/hw/top_earlgrey/rtl/tlul_xbar_usb.sv
+++ /dev/null
@@ -1,209 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-// TODO: Only here until code is ported to use top generator
-module tlul_xbar_usb (
-  input clk_i,
-  input rst_ni,
-
-  // Host accepter
-  input  tlul_pkg::tl_h2d_t tl_h_i [tl_main_pkg::N_HOST],
-  output tlul_pkg::tl_d2h_t tl_h_o [tl_main_pkg::N_HOST],
-
-  // Device sender
-  output tlul_pkg::tl_h2d_t tl_d_o [tl_main_pkg::N_DEVICE],
-  input  tlul_pkg::tl_d2h_t tl_d_i [tl_main_pkg::N_DEVICE]
-);
-
-  import tlul_pkg::*;
-  import tl_main_pkg::*;
-
-  //
-  // Core D interface connects to Sram, Uart, Gpio, DebugMem and error
-  //
-  localparam int unsigned N_CORE_D_DEVICE = 5;
-
-  typedef enum logic [2:0] {
-    CoreDToSram     = 3'h0,
-    CoreDToUart     = 3'h1,
-    CoreDToGpio     = 3'h2,
-    CoreDToDebugMem = 3'h3,
-    CoreDToSpiDevice = 3'h4,
-    CoreDToErr      = 3'h5
-  } core_d_dsp_e;
-
-  core_d_dsp_e dev_select_core_d;
-
-  tl_h2d_t tl_core_d_h2d [N_CORE_D_DEVICE];
-  tl_d2h_t tl_core_d_d2h [N_CORE_D_DEVICE];
-
-  tlul_socket_1n #(
-    .N            (N_CORE_D_DEVICE),
-    .HReqPass     (1'b0),                     // register just outside of core
-    .HRspPass     (1'b0),                     // register just outside of core
-    .DReqPass     ({N_CORE_D_DEVICE{1'b1}}),  // unregistered
-    .DRspPass     ({N_CORE_D_DEVICE{1'b1}}),  // unregistered
-    .HReqDepth    (4'h2),                     // some elasticity
-    .HRspDepth    (4'h2),                     // some elasticity
-    .DReqDepth    ({N_CORE_D_DEVICE{4'h1}}),  // minimal elasticity
-    .DRspDepth    ({N_CORE_D_DEVICE{4'h1}})   // minimal elasticity
-  ) core_d_socket_14 (
-    .clk_i        (clk_i),
-    .rst_ni       (rst_ni),
-    .tl_h_i       (tl_h_i[TlCored]),
-    .tl_h_o       (tl_h_o[TlCored]),
-    .tl_d_o       (tl_core_d_h2d),
-    .tl_d_i       (tl_core_d_d2h),
-    .dev_select   (dev_select_core_d)
-  );
-
-  // address map lookup, will eventually be automated via configuration
-  assign dev_select_core_d =
-      ((tl_h_i[TlCored].a_address & ~ADDR_MASK_RAM_MAIN)     == ADDR_SPACE_RAM_MAIN)     ? CoreDToSram :
-      ((tl_h_i[TlCored].a_address & ~ADDR_MASK_UART)     == ADDR_SPACE_UART)     ? CoreDToUart :
-      ((tl_h_i[TlCored].a_address & ~ADDR_MASK_GPIO)     == ADDR_SPACE_GPIO)     ? CoreDToGpio :
-      ((tl_h_i[TlCored].a_address & ~ADDR_MASK_DEBUG_MEM) == ADDR_SPACE_DEBUG_MEM) ? CoreDToDebugMem :
-      ((tl_h_i[TlCored].a_address & ~ADDR_MASK_SPI_DEVICE)     == ADDR_SPACE_SPI_DEVICE)     ? CoreDToSpiDevice :
-          CoreDToErr; // indicate to socket to return error
-
-
-  //
-  // Core I connects to SRAM and Debug Memory and error
-  // TODO: Add connection to bootrom
-  //
-  localparam int unsigned N_CORE_I_DEVICE = 2;
-
-  typedef enum logic [1:0] {
-    CoreIToSram     = 2'h0,
-    CoreIToDebugMem = 2'h1,
-    CoreIToErr      = 2'h2
-  } core_i_dsp_e;
-
-  core_i_dsp_e dev_select_core_i;
-
-  tl_h2d_t tl_core_i_h2d [N_CORE_I_DEVICE];
-  tl_d2h_t tl_core_i_d2h [N_CORE_I_DEVICE];
-
-  tlul_socket_1n #(
-    .N            (N_CORE_I_DEVICE),
-    .HReqPass     (1'b0),                     // register just outside of core
-    .HRspPass     (1'b0),                     // register just outside of core
-    .DReqPass     ({N_CORE_I_DEVICE{1'b1}}),  // unregistered
-    .DRspPass     ({N_CORE_I_DEVICE{1'b1}}),  // unregistered
-    .HReqDepth    (4'h2),                     // some elasticity
-    .HRspDepth    (4'h2),                     // some elasticity
-    .DReqDepth    ({N_CORE_I_DEVICE{4'h1}}),  // minimal elasticity
-    .DRspDepth    ({N_CORE_I_DEVICE{4'h1}})   // minimal elasticity
-    ) core_i_socket_12 (
-    .clk_i        (clk_i),
-    .rst_ni       (rst_ni),
-    .tl_h_i       (tl_h_i[TlCorei]),
-    .tl_h_o       (tl_h_o[TlCorei]),
-    .tl_d_o       (tl_core_i_h2d),
-    .tl_d_i       (tl_core_i_d2h),
-    .dev_select   (dev_select_core_i)
-    );
-
-  // address map lookup, will eventually be automated via configuration
-  assign dev_select_core_i =
-    ((tl_h_i[TlCorei].a_address & ~ADDR_MASK_RAM_MAIN)     == ADDR_SPACE_RAM_MAIN)     ? CoreIToSram :
-    ((tl_h_i[TlCorei].a_address & ~ADDR_MASK_DEBUG_MEM) == ADDR_SPACE_DEBUG_MEM) ? CoreIToDebugMem :
-    CoreIToErr; // indicate to socket to return error
-
-
-  //
-  // SRAM connects to Core I, Core D and Debug SBA
-  //
-  localparam int unsigned N_SRAM_HOST = 3;
-
-  typedef enum logic [1:0] {
-    SramFromCoreI    = 2'h0,
-    SramFromCoreD    = 2'h1,
-    SramFromDebugSba = 2'h2
-  } sram_host_e;
-
-  tl_h2d_t tl_sram_h_h2d [N_SRAM_HOST];
-  tl_d2h_t tl_sram_h_d2h [N_SRAM_HOST];
-
-  assign tl_sram_h_h2d[SramFromCoreI]    = tl_core_i_h2d[CoreIToSram];
-  assign tl_sram_h_h2d[SramFromCoreD]    = tl_core_d_h2d[CoreDToSram];
-  assign tl_sram_h_h2d[SramFromDebugSba] = tl_h_i[TlDmSba];
-
-  assign tl_core_i_d2h[CoreIToSram] = tl_sram_h_d2h[SramFromCoreI];
-  assign tl_core_d_d2h[CoreDToSram] = tl_sram_h_d2h[SramFromCoreD];
-  assign tl_h_o[TlDmSba]         = tl_sram_h_d2h[SramFromDebugSba];
-
-  tlul_socket_m1 #(
-    .M            (N_SRAM_HOST),
-    .HReqPass     ({N_SRAM_HOST{1'b1}}),   // unregistered
-    .HRspPass     ({N_SRAM_HOST{1'b1}}),   // unregistered
-    .HReqDepth    ({N_SRAM_HOST{4'h1}}),   // minimal elasticity
-    .HRspDepth    ({N_SRAM_HOST{4'h1}}),   // minimal elasticity
-    .DReqPass     (1'b1),                  // unregistered
-    .DRspPass     (1'b1),                  // unregistered
-    .DReqDepth    (4'h1),                  // minimal elasticity
-    .DRspDepth    (4'h1)                   // minimal elasticity
-  ) sram_socket_31 (
-    .clk_i        (clk_i),
-    .rst_ni       (rst_ni),
-    .tl_h_i       (tl_sram_h_h2d),
-    .tl_h_o       (tl_sram_h_d2h),
-    .tl_d_o       (tl_d_o[TlRamMain]),
-    .tl_d_i       (tl_d_i[TlRamMain])
-  );
-
-
-  //
-  // Debug Memory connects to Core I and Core D
-  //
-  localparam int unsigned N_DEBUGMEM_HOST = 2;
-
-  typedef enum logic [0:0] {
-    DebugMemFromCoreI = 1'h0,
-    DebugMemFromCoreD = 1'h1
-  } debugmem_host_e;
-
-  tl_h2d_t tl_debugmem_h_h2d [N_DEBUGMEM_HOST];
-  tl_d2h_t tl_debugmem_h_d2h [N_DEBUGMEM_HOST];
-
-  assign tl_debugmem_h_h2d[DebugMemFromCoreI] = tl_core_i_h2d[CoreIToDebugMem];
-  assign tl_debugmem_h_h2d[DebugMemFromCoreD] = tl_core_d_h2d[CoreDToDebugMem];
-
-  assign tl_core_i_d2h[CoreIToDebugMem] = tl_debugmem_h_d2h[DebugMemFromCoreI];
-  assign tl_core_d_d2h[CoreDToDebugMem] = tl_debugmem_h_d2h[DebugMemFromCoreD];
-
-  tlul_socket_m1 #(
-    .M            (N_DEBUGMEM_HOST),
-    .HReqPass     ({N_DEBUGMEM_HOST{1'b1}}), // unregistered
-    .HRspPass     ({N_DEBUGMEM_HOST{1'b1}}), // unregistered
-    .HReqDepth    ({N_DEBUGMEM_HOST{4'h1}}), // minimal elasticity
-    .HRspDepth    ({N_DEBUGMEM_HOST{4'h1}}), // minimal elasticity
-    .DReqPass     (1'b1),                    // unregistered
-    .DRspPass     (1'b1),                    // unregistered
-    .DReqDepth    (4'h1),                    // minimal elasticity
-    .DRspDepth    (4'h1)                     // minimal elasticity
-  ) debugmem_socket_21 (
-    .clk_i        (clk_i),
-    .rst_ni       (rst_ni),
-    .tl_h_i       (tl_debugmem_h_h2d),
-    .tl_h_o       (tl_debugmem_h_d2h),
-    .tl_d_o       (tl_d_o[TlDebugMem]),
-    .tl_d_i       (tl_d_i[TlDebugMem])
-  );
-
-
-  // UART connects to Core D
-  // TODO: Connect to SBA as well?
-  assign tl_d_o[TlUart] = tl_core_d_h2d[CoreDToUart];
-  assign tl_core_d_d2h[CoreDToUart] = tl_d_i[TlUart];
-
-  // GPIO connects to Core D
-  // TODO: Connect to SBA as well?
-  assign tl_d_o[TlGpio] = tl_core_d_h2d[CoreDToGpio];
-  assign tl_core_d_d2h[CoreDToGpio] = tl_d_i[TlGpio];
-
-  // SPI Device
-  assign tl_d_o[TlSpiDevice] = tl_core_d_h2d[CoreDToSpiDevice];
-  assign tl_core_d_d2h[CoreDToSpiDevice] = tl_d_i[TlSpiDevice];
-endmodule
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv b/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv
index 8e6f8a1..5df9b76 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_artys7.sv
@@ -15,6 +15,11 @@
   // UART interface
   input               IO_URX,
   output              IO_UTX,
+  // USB interface
+  inout               IO_USB_DP0,
+  inout               IO_USB_DN0,
+  input               IO_USB_SENSE0,
+  output              IO_USB_PULLUP0,
   // GPIO x 16 interface
   inout               IO_GP0,
   inout               IO_GP1,
@@ -34,9 +39,12 @@
   inout               IO_GP15
 );
 
-  logic clk_sys, rst_sys_n;
-  logic [31:0]  cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
+  logic clk_sys, clk_48mhz, rst_sys_n;
+  logic [31:0] cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
   logic cio_uart_rx_p2d, cio_uart_tx_d2p, cio_uart_tx_en_d2p;
+  logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+  logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
+  logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
 
   // Unlike Nexys Video there is no separate JTAG controller, tie off for now
   logic IO_JTCK = 0;
@@ -45,12 +53,13 @@
   logic IO_JTRST_N = IO_RST_N;
   logic IO_JTDO;
 
-
   // Top-level design
   top_earlgrey top_earlgrey (
     .clk_i                  (clk_sys),
     .rst_ni                 (rst_sys_n),
 
+    .clk_usb_48mhz_i        (clk_48mhz),
+
     .jtag_tck_i             (IO_JTCK),
     .jtag_tms_i             (IO_JTMS),
     .jtag_trst_ni           (IO_JTRST_N),
@@ -63,7 +72,19 @@
 
     .mio_in_i               (cio_gpio_p2d),
     .mio_out_o              (cio_gpio_d2p),
-    .mio_oe_o               (cio_gpio_en_d2p)
+    .mio_oe_o               (cio_gpio_en_d2p),
+
+    .dio_usbdev_sense_i     (cio_usbdev_sense_p2d),
+    .dio_usbdev_pullup_o    (cio_usbdev_pullup_d2p),
+    .dio_usbdev_pullup_en_o (cio_usbdev_pullup_en_d2p),
+    .dio_usbdev_dp_i        (cio_usbdev_dp_p2d),
+    .dio_usbdev_dp_o        (cio_usbdev_dp_d2p),
+    .dio_usbdev_dp_en_o     (cio_usbdev_dp_en_d2p),
+    .dio_usbdev_dn_i        (cio_usbdev_dn_p2d),
+    .dio_usbdev_dn_o        (cio_usbdev_dn_d2p),
+    .dio_usbdev_dn_en_o     (cio_usbdev_dn_en_d2p),
+
+    .scanmode_i             (1'b0) // 1 for Scan
   );
 
   // Clock and reset
@@ -71,6 +92,7 @@
     .IO_CLK(IO_CLK),
     .IO_RST_N(IO_RST_N),
     .clk_sys(clk_sys),
+    .clk_48MHz(clk_48mhz),
     .rst_sys_n(rst_sys_n)
   );
 
@@ -80,6 +102,16 @@
     .cio_uart_rx_p2d,
     .cio_uart_tx_d2p,
     .cio_uart_tx_en_d2p,
+    // USB
+    .cio_usbdev_sense_p2d(cio_usbdev_sense_p2d),
+    .cio_usbdev_pullup_d2p(cio_usbdev_pullup_d2p),
+    .cio_usbdev_pullup_en_d2p(cio_usbdev_pullup_en_d2p),
+    .cio_usbdev_dp_p2d(cio_usbdev_dp_p2d),
+    .cio_usbdev_dp_d2p(cio_usbdev_dp_d2p),
+    .cio_usbdev_dp_en_d2p(cio_usbdev_dp_en_d2p),
+    .cio_usbdev_dn_p2d(cio_usbdev_dn_p2d),
+    .cio_usbdev_dn_d2p(cio_usbdev_dn_d2p),
+    .cio_usbdev_dn_en_d2p(cio_usbdev_dn_en_d2p),
     // GPIO
     .cio_gpio_p2d,
     .cio_gpio_d2p,
@@ -87,6 +119,10 @@
     // pads
     .IO_URX,
     .IO_UTX,
+    .IO_USB_DP0,
+    .IO_USB_DN0,
+    .IO_USB_SENSE0,
+    .IO_USB_PULLUP0,
     .IO_GP0,
     .IO_GP1,
     .IO_GP2,
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_asic.sv b/hw/top_earlgrey/rtl/top_earlgrey_asic.sv
index ecb488e..c1b268f 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_asic.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_asic.sv
@@ -6,6 +6,7 @@
   // Clock and Reset
   input               IO_CLK,
   input               IO_RST_N,
+  input               IO_CLK_USB_48MHZ,
   // JTAG interface
   input               IO_JTCK,
   input               IO_JTMS,
@@ -15,6 +16,11 @@
   // UART interface
   input               IO_URX,
   output              IO_UTX,
+  // USB interface
+  inout               IO_USB_DP0,
+  inout               IO_USB_DN0,
+  input               IO_USB_SENSE0,
+  output              IO_USB_PULLUP0,
   // GPIO x 16 interface
   inout               IO_GP0,
   inout               IO_GP1,
@@ -34,14 +40,19 @@
   inout               IO_GP15
 );
 
-  logic [31:0]  cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
+  logic [31:0] cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
   logic cio_uart_rx_p2d, cio_uart_tx_d2p, cio_uart_tx_en_d2p;
+  logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+  logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
+  logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
 
   // Top-level design
   top_earlgrey top_earlgrey (
     .clk_i            (IO_CLK),
     .rst_ni           (IO_RST_N),
 
+    .clk_usb_48mhz_i  (IO_CLK_USB_48MHZ),
+
     .jtag_tck_i       (IO_JTCK),
     .jtag_tms_i       (IO_JTMS),
     .jtag_trst_ni     (IO_JTRST_N),
@@ -56,6 +67,15 @@
     .dio_uart_rx_i    (cio_uart_rx_p2d),
     .dio_uart_tx_o    (cio_uart_tx_d2p),
     .dio_uart_tx_en_o (cio_uart_tx_en_d2p),
+    .dio_usbdev_sense_i       (cio_usbdev_sense_p2d),
+    .dio_usbdev_pullup_o      (cio_usbdev_pullup_d2p),
+    .dio_usbdev_pullup_en_o   (cio_usbdev_pullup_en_d2p),
+    .dio_usbdev_dp_i          (cio_usbdev_dp_p2d),
+    .dio_usbdev_dp_o          (cio_usbdev_dp_d2p),
+    .dio_usbdev_dp_en_o       (cio_usbdev_dp_en_d2p),
+    .dio_usbdev_dn_i          (cio_usbdev_dn_p2d),
+    .dio_usbdev_dn_o          (cio_usbdev_dn_d2p),
+    .dio_usbdev_dn_en_o       (cio_usbdev_dn_en_d2p),
 
     .mio_in_i         (cio_gpio_p2d),
     .mio_out_o        (cio_gpio_d2p),
@@ -70,6 +90,16 @@
     .cio_uart_rx_p2d,
     .cio_uart_tx_d2p,
     .cio_uart_tx_en_d2p,
+    // USB
+    .cio_usbdev_sense_p2d(cio_usbdev_sense_p2d),
+    .cio_usbdev_pullup_d2p(cio_usbdev_pullup_d2p),
+    .cio_usbdev_pullup_en_d2p(cio_usbdev_pullup_en_d2p),
+    .cio_usbdev_dp_p2d(cio_usbdev_dp_p2d),
+    .cio_usbdev_dp_d2p(cio_usbdev_dp_d2p),
+    .cio_usbdev_dp_en_d2p(cio_usbdev_dp_en_d2p),
+    .cio_usbdev_dn_p2d(cio_usbdev_dn_p2d),
+    .cio_usbdev_dn_d2p(cio_usbdev_dn_d2p),
+    .cio_usbdev_dn_en_d2p(cio_usbdev_dn_en_d2p),
     // GPIO
     .cio_gpio_p2d,
     .cio_gpio_d2p,
@@ -77,6 +107,10 @@
     // pads
     .IO_URX,
     .IO_UTX,
+    .IO_USB_DP0,
+    .IO_USB_DN0,
+    .IO_USB_SENSE0,
+    .IO_USB_PULLUP0,
     .IO_GP0,
     .IO_GP1,
     .IO_GP2,
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv b/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv
index 2791eb8..dc3df9c 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_nexysvideo.sv
@@ -18,6 +18,11 @@
   // UART interface
   input               IO_URX,
   output              IO_UTX,
+  // USB interface
+  inout               IO_USB_DP0,
+  inout               IO_USB_DN0,
+  input               IO_USB_SENSE0,
+  output              IO_USB_PULLUP0,
   // GPIO x 16 interface
   inout               IO_GP0,
   inout               IO_GP1,
@@ -37,13 +42,16 @@
   inout               IO_GP15
 );
 
-  logic clk_sys, rst_sys_n;
-  logic [31:0]  cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
+  logic clk_sys, clk_48mhz, rst_sys_n;
+  logic [31:0] cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
   logic cio_uart_rx_p2d, cio_uart_tx_d2p, cio_uart_tx_en_d2p;
   logic cio_spi_device_sck_p2d, cio_spi_device_csb_p2d, cio_spi_device_mosi_p2d,
         cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
   logic cio_jtag_tck_p2d, cio_jtag_tms_p2d, cio_jtag_tdi_p2d, cio_jtag_tdo_d2p;
   logic cio_jtag_trst_n_p2d, cio_jtag_srst_n_p2d;
+  logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+  logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
+  logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
 
   // Top-level design
   top_earlgrey #(
@@ -52,6 +60,8 @@
     .clk_i                    (clk_sys),
     .rst_ni                   (rst_sys_n),
 
+    .clk_usb_48mhz_i          (clk_48mhz),
+
     .jtag_tck_i               (cio_jtag_tck_p2d),
     .jtag_tms_i               (cio_jtag_tms_p2d),
     .jtag_trst_ni             (cio_jtag_trst_n_p2d),
@@ -72,13 +82,24 @@
     .dio_spi_device_miso_o    (cio_spi_device_miso_d2p),
     .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
 
-    .scanmode_i                   (1'b0) // 1 for Scan
+    .dio_usbdev_sense_i       (cio_usbdev_sense_p2d),
+    .dio_usbdev_pullup_o      (cio_usbdev_pullup_d2p),
+    .dio_usbdev_pullup_en_o   (cio_usbdev_pullup_en_d2p),
+    .dio_usbdev_dp_i          (cio_usbdev_dp_p2d),
+    .dio_usbdev_dp_o          (cio_usbdev_dp_d2p),
+    .dio_usbdev_dp_en_o       (cio_usbdev_dp_en_d2p),
+    .dio_usbdev_dn_i          (cio_usbdev_dn_p2d),
+    .dio_usbdev_dn_o          (cio_usbdev_dn_d2p),
+    .dio_usbdev_dn_en_o       (cio_usbdev_dn_en_d2p),
+
+    .scanmode_i               (1'b0) // 1 for Scan
   );
 
   clkgen_xil7series clkgen (
     .IO_CLK(IO_CLK),
     .IO_RST_N(IO_RST_N & cio_jtag_srst_n_p2d),
     .clk_sys(clk_sys),
+    .clk_48MHz(clk_48mhz),
     .rst_sys_n(rst_sys_n)
   );
 
@@ -88,6 +109,16 @@
     .cio_uart_rx_p2d,
     .cio_uart_tx_d2p,
     .cio_uart_tx_en_d2p,
+    // USB
+    .cio_usbdev_sense_p2d(cio_usbdev_sense_p2d),
+    .cio_usbdev_pullup_d2p(cio_usbdev_pullup_d2p),
+    .cio_usbdev_pullup_en_d2p(cio_usbdev_pullup_en_d2p),
+    .cio_usbdev_dp_p2d(cio_usbdev_dp_p2d),
+    .cio_usbdev_dp_d2p(cio_usbdev_dp_d2p),
+    .cio_usbdev_dp_en_d2p(cio_usbdev_dp_en_d2p),
+    .cio_usbdev_dn_p2d(cio_usbdev_dn_p2d),
+    .cio_usbdev_dn_d2p(cio_usbdev_dn_d2p),
+    .cio_usbdev_dn_en_d2p(cio_usbdev_dn_en_d2p),
     // GPIO
     .cio_gpio_p2d,
     .cio_gpio_d2p,
@@ -95,6 +126,10 @@
     // pads
     .IO_URX,
     .IO_UTX,
+    .IO_USB_DP0,
+    .IO_USB_DN0,
+    .IO_USB_SENSE0,
+    .IO_USB_PULLUP0,
     .IO_GP0,
     .IO_GP1,
     .IO_GP2,
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_usb.sv b/hw/top_earlgrey/rtl/top_earlgrey_usb.sv
deleted file mode 100644
index 1d5f264..0000000
--- a/hw/top_earlgrey/rtl/top_earlgrey_usb.sv
+++ /dev/null
@@ -1,863 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-module top_earlgrey_usb #(
-  parameter bit IbexPipeLine = 0,
-  parameter N_USB = 1,
-  parameter MAX_USB = 2,
-  parameter USB_UART = 1,
-  parameter USB_DEVICE = 0
-) (
-  // Clock and Reset
-  input               clk_i,
-  input               rst_ni,
-
-  // JTAG interface
-  input               jtag_tck_i,
-  input               jtag_tms_i,
-  input               jtag_trst_ni,
-  input               jtag_td_i,
-  output              jtag_td_o,
-
-  // USB interface
-  input         clk_48mhz_i,
-  input         dio_usb_dp_i[MAX_USB],
-  output logic  dio_usb_dp_o[MAX_USB],
-  output logic  dio_usb_dp_en_o[MAX_USB],
-
-  input         dio_usb_dn_i[MAX_USB],
-  output logic  dio_usb_dn_o[MAX_USB],
-  output logic  dio_usb_dn_en_o[MAX_USB],
-
-  input         dio_usb_sense_i[MAX_USB],
-
-  output logic  dio_usb_pullup_o[MAX_USB],
-  output logic  dio_usb_pullup_en_o[MAX_USB],
-
-  // Multiplexed I/O
-  input        [31:0] mio_in_i,
-  output logic [31:0] mio_out_o,
-  output logic [31:0] mio_oe_o,
-
-  // Dedicated I/O
-  input               dio_spi_device_sck_i,
-  input               dio_spi_device_csb_i,
-  input               dio_spi_device_mosi_i,
-  output logic        dio_spi_device_miso_o,
-  output logic        dio_spi_device_miso_en_o,
-  input               dio_uart_rx_i,
-  output logic        dio_uart_tx_o,
-  output logic        dio_uart_tx_en_o,
-
-  input               scanmode_i  // 1 for Scan
-);
-
-  // JTAG IDCODE for development versions of this code.
-  // Manufacturers of OpenTitan chips must replace this code with one of their
-  // own IDs.
-  // Field structure as defined in the IEEE 1149.1 (JTAG) specification,
-  // section 12.1.1.
-  localparam JTAG_IDCODE = {
-    4'h0,     // Version
-    16'h4F54, // Part Number: "OT"
-    11'h426,  // Manufacturer Identity: Google
-    1'b1      // (fixed)
-  };
-
-  import tlul_pkg::*;
-  import top_pkg::*;
-  import tl_main_pkg::*;
-  import flash_ctrl_pkg::*;
-
-  tl_h2d_t  tl_corei_h_h2d;
-  tl_d2h_t  tl_corei_h_d2h;
-
-  tl_h2d_t  tl_cored_h_h2d;
-  tl_d2h_t  tl_cored_h_d2h;
-
-  tl_h2d_t  tl_dm_sba_h_h2d;
-  tl_d2h_t  tl_dm_sba_h_d2h;
-
-  tl_h2d_t  tl_debug_mem_d_h2d;
-  tl_d2h_t  tl_debug_mem_d_d2h;
-
-  tl_h2d_t  tl_uart_d_h2d;
-  tl_d2h_t  tl_uart_d_d2h;
-  tl_h2d_t  tl_gpio_d_h2d;
-  tl_d2h_t  tl_gpio_d_d2h;
-  tl_h2d_t  tl_spi_device_d_h2d;
-  tl_d2h_t  tl_spi_device_d_d2h;
-  tl_h2d_t  tl_flash_ctrl_d_h2d;
-  tl_d2h_t  tl_flash_ctrl_d_d2h;
-  tl_h2d_t  tl_rv_timer_d_h2d;
-  tl_d2h_t  tl_rv_timer_d_d2h;
-  tl_h2d_t  tl_aes_d_h2d;
-  tl_d2h_t  tl_aes_d_d2h;
-  tl_h2d_t  tl_hmac_d_h2d;
-  tl_d2h_t  tl_hmac_d_d2h;
-  tl_h2d_t  tl_rv_plic_d_h2d;
-  tl_d2h_t  tl_rv_plic_d_d2h;
-  tl_h2d_t  tl_pinmux_d_h2d;
-  tl_d2h_t  tl_pinmux_d_d2h;
-  tl_h2d_t  tl_alert_handler_d_h2d;
-  tl_d2h_t  tl_alert_handler_d_d2h;
-  tl_h2d_t  tl_nmi_gen_d_h2d;
-  tl_d2h_t  tl_nmi_gen_d_d2h;
-
-  tl_h2d_t tl_rom_d_h2d;
-  tl_d2h_t tl_rom_d_d2h;
-  tl_h2d_t tl_ram_main_d_h2d;
-  tl_d2h_t tl_ram_main_d_d2h;
-  tl_h2d_t tl_eflash_d_h2d;
-  tl_d2h_t tl_eflash_d_d2h;
-
-  tl_h2d_t tl_main_h_h2d;
-  tl_d2h_t tl_main_h_d2h;
-  tl_h2d_t tl_peri_d_h2d;
-  tl_d2h_t tl_peri_d_d2h;
-
-  assign tl_main_h_h2d = tl_peri_d_h2d;
-  assign tl_peri_d_d2h = tl_main_h_d2h;
-
-  //reset wires declaration
-  logic lc_rst_n;
-  logic sys_rst_n;
-  logic sys_fixed_rst_n;
-  logic spi_device_rst_n;
-
-  //clock wires declaration
-  logic main_clk;
-  logic fixed_clk;
-
-  // Signals
-  logic [31:0] m2p;
-  logic [31:0] p2m;
-  logic [31:0] p2m_en;
-  // uart
-  logic        cio_uart_rx_p2d;
-  logic        cio_uart_tx_d2p;
-  logic        cio_uart_tx_en_d2p;
-  // gpio
-  logic [31:0] cio_gpio_gpio_p2d;
-  logic [31:0] cio_gpio_gpio_d2p;
-  logic [31:0] cio_gpio_gpio_en_d2p;
-  // spi_device
-  logic        cio_spi_device_sck_p2d;
-  logic        cio_spi_device_csb_p2d;
-  logic        cio_spi_device_mosi_p2d;
-  logic        cio_spi_device_miso_d2p;
-  logic        cio_spi_device_miso_en_d2p;
-  // flash_ctrl
-  // rv_timer
-  // aes
-  // hmac
-  // rv_plic
-  // pinmux
-  // alert_handler
-  // nmi_gen
-
-
-  logic [62:0]  intr_vector;
-  // Interrupt source list
-  logic intr_uart_tx_watermark;
-  logic intr_uart_rx_watermark;
-  logic intr_uart_tx_empty;
-  logic intr_uart_rx_overflow;
-  logic intr_uart_rx_frame_err;
-  logic intr_uart_rx_break_err;
-  logic intr_uart_rx_timeout;
-  logic intr_uart_rx_parity_err;
-  logic [31:0] intr_gpio_gpio;
-  logic intr_spi_device_rxf;
-  logic intr_spi_device_rxlvl;
-  logic intr_spi_device_txlvl;
-  logic intr_spi_device_rxerr;
-  logic intr_spi_device_rxoverflow;
-  logic intr_spi_device_txunderflow;
-  logic intr_flash_ctrl_prog_empty;
-  logic intr_flash_ctrl_prog_lvl;
-  logic intr_flash_ctrl_rd_full;
-  logic intr_flash_ctrl_rd_lvl;
-  logic intr_flash_ctrl_op_done;
-  logic intr_flash_ctrl_op_error;
-  logic intr_rv_timer_timer_expired_0_0;
-  logic intr_hmac_hmac_done;
-  logic intr_hmac_fifo_full;
-  logic intr_hmac_hmac_err;
-  logic intr_alert_handler_classa;
-  logic intr_alert_handler_classb;
-  logic intr_alert_handler_classc;
-  logic intr_alert_handler_classd;
-  logic intr_nmi_gen_esc0;
-  logic intr_nmi_gen_esc1;
-  logic intr_nmi_gen_esc2;
-  logic intr_nmi_gen_esc3;
-
-
-  logic [0:0] irq_plic;
-  logic [0:0] msip;
-  logic [5:0] irq_id[1];
-  logic [5:0] unused_irq_id[1];
-
-  // this avoids lint errors
-  assign unused_irq_id = irq_id;
-
-  // Alert list
-  prim_pkg::alert_tx_t [alert_pkg::NAlerts-1:0]  alert_tx;
-  prim_pkg::alert_rx_t [alert_pkg::NAlerts-1:0]  alert_rx;
-  // Escalation outputs
-  prim_pkg::esc_tx_t [alert_pkg::N_ESC_SEV-1:0]  esc_tx;
-  prim_pkg::esc_rx_t [alert_pkg::N_ESC_SEV-1:0]  esc_rx;
-
-  // clock assignments
-  assign main_clk = clk_i;
-  assign fixed_clk = clk_i;
-
-  // Non-debug module reset == reset for everything except for the debug module
-  logic ndmreset_req;
-
-  // root resets
-  // TODO: lc_rst_n is not the true root reset.  It will be differentiated once the
-  //       the reset controller logic is present
-  assign lc_rst_n = rst_ni;
-  assign sys_rst_n = (scanmode_i) ? lc_rst_n : ~ndmreset_req & lc_rst_n;
-
-  //non-root reset assignments
-  assign sys_fixed_rst_n = sys_rst_n;
-  assign spi_device_rst_n = sys_rst_n;
-
-  // debug request from rv_dm to core
-  logic debug_req;
-
-  // processor core
-  rv_core_ibex #(
-    .PMPEnable           (0),
-    .PMPGranularity      (0),
-    .PMPNumRegions       (4),
-    .MHPMCounterNum      (8),
-    .MHPMCounterWidth    (40),
-    .RV32E               (0),
-    .RV32M               (1),
-    .DmHaltAddr          (ADDR_SPACE_DEBUG_MEM + dm::HaltAddress),
-    .DmExceptionAddr     (ADDR_SPACE_DEBUG_MEM + dm::ExceptionAddress),
-    .PipeLine            (IbexPipeLine)
-  ) core (
-    // clock and reset
-    .clk_i                (main_clk),
-    .rst_ni               (sys_rst_n),
-    .test_en_i            (1'b0),
-    // static pinning
-    .hart_id_i            (32'b0),
-    .boot_addr_i          (ADDR_SPACE_ROM),
-    // TL-UL buses
-    .tl_i_o               (tl_corei_h_h2d),
-    .tl_i_i               (tl_corei_h_d2h),
-    .tl_d_o               (tl_cored_h_h2d),
-    .tl_d_i               (tl_cored_h_d2h),
-    // interrupts
-    .irq_software_i       (msip),
-    .irq_timer_i          (intr_rv_timer_timer_expired_0_0),
-    .irq_external_i       (irq_plic),
-    .irq_fast_i           (15'b0),// PLIC handles all peripheral interrupts
-    .irq_nm_i             (1'b0),// TODO - add and connect alert responder
-    // debug interface
-    .debug_req_i          (debug_req),
-    // CPU control signals
-    .fetch_enable_i       (1'b1),
-    .core_sleep_o         ()
-  );
-
-  // Debug Module (RISC-V Debug Spec 0.13)
-  //
-
-  rv_dm #(
-    .NrHarts     (1),
-    .IdcodeValue (JTAG_IDCODE)
-  ) u_dm_top (
-    .clk_i         (main_clk),
-    .rst_ni        (lc_rst_n),
-    .testmode_i    (1'b0),
-    .ndmreset_o    (ndmreset_req),
-    .dmactive_o    (),
-    .debug_req_o   (debug_req),
-    .unavailable_i (1'b0),
-
-    // bus device with debug memory (for execution-based debug)
-    .tl_d_i        (tl_debug_mem_d_h2d),
-    .tl_d_o        (tl_debug_mem_d_d2h),
-
-    // bus host (for system bus accesses, SBA)
-    .tl_h_o        (tl_dm_sba_h_h2d),
-    .tl_h_i        (tl_dm_sba_h_d2h),
-
-    //JTAG
-    .tck_i            (jtag_tck_i),
-    .tms_i            (jtag_tms_i),
-    .trst_ni          (jtag_trst_ni),
-    .td_i             (jtag_td_i),
-    .td_o             (jtag_td_o),
-    .tdo_oe_o         (       )
-  );
-
-  // ROM device
-  logic        rom_req;
-  logic [10:0] rom_addr;
-  logic [31:0] rom_rdata;
-  logic        rom_rvalid;
-
-  tlul_adapter_sram #(
-    .SramAw(11),
-    .SramDw(32),
-    .Outstanding(1),
-    .ErrOnWrite(1)
-  ) tl_adapter_rom (
-    .clk_i   (main_clk),
-    .rst_ni   (sys_rst_n),
-
-    .tl_i     (tl_rom_d_h2d),
-    .tl_o     (tl_rom_d_d2h),
-
-    .req_o    (rom_req),
-    .gnt_i    (1'b1), // Always grant as only one requester exists
-    .we_o     (),
-    .addr_o   (rom_addr),
-    .wdata_o  (),
-    .wmask_o  (),
-    .rdata_i  (rom_rdata),
-    .rvalid_i (rom_rvalid),
-    .rerror_i (2'b00)
-  );
-
-  prim_rom #(
-    .Width(32),
-    .Depth(2048)
-  ) u_rom_rom (
-    .clk_i   (main_clk),
-    .rst_ni   (sys_rst_n),
-    .cs_i     (rom_req),
-    .addr_i   (rom_addr),
-    .dout_o   (rom_rdata),
-    .dvalid_o (rom_rvalid)
-  );
-
-  // sram device
-  logic        ram_main_req;
-  logic        ram_main_we;
-  logic [13:0] ram_main_addr;
-  logic [31:0] ram_main_wdata;
-  logic [31:0] ram_main_wmask;
-  logic [31:0] ram_main_rdata;
-  logic        ram_main_rvalid;
-
-  tlul_adapter_sram #(
-    .SramAw(14),
-    .SramDw(32),
-    .Outstanding(1)
-  ) tl_adapter_ram_main (
-    .clk_i   (main_clk),
-    .rst_ni   (sys_rst_n),
-    .tl_i     (tl_ram_main_d_h2d),
-    .tl_o     (tl_ram_main_d_d2h),
-
-    .req_o    (ram_main_req),
-    .gnt_i    (1'b1), // Always grant as only one requester exists
-    .we_o     (ram_main_we),
-    .addr_o   (ram_main_addr),
-    .wdata_o  (ram_main_wdata),
-    .wmask_o  (ram_main_wmask),
-    .rdata_i  (ram_main_rdata),
-    .rvalid_i (ram_main_rvalid),
-    .rerror_i (2'b00)
-  );
-
-  prim_ram_1p #(
-    .Width(32),
-    .Depth(16384),
-    .DataBitsPerMask(8)
-  ) u_ram1p_ram_main (
-    .clk_i   (main_clk),
-    .rst_ni   (sys_rst_n),
-
-    .req_i    (ram_main_req),
-    .write_i  (ram_main_we),
-    .addr_i   (ram_main_addr),
-    .wdata_i  (ram_main_wdata),
-    .wmask_i  (ram_main_wmask),
-    .rvalid_o (ram_main_rvalid),
-    .rdata_o  (ram_main_rdata)
-  );
-
-  // flash controller to eflash communication
-  flash_c2m_t flash_c2m;
-  flash_m2c_t flash_m2c;
-
-  // host to flash communication
-  logic flash_host_req;
-  logic flash_host_req_rdy;
-  logic flash_host_req_done;
-  logic [FLASH_DW-1:0] flash_host_rdata;
-  logic [FLASH_AW-1:0] flash_host_addr;
-
-  tlul_adapter_sram #(
-    .SramAw(FLASH_AW),
-    .SramDw(FLASH_DW),
-    .Outstanding(1),
-    .ByteAccess(0),
-    .ErrOnWrite(1)
-  ) tl_adapter_eflash (
-    .clk_i   (main_clk),
-    .rst_ni   (lc_rst_n),
-
-    .tl_i       (tl_eflash_d_h2d),
-    .tl_o       (tl_eflash_d_d2h),
-
-    .req_o    (flash_host_req),
-    .gnt_i    (flash_host_req_rdy),
-    .we_o     (),
-    .addr_o   (flash_host_addr),
-    .wdata_o  (),
-    .wmask_o  (),
-    .rdata_i  (flash_host_rdata),
-    .rvalid_i (flash_host_req_done),
-    .rerror_i (2'b00)
-  );
-
-  flash_phy #(
-    .NumBanks(FLASH_BANKS),
-    .PagesPerBank(FLASH_PAGES_PER_BANK),
-    .WordsPerPage(FLASH_WORDS_PER_PAGE),
-    .DataWidth(32)
-  ) u_flash_eflash (
-    .clk_i   (main_clk),
-    .rst_ni   (lc_rst_n),
-    .host_req_i      (flash_host_req),
-    .host_addr_i     (flash_host_addr),
-    .host_req_rdy_o  (flash_host_req_rdy),
-    .host_req_done_o (flash_host_req_done),
-    .host_rdata_o    (flash_host_rdata),
-    .flash_ctrl_i    (flash_c2m),
-    .flash_ctrl_o    (flash_m2c)
-  );
-
-
-  if (USB_UART == 0) begin : gen_uart
-    uart uart (
-        .tl_i (tl_uart_d_h2d),
-        .tl_o (tl_uart_d_d2h),
-
-        // Input
-        .cio_rx_i    (cio_uart_rx_p2d),
-
-        // Output
-        .cio_tx_o    (cio_uart_tx_d2p),
-        .cio_tx_en_o (cio_uart_tx_en_d2p),
-
-        // Interrupt
-        .intr_tx_watermark_o  (intr_uart_tx_watermark),
-        .intr_rx_watermark_o  (intr_uart_rx_watermark),
-        .intr_tx_empty_o      (intr_uart_tx_empty),
-        .intr_rx_overflow_o   (intr_uart_rx_overflow),
-        .intr_rx_frame_err_o  (intr_uart_rx_frame_err),
-        .intr_rx_break_err_o  (intr_uart_rx_break_err),
-        .intr_rx_timeout_o    (intr_uart_rx_timeout),
-        .intr_rx_parity_err_o (intr_uart_rx_parity_err),
-
-        .clk_i (fixed_clk),
-        .rst_ni (sys_fixed_rst_n)
-    );
-  end else begin : gen_uuart
-    logic unused_rx = cio_uart_rx_p2d;
-    assign cio_uart_tx_d2p_o = 0;
-    assign cio_uart_tx_en_d2p_o = 0;
-
-    usbuart uart (
-      .clk_i                (clk_i),
-      .clk_48mhz_i          (clk_48mhz_i),
-      .rst_ni               (sys_rst_n),
-      .rst_usb_ni           (sys_rst_n),
-      .tl_i                 (tl_uart_d_h2d),
-      .tl_o                 (tl_uart_d_d2h),
-      .cio_usb_dp_i         (dio_usb_dp_i[USB_UART - 1]),
-      .cio_usb_dp_o         (dio_usb_dp_o[USB_UART - 1]),
-      .cio_usb_dp_en_o      (dio_usb_dp_en_o[USB_UART - 1]),
-      .cio_usb_dn_i         (dio_usb_dn_i[USB_UART - 1]),
-      .cio_usb_dn_o         (dio_usb_dn_o[USB_UART - 1]),
-      .cio_usb_dn_en_o      (dio_usb_dn_en_o[USB_UART - 1]),
-      .cio_usb_sense_i      (dio_usb_sense_i[USB_UART - 1]),
-      .cio_pullup_o         (dio_usb_pullup_o[USB_UART - 1]),
-      .cio_pullup_en_o      (dio_usb_pullup_en_o[USB_UART - 1]),
-
-      .intr_tx_watermark_o  (intr_uart_tx_watermark),
-      .intr_rx_watermark_o  (intr_uart_rx_watermark),
-      .intr_tx_overflow_o   (intr_uart_tx_empty),
-      .intr_rx_overflow_o   (intr_uart_rx_overflow),
-      .intr_rx_frame_err_o  (intr_uart_rx_frame_err),
-      .intr_rx_break_err_o  (intr_uart_rx_break_err),
-      .intr_rx_timeout_o    (intr_uart_rx_timeout),
-      .intr_rx_parity_err_o (intr_uart_rx_parity_err)
-    );
-  end // block: gen_uuart
-
-  gpio gpio (
-      .tl_i (tl_gpio_d_h2d),
-      .tl_o (tl_gpio_d_d2h),
-
-      // Input
-      .cio_gpio_i    (cio_gpio_gpio_p2d),
-
-      // Output
-      .cio_gpio_o    (cio_gpio_gpio_d2p),
-      .cio_gpio_en_o (cio_gpio_gpio_en_d2p),
-
-      // Interrupt
-      .intr_gpio_o (intr_gpio_gpio),
-
-      .clk_i (fixed_clk),
-      .rst_ni (sys_fixed_rst_n)
-  );
-
-  if (USB_DEVICE == 0) begin : gen_spi
-    spi_device spi_device (
-        .tl_i (tl_spi_device_d_h2d),
-        .tl_o (tl_spi_device_d_d2h),
-
-        // Input
-        .cio_sck_i     (cio_spi_device_sck_p2d),
-        .cio_csb_i     (cio_spi_device_csb_p2d),
-        .cio_mosi_i    (cio_spi_device_mosi_p2d),
-
-        // Output
-        .cio_miso_o    (cio_spi_device_miso_d2p),
-        .cio_miso_en_o (cio_spi_device_miso_en_d2p),
-
-        // Interrupt
-        .intr_rxf_o         (intr_spi_device_rxf),
-        .intr_rxlvl_o       (intr_spi_device_rxlvl),
-        .intr_txlvl_o       (intr_spi_device_txlvl),
-        .intr_rxerr_o       (intr_spi_device_rxerr),
-        .intr_rxoverflow_o  (intr_spi_device_rxoverflow),
-        .intr_txunderflow_o (intr_spi_device_txunderflow),
-
-        .scanmode_i   (scanmode_i),
-
-        .clk_i (fixed_clk),
-        .rst_ni (spi_device_rst_n)
-    );
-  end else begin : gen_usbdev // block: gen_spi
-    logic unused_sck = cio_spi_device_sck_p2d;
-    logic unused_csb = cio_spi_device_csb_p2d;
-    logic unused_mosi = cio_spi_device_mosi_p2d;
-    logic usbdev_usb_oe;
-    logic usbdev_usb_pullup_en;
-
-    assign intr_spi_device_rxlvl = 0;
-    assign intr_spi_device_txf = 0;
-    assign cio_spi_device_miso_o = 0;
-    assign cio_spi_device_miso_en_o = 0;
-
-    usbdev udev (
-      .clk_i                   (clk_i),
-      .clk_usb_48mhz_i         (clk_48mhz_i),
-      .rst_ni                  (spi_device_rst_n),
-      .rst_usb_ni              (spi_device_rst_n), // TODO: Need a real USB reset here
-      .tl_i                    (tl_spi_device_d_h2d),
-      .tl_o                    (tl_spi_device_d_d2h),
-
-      .cio_usb_d_i             (1'b0),
-      .cio_usb_dp_i            (dio_usb_dp_i[USB_DEVICE - 1]),
-      .cio_usb_dn_i            (dio_usb_dn_i[USB_DEVICE - 1]),
-
-      .cio_usb_d_o             (),
-      .cio_usb_se0_o           (),
-      .cio_usb_dp_o            (dio_usb_dp_o[USB_DEVICE - 1]),
-      .cio_usb_dn_o            (dio_usb_dn_o[USB_DEVICE - 1]),
-      .cio_usb_oe_o            (usbdev_usb_oe),
-
-      .cio_usb_tx_mode_se_o    (),
-      .cio_usb_sense_i         (dio_usb_sense_i[USB_DEVICE - 1]),
-      .cio_usb_pullup_en_o     (usbdev_usb_pullup_en),
-      .cio_usb_suspend_o       (),
-
-      .intr_pkt_received_o     (intr_spi_device_rxf),
-      .intr_pkt_sent_o         (intr_spi_device_txlvl),
-      .intr_disconnected_o     (),
-      .intr_connected_o        (),
-      .intr_host_lost_o        (),
-      .intr_link_reset_o       (),
-      .intr_link_suspend_o     (),
-      .intr_link_resume_o      (),
-      .intr_av_empty_o         (intr_spi_device_rxlvl),
-      .intr_rx_full_o          (intr_spi_device_rxerr),
-      .intr_av_overflow_o      (intr_spi_device_txunderflow),
-      .intr_link_in_err_o      (),
-      .intr_rx_crc_err_o       (),
-      .intr_rx_pid_err_o       (),
-      .intr_rx_bitstuff_err_o  (),
-      .intr_frame_o            ()
-    );
-
-    assign dio_usb_dp_en_o[USB_DEVICE - 1] = usbdev_usb_oe;
-    assign dio_usb_dn_en_o[USB_DEVICE - 1] = usbdev_usb_oe;
-
-    // Enable -- This is working but should these be swapped so there is no active pull down?
-    assign dio_usb_pullup_o[USB_DEVICE - 1]    = usbdev_usb_pullup_en;
-    assign dio_usb_pullup_en_o[USB_DEVICE - 1] = 1'b1;
-
-  end // block: gen_usbdev
-
-  // Tie off unused USB
-  if (N_USB < MAX_USB) begin: gen_utie
-    for (genvar j = N_USB; j < MAX_USB; j = j + 1) begin
-      logic unused_usb;
-      assign unused_usb = dio_usb_dp_i[j] | dio_usb_dn_i[j] | dio_usb_sense_i[j];
-      assign dio_usb_dp_o[j] = 1'b0;
-      assign dio_usb_dp_en_o[j] = 1'b0;
-      assign dio_usb_dn_o[j] = 1'b0;
-      assign dio_usb_dn_en_o[j] = 1'b0;
-      assign dio_usb_pullup_o[j] = 1'b0;
-      assign dio_usb_pullup_en_o[j] = 1'b0;
-    end
-  end // block: gen_utie
-
-  flash_ctrl flash_ctrl (
-      .tl_i (tl_flash_ctrl_d_h2d),
-      .tl_o (tl_flash_ctrl_d_d2h),
-
-      // Interrupt
-      .intr_prog_empty_o (intr_flash_ctrl_prog_empty),
-      .intr_prog_lvl_o   (intr_flash_ctrl_prog_lvl),
-      .intr_rd_full_o    (intr_flash_ctrl_rd_full),
-      .intr_rd_lvl_o     (intr_flash_ctrl_rd_lvl),
-      .intr_op_done_o    (intr_flash_ctrl_op_done),
-      .intr_op_error_o   (intr_flash_ctrl_op_error),
-
-      .flash_o(flash_c2m),
-      .flash_i(flash_m2c),
-
-      .clk_i (main_clk),
-      .rst_ni (lc_rst_n)
-  );
-
-  rv_timer rv_timer (
-      .tl_i (tl_rv_timer_d_h2d),
-      .tl_o (tl_rv_timer_d_d2h),
-
-      // Interrupt
-      .intr_timer_expired_0_0_o (intr_rv_timer_timer_expired_0_0),
-
-      .clk_i (fixed_clk),
-      .rst_ni (sys_fixed_rst_n)
-  );
-
-  aes aes (
-      .tl_i (tl_aes_d_h2d),
-      .tl_o (tl_aes_d_d2h),
-
-      .clk_i (main_clk),
-      .rst_ni (sys_rst_n)
-  );
-
-  hmac hmac (
-      .tl_i (tl_hmac_d_h2d),
-      .tl_o (tl_hmac_d_d2h),
-
-      // Interrupt
-      .intr_hmac_done_o (intr_hmac_hmac_done),
-      .intr_fifo_full_o (intr_hmac_fifo_full),
-      .intr_hmac_err_o  (intr_hmac_hmac_err),
-
-      // [0]: msg_push_sha_disabled
-      .alert_tx_o  ( alert_tx[0:0] ),
-      .alert_rx_i  ( alert_rx[0:0] ),
-
-      .clk_i (main_clk),
-      .rst_ni (sys_rst_n)
-  );
-
-  rv_plic rv_plic (
-      .tl_i (tl_rv_plic_d_h2d),
-      .tl_o (tl_rv_plic_d_d2h),
-
-      .intr_src_i (intr_vector),
-      .irq_o      (irq_plic),
-      .irq_id_o   (irq_id),
-      .msip_o     (msip),
-
-      .clk_i (main_clk),
-      .rst_ni (sys_rst_n)
-  );
-
-  pinmux pinmux (
-      .tl_i (tl_pinmux_d_h2d),
-      .tl_o (tl_pinmux_d_d2h),
-
-      .periph_to_mio_i      (p2m    ),
-      .periph_to_mio_oe_i   (p2m_en ),
-      .mio_to_periph_o      (m2p    ),
-
-      .mio_out_o            (mio_out_o),
-      .mio_oe_o             (mio_oe_o ),
-      .mio_in_i             (mio_in_i ),
-
-      .clk_i (main_clk),
-      .rst_ni (sys_rst_n)
-  );
-
-  alert_handler alert_handler (
-      .tl_i (tl_alert_handler_d_h2d),
-      .tl_o (tl_alert_handler_d_d2h),
-
-      // Interrupt
-      .intr_classa_o (intr_alert_handler_classa),
-      .intr_classb_o (intr_alert_handler_classb),
-      .intr_classc_o (intr_alert_handler_classc),
-      .intr_classd_o (intr_alert_handler_classd),
-      // TODO: wire this to hardware debug circuit
-      .crashdump_o (          ),
-      // TODO: wire this to TRNG
-      .entropy_i   ( 1'b0     ),
-      // alert signals
-      .alert_rx_o  ( alert_rx ),
-      .alert_tx_i  ( alert_tx ),
-      // escalation outputs
-      .esc_rx_i    ( esc_rx   ),
-      .esc_tx_o    ( esc_tx   ),
-
-      .clk_i (main_clk),
-      .rst_ni (sys_rst_n)
-  );
-
-  nmi_gen nmi_gen (
-      .tl_i (tl_nmi_gen_d_h2d),
-      .tl_o (tl_nmi_gen_d_d2h),
-
-      // Interrupt
-      .intr_esc0_o (intr_nmi_gen_esc0),
-      .intr_esc1_o (intr_nmi_gen_esc1),
-      .intr_esc2_o (intr_nmi_gen_esc2),
-      .intr_esc3_o (intr_nmi_gen_esc3),
-      // escalation signal inputs
-      .esc_rx_o    ( esc_rx   ),
-      .esc_tx_i    ( esc_tx   ),
-
-      .clk_i (main_clk),
-      .rst_ni (sys_rst_n)
-  );
-
-  // interrupt assignments
-  assign intr_vector = {
-      intr_nmi_gen_esc3,
-      intr_nmi_gen_esc2,
-      intr_nmi_gen_esc1,
-      intr_nmi_gen_esc0,
-      intr_alert_handler_classd,
-      intr_alert_handler_classc,
-      intr_alert_handler_classb,
-      intr_alert_handler_classa,
-      intr_hmac_hmac_err,
-      intr_hmac_fifo_full,
-      intr_hmac_hmac_done,
-      intr_flash_ctrl_op_error,
-      intr_flash_ctrl_op_done,
-      intr_flash_ctrl_rd_lvl,
-      intr_flash_ctrl_rd_full,
-      intr_flash_ctrl_prog_lvl,
-      intr_flash_ctrl_prog_empty,
-      intr_spi_device_txunderflow,
-      intr_spi_device_rxoverflow,
-      intr_spi_device_rxerr,
-      intr_spi_device_txlvl,
-      intr_spi_device_rxlvl,
-      intr_spi_device_rxf,
-      intr_uart_rx_parity_err,
-      intr_uart_rx_timeout,
-      intr_uart_rx_break_err,
-      intr_uart_rx_frame_err,
-      intr_uart_rx_overflow,
-      intr_uart_tx_empty,
-      intr_uart_rx_watermark,
-      intr_uart_tx_watermark,
-      intr_gpio_gpio
-  };
-
-  // TL-UL Crossbar
-  xbar_main u_xbar_main (
-    .clk_main_i (main_clk),
-    .clk_fixed_i (fixed_clk),
-    .rst_main_ni (sys_rst_n),
-    .rst_fixed_ni (sys_fixed_rst_n),
-    .tl_corei_i         (tl_corei_h_h2d),
-    .tl_corei_o         (tl_corei_h_d2h),
-    .tl_cored_i         (tl_cored_h_h2d),
-    .tl_cored_o         (tl_cored_h_d2h),
-    .tl_dm_sba_i        (tl_dm_sba_h_h2d),
-    .tl_dm_sba_o        (tl_dm_sba_h_d2h),
-    .tl_rom_o           (tl_rom_d_h2d),
-    .tl_rom_i           (tl_rom_d_d2h),
-    .tl_debug_mem_o     (tl_debug_mem_d_h2d),
-    .tl_debug_mem_i     (tl_debug_mem_d_d2h),
-    .tl_ram_main_o      (tl_ram_main_d_h2d),
-    .tl_ram_main_i      (tl_ram_main_d_d2h),
-    .tl_eflash_o        (tl_eflash_d_h2d),
-    .tl_eflash_i        (tl_eflash_d_d2h),
-    .tl_peri_o          (tl_peri_d_h2d),
-    .tl_peri_i          (tl_peri_d_d2h),
-    .tl_flash_ctrl_o    (tl_flash_ctrl_d_h2d),
-    .tl_flash_ctrl_i    (tl_flash_ctrl_d_d2h),
-    .tl_hmac_o          (tl_hmac_d_h2d),
-    .tl_hmac_i          (tl_hmac_d_d2h),
-    .tl_aes_o           (tl_aes_d_h2d),
-    .tl_aes_i           (tl_aes_d_d2h),
-    .tl_rv_plic_o       (tl_rv_plic_d_h2d),
-    .tl_rv_plic_i       (tl_rv_plic_d_d2h),
-    .tl_pinmux_o        (tl_pinmux_d_h2d),
-    .tl_pinmux_i        (tl_pinmux_d_d2h),
-    .tl_alert_handler_o (tl_alert_handler_d_h2d),
-    .tl_alert_handler_i (tl_alert_handler_d_d2h),
-    .tl_nmi_gen_o       (tl_nmi_gen_d_h2d),
-    .tl_nmi_gen_i       (tl_nmi_gen_d_d2h),
-
-    .scanmode_i
-  );
-  xbar_peri u_xbar_peri (
-    .clk_peri_i (fixed_clk),
-    .rst_peri_ni (sys_fixed_rst_n),
-    .tl_main_i       (tl_main_h_h2d),
-    .tl_main_o       (tl_main_h_d2h),
-    .tl_uart_o       (tl_uart_d_h2d),
-    .tl_uart_i       (tl_uart_d_d2h),
-    .tl_gpio_o       (tl_gpio_d_h2d),
-    .tl_gpio_i       (tl_gpio_d_d2h),
-    .tl_spi_device_o (tl_spi_device_d_h2d),
-    .tl_spi_device_i (tl_spi_device_d_d2h),
-    .tl_rv_timer_o   (tl_rv_timer_d_h2d),
-    .tl_rv_timer_i   (tl_rv_timer_d_d2h),
-
-    .scanmode_i
-  );
-
-  // Pinmux connections
-  assign p2m = {
-    cio_gpio_gpio_d2p
-  };
-  assign p2m_en = {
-    cio_gpio_gpio_en_d2p
-  };
-  assign {
-    cio_gpio_gpio_p2d
-  } = m2p;
-
-  assign cio_spi_device_sck_p2d   = dio_spi_device_sck_i;
-  assign cio_spi_device_csb_p2d   = dio_spi_device_csb_i;
-  assign cio_spi_device_mosi_p2d  = dio_spi_device_mosi_i;
-  assign dio_spi_device_miso_o    = cio_spi_device_miso_d2p;
-  assign dio_spi_device_miso_en_o = cio_spi_device_miso_en_d2p;
-  assign cio_uart_rx_p2d          = dio_uart_rx_i;
-  assign dio_uart_tx_o            = cio_uart_tx_d2p;
-  assign dio_uart_tx_en_o         = cio_uart_tx_en_d2p;
-
-  // make sure scanmode_i is never X (including during reset)
-  `ASSERT_KNOWN(scanmodeKnown, scanmode_i, clk_i, 0)
-
-endmodule
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_usb_nexysvideo.sv b/hw/top_earlgrey/rtl/top_earlgrey_usb_nexysvideo.sv
deleted file mode 100644
index 00d76f6..0000000
--- a/hw/top_earlgrey/rtl/top_earlgrey_usb_nexysvideo.sv
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-module top_earlgrey_usb_nexysvideo (
-  // Clock and Reset
-  input  IO_CLK,
-  input  IO_RST_N,
-  // JTAG interface
-  input  IO_DPS0, // IO_JTCK,    IO_SDCK
-  input  IO_DPS3, // IO_JTMS,    IO_SDCSB
-  input  IO_DPS1, // IO_JTDI,    IO_SDMOSI
-  input  IO_DPS4, // IO_JTRST_N,
-  input  IO_DPS5, // IO_JSRST_N,
-  output IO_DPS2, // IO_JTDO,    IO_MISO
-  input  IO_DPS6, // JTAG=0,     SPI=1
-  // UART interface
-  input  IO_URX,
-  output IO_UTX,
-  // USB interface
-  inout  IO_USB_DP0,
-  inout  IO_USB_DN0,
-  input  IO_USB_SENSE0,
-  output IO_USB_PULLUP0,
-  inout  IO_USB_DP1,
-  inout  IO_USB_DN1,
-  input  IO_USB_SENSE1,
-  output IO_USB_PULLUP1,
-  output IO_OBS,
-  // GPIO x 16 interface
-  inout  IO_GP0,
-  inout  IO_GP1,
-  inout  IO_GP2,
-  inout  IO_GP3,
-  inout  IO_GP4,
-  inout  IO_GP5,
-  inout  IO_GP6,
-  inout  IO_GP7,
-  inout  IO_GP8,
-  inout  IO_GP9,
-  inout  IO_GP10,
-  inout  IO_GP11,
-  inout  IO_GP12,
-  inout  IO_GP13,
-  inout  IO_GP14,
-  inout  IO_GP15
-);
-
-  localparam MAX_USB=2;
-
-  logic        clk_sys, clk_48mhz, rst_sys_n;
-  logic [31:0] cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
-  logic        cio_uart_rx_p2d, cio_uart_tx_d2p, cio_uart_tx_en_d2p;
-  logic        cio_usb_dp_p2d[MAX_USB], cio_usb_dp_d2p[MAX_USB], cio_usb_dp_en_d2p[MAX_USB];
-  logic        cio_usb_dn_p2d[MAX_USB], cio_usb_dn_d2p[MAX_USB], cio_usb_dn_en_d2p[MAX_USB];
-  logic        cio_usb_sense_p2d[MAX_USB];
-  logic        cio_usb_pullup_d2p[MAX_USB], cio_usb_pullup_en_d2p[MAX_USB];
-  logic        cio_spi_device_sck_p2d, cio_spi_device_csb_p2d, cio_spi_device_mosi_p2d;
-  logic        cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
-  logic        cio_jtag_tck_p2d, cio_jtag_tms_p2d, cio_jtag_tdi_p2d, cio_jtag_tdo_d2p;
-  logic        cio_jtag_trst_n_p2d, cio_jtag_srst_n_p2d;
-
-  // Top-level design
-  top_earlgrey_usb #(
-    .MAX_USB(MAX_USB),
-    .N_USB(2),
-    .USB_UART(2),
-    .USB_DEVICE(1)
-  ) top_earlgrey_usb  (
-    .clk_i                (clk_sys),
-    .rst_ni               (rst_sys_n),
-
-    .jtag_tck_i           (cio_jtag_tck_p2d),
-    .jtag_tms_i           (cio_jtag_tms_p2d),
-    .jtag_trst_ni         (cio_jtag_trst_n_p2d),
-    .jtag_td_i            (cio_jtag_tdi_p2d),
-    .jtag_td_o            (cio_jtag_tdo_d2p),
-
-    .cio_uart_rx_p2d_i    (cio_uart_rx_p2d),
-    .cio_uart_tx_d2p_o    (cio_uart_tx_d2p),
-    .cio_uart_tx_en_d2p_o (cio_uart_tx_en_d2p),
-    .clk_48mhz_i          (clk_48mhz),
-    .cio_usb_dp_i         (cio_usb_dp_p2d),
-    .cio_usb_dp_o         (cio_usb_dp_d2p),
-    .cio_usb_dp_en_o      (cio_usb_dp_en_d2p),
-    .cio_usb_dn_i         (cio_usb_dn_p2d),
-    .cio_usb_dn_o         (cio_usb_dn_d2p),
-    .cio_usb_dn_en_o      (cio_usb_dn_en_d2p),
-    .cio_usb_sense_i      (cio_usb_sense_p2d),
-    .cio_usb_pullup_o     (cio_usb_pullup_d2p),
-    .cio_usb_pullup_en_o  (cio_usb_pullup_en_d2p),
-
-    .cio_gpio_p2d_i       (cio_gpio_p2d),
-    .cio_gpio_d2p_o       (cio_gpio_d2p),
-    .cio_gpio_en_d2p_o    (cio_gpio_en_d2p),
-
-    .cio_spi_device_sck_i     (cio_spi_device_sck_p2d),
-    .cio_spi_device_csb_i     (cio_spi_device_csb_p2d),
-    .cio_spi_device_mosi_i    (cio_spi_device_mosi_p2d),
-    .cio_spi_device_miso_o    (cio_spi_device_miso_d2p),
-    .cio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
-
-    .scanmode_i               (1'b0)// 1 for Scan
-  );
-
-  // Clock and reset
-  clkgen_xil7series clkgen (
-    .IO_CLK    (IO_CLK),
-    .IO_RST_N  (IO_RST_N & cio_jtag_srst_n_p2d),
-    .clk_sys   (clk_sys),
-    .clk_48MHz (clk_48mhz),
-    .rst_sys_n (rst_sys_n)
-  );
-
-  assign  IO_OBS = cio_usb_dp_en_d2p[0];
-  // pad control
-  padctl_usb padctl (
-    // UART
-    .cio_uart_rx_p2d,
-    .cio_uart_tx_d2p,
-    .cio_uart_tx_en_d2p,
-    // USB
-    .cio_usb_dp_p2d(cio_usb_dp_p2d),
-    .cio_usb_dp_d2p(cio_usb_dp_d2p),
-    .cio_usb_dp_en_d2p(cio_usb_dp_en_d2p),
-    .cio_usb_dn_p2d(cio_usb_dn_p2d),
-    .cio_usb_dn_d2p(cio_usb_dn_d2p),
-    .cio_usb_dn_en_d2p(cio_usb_dn_en_d2p),
-    .cio_usb_sense_p2d(cio_usb_sense_p2d),
-    .cio_usb_pullup_d2p(cio_usb_pullup_d2p),
-    .cio_usb_pullup_en_d2p(cio_usb_pullup_en_d2p),
-    // GPIO
-    .cio_gpio_p2d,
-    .cio_gpio_d2p,
-    .cio_gpio_en_d2p,
-    // pads
-    .IO_URX,
-    .IO_UTX,
-    .IO_USB_DP0,
-    .IO_USB_DN0,
-    .IO_USB_SENSE0,
-    .IO_USB_PULLUP0,
-    .IO_USB_DP1,
-    .IO_USB_DN1,
-    .IO_USB_SENSE1,
-    .IO_USB_PULLUP1,
-    .IO_GP0,
-    .IO_GP1,
-    .IO_GP2,
-    .IO_GP3,
-    .IO_GP4,
-    .IO_GP5,
-    .IO_GP6,
-    .IO_GP7,
-    .IO_GP8,
-    .IO_GP9,
-    .IO_GP10,
-    .IO_GP11,
-    .IO_GP12,
-    .IO_GP13,
-    .IO_GP14,
-    .IO_GP15,
-
-    .cio_spi_device_sck_p2d,
-    .cio_spi_device_csb_p2d,
-    .cio_spi_device_mosi_p2d,
-    .cio_spi_device_miso_d2p,
-    .cio_spi_device_miso_en_d2p,
-    .cio_jtag_tck_p2d,
-    .cio_jtag_tms_p2d,
-    .cio_jtag_trst_n_p2d,
-    .cio_jtag_srst_n_p2d,
-    .cio_jtag_tdi_p2d,
-    .cio_jtag_tdo_d2p,
-    .IO_DPS0,
-    .IO_DPS1,
-    .IO_DPS2,
-    .IO_DPS3,
-    .IO_DPS4,
-    .IO_DPS5,
-    .IO_DPS6
-  );
-endmodule
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_usb_verilator.sv b/hw/top_earlgrey/rtl/top_earlgrey_usb_verilator.sv
deleted file mode 100644
index 8b8e17a..0000000
--- a/hw/top_earlgrey/rtl/top_earlgrey_usb_verilator.sv
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-module top_earlgrey_usb_verilator (
-  // Clock and Reset
-  input clk_i,
-  input rst_ni
-  );
-
-  localparam MAX_USB=1;
-
-  logic cio_jtag_tck, cio_jtag_tms, cio_jtag_tdi, cio_jtag_tdo;
-  logic cio_jtag_trst_n, cio_jtag_srst_n;
-
-  logic [31:0]  cio_gpio_p2d, cio_gpio_d2p, cio_gpio_en_d2p;
-  logic cio_uart_rx_p2d, cio_uart_tx_d2p, cio_uart_tx_en_d2p;
-  logic dio_usb_dp_p2d[MAX_USB], dio_usb_dp_d2p[MAX_USB], dio_usb_dp_en_d2p[MAX_USB];
-  logic dio_usb_dn_p2d[MAX_USB], dio_usb_dn_d2p[MAX_USB], dio_usb_dn_en_d2p[MAX_USB];
-  logic dio_usb_sense_p2d[MAX_USB], dio_usb_pullup_d2p[MAX_USB], dio_usb_pullup_en_d2p[MAX_USB];
-
-  logic cio_spi_device_sck_p2d, cio_spi_device_csb_p2d;
-  logic cio_spi_device_mosi_p2d;
-  logic cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
-
-  logic IO_JTCK, IO_JTMS, IO_JTRST_N, IO_JTDI, IO_JTDO;
-
-  // Top-level design
-  top_earlgrey_usb #(
-    .MAX_USB(1),
-    .N_USB(1),
-    .USB_UART(0),
-    .USB_DEVICE(1)
-  ) top_earlgrey_usb  (
-    .clk_i                    (clk_i),
-    .rst_ni                   (rst_ni),
-
-    .jtag_tck_i               (IO_JTCK),
-    .jtag_tms_i               (IO_JTMS),
-    .jtag_trst_ni             (rst_ni),
-    .jtag_td_i                (IO_JTDI),
-    .jtag_td_o                (IO_JTDO),
-
-    .dio_uart_rx_i            (cio_uart_rx_p2d),
-    .dio_uart_tx_o            (cio_uart_tx_d2p),
-    .dio_uart_tx_en_o         (cio_uart_tx_en_d2p),
-
-    .clk_48mhz_i              (clk_i),
-    .dio_usb_dp_i             (dio_usb_dp_p2d),
-    .dio_usb_dp_o             (dio_usb_dp_d2p),
-    .dio_usb_dp_en_o          (dio_usb_dp_en_d2p),
-    .dio_usb_dn_i             (dio_usb_dn_p2d),
-    .dio_usb_dn_o             (dio_usb_dn_d2p),
-    .dio_usb_dn_en_o          (dio_usb_dn_en_d2p),
-    .dio_usb_sense_i          (dio_usb_sense_p2d),
-    .dio_usb_pullup_o         (dio_usb_pullup_d2p),
-    .dio_usb_pullup_en_o      (dio_usb_pullup_en_d2p),
-
-    .mio_in_i                 (cio_gpio_p2d),
-    .mio_out_o                (cio_gpio_d2p),
-    .mio_oe_o                 (cio_gpio_en_d2p),
-
-    .dio_spi_device_sck_i     (cio_spi_device_sck_p2d),
-    .dio_spi_device_csb_i     (cio_spi_device_csb_p2d),
-    .dio_spi_device_mosi_i    (cio_spi_device_mosi_p2d),
-    .dio_spi_device_miso_o    (cio_spi_device_miso_d2p),
-    .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
-
-    .scanmode_i               (1'b0)
-  );
-
-  // GPIO DPI
-  gpiodpi
-    #(.N_GPIO(32))
-    u_gpiodpi(
-      .clk_i(clk_i),
-      .rst_ni(rst_ni),
-      .gpio_p2d(cio_gpio_p2d),
-      .gpio_d2p(cio_gpio_d2p),
-      .gpio_en_d2p(cio_gpio_en_d2p)
-  );
-
-  // UART DPI
-  // The baud rate set to match FPGA implementation; the frequency is
-  // "artificial".
-  // Both baud rate and frequency must match the settings used in the on-chip
-  // software.
-  uartdpi #(
-    .BAUD('d9_600),
-    .FREQ('d500_000)
-  ) u_uart (
-    .clk_i  (clk_i),
-    .rst_ni (rst_ni),
-    .tx_o   (cio_uart_rx_p2d),
-    .rx_i   (cio_uart_tx_d2p)
-  );
-
-  // USB DPI
-  usbdpi udpi (
-    .clk_i          (clk_i),
-    .rst_ni         (rst_ni),
-    .clk_48MHz_i    (clk_i),
-    .dp_p2d         (dio_usb_dp_p2d[0]),
-    .dp_d2p         (dio_usb_dp_d2p[0]),
-    .dp_en_d2p      (dio_usb_dp_en_d2p[0]),
-    .dn_p2d         (dio_usb_dn_p2d[0]),
-    .dn_d2p         (dio_usb_dn_d2p[0]),
-    .dn_en_d2p      (dio_usb_dn_en_d2p[0]),
-    .sense_p2d      (dio_usb_sense_p2d[0]),
-    .pullup_d2p     (dio_usb_pullup_d2p[0]),
-    .pullup_en_d2p  (dio_usb_pullup_en_d2p[0])
-  );
-
-  // JTAG DPI for OpenOCD
-  jtagdpi u_jtagdpi (
-    .clk_i,
-    .rst_ni,
-
-    .jtag_tck    (cio_jtag_tck),
-    .jtag_tms    (cio_jtag_tms),
-    .jtag_tdi    (cio_jtag_tdi),
-    .jtag_tdo    (cio_jtag_tdo),
-    .jtag_trst_n (cio_jtag_trst_n),
-    .jtag_srst_n (cio_jtag_srst_n)
-  );
-
-  // SPI DPI
-  spidpi u_spi (
-    .clk_i  (clk_i),
-    .rst_ni (rst_ni),
-    .spi_device_sck_o     (cio_spi_device_sck_p2d),
-    .spi_device_csb_o     (cio_spi_device_csb_p2d),
-    .spi_device_mosi_o    (cio_spi_device_mosi_p2d),
-    .spi_device_miso_i    (cio_spi_device_miso_d2p),
-    .spi_device_miso_en_i (cio_spi_device_miso_en_d2p)
-  );
-
-endmodule
diff --git a/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv b/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
index c334b83..5535aed 100644
--- a/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
+++ b/hw/top_earlgrey/rtl/top_earlgrey_verilator.sv
@@ -18,6 +18,10 @@
   logic cio_spi_device_mosi_p2d;
   logic cio_spi_device_miso_d2p, cio_spi_device_miso_en_d2p;
 
+  logic cio_usbdev_sense_p2d, cio_usbdev_pullup_d2p, cio_usbdev_pullup_en_d2p;
+  logic cio_usbdev_dp_p2d, cio_usbdev_dp_d2p, cio_usbdev_dp_en_d2p;
+  logic cio_usbdev_dn_p2d, cio_usbdev_dn_d2p, cio_usbdev_dn_en_d2p;
+
   logic IO_JTCK, IO_JTMS, IO_JTRST_N, IO_JTDI, IO_JTDO;
 
   // Top-level design
@@ -25,6 +29,8 @@
     .clk_i                    (clk_i),
     .rst_ni                   (rst_ni),
 
+    .clk_usb_48mhz_i          (clk_i),
+
     .jtag_tck_i               (cio_jtag_tck),
     .jtag_tms_i               (cio_jtag_tms),
     .jtag_trst_ni             (cio_jtag_trst_n),
@@ -47,7 +53,17 @@
     .dio_spi_device_miso_o    (cio_spi_device_miso_d2p),
     .dio_spi_device_miso_en_o (cio_spi_device_miso_en_d2p),
 
-    .scanmode_i                   (1'b0)
+    .dio_usbdev_sense_i       (cio_usbdev_sense_p2d),
+    .dio_usbdev_pullup_o      (cio_usbdev_pullup_d2p),
+    .dio_usbdev_pullup_en_o   (cio_usbdev_pullup_en_d2p),
+    .dio_usbdev_dp_i          (cio_usbdev_dp_p2d),
+    .dio_usbdev_dp_o          (cio_usbdev_dp_d2p),
+    .dio_usbdev_dp_en_o       (cio_usbdev_dp_en_d2p),
+    .dio_usbdev_dn_i          (cio_usbdev_dn_p2d),
+    .dio_usbdev_dn_o          (cio_usbdev_dn_d2p),
+    .dio_usbdev_dn_en_o       (cio_usbdev_dn_en_d2p),
+
+    .scanmode_i               (1'b0)
   );
 
   // GPIO DPI
@@ -98,6 +114,22 @@
     .spi_device_miso_en_i (cio_spi_device_miso_en_d2p)
   );
 
+  // USB DPI
+  usbdpi u_usbdpi (
+    .clk_i         (clk_i),
+    .rst_ni        (rst_ni),
+    .clk_48MHz_i   (clk_i),
+    .sense_p2d     (cio_usbdev_sense_p2d),
+    .pullup_d2p    (cio_usbdev_pullup_d2p),
+    .pullup_en_d2p (cio_usbdev_pullup_en_d2p),
+    .dp_p2d        (cio_usbdev_dp_p2d),
+    .dp_d2p        (cio_usbdev_dp_d2p),
+    .dp_en_d2p     (cio_usbdev_dp_en_d2p),
+    .dn_p2d        (cio_usbdev_dn_p2d),
+    .dn_d2p        (cio_usbdev_dn_d2p),
+    .dn_en_d2p     (cio_usbdev_dn_en_d2p)
+  );
+
   // monitor for termination
 `ifndef END_MON_PATH
   `define END_MON_PATH top_earlgrey.u_ram1p_ram_main
diff --git a/hw/top_earlgrey/sw/autogen/top_earlgrey.h b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
index e22adfb..eca2f58 100644
--- a/hw/top_earlgrey/sw/autogen/top_earlgrey.h
+++ b/hw/top_earlgrey/sw/autogen/top_earlgrey.h
@@ -11,7 +11,7 @@
 // PERIPH_INSEL ranges from 0 to NUM_MIO + 2 -1}
 //  0 and 1 are tied to value 0 and 1
 #define NUM_MIO 32
-#define NUM_DIO 6
+#define NUM_DIO 10
 
 #define PINMUX_GPIO_GPIO_0_IN 0
 #define PINMUX_GPIO_GPIO_1_IN 1
diff --git a/hw/top_earlgrey/top_earlgrey.core b/hw/top_earlgrey/top_earlgrey.core
index 6430e3c..bf7630e 100644
--- a/hw/top_earlgrey/top_earlgrey.core
+++ b/hw/top_earlgrey/top_earlgrey.core
@@ -23,6 +23,7 @@
       - lowrisc:ip:flash_ctrl:0.1
       - lowrisc:constants:top_pkg
       - lowrisc:ip:nmi_gen
+      - lowrisc:ip:usbdev
     files:
       - ip/xbar_main/rtl/autogen/tl_main_pkg.sv
       - ip/xbar_main/rtl/autogen/xbar_main.sv
diff --git a/hw/top_earlgrey/top_earlgrey_usb.core b/hw/top_earlgrey/top_earlgrey_usb.core
deleted file mode 100644
index 32ca59e..0000000
--- a/hw/top_earlgrey/top_earlgrey_usb.core
+++ /dev/null
@@ -1,79 +0,0 @@
-CAPI=2:
-# Copyright lowRISC contributors.
-# Licensed under the Apache License, Version 2.0, see LICENSE for details.
-# SPDX-License-Identifier: Apache-2.0
-name: "lowrisc:systems:top_earlgrey_usb:0.1"
-description: "Technology-independent Earl Grey with USB toplevel"
-filesets:
-  files_rtl_generic:
-    depend:
-      - lowrisc:ip:uart:0.1
-      - lowrisc:ip:gpio
-      - lowrisc:ip:rv_core_ibex
-      - lowrisc:ip:rv_dm
-      - lowrisc:ip:rv_plic_component
-      - lowrisc:ip:rv_timer
-      - lowrisc:ip:tlul
-      - lowrisc:ip:spi_device
-      - lowrisc:ip:aes
-      - lowrisc:ip:hmac
-      - lowrisc:prim:ram_1p
-      - lowrisc:prim:rom
-      - lowrisc:prim:flash
-      - lowrisc:ip:flash_ctrl:0.1
-      - lowrisc:constants:top_pkg
-      - lowrisc:ip:nmi_gen
-      - lowrisc:ip:usbuart
-      - lowrisc:ip:usbdev
-    files:
-      - ip/xbar_main/rtl/autogen/tl_main_pkg.sv
-      - ip/xbar_main/rtl/autogen/xbar_main.sv
-      - ip/xbar_peri/rtl/autogen/tl_peri_pkg.sv
-      - ip/xbar_peri/rtl/autogen/xbar_peri.sv
-      - ip/rv_plic/rtl/autogen/rv_plic_reg_pkg.sv
-      - ip/rv_plic/rtl/autogen/rv_plic_reg_top.sv
-      - ip/rv_plic/rtl/autogen/rv_plic.sv
-      - ip/pinmux/rtl/autogen/pinmux_reg_pkg.sv
-      - ip/pinmux/rtl/autogen/pinmux_reg_top.sv
-      - ../ip/pinmux/rtl/pinmux.sv
-      - ip/alert_handler/rtl/autogen/alert_handler_reg_pkg.sv
-      - ip/alert_handler/rtl/autogen/alert_handler_reg_top.sv
-      - ../ip/alert_handler/rtl/alert_pkg.sv
-      - ../ip/alert_handler/rtl/alert_handler_reg_wrap.sv
-      - ../ip/alert_handler/rtl/alert_handler_class.sv
-      - ../ip/alert_handler/rtl/alert_handler_ping_timer.sv
-      - ../ip/alert_handler/rtl/alert_handler_esc_timer.sv
-      - ../ip/alert_handler/rtl/alert_handler_accu.sv
-      - ../ip/alert_handler/rtl/alert_handler.sv
-      - rtl/padctl_usb.sv
-      - rtl/top_earlgrey_usb.sv
-    file_type: systemVerilogSource
-
-parameters:
-  SYNTHESIS:
-    datatype: bool
-    paramtype: vlogdefine
-  ASIC_SYNTHESIS:
-    datatype: bool
-    paramtype: vlogdefine
-  # For value definition, please see ip/prim/rtl/prim_pkg.sv
-  PRIM_DEFAULT_IMPL:
-    datatype: str
-    paramtype: vlogdefine
-    description: Primitives implementation to use, e.g. "prim_pkg::ImplGeneric".
-    default: prim_pkg::ImplGeneric
-
-targets:
-  default: &default_target
-    filesets:
-      - files_rtl_generic
-    parameters:
-      - PRIM_DEFAULT_IMPL=prim_pkg::ImplGeneric
-    toplevel: top_earlgrey
-  sim:
-    default_tool: icarus
-    filesets:
-      - files_rtl_generic
-    parameters:
-      - PRIM_DEFAULT_IMPL=prim_pkg::ImplGeneric
-    toplevel: top_earlgrey_usb
diff --git a/hw/top_earlgrey/top_earlgrey_usb_nexysvideo.core b/hw/top_earlgrey/top_earlgrey_usb_nexysvideo.core
deleted file mode 100644
index 52d8ab0..0000000
--- a/hw/top_earlgrey/top_earlgrey_usb_nexysvideo.core
+++ /dev/null
@@ -1,50 +0,0 @@
-CAPI=2:
-# Copyright lowRISC contributors.
-# Licensed under the Apache License, Version 2.0, see LICENSE for details.
-# SPDX-License-Identifier: Apache-2.0
-name: "lowrisc:systems:top_earlgrey_usb_nexysvideo:0.1"
-description: "Earl Grey with USB toplevel for the Nexys Video board"
-filesets:
-  files_rtl_usb_nexysvideo:
-    depend:
-      - lowrisc:systems:top_earlgrey_usb:0.1
-    files:
-      - rtl/clkgen_xil7series.sv
-      - rtl/top_earlgrey_usb_nexysvideo.sv
-    file_type: systemVerilogSource
-
-  files_constraints:
-    files:
-      - data/pins_nexysvideo.xdc
-    file_type: xdc
-
-parameters:
-  # XXX: This parameter needs to be absolute, or relative to the *.runs/synth_1
-  # directory. It's best to pass it as absolute path when invoking fusesoc, e.g.
-  # --SRAM_INIT_FILE=$PWD/build-bin/sw/device/fpga/examples/hello_usbdev/hello_usbdev.vmem
-  # XXX: The VMEM file should be added to the sources of the Vivado project to
-  # make the Vivado dependency tracking work. However this requires changes to
-  # fusesoc first.
-  SRAM_INIT_FILE:
-    datatype: str
-    description: SRAM initialization file in vmem hex format
-    default: "../../../../../build-bin/sw/device/fpga/examples/hello_usbdev/hello_usbdev.vmem"
-    paramtype: vlogdefine
-  PRIM_DEFAULT_IMPL:
-    datatype: str
-    paramtype: vlogdefine
-    description: Primitives implementation to use, e.g. "prim_pkg::ImplGeneric".
-
-targets:
-  synth:
-    default_tool: vivado
-    filesets:
-      - files_rtl_usb_nexysvideo
-      - files_constraints
-    toplevel: top_earlgrey_usb_nexysvideo
-    parameters:
-      - SRAM_INIT_FILE
-      - PRIM_DEFAULT_IMPL=prim_pkg::ImplXilinx
-    tools:
-      vivado:
-        part: "xc7a200tsbg484-1" # Nexys Video
diff --git a/hw/top_earlgrey/top_earlgrey_usb_verilator.cc b/hw/top_earlgrey/top_earlgrey_usb_verilator.cc
deleted file mode 100644
index 007fa34..0000000
--- a/hw/top_earlgrey/top_earlgrey_usb_verilator.cc
+++ /dev/null
@@ -1,39 +0,0 @@
-// Copyright lowRISC contributors.
-// Licensed under the Apache License, Version 2.0, see LICENSE for details.
-// SPDX-License-Identifier: Apache-2.0
-
-#include <iostream>
-
-#include "verilated_toplevel.h"
-#include "verilator_memutil.h"
-#include "verilator_sim_ctrl.h"
-
-int main(int argc, char **argv) {
-  top_earlgrey_usb_verilator top;
-  VerilatorMemUtil memutil;
-  VerilatorSimCtrl &simctrl = VerilatorSimCtrl::GetInstance();
-  simctrl.SetTop(&top, &top.clk_i, &top.rst_ni,
-                 VerilatorSimCtrlFlags::ResetPolarityNegative);
-
-  memutil.RegisterMemoryArea("rom",
-                             "TOP.top_earlgrey_usb_verilator.top_earlgrey_usb."
-                             "u_rom_rom.gen_mem_generic."
-                             "u_impl_generic");
-  memutil.RegisterMemoryArea(
-      "ram",
-      "TOP.top_earlgrey_usb_verilator.top_earlgrey_usb.u_ram1p_ram_main"
-      ".gen_mem_generic.u_impl_generic");
-  memutil.RegisterMemoryArea(
-      "flash",
-      "TOP.top_earlgrey_usb_verilator.top_earlgrey_usb.u_flash_eflash."
-      "gen_flash_banks[0].u_flash.gen_flash.u_impl_generic.u_mem.gen_mem_"
-      "generic.u_impl_"
-      "generic");
-  simctrl.RegisterExtension(&memutil);
-
-  std::cout << "Simulation of OpenTitan Earl Grey" << std::endl
-            << "=================================" << std::endl
-            << std::endl;
-
-  return simctrl.Exec(argc, argv);
-}
diff --git a/hw/top_earlgrey/top_earlgrey_usb_verilator.core b/hw/top_earlgrey/top_earlgrey_usb_verilator.core
deleted file mode 100644
index a347fdf..0000000
--- a/hw/top_earlgrey/top_earlgrey_usb_verilator.core
+++ /dev/null
@@ -1,60 +0,0 @@
-CAPI=2:
-# Copyright lowRISC contributors.
-# Licensed under the Apache License, Version 2.0, see LICENSE for details.
-# SPDX-License-Identifier: Apache-2.0
-name: "lowrisc:systems:top_earlgrey_usb_verilator:0.1"
-description: "Earl Grey toplevel with USB for simulation with Verilator"
-filesets:
-  files_sim_verilator:
-    depend:
-      - lowrisc:systems:top_earlgrey_usb:0.1
-      - lowrisc:dv_dpi:uartdpi
-      - lowrisc:dv_dpi:usbdpi
-      - lowrisc:dv_dpi:gpiodpi
-      - lowrisc:dv_dpi:jtagdpi
-      - lowrisc:dv_dpi:spidpi
-      - lowrisc:dv_verilator:simutil_verilator
-      - lowrisc:dv_verilator:memutil_verilator
-
-    files:
-      - rtl/top_earlgrey_usb_verilator.sv: { file_type: systemVerilogSource }
-      - top_earlgrey_usb_verilator.cc: { file_type: cppSource }
-parameters:
-  # For value definition, please see ip/prim/rtl/prim_pkg.sv
-  PRIM_DEFAULT_IMPL:
-    datatype: str
-    paramtype: vlogdefine
-    description: Primitives implementation to use, e.g. "prim_pkg::ImplGeneric".
-
-targets:
-  sim:
-    parameters:
-      - PRIM_DEFAULT_IMPL=prim_pkg::ImplGeneric
-    default_tool: verilator
-    filesets:
-      - files_sim_verilator
-    toplevel: top_earlgrey_usb_verilator
-    tools:
-      verilator:
-        mode: cc
-        verilator_options:
-          # Disabling tracing reduces compile times but doesn't have a
-          # huge influence on runtime performance.
-          - '--trace'
-          - '--trace-fst' # this requires -DVM_TRACE_FMT_FST in CFLAGS below!
-          # Remove FST options for VCD trace (~100 x faster but larger files)
-          - '--trace-structs'
-          - '--trace-params'
-          - '--trace-max-array 1024'
-          - '-CFLAGS "-std=c++11 -Wall -DVM_TRACE_FMT_FST -DTOPLEVEL_NAME=top_earlgrey_usb_verilator -g"'
-          - '-LDFLAGS "-pthread -lutil -lelf"'
-          - "-Wall"
-          - "-Wno-PINCONNECTEMPTY"
-          # XXX: Cleanup all warnings and remove this option
-          # (or make it more fine-grained at least)
-          - "-Wno-fatal"
-        make_options:
-          # Optimization levels have a large impact on the runtime performance
-          # of the simulation model. -O2 and -O3 are pretty similar, -Os is
-          # slower than -O2/-O3
-          - OPT_FAST="-O2"
diff --git a/hw/top_earlgrey/top_earlgrey_verilator.core b/hw/top_earlgrey/top_earlgrey_verilator.core
index 6f09f6d..c5e752d 100644
--- a/hw/top_earlgrey/top_earlgrey_verilator.core
+++ b/hw/top_earlgrey/top_earlgrey_verilator.core
@@ -12,6 +12,7 @@
       - lowrisc:dv_dpi:gpiodpi
       - lowrisc:dv_dpi:jtagdpi
       - lowrisc:dv_dpi:spidpi
+      - lowrisc:dv_dpi:usbdpi
       - lowrisc:dv_verilator:memutil_verilator
       - lowrisc:dv_verilator:simutil_verilator
       - lowrisc:ibex:ibex_tracer
diff --git a/sw/device/examples/hello_usbdev/hello_usbdev.c b/sw/device/examples/hello_usbdev/hello_usbdev.c
index 9c7b7dd..3182b3e 100644
--- a/sw/device/examples/hello_usbdev/hello_usbdev.c
+++ b/sw/device/examples/hello_usbdev/hello_usbdev.c
@@ -2,19 +2,40 @@
 // Licensed under the Apache License, Version 2.0, see LICENSE for details.
 // SPDX-License-Identifier: Apache-2.0
 
+#include <stdbool.h>
 #include "sw/device/lib/base/stdasm.h"
 #include "sw/device/lib/common.h"
 #include "sw/device/lib/gpio.h"
+#include "sw/device/lib/pinmux.h"
 #include "sw/device/lib/runtime/hart.h"
+#include "sw/device/lib/spi_device.h"
 #include "sw/device/lib/uart.h"
 #include "sw/device/lib/usb_controlep.h"
 #include "sw/device/lib/usb_simpleserial.h"
 #include "sw/device/lib/usbdev.h"
 
 // These just for the '/' printout
-#define USBDEV_BASE_ADDR 0x40020000
+#define USBDEV_BASE_ADDR 0x40150000
 #include "usbdev_regs.h"  // Generated.
 
+#define SPI_MAX 32
+
+// called from ctr0 when something bad happens
+// char I=illegal instruction, A=lsu error (address), E=ecall
+void trap_handler(uint32_t mepc, char c) {
+  uart_send_char(c);
+  uart_send_uint(mepc, 32);
+  while (1) {
+    gpio_write_all(0xAA00);  // pattern
+    usleep(200 * 1000);
+    gpio_write_all(0x5500);  // pattern
+    usleep(100 * 1000);
+  }
+}
+
+#define MK_PRINT(c) \
+  (((c != 0xa) && (c != 0xd) && ((c < 32) || (c > 126))) ? '_' : c)
+
 // Build Configuration descriptor array
 static uint8_t cfg_dscr[] = {
     USB_CFG_DSCR_HEAD(
@@ -33,42 +54,32 @@
 static usb_controlep_ctx_t control_ctx;
 static usb_ss_ctx_t ss_ctx[2];
 
-static void test_error(void) {
-  while (1) {
-    gpio_write_all(0xAA00);  // pattern
-    usleep(200 * 1000);
-    gpio_write_all(0x5500);  // pattern
-    usleep(100 * 1000);
-  }
-}
-
-// Override default handler routines
-void handler_instr_ill_fault(void) {
-  uart_send_str("Instruction Illegal fault");
-  test_error();
-}
-
-// Override default handler routines
-void handler_lsu_fault(void) {
-  uart_send_str("Load/Store Fault");
-  test_error();
-}
-
-#define MK_PRINT(c) \
-  (((c != 0xa) && (c != 0xd) && ((c < 32) || (c > 126))) ? '_' : c)
+// We signal PASS! after receiving USB_MAX.
+static volatile unsigned int num_chars_rx = 0;
+#ifndef USB_MAX
+#define USB_MAX 6
+#endif
 
 /* Inbound USB characters get printed to the UART via these callbacks */
 /* Not ideal because the UART is slower */
-static void serial_rx0(uint8_t c) { uart_send_char(MK_PRINT(c)); }
+static void serial_rx0(uint8_t c) {
+  uart_send_char(MK_PRINT(c));
+  num_chars_rx++;
+}
 /* Add one to rx character so you can tell it is the second instance */
-static void serial_rx1(uint8_t c) { uart_send_char(MK_PRINT(c + 1)); }
+static void serial_rx1(uint8_t c) {
+  uart_send_char(MK_PRINT(c + 1));
+  num_chars_rx++;
+}
 
 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);
 
+  spid_init();
   // Add DATE and TIME because I keep fooling myself with old versions
   uart_send_str(
       "Hello USB! "__DATE__
@@ -87,13 +98,19 @@
   usb_controlep_init(&control_ctx, &usbdev_ctx, 0, cfg_dscr, sizeof(cfg_dscr));
   usb_simpleserial_init(&ss_ctx[0], &usbdev_ctx, 1, serial_rx0);
   usb_simpleserial_init(&ss_ctx[1], &usbdev_ctx, 2, serial_rx1);
+  bool pass_signaled = false;
 
   uint32_t gpio_in;
   uint32_t gpio_in_prev = 0;
   uint32_t gpio_in_changes;
+  uint8_t spi_buf[SPI_MAX];
+  uint32_t spi_in;
+
+  spid_send("SPI!", 4);
 
   while (1) {
     usbdev_poll(&usbdev_ctx);
+
     // report changed switches over UART
     gpio_in = gpio_read() & 0x100FF;  // 0-7 is switch input, 16 is FTDI
     gpio_in_changes = (gpio_in & ~gpio_in_prev) | (~gpio_in & gpio_in_prev);
@@ -113,13 +130,25 @@
     }
     gpio_in_prev = gpio_in;
 
+    // SPI character echo
+    spi_in = spid_read_nb(spi_buf, SPI_MAX);
+    if (spi_in) {
+      uint32_t d = (*(uint32_t *)spi_buf) ^ 0x01010101;
+      spid_send(&d, 4);
+      uart_send_str("SPI: ");
+      for (int i = 0; i < spi_in; i++) {
+        uart_send_char(MK_PRINT(spi_buf[i]));
+      }
+      uart_send_str("\r\n");
+    }
     // UART echo
     char rcv_char;
     while (uart_rcv_char(&rcv_char) != -1) {
       uart_send_char(rcv_char);
+      gpio_write_all(rcv_char << 8);
       if (rcv_char == '/') {
         uart_send_char('I');
-        uart_send_uint(REG32(USBDEV_INTR_STATE()), 12);
+        uart_send_uint(REG32(USBDEV_INTR_STATE()), 16);
         uart_send_char('-');
         uart_send_uint(REG32(USBDEV_USBSTAT()), 32);
         uart_send_char(' ');
@@ -127,7 +156,15 @@
         usb_simpleserial_send_byte(&ss_ctx[0], rcv_char);
         usb_simpleserial_send_byte(&ss_ctx[1], rcv_char + 1);
       }
-      gpio_write_all(rcv_char << 8);
+    }
+
+    // Signal that the simulation passed
+    if ((num_chars_rx >= USB_MAX) && (pass_signaled == false)) {
+      uart_send_str("\r\nPASS!\r\n");
+      pass_signaled = true;
     }
   }
+  uart_send_str("\r\nUSB received 0x");
+  uart_send_uint(num_chars_rx, 32);
+  uart_send_str(" characters.\r\n");
 }
diff --git a/sw/device/examples/hello_usbdev/meson.build b/sw/device/examples/hello_usbdev/meson.build
index dc89956..86bc516 100644
--- a/sw/device/examples/hello_usbdev/meson.build
+++ b/sw/device/examples/hello_usbdev/meson.build
@@ -8,8 +8,10 @@
   name_suffix: 'elf',
   dependencies: [
     sw_lib_runtime_hart,
+    sw_lib_pinmux,
     sw_lib_gpio,
     sw_lib_irq,
+    sw_lib_spi_device,
     sw_lib_uart,
     sw_lib_usb,
     riscv_crt,
diff --git a/sw/device/lib/usbdev.c b/sw/device/lib/usbdev.c
index bd5f74b..5bb905b 100644
--- a/sw/device/lib/usbdev.c
+++ b/sw/device/lib/usbdev.c
@@ -6,7 +6,7 @@
 
 #include "sw/device/lib/common.h"
 
-#define USBDEV_BASE_ADDR 0x40020000
+#define USBDEV_BASE_ADDR 0x40150000
 #include "usbdev_regs.h"  // Generated.
 
 #define EXTRACT(n, f) ((n >> USBDEV_##f##_OFFSET) & USBDEV_##f##_MASK)
diff --git a/sw/device/lib/usbdev.h b/sw/device/lib/usbdev.h
index 6e14770..4e4c19a 100644
--- a/sw/device/lib/usbdev.h
+++ b/sw/device/lib/usbdev.h
@@ -224,10 +224,18 @@
  */
 void usbdev_init(usbdev_ctx_t *ctx);
 
-// Used for tracing what is going on
+// Used for tracing what is going on. This may impact timing which is critical
+// when simulating with the USB DPI module.
+//#define ENABLE_TRC
+#ifdef ENABLE_TRC
 #include "sw/device/lib/uart.h"
 #define TRC_S(s) uart_send_str(s)
 #define TRC_I(i, b) uart_send_uint(i, b)
 #define TRC_C(c) uart_send_char(c)
+#else
+#define TRC_S(s)
+#define TRC_I(i, b)
+#define TRC_C(c)
+#endif
 
 #endif  // OPENTITAN_SW_DEVICE_LIB_USBDEV_H_