rtl updated
diff --git a/verilog/rtl/Caravel_Top.v b/verilog/rtl/Top.v
similarity index 70%
rename from verilog/rtl/Caravel_Top.v
rename to verilog/rtl/Top.v
index 01429e9..80768b7 100644
--- a/verilog/rtl/Caravel_Top.v
+++ b/verilog/rtl/Top.v
@@ -245,6 +245,220 @@
   assign io_reqOut_bits_activeByteLane = io_wbMasterReceiver_bits_sel; // @[WishboneDevice.scala 26:40 WishboneDevice.scala 34:37 WishboneDevice.scala 58:37]
   assign io_reqOut_bits_isWrite = ~io_wbMasterReceiver_bits_we ? 1'h0 : io_wbMasterReceiver_bits_we; // @[WishboneDevice.scala 26:40 WishboneDevice.scala 35:30 WishboneDevice.scala 59:30]
 endmodule
+module SRAM1kb(
+  input         clock,
+  input         reset,
+  input         io_req_valid,
+  input  [31:0] io_req_bits_addrRequest,
+  input  [31:0] io_req_bits_dataRequest,
+  input  [3:0]  io_req_bits_activeByteLane,
+  input         io_req_bits_isWrite,
+  output        io_rsp_valid,
+  output [31:0] io_rsp_bits_dataResponse
+);
+`ifdef RANDOMIZE_REG_INIT
+  reg [31:0] _RAND_0;
+`endif // RANDOMIZE_REG_INIT
+  wire  sram_clk0; // @[SRAM1kb.scala 24:20]
+  wire  sram_csb0; // @[SRAM1kb.scala 24:20]
+  wire  sram_web0; // @[SRAM1kb.scala 24:20]
+  wire [3:0] sram_wmask0; // @[SRAM1kb.scala 24:20]
+  wire [9:0] sram_addr0; // @[SRAM1kb.scala 24:20]
+  wire [31:0] sram_din0; // @[SRAM1kb.scala 24:20]
+  wire [31:0] sram_dout0; // @[SRAM1kb.scala 24:20]
+  wire  sram_clk1; // @[SRAM1kb.scala 24:20]
+  wire  sram_csb1; // @[SRAM1kb.scala 24:20]
+  wire [9:0] sram_addr1; // @[SRAM1kb.scala 24:20]
+  wire [31:0] sram_dout1; // @[SRAM1kb.scala 24:20]
+  reg  validReg; // @[SRAM1kb.scala 16:25]
+  wire  _T_2 = io_req_valid & io_req_bits_isWrite; // @[SRAM1kb.scala 51:28]
+  wire  _GEN_0 = io_req_valid & io_req_bits_isWrite ? 1'h0 : 1'h1; // @[SRAM1kb.scala 51:52 SRAM1kb.scala 56:18 SRAM1kb.scala 29:16]
+  wire  _GEN_6 = io_req_valid & ~io_req_bits_isWrite | _T_2; // @[SRAM1kb.scala 42:46 SRAM1kb.scala 45:14]
+  sky130_sram_1kbyte_1rw1r_32x256_8 dccm ( // @[SRAM1kb.scala 24:20]
+    .clk0(sram_clk0),
+    .csb0(sram_csb0),
+    .web0(sram_web0),
+    .wmask0(sram_wmask0),
+    .addr0(sram_addr0),
+    .din0(sram_din0),
+    .dout0(sram_dout0),
+    .clk1(sram_clk1),
+    .csb1(sram_csb1),
+    .addr1(sram_addr1),
+    .dout1(sram_dout1)
+  );
+  assign io_rsp_valid = validReg; // @[SRAM1kb.scala 17:16]
+  assign io_rsp_bits_dataResponse = sram_dout0; // @[SRAM1kb.scala 42:46 SRAM1kb.scala 50:11]
+  assign sram_clk0 = clock; // @[SRAM1kb.scala 26:34]
+  assign sram_csb0 = io_req_valid & ~io_req_bits_isWrite ? 1'h0 : _GEN_0; // @[SRAM1kb.scala 42:46 SRAM1kb.scala 46:18]
+  assign sram_web0 = io_req_valid & ~io_req_bits_isWrite; // @[SRAM1kb.scala 42:21]
+  assign sram_wmask0 = io_req_bits_activeByteLane; // @[SRAM1kb.scala 51:52 SRAM1kb.scala 58:20]
+  assign sram_addr0 = io_req_bits_addrRequest[9:0];
+  assign sram_din0 = io_req_bits_dataRequest; // @[SRAM1kb.scala 51:52 SRAM1kb.scala 60:18]
+  assign sram_clk1 = 1'h0;
+  assign sram_csb1 = 1'h0;
+  assign sram_addr1 = 10'h0;
+  always @(posedge clock) begin
+    if (reset) begin // @[SRAM1kb.scala 16:25]
+      validReg <= 1'h0; // @[SRAM1kb.scala 16:25]
+    end else begin
+      validReg <= _GEN_6;
+    end
+  end
+// Register and memory initialization
+`ifdef RANDOMIZE_GARBAGE_ASSIGN
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_INVALID_ASSIGN
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_REG_INIT
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_MEM_INIT
+`define RANDOMIZE
+`endif
+`ifndef RANDOM
+`define RANDOM $random
+`endif
+`ifdef RANDOMIZE_MEM_INIT
+  integer initvar;
+`endif
+`ifndef SYNTHESIS
+`ifdef FIRRTL_BEFORE_INITIAL
+`FIRRTL_BEFORE_INITIAL
+`endif
+initial begin
+  `ifdef RANDOMIZE
+    `ifdef INIT_RANDOM
+      `INIT_RANDOM
+    `endif
+    `ifndef VERILATOR
+      `ifdef RANDOMIZE_DELAY
+        #`RANDOMIZE_DELAY begin end
+      `else
+        #0.002 begin end
+      `endif
+    `endif
+`ifdef RANDOMIZE_REG_INIT
+  _RAND_0 = {1{`RANDOM}};
+  validReg = _RAND_0[0:0];
+`endif // RANDOMIZE_REG_INIT
+  `endif // RANDOMIZE
+end // initial
+`ifdef FIRRTL_AFTER_INITIAL
+`FIRRTL_AFTER_INITIAL
+`endif
+`endif // SYNTHESIS
+endmodule
+module SramImem(
+  input         clock,
+  input         reset,
+  input         io_req_valid,
+  input  [31:0] io_req_bits_addrRequest,
+  input         io_req_bits_isWrite,
+  output        io_rsp_valid,
+  output [31:0] io_rsp_bits_dataResponse,
+  input         io_writeEnable,
+  input  [31:0] io_addrIn,
+  input  [31:0] io_dataIn
+);
+`ifdef RANDOMIZE_REG_INIT
+  reg [31:0] _RAND_0;
+`endif // RANDOMIZE_REG_INIT
+  wire  sram_clk0; // @[SramImem.scala 28:20]
+  wire  sram_csb0; // @[SramImem.scala 28:20]
+  wire  sram_web0; // @[SramImem.scala 28:20]
+  wire [3:0] sram_wmask0; // @[SramImem.scala 28:20]
+  wire [9:0] sram_addr0; // @[SramImem.scala 28:20]
+  wire [31:0] sram_din0; // @[SramImem.scala 28:20]
+  wire [31:0] sram_dout0; // @[SramImem.scala 28:20]
+  wire  sram_clk1; // @[SramImem.scala 28:20]
+  wire  sram_csb1; // @[SramImem.scala 28:20]
+  wire [9:0] sram_addr1; // @[SramImem.scala 28:20]
+  wire [31:0] sram_dout1; // @[SramImem.scala 28:20]
+  reg  validReg; // @[SramImem.scala 20:25]
+  wire  _T_2 = ~io_writeEnable; // @[SramImem.scala 55:15]
+  wire  _GEN_0 = ~io_writeEnable ? 1'h0 : 1'h1; // @[SramImem.scala 55:32 SramImem.scala 60:18 SramImem.scala 33:16]
+  wire  _GEN_6 = io_req_valid & ~io_req_bits_isWrite | _T_2; // @[SramImem.scala 46:46 SramImem.scala 49:14]
+  wire [31:0] _GEN_9 = io_req_valid & ~io_req_bits_isWrite ? io_req_bits_addrRequest : io_addrIn; // @[SramImem.scala 46:46 SramImem.scala 52:19]
+  sky130_sram_1kbyte_1rw1r_32x256_8 iccm ( // @[SramImem.scala 28:20]
+    .clk0(sram_clk0),
+    .csb0(sram_csb0),
+    .web0(sram_web0),
+    .wmask0(sram_wmask0),
+    .addr0(sram_addr0),
+    .din0(sram_din0),
+    .dout0(sram_dout0),
+    .clk1(sram_clk1),
+    .csb1(sram_csb1),
+    .addr1(sram_addr1),
+    .dout1(sram_dout1)
+  );
+  assign io_rsp_valid = validReg; // @[SramImem.scala 21:16]
+  assign io_rsp_bits_dataResponse = sram_dout0; // @[SramImem.scala 46:46 SramImem.scala 54:11]
+  assign sram_clk0 = clock; // @[SramImem.scala 30:34]
+  assign sram_csb0 = io_req_valid & ~io_req_bits_isWrite ? 1'h0 : _GEN_0; // @[SramImem.scala 46:46 SramImem.scala 50:18]
+  assign sram_web0 = io_req_valid & ~io_req_bits_isWrite | io_writeEnable; // @[SramImem.scala 46:46 SramImem.scala 51:18]
+  assign sram_wmask0 = 4'hf; // @[SramImem.scala 55:32 SramImem.scala 62:20]
+  assign sram_addr0 = _GEN_9[9:0];
+  assign sram_din0 = io_dataIn; // @[SramImem.scala 55:32 SramImem.scala 64:18]
+  assign sram_clk1 = 1'h0;
+  assign sram_csb1 = 1'h0;
+  assign sram_addr1 = 10'h0;
+  always @(posedge clock) begin
+    if (reset) begin // @[SramImem.scala 20:25]
+      validReg <= 1'h0; // @[SramImem.scala 20:25]
+    end else begin
+      validReg <= _GEN_6;
+    end
+  end
+// Register and memory initialization
+`ifdef RANDOMIZE_GARBAGE_ASSIGN
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_INVALID_ASSIGN
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_REG_INIT
+`define RANDOMIZE
+`endif
+`ifdef RANDOMIZE_MEM_INIT
+`define RANDOMIZE
+`endif
+`ifndef RANDOM
+`define RANDOM $random
+`endif
+`ifdef RANDOMIZE_MEM_INIT
+  integer initvar;
+`endif
+`ifndef SYNTHESIS
+`ifdef FIRRTL_BEFORE_INITIAL
+`FIRRTL_BEFORE_INITIAL
+`endif
+initial begin
+  `ifdef RANDOMIZE
+    `ifdef INIT_RANDOM
+      `INIT_RANDOM
+    `endif
+    `ifndef VERILATOR
+      `ifdef RANDOMIZE_DELAY
+        #`RANDOMIZE_DELAY begin end
+      `else
+        #0.002 begin end
+      `endif
+    `endif
+`ifdef RANDOMIZE_REG_INIT
+  _RAND_0 = {1{`RANDOM}};
+  validReg = _RAND_0[0:0];
+`endif // RANDOMIZE_REG_INIT
+  `endif // RANDOMIZE
+end // initial
+`ifdef FIRRTL_AFTER_INITIAL
+`FIRRTL_AFTER_INITIAL
+`endif
+`endif // SYNTHESIS
+endmodule
 module SubReg(
   input         clock,
   input         reset,
@@ -1008,10 +1222,10 @@
   output [31:0] io_hw2reg_intr_state_d_o
 );
   wire [31:0] _new_event_T_1 = io_reg2hw_intr_test_qe_i ? 32'hffffffff : 32'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _new_event_T_2 = _new_event_T_1 & io_reg2hw_intr_test_q_i; // @[IntrHardware.scala 26:54]
-  wire [31:0] new_event = _new_event_T_2 | io_event_intr_i; // @[IntrHardware.scala 26:80]
-  assign io_hw2reg_intr_state_de_o = |new_event; // @[IntrHardware.scala 27:45]
-  assign io_hw2reg_intr_state_d_o = new_event | io_reg2hw_intr_state_q_i; // @[IntrHardware.scala 28:41]
+  wire [31:0] _new_event_T_2 = _new_event_T_1 & io_reg2hw_intr_test_q_i; // @[IntrHardware.scala 25:54]
+  wire [31:0] new_event = _new_event_T_2 | io_event_intr_i; // @[IntrHardware.scala 25:80]
+  assign io_hw2reg_intr_state_de_o = |new_event; // @[IntrHardware.scala 26:45]
+  assign io_hw2reg_intr_state_d_o = new_event | io_reg2hw_intr_state_q_i; // @[IntrHardware.scala 27:41]
 endmodule
 module Gpio(
   input         clock,
@@ -1292,112 +1506,6 @@
 `endif
 `endif // SYNTHESIS
 endmodule
-module SRAM1kb(
-  input         clock,
-  input         reset,
-  input         io_req_valid,
-  input  [31:0] io_req_bits_addrRequest,
-  input  [31:0] io_req_bits_dataRequest,
-  input  [3:0]  io_req_bits_activeByteLane,
-  input         io_req_bits_isWrite,
-  output        io_rsp_valid,
-  output [31:0] io_rsp_bits_dataResponse
-);
-`ifdef RANDOMIZE_REG_INIT
-  reg [31:0] _RAND_0;
-`endif // RANDOMIZE_REG_INIT
-  wire  sram_clk0; // @[SRAM1kb.scala 26:20]
-  wire  sram_csb0; // @[SRAM1kb.scala 26:20]
-  wire  sram_web0; // @[SRAM1kb.scala 26:20]
-  wire [3:0] sram_wmask0; // @[SRAM1kb.scala 26:20]
-  wire [7:0] sram_addr0; // @[SRAM1kb.scala 26:20]
-  wire [31:0] sram_din0; // @[SRAM1kb.scala 26:20]
-  wire [31:0] sram_dout0; // @[SRAM1kb.scala 26:20]
-  wire  sram_clk1; // @[SRAM1kb.scala 26:20]
-  wire  sram_csb1; // @[SRAM1kb.scala 26:20]
-  wire [7:0] sram_addr1; // @[SRAM1kb.scala 26:20]
-  wire [31:0] sram_dout1; // @[SRAM1kb.scala 26:20]
-  reg  validReg; // @[SRAM1kb.scala 18:25]
-  wire  _T_2 = io_req_valid & io_req_bits_isWrite; // @[SRAM1kb.scala 53:28]
-  wire  _GEN_0 = io_req_valid & io_req_bits_isWrite ? 1'h0 : 1'h1; // @[SRAM1kb.scala 53:52 SRAM1kb.scala 58:18 SRAM1kb.scala 31:16]
-  wire  _GEN_6 = io_req_valid & ~io_req_bits_isWrite | _T_2; // @[SRAM1kb.scala 44:46 SRAM1kb.scala 47:14]
-  sky130_sram_1kbyte_1rw1r_32x256_8 sram ( // @[SRAM1kb.scala 26:20]
-    .clk0(sram_clk0),
-    .csb0(sram_csb0),
-    .web0(sram_web0),
-    .wmask0(sram_wmask0),
-    .addr0(sram_addr0),
-    .din0(sram_din0),
-    .dout0(sram_dout0),
-    .clk1(sram_clk1),
-    .csb1(sram_csb1),
-    .addr1(sram_addr1),
-    .dout1(sram_dout1)
-  );
-  assign io_rsp_valid = validReg; // @[SRAM1kb.scala 19:16]
-  assign io_rsp_bits_dataResponse = sram_dout0; // @[SRAM1kb.scala 44:46 SRAM1kb.scala 52:11]
-  assign sram_clk0 = clock; // @[SRAM1kb.scala 28:34]
-  assign sram_csb0 = io_req_valid & ~io_req_bits_isWrite ? 1'h0 : _GEN_0; // @[SRAM1kb.scala 44:46 SRAM1kb.scala 48:18]
-  assign sram_web0 = io_req_valid & ~io_req_bits_isWrite; // @[SRAM1kb.scala 44:21]
-  assign sram_wmask0 = io_req_bits_activeByteLane; // @[SRAM1kb.scala 53:52 SRAM1kb.scala 60:20]
-  assign sram_addr0 = io_req_bits_addrRequest[7:0];
-  assign sram_din0 = io_req_bits_dataRequest; // @[SRAM1kb.scala 53:52 SRAM1kb.scala 62:18]
-  assign sram_clk1 = 1'h0;
-  assign sram_csb1 = 1'h0;
-  assign sram_addr1 = 8'h0;
-  always @(posedge clock) begin
-    if (reset) begin // @[SRAM1kb.scala 18:25]
-      validReg <= 1'h0; // @[SRAM1kb.scala 18:25]
-    end else begin
-      validReg <= _GEN_6;
-    end
-  end
-// Register and memory initialization
-`ifdef RANDOMIZE_GARBAGE_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_INVALID_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_REG_INIT
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-`define RANDOMIZE
-`endif
-`ifndef RANDOM
-`define RANDOM $random
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-  integer initvar;
-`endif
-`ifndef SYNTHESIS
-`ifdef FIRRTL_BEFORE_INITIAL
-`FIRRTL_BEFORE_INITIAL
-`endif
-initial begin
-  `ifdef RANDOMIZE
-    `ifdef INIT_RANDOM
-      `INIT_RANDOM
-    `endif
-    `ifndef VERILATOR
-      `ifdef RANDOMIZE_DELAY
-        #`RANDOMIZE_DELAY begin end
-      `else
-        #0.002 begin end
-      `endif
-    `endif
-`ifdef RANDOMIZE_REG_INIT
-  _RAND_0 = {1{`RANDOM}};
-  validReg = _RAND_0[0:0];
-`endif // RANDOMIZE_REG_INIT
-  `endif // RANDOMIZE
-end // initial
-`ifdef FIRRTL_AFTER_INITIAL
-`FIRRTL_AFTER_INITIAL
-`endif
-`endif // SYNTHESIS
-endmodule
 module WishboneErr(
   input         clock,
   input         reset,
@@ -1481,7 +1589,6 @@
 module InstructionFetch(
   input  [31:0] io_address,
   output [31:0] io_instruction,
-  input         io_stall,
   input         io_coreInstrReq_ready,
   output        io_coreInstrReq_valid,
   output [31:0] io_coreInstrReq_bits_addrRequest,
@@ -1489,7 +1596,7 @@
   input  [31:0] io_coreInstrResp_bits_dataResponse
 );
   assign io_instruction = io_coreInstrResp_valid ? io_coreInstrResp_bits_dataResponse : 32'h0; // @[InstructionFetch.scala 26:24]
-  assign io_coreInstrReq_valid = io_stall ? 1'h0 : io_coreInstrReq_ready; // @[InstructionFetch.scala 24:31]
+  assign io_coreInstrReq_valid = io_coreInstrReq_ready; // @[InstructionFetch.scala 24:31]
   assign io_coreInstrReq_bits_addrRequest = {{2'd0}, io_address[31:2]}; // @[InstructionFetch.scala 23:50]
 endmodule
 module HazardUnit(
@@ -1540,54 +1647,54 @@
   output [1:0]  io_jump,
   output [1:0]  io_aluSrc1
 );
-  wire [31:0] _T = io_in & 32'h7f; // @[Lookup.scala 31:38]
-  wire  _T_1 = 32'h33 == _T; // @[Lookup.scala 31:38]
-  wire  _T_3 = 32'h13 == _T; // @[Lookup.scala 31:38]
-  wire  _T_5 = 32'h3 == _T; // @[Lookup.scala 31:38]
-  wire  _T_7 = 32'h23 == _T; // @[Lookup.scala 31:38]
-  wire  _T_9 = 32'h63 == _T; // @[Lookup.scala 31:38]
-  wire  _T_11 = 32'h37 == _T; // @[Lookup.scala 31:38]
-  wire  _T_13 = 32'h17 == _T; // @[Lookup.scala 31:38]
-  wire  _T_15 = 32'h6f == _T; // @[Lookup.scala 31:38]
-  wire  _T_17 = 32'h67 == _T; // @[Lookup.scala 31:38]
-  wire  _T_23 = _T_7 ? 1'h0 : _T_9; // @[Lookup.scala 33:37]
-  wire  _T_24 = _T_5 ? 1'h0 : _T_23; // @[Lookup.scala 33:37]
-  wire  _T_25 = _T_3 ? 1'h0 : _T_24; // @[Lookup.scala 33:37]
-  wire [1:0] _T_26 = _T_17 ? 2'h2 : 2'h0; // @[Lookup.scala 33:37]
-  wire [1:0] _T_27 = _T_15 ? 2'h2 : _T_26; // @[Lookup.scala 33:37]
-  wire [1:0] _T_28 = _T_13 ? 2'h0 : _T_27; // @[Lookup.scala 33:37]
-  wire [1:0] _T_29 = _T_11 ? 2'h0 : _T_28; // @[Lookup.scala 33:37]
-  wire [1:0] _T_30 = _T_9 ? 2'h0 : _T_29; // @[Lookup.scala 33:37]
-  wire [1:0] _T_31 = _T_7 ? 2'h0 : _T_30; // @[Lookup.scala 33:37]
-  wire [1:0] _T_32 = _T_5 ? 2'h1 : _T_31; // @[Lookup.scala 33:37]
-  wire [1:0] _T_33 = _T_3 ? 2'h0 : _T_32; // @[Lookup.scala 33:37]
-  wire  _T_38 = _T_9 ? 1'h0 : _T_11 | (_T_13 | (_T_15 | _T_17)); // @[Lookup.scala 33:37]
-  wire  _T_39 = _T_7 ? 1'h0 : _T_38; // @[Lookup.scala 33:37]
-  wire  _T_49 = _T_3 ? 1'h0 : _T_5; // @[Lookup.scala 33:37]
-  wire  _T_56 = _T_5 ? 1'h0 : _T_7; // @[Lookup.scala 33:37]
-  wire  _T_57 = _T_3 ? 1'h0 : _T_56; // @[Lookup.scala 33:37]
-  wire [1:0] _T_67 = _T_15 ? 2'h1 : _T_26; // @[Lookup.scala 33:37]
-  wire [1:0] _T_68 = _T_13 ? 2'h0 : _T_67; // @[Lookup.scala 33:37]
-  wire [1:0] _T_69 = _T_11 ? 2'h0 : _T_68; // @[Lookup.scala 33:37]
-  wire [1:0] _T_70 = _T_9 ? 2'h0 : _T_69; // @[Lookup.scala 33:37]
-  wire [1:0] _T_71 = _T_7 ? 2'h0 : _T_70; // @[Lookup.scala 33:37]
-  wire [1:0] _T_72 = _T_5 ? 2'h0 : _T_71; // @[Lookup.scala 33:37]
-  wire [1:0] _T_73 = _T_3 ? 2'h0 : _T_72; // @[Lookup.scala 33:37]
-  wire [1:0] _T_81 = _T_3 ? 2'h2 : 2'h0; // @[Lookup.scala 33:37]
-  wire [1:0] _T_85 = _T_11 ? 2'h2 : {{1'd0}, _T_13}; // @[Lookup.scala 33:37]
-  wire [1:0] _T_86 = _T_9 ? 2'h0 : _T_85; // @[Lookup.scala 33:37]
-  wire [1:0] _T_87 = _T_7 ? 2'h0 : _T_86; // @[Lookup.scala 33:37]
-  wire [1:0] _T_88 = _T_5 ? 2'h0 : _T_87; // @[Lookup.scala 33:37]
-  wire [1:0] _T_89 = _T_3 ? 2'h0 : _T_88; // @[Lookup.scala 33:37]
-  assign io_aluSrc = _T_1 | _T_25; // @[Lookup.scala 33:37]
-  assign io_memToReg = _T_1 ? 2'h0 : _T_33; // @[Lookup.scala 33:37]
-  assign io_regWrite = _T_1 | (_T_3 | (_T_5 | _T_39)); // @[Lookup.scala 33:37]
-  assign io_memRead = _T_1 ? 1'h0 : _T_49; // @[Lookup.scala 33:37]
-  assign io_memWrite = _T_1 ? 1'h0 : _T_57; // @[Lookup.scala 33:37]
-  assign io_branch = _T_1 ? 1'h0 : _T_25; // @[Lookup.scala 33:37]
-  assign io_aluOp = _T_1 ? 2'h2 : _T_81; // @[Lookup.scala 33:37]
-  assign io_jump = _T_1 ? 2'h0 : _T_73; // @[Lookup.scala 33:37]
-  assign io_aluSrc1 = _T_1 ? 2'h0 : _T_89; // @[Lookup.scala 33:37]
+  wire [31:0] _signals_T = io_in & 32'h7f; // @[Lookup.scala 31:38]
+  wire  _signals_T_1 = 32'h33 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_3 = 32'h13 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_5 = 32'h3 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_7 = 32'h23 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_9 = 32'h63 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_11 = 32'h37 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_13 = 32'h17 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_15 = 32'h6f == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_17 = 32'h67 == _signals_T; // @[Lookup.scala 31:38]
+  wire  _signals_T_23 = _signals_T_7 ? 1'h0 : _signals_T_9; // @[Lookup.scala 33:37]
+  wire  _signals_T_24 = _signals_T_5 ? 1'h0 : _signals_T_23; // @[Lookup.scala 33:37]
+  wire  _signals_T_25 = _signals_T_3 ? 1'h0 : _signals_T_24; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_26 = _signals_T_17 ? 2'h2 : 2'h0; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_27 = _signals_T_15 ? 2'h2 : _signals_T_26; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_28 = _signals_T_13 ? 2'h0 : _signals_T_27; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_29 = _signals_T_11 ? 2'h0 : _signals_T_28; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_30 = _signals_T_9 ? 2'h0 : _signals_T_29; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_31 = _signals_T_7 ? 2'h0 : _signals_T_30; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_32 = _signals_T_5 ? 2'h1 : _signals_T_31; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_33 = _signals_T_3 ? 2'h0 : _signals_T_32; // @[Lookup.scala 33:37]
+  wire  _signals_T_38 = _signals_T_9 ? 1'h0 : _signals_T_11 | (_signals_T_13 | (_signals_T_15 | _signals_T_17)); // @[Lookup.scala 33:37]
+  wire  _signals_T_39 = _signals_T_7 ? 1'h0 : _signals_T_38; // @[Lookup.scala 33:37]
+  wire  _signals_T_49 = _signals_T_3 ? 1'h0 : _signals_T_5; // @[Lookup.scala 33:37]
+  wire  _signals_T_56 = _signals_T_5 ? 1'h0 : _signals_T_7; // @[Lookup.scala 33:37]
+  wire  _signals_T_57 = _signals_T_3 ? 1'h0 : _signals_T_56; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_67 = _signals_T_15 ? 2'h1 : _signals_T_26; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_68 = _signals_T_13 ? 2'h0 : _signals_T_67; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_69 = _signals_T_11 ? 2'h0 : _signals_T_68; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_70 = _signals_T_9 ? 2'h0 : _signals_T_69; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_71 = _signals_T_7 ? 2'h0 : _signals_T_70; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_72 = _signals_T_5 ? 2'h0 : _signals_T_71; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_73 = _signals_T_3 ? 2'h0 : _signals_T_72; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_81 = _signals_T_3 ? 2'h2 : 2'h0; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_85 = _signals_T_11 ? 2'h2 : {{1'd0}, _signals_T_13}; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_86 = _signals_T_9 ? 2'h0 : _signals_T_85; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_87 = _signals_T_7 ? 2'h0 : _signals_T_86; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_88 = _signals_T_5 ? 2'h0 : _signals_T_87; // @[Lookup.scala 33:37]
+  wire [1:0] _signals_T_89 = _signals_T_3 ? 2'h0 : _signals_T_88; // @[Lookup.scala 33:37]
+  assign io_aluSrc = _signals_T_1 | _signals_T_25; // @[Lookup.scala 33:37]
+  assign io_memToReg = _signals_T_1 ? 2'h0 : _signals_T_33; // @[Lookup.scala 33:37]
+  assign io_regWrite = _signals_T_1 | (_signals_T_3 | (_signals_T_5 | _signals_T_39)); // @[Lookup.scala 33:37]
+  assign io_memRead = _signals_T_1 ? 1'h0 : _signals_T_49; // @[Lookup.scala 33:37]
+  assign io_memWrite = _signals_T_1 ? 1'h0 : _signals_T_57; // @[Lookup.scala 33:37]
+  assign io_branch = _signals_T_1 ? 1'h0 : _signals_T_25; // @[Lookup.scala 33:37]
+  assign io_aluOp = _signals_T_1 ? 2'h2 : _signals_T_81; // @[Lookup.scala 33:37]
+  assign io_jump = _signals_T_1 ? 2'h0 : _signals_T_73; // @[Lookup.scala 33:37]
+  assign io_aluSrc1 = _signals_T_1 ? 2'h0 : _signals_T_89; // @[Lookup.scala 33:37]
 endmodule
 module Registers(
   input         clock,
@@ -2070,33 +2177,33 @@
 );
   wire [6:0] opcode = io_instruction[6:0]; // @[ImmediateGen.scala 11:30]
   wire  _T_10 = opcode == 7'h3 | opcode == 7'hf | opcode == 7'h13 | opcode == 7'h1b | opcode == 7'h67 | opcode == 7'h73; // @[ImmediateGen.scala 15:97]
-  wire [11:0] lo = io_instruction[31:20]; // @[ImmediateGen.scala 17:31]
-  wire [19:0] hi = lo[11] ? 20'hfffff : 20'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_13 = {hi,lo}; // @[Cat.scala 30:58]
-  wire [19:0] hi_1 = io_instruction[31:12]; // @[ImmediateGen.scala 24:33]
-  wire [31:0] _T_17 = {hi_1,12'h0}; // @[Cat.scala 30:58]
-  wire [6:0] hi_2 = io_instruction[31:25]; // @[ImmediateGen.scala 30:37]
-  wire [4:0] lo_2 = io_instruction[11:7]; // @[ImmediateGen.scala 30:61]
-  wire [11:0] lo_3 = {hi_2,lo_2}; // @[Cat.scala 30:58]
-  wire [19:0] hi_3 = lo_3[11] ? 20'hfffff : 20'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_21 = {hi_3,hi_2,lo_2}; // @[Cat.scala 30:58]
-  wire  hi_hi = io_instruction[31]; // @[ImmediateGen.scala 37:23]
-  wire  hi_lo = io_instruction[7]; // @[ImmediateGen.scala 38:23]
-  wire [5:0] lo_hi = io_instruction[30:25]; // @[ImmediateGen.scala 39:23]
-  wire [3:0] lo_lo = io_instruction[11:8]; // @[ImmediateGen.scala 40:23]
-  wire [11:0] hi_lo_1 = {hi_hi,hi_lo,lo_hi,lo_lo}; // @[Cat.scala 30:58]
-  wire [18:0] hi_hi_1 = hi_lo_1[11] ? 19'h7ffff : 19'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_25 = {hi_hi_1,hi_hi,hi_lo,lo_hi,lo_lo,1'h0}; // @[Cat.scala 30:58]
-  wire [7:0] hi_lo_2 = io_instruction[19:12]; // @[ImmediateGen.scala 50:21]
-  wire  lo_hi_1 = io_instruction[20]; // @[ImmediateGen.scala 51:21]
-  wire [9:0] lo_lo_1 = io_instruction[30:21]; // @[ImmediateGen.scala 52:21]
-  wire [19:0] hi_lo_3 = {hi_hi,hi_lo_2,lo_hi_1,lo_lo_1}; // @[Cat.scala 30:58]
-  wire [10:0] hi_hi_3 = hi_lo_3[19] ? 11'h7ff : 11'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_28 = {hi_hi_3,hi_hi,hi_lo_2,lo_hi_1,lo_lo_1,1'h0}; // @[Cat.scala 30:58]
-  wire [31:0] _GEN_0 = opcode == 7'h63 ? _T_25 : _T_28; // @[ImmediateGen.scala 35:32 ImmediateGen.scala 43:14 ImmediateGen.scala 55:12]
-  wire [31:0] _GEN_1 = opcode == 7'h23 ? _T_21 : _GEN_0; // @[ImmediateGen.scala 29:32 ImmediateGen.scala 32:14]
-  wire [31:0] _GEN_2 = opcode == 7'h17 | opcode == 7'h37 ? _T_17 : _GEN_1; // @[ImmediateGen.scala 23:51 ImmediateGen.scala 26:14]
-  assign io_out = _T_10 ? _T_13 : _GEN_2; // @[ImmediateGen.scala 16:5 ImmediateGen.scala 19:12]
+  wire [11:0] ext_i_lo = io_instruction[31:20]; // @[ImmediateGen.scala 17:31]
+  wire [19:0] ext_i_hi = ext_i_lo[11] ? 20'hfffff : 20'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] ext_i = {ext_i_hi,ext_i_lo}; // @[Cat.scala 30:58]
+  wire [19:0] ext_u_hi = io_instruction[31:12]; // @[ImmediateGen.scala 24:33]
+  wire [31:0] ext_u = {ext_u_hi,12'h0}; // @[Cat.scala 30:58]
+  wire [6:0] imm_s_hi = io_instruction[31:25]; // @[ImmediateGen.scala 30:37]
+  wire [4:0] imm_s_lo = io_instruction[11:7]; // @[ImmediateGen.scala 30:61]
+  wire [11:0] ext_s_lo = {imm_s_hi,imm_s_lo}; // @[Cat.scala 30:58]
+  wire [19:0] ext_s_hi = ext_s_lo[11] ? 20'hfffff : 20'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] ext_s = {ext_s_hi,imm_s_hi,imm_s_lo}; // @[Cat.scala 30:58]
+  wire  imm_sb_hi_hi = io_instruction[31]; // @[ImmediateGen.scala 37:23]
+  wire  imm_sb_hi_lo = io_instruction[7]; // @[ImmediateGen.scala 38:23]
+  wire [5:0] imm_sb_lo_hi = io_instruction[30:25]; // @[ImmediateGen.scala 39:23]
+  wire [3:0] imm_sb_lo_lo = io_instruction[11:8]; // @[ImmediateGen.scala 40:23]
+  wire [11:0] ext_sb_hi_lo = {imm_sb_hi_hi,imm_sb_hi_lo,imm_sb_lo_hi,imm_sb_lo_lo}; // @[Cat.scala 30:58]
+  wire [18:0] ext_sb_hi_hi = ext_sb_hi_lo[11] ? 19'h7ffff : 19'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] ext_sb = {ext_sb_hi_hi,imm_sb_hi_hi,imm_sb_hi_lo,imm_sb_lo_hi,imm_sb_lo_lo,1'h0}; // @[Cat.scala 30:58]
+  wire [7:0] imm_uj_hi_lo = io_instruction[19:12]; // @[ImmediateGen.scala 50:21]
+  wire  imm_uj_lo_hi = io_instruction[20]; // @[ImmediateGen.scala 51:21]
+  wire [9:0] imm_uj_lo_lo = io_instruction[30:21]; // @[ImmediateGen.scala 52:21]
+  wire [19:0] ext_uj_hi_lo = {imm_sb_hi_hi,imm_uj_hi_lo,imm_uj_lo_hi,imm_uj_lo_lo}; // @[Cat.scala 30:58]
+  wire [10:0] ext_uj_hi_hi = ext_uj_hi_lo[19] ? 11'h7ff : 11'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] ext_uj = {ext_uj_hi_hi,imm_sb_hi_hi,imm_uj_hi_lo,imm_uj_lo_hi,imm_uj_lo_lo,1'h0}; // @[Cat.scala 30:58]
+  wire [31:0] _GEN_0 = opcode == 7'h63 ? ext_sb : ext_uj; // @[ImmediateGen.scala 35:32 ImmediateGen.scala 43:14 ImmediateGen.scala 55:12]
+  wire [31:0] _GEN_1 = opcode == 7'h23 ? ext_s : _GEN_0; // @[ImmediateGen.scala 29:32 ImmediateGen.scala 32:14]
+  wire [31:0] _GEN_2 = opcode == 7'h17 | opcode == 7'h37 ? ext_u : _GEN_1; // @[ImmediateGen.scala 23:51 ImmediateGen.scala 26:14]
+  assign io_out = _T_10 ? ext_i : _GEN_2; // @[ImmediateGen.scala 16:5 ImmediateGen.scala 19:12]
 endmodule
 module BranchUnit(
   input         io_branch,
@@ -2107,15 +2214,15 @@
   output        io_taken
 );
   wire  _T = 3'h0 == io_funct3; // @[Conditional.scala 37:30]
-  wire  _T_2 = 3'h1 == io_funct3; // @[Conditional.scala 37:30]
-  wire  _T_4 = 3'h4 == io_funct3; // @[Conditional.scala 37:30]
-  wire  _T_8 = 3'h5 == io_funct3; // @[Conditional.scala 37:30]
-  wire  _T_12 = 3'h6 == io_funct3; // @[Conditional.scala 37:30]
-  wire  _T_15 = io_rd1 >= io_rd2; // @[BranchUnit.scala 28:32]
-  wire  _GEN_1 = _T_12 ? io_rd1 < io_rd2 : _T_15; // @[Conditional.scala 39:67 BranchUnit.scala 27:21]
-  wire  _GEN_2 = _T_8 ? $signed(io_rd1) >= $signed(io_rd2) : _GEN_1; // @[Conditional.scala 39:67 BranchUnit.scala 26:21]
-  wire  _GEN_3 = _T_4 ? $signed(io_rd1) < $signed(io_rd2) : _GEN_2; // @[Conditional.scala 39:67 BranchUnit.scala 25:21]
-  wire  _GEN_4 = _T_2 ? io_rd1 != io_rd2 : _GEN_3; // @[Conditional.scala 39:67 BranchUnit.scala 24:21]
+  wire  _T_1 = 3'h1 == io_funct3; // @[Conditional.scala 37:30]
+  wire  _T_2 = 3'h4 == io_funct3; // @[Conditional.scala 37:30]
+  wire  _T_3 = 3'h5 == io_funct3; // @[Conditional.scala 37:30]
+  wire  _T_4 = 3'h6 == io_funct3; // @[Conditional.scala 37:30]
+  wire  _check_T_9 = io_rd1 >= io_rd2; // @[BranchUnit.scala 28:32]
+  wire  _GEN_1 = _T_4 ? io_rd1 < io_rd2 : _check_T_9; // @[Conditional.scala 39:67 BranchUnit.scala 27:21]
+  wire  _GEN_2 = _T_3 ? $signed(io_rd1) >= $signed(io_rd2) : _GEN_1; // @[Conditional.scala 39:67 BranchUnit.scala 26:21]
+  wire  _GEN_3 = _T_2 ? $signed(io_rd1) < $signed(io_rd2) : _GEN_2; // @[Conditional.scala 39:67 BranchUnit.scala 25:21]
+  wire  _GEN_4 = _T_1 ? io_rd1 != io_rd2 : _GEN_3; // @[Conditional.scala 39:67 BranchUnit.scala 24:21]
   wire  check = _T ? io_rd1 == io_rd2 : _GEN_4; // @[Conditional.scala 40:58 BranchUnit.scala 23:21]
   assign io_taken = check & io_branch & io_take_branch; // @[BranchUnit.scala 31:33]
 endmodule
@@ -2203,19 +2310,19 @@
   wire  bu_io_taken; // @[InstructionDecode.scala 143:18]
   wire [31:0] _GEN_2 = io_id_instruction[19:15] == 5'h0 ? 32'h0 : io_writeData; // @[InstructionDecode.scala 98:30 InstructionDecode.scala 99:20 InstructionDecode.scala 101:20]
   wire [31:0] _GEN_4 = io_id_instruction[24:20] == 5'h0 ? 32'h0 : io_writeData; // @[InstructionDecode.scala 107:30 InstructionDecode.scala 108:20 InstructionDecode.scala 110:20]
-  wire  _T_11 = io_id_instruction[19:15] == io_ex_mem_ins[11:7]; // @[InstructionDecode.scala 125:20]
-  wire  _T_13 = io_id_instruction[19:15] == io_mem_wb_ins[11:7]; // @[InstructionDecode.scala 127:26]
+  wire  _T_9 = io_id_instruction[19:15] == io_ex_mem_ins[11:7]; // @[InstructionDecode.scala 125:20]
+  wire  _T_11 = io_id_instruction[19:15] == io_mem_wb_ins[11:7]; // @[InstructionDecode.scala 127:26]
   wire [31:0] _GEN_6 = io_id_instruction[19:15] == io_mem_wb_ins[11:7] ? io_mem_wb_result : io_readData1; // @[InstructionDecode.scala 127:52 InstructionDecode.scala 128:14 InstructionDecode.scala 131:14]
   wire [31:0] _GEN_8 = io_id_instruction[24:20] == io_mem_wb_ins[11:7] ? io_mem_wb_result : io_readData2; // @[InstructionDecode.scala 135:52 InstructionDecode.scala 136:14 InstructionDecode.scala 139:14]
-  wire  _T_20 = io_id_instruction[19:15] == io_ex_ins[11:7]; // @[InstructionDecode.scala 153:22]
-  wire [31:0] _GEN_10 = _T_20 ? io_ex_result : io_readData1; // @[InstructionDecode.scala 159:47 InstructionDecode.scala 160:14 InstructionDecode.scala 162:16]
-  wire [31:0] _GEN_11 = _T_13 ? io_mem_wb_result : _GEN_10; // @[InstructionDecode.scala 157:52 InstructionDecode.scala 158:14]
-  wire [31:0] _GEN_12 = _T_11 ? io_ex_mem_result : _GEN_11; // @[InstructionDecode.scala 155:54 InstructionDecode.scala 156:14]
+  wire  _T_17 = io_id_instruction[19:15] == io_ex_ins[11:7]; // @[InstructionDecode.scala 153:22]
+  wire [31:0] _GEN_10 = _T_17 ? io_ex_result : io_readData1; // @[InstructionDecode.scala 159:47 InstructionDecode.scala 160:14 InstructionDecode.scala 162:16]
+  wire [31:0] _GEN_11 = _T_11 ? io_mem_wb_result : _GEN_10; // @[InstructionDecode.scala 157:52 InstructionDecode.scala 158:14]
+  wire [31:0] _GEN_12 = _T_9 ? io_ex_mem_result : _GEN_11; // @[InstructionDecode.scala 155:54 InstructionDecode.scala 156:14]
   wire [31:0] j_offset = io_id_instruction[19:15] == io_ex_ins[11:7] ? io_ex_result : _GEN_12; // @[InstructionDecode.scala 153:43 InstructionDecode.scala 154:16]
-  wire [31:0] _T_29 = io_pcAddress + io_immediate; // @[InstructionDecode.scala 167:37]
-  wire [31:0] _T_32 = j_offset + io_immediate; // @[InstructionDecode.scala 169:35]
-  wire [31:0] _T_34 = io_pcAddress + immediate_io_out; // @[InstructionDecode.scala 172:39]
-  wire [31:0] _GEN_14 = io_ctl_jump == 2'h2 ? _T_32 : _T_34; // @[InstructionDecode.scala 168:35 InstructionDecode.scala 169:23 InstructionDecode.scala 172:23]
+  wire [31:0] _io_pcPlusOffset_T_1 = io_pcAddress + io_immediate; // @[InstructionDecode.scala 167:37]
+  wire [31:0] _io_pcPlusOffset_T_3 = j_offset + io_immediate; // @[InstructionDecode.scala 169:35]
+  wire [31:0] _io_pcPlusOffset_T_5 = io_pcAddress + immediate_io_out; // @[InstructionDecode.scala 172:39]
+  wire [31:0] _GEN_14 = io_ctl_jump == 2'h2 ? _io_pcPlusOffset_T_3 : _io_pcPlusOffset_T_5; // @[InstructionDecode.scala 168:35 InstructionDecode.scala 169:23 InstructionDecode.scala 172:23]
   HazardUnit hdu ( // @[InstructionDecode.scala 51:19]
     .io_id_ex_memRead(hdu_io_id_ex_memRead),
     .io_ex_mem_memRead(hdu_io_ex_mem_memRead),
@@ -2286,7 +2393,7 @@
   assign io_hdu_pcWrite = hdu_io_pc_write; // @[InstructionDecode.scala 63:18]
   assign io_hdu_if_reg_write = hdu_io_if_reg_write; // @[InstructionDecode.scala 64:23]
   assign io_pcSrc = bu_io_taken | io_ctl_jump != 2'h0; // @[InstructionDecode.scala 175:20]
-  assign io_pcPlusOffset = io_ctl_jump == 2'h1 ? _T_29 : _GEN_14; // @[InstructionDecode.scala 166:29 InstructionDecode.scala 167:21]
+  assign io_pcPlusOffset = io_ctl_jump == 2'h1 ? _io_pcPlusOffset_T_1 : _GEN_14; // @[InstructionDecode.scala 166:29 InstructionDecode.scala 167:21]
   assign io_ifid_flush = hdu_io_ifid_flush; // @[InstructionDecode.scala 182:17]
   assign hdu_io_id_ex_memRead = io_id_ex_mem_read; // @[InstructionDecode.scala 53:24]
   assign hdu_io_ex_mem_memRead = io_ex_mem_mem_read; // @[InstructionDecode.scala 55:25]
@@ -2319,38 +2426,38 @@
   input  [3:0]  io_aluCtl,
   output [31:0] io_result
 );
-  wire  _T = io_aluCtl == 4'h0; // @[ALU.scala 17:18]
-  wire [31:0] _T_1 = io_input1 & io_input2; // @[ALU.scala 17:41]
-  wire  _T_2 = io_aluCtl == 4'h1; // @[ALU.scala 18:18]
-  wire [31:0] _T_3 = io_input1 | io_input2; // @[ALU.scala 18:41]
-  wire  _T_4 = io_aluCtl == 4'h2; // @[ALU.scala 19:18]
-  wire [31:0] _T_6 = io_input1 + io_input2; // @[ALU.scala 19:41]
-  wire  _T_7 = io_aluCtl == 4'h3; // @[ALU.scala 20:18]
-  wire [31:0] _T_9 = io_input1 - io_input2; // @[ALU.scala 20:41]
-  wire  _T_10 = io_aluCtl == 4'h4; // @[ALU.scala 21:18]
-  wire  _T_13 = $signed(io_input1) < $signed(io_input2); // @[ALU.scala 21:48]
-  wire  _T_14 = io_aluCtl == 4'h5; // @[ALU.scala 22:18]
-  wire  _T_15 = io_input1 < io_input2; // @[ALU.scala 22:41]
-  wire  _T_16 = io_aluCtl == 4'h6; // @[ALU.scala 23:18]
+  wire  _io_result_T = io_aluCtl == 4'h0; // @[ALU.scala 17:18]
+  wire [31:0] _io_result_T_1 = io_input1 & io_input2; // @[ALU.scala 17:41]
+  wire  _io_result_T_2 = io_aluCtl == 4'h1; // @[ALU.scala 18:18]
+  wire [31:0] _io_result_T_3 = io_input1 | io_input2; // @[ALU.scala 18:41]
+  wire  _io_result_T_4 = io_aluCtl == 4'h2; // @[ALU.scala 19:18]
+  wire [31:0] _io_result_T_6 = io_input1 + io_input2; // @[ALU.scala 19:41]
+  wire  _io_result_T_7 = io_aluCtl == 4'h3; // @[ALU.scala 20:18]
+  wire [31:0] _io_result_T_9 = io_input1 - io_input2; // @[ALU.scala 20:41]
+  wire  _io_result_T_10 = io_aluCtl == 4'h4; // @[ALU.scala 21:18]
+  wire  _io_result_T_13 = $signed(io_input1) < $signed(io_input2); // @[ALU.scala 21:48]
+  wire  _io_result_T_14 = io_aluCtl == 4'h5; // @[ALU.scala 22:18]
+  wire  _io_result_T_15 = io_input1 < io_input2; // @[ALU.scala 22:41]
+  wire  _io_result_T_16 = io_aluCtl == 4'h6; // @[ALU.scala 23:18]
   wire [62:0] _GEN_0 = {{31'd0}, io_input1}; // @[ALU.scala 23:41]
-  wire [62:0] _T_18 = _GEN_0 << io_input2[4:0]; // @[ALU.scala 23:41]
-  wire  _T_19 = io_aluCtl == 4'h7; // @[ALU.scala 24:18]
-  wire [31:0] _T_21 = io_input1 >> io_input2[4:0]; // @[ALU.scala 24:41]
-  wire  _T_22 = io_aluCtl == 4'h8; // @[ALU.scala 25:18]
-  wire [31:0] _T_26 = $signed(io_input1) >>> io_input2[4:0]; // @[ALU.scala 25:68]
-  wire  _T_27 = io_aluCtl == 4'h9; // @[ALU.scala 26:18]
-  wire [31:0] _T_28 = io_input1 ^ io_input2; // @[ALU.scala 26:41]
-  wire [31:0] _T_29 = _T_27 ? _T_28 : 32'h0; // @[Mux.scala 98:16]
-  wire [31:0] _T_30 = _T_22 ? _T_26 : _T_29; // @[Mux.scala 98:16]
-  wire [31:0] _T_31 = _T_19 ? _T_21 : _T_30; // @[Mux.scala 98:16]
-  wire [62:0] _T_32 = _T_16 ? _T_18 : {{31'd0}, _T_31}; // @[Mux.scala 98:16]
-  wire [62:0] _T_33 = _T_14 ? {{62'd0}, _T_15} : _T_32; // @[Mux.scala 98:16]
-  wire [62:0] _T_34 = _T_10 ? {{62'd0}, _T_13} : _T_33; // @[Mux.scala 98:16]
-  wire [62:0] _T_35 = _T_7 ? {{31'd0}, _T_9} : _T_34; // @[Mux.scala 98:16]
-  wire [62:0] _T_36 = _T_4 ? {{31'd0}, _T_6} : _T_35; // @[Mux.scala 98:16]
-  wire [62:0] _T_37 = _T_2 ? {{31'd0}, _T_3} : _T_36; // @[Mux.scala 98:16]
-  wire [62:0] _T_38 = _T ? {{31'd0}, _T_1} : _T_37; // @[Mux.scala 98:16]
-  assign io_result = _T_38[31:0]; // @[ALU.scala 14:13]
+  wire [62:0] _io_result_T_18 = _GEN_0 << io_input2[4:0]; // @[ALU.scala 23:41]
+  wire  _io_result_T_19 = io_aluCtl == 4'h7; // @[ALU.scala 24:18]
+  wire [31:0] _io_result_T_21 = io_input1 >> io_input2[4:0]; // @[ALU.scala 24:41]
+  wire  _io_result_T_22 = io_aluCtl == 4'h8; // @[ALU.scala 25:18]
+  wire [31:0] _io_result_T_26 = $signed(io_input1) >>> io_input2[4:0]; // @[ALU.scala 25:68]
+  wire  _io_result_T_27 = io_aluCtl == 4'h9; // @[ALU.scala 26:18]
+  wire [31:0] _io_result_T_28 = io_input1 ^ io_input2; // @[ALU.scala 26:41]
+  wire [31:0] _io_result_T_29 = _io_result_T_27 ? _io_result_T_28 : 32'h0; // @[Mux.scala 98:16]
+  wire [31:0] _io_result_T_30 = _io_result_T_22 ? _io_result_T_26 : _io_result_T_29; // @[Mux.scala 98:16]
+  wire [31:0] _io_result_T_31 = _io_result_T_19 ? _io_result_T_21 : _io_result_T_30; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_32 = _io_result_T_16 ? _io_result_T_18 : {{31'd0}, _io_result_T_31}; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_33 = _io_result_T_14 ? {{62'd0}, _io_result_T_15} : _io_result_T_32; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_34 = _io_result_T_10 ? {{62'd0}, _io_result_T_13} : _io_result_T_33; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_35 = _io_result_T_7 ? {{31'd0}, _io_result_T_9} : _io_result_T_34; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_36 = _io_result_T_4 ? {{31'd0}, _io_result_T_6} : _io_result_T_35; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_37 = _io_result_T_2 ? {{31'd0}, _io_result_T_3} : _io_result_T_36; // @[Mux.scala 98:16]
+  wire [62:0] _io_result_T_38 = _io_result_T ? {{31'd0}, _io_result_T_1} : _io_result_T_37; // @[Mux.scala 98:16]
+  assign io_result = _io_result_T_38[31:0]; // @[ALU.scala 14:13]
 endmodule
 module AluControl(
   input  [1:0] io_aluOp,
@@ -2436,21 +2543,21 @@
   wire  ForwardingUnit_io_mem_regWrite; // @[Execute.scala 33:18]
   wire [1:0] ForwardingUnit_io_forwardA; // @[Execute.scala 33:18]
   wire [1:0] ForwardingUnit_io_forwardB; // @[Execute.scala 33:18]
-  wire  _T_4 = ForwardingUnit_io_forwardA == 2'h0; // @[Execute.scala 47:20]
-  wire  _T_5 = ForwardingUnit_io_forwardA == 2'h1; // @[Execute.scala 48:20]
-  wire  _T_6 = ForwardingUnit_io_forwardA == 2'h2; // @[Execute.scala 49:20]
-  wire [31:0] _T_7 = _T_6 ? io_wb_result : 32'h0; // @[Mux.scala 98:16]
-  wire [31:0] _T_8 = _T_5 ? io_mem_result : _T_7; // @[Mux.scala 98:16]
-  wire [31:0] inputMux1 = _T_4 ? io_readData1 : _T_8; // @[Mux.scala 98:16]
-  wire  _T_9 = ForwardingUnit_io_forwardB == 2'h0; // @[Execute.scala 55:20]
-  wire  _T_10 = ForwardingUnit_io_forwardB == 2'h1; // @[Execute.scala 56:20]
-  wire  _T_11 = ForwardingUnit_io_forwardB == 2'h2; // @[Execute.scala 57:20]
-  wire [31:0] _T_12 = _T_11 ? io_wb_result : 32'h0; // @[Mux.scala 98:16]
-  wire [31:0] _T_13 = _T_10 ? io_mem_result : _T_12; // @[Mux.scala 98:16]
-  wire [31:0] inputMux2 = _T_9 ? io_readData2 : _T_13; // @[Mux.scala 98:16]
-  wire  _T_14 = io_ctl_aluSrc1 == 2'h1; // @[Execute.scala 64:23]
-  wire  _T_15 = io_ctl_aluSrc1 == 2'h2; // @[Execute.scala 65:23]
-  wire [31:0] _T_16 = _T_15 ? 32'h0 : inputMux1; // @[Mux.scala 98:16]
+  wire  _inputMux1_T = ForwardingUnit_io_forwardA == 2'h0; // @[Execute.scala 47:20]
+  wire  _inputMux1_T_1 = ForwardingUnit_io_forwardA == 2'h1; // @[Execute.scala 48:20]
+  wire  _inputMux1_T_2 = ForwardingUnit_io_forwardA == 2'h2; // @[Execute.scala 49:20]
+  wire [31:0] _inputMux1_T_3 = _inputMux1_T_2 ? io_wb_result : 32'h0; // @[Mux.scala 98:16]
+  wire [31:0] _inputMux1_T_4 = _inputMux1_T_1 ? io_mem_result : _inputMux1_T_3; // @[Mux.scala 98:16]
+  wire [31:0] inputMux1 = _inputMux1_T ? io_readData1 : _inputMux1_T_4; // @[Mux.scala 98:16]
+  wire  _inputMux2_T = ForwardingUnit_io_forwardB == 2'h0; // @[Execute.scala 55:20]
+  wire  _inputMux2_T_1 = ForwardingUnit_io_forwardB == 2'h1; // @[Execute.scala 56:20]
+  wire  _inputMux2_T_2 = ForwardingUnit_io_forwardB == 2'h2; // @[Execute.scala 57:20]
+  wire [31:0] _inputMux2_T_3 = _inputMux2_T_2 ? io_wb_result : 32'h0; // @[Mux.scala 98:16]
+  wire [31:0] _inputMux2_T_4 = _inputMux2_T_1 ? io_mem_result : _inputMux2_T_3; // @[Mux.scala 98:16]
+  wire [31:0] inputMux2 = _inputMux2_T ? io_readData2 : _inputMux2_T_4; // @[Mux.scala 98:16]
+  wire  _aluIn1_T = io_ctl_aluSrc1 == 2'h1; // @[Execute.scala 64:23]
+  wire  _aluIn1_T_1 = io_ctl_aluSrc1 == 2'h2; // @[Execute.scala 65:23]
+  wire [31:0] _aluIn1_T_2 = _aluIn1_T_1 ? 32'h0 : inputMux1; // @[Mux.scala 98:16]
   ALU alu ( // @[Execute.scala 31:19]
     .io_input1(alu_io_input1),
     .io_input2(alu_io_input2),
@@ -2474,9 +2581,9 @@
     .io_forwardA(ForwardingUnit_io_forwardA),
     .io_forwardB(ForwardingUnit_io_forwardB)
   );
-  assign io_writeData = _T_9 ? io_readData2 : _T_13; // @[Mux.scala 98:16]
+  assign io_writeData = _inputMux2_T ? io_readData2 : _inputMux2_T_4; // @[Mux.scala 98:16]
   assign io_ALUresult = alu_io_result; // @[Execute.scala 78:16]
-  assign alu_io_input1 = _T_14 ? io_pcAddress : _T_16; // @[Mux.scala 98:16]
+  assign alu_io_input1 = _aluIn1_T ? io_pcAddress : _aluIn1_T_2; // @[Mux.scala 98:16]
   assign alu_io_input2 = io_ctl_aluSrc ? inputMux2 : io_immediate; // @[Execute.scala 68:19]
   assign alu_io_aluCtl = aluCtl_io_out; // @[Execute.scala 77:17]
   assign aluCtl_io_aluOp = io_ctl_aluOp; // @[Execute.scala 72:19]
@@ -2515,8 +2622,8 @@
   reg [1:0] offset; // @[MemoryFetch.scala 26:23]
   reg [2:0] funct3; // @[MemoryFetch.scala 27:23]
   wire [1:0] offsetSW = io_aluResultIn[1:0]; // @[MemoryFetch.scala 28:32]
-  wire  _T_8 = offsetSW == 2'h0; // @[MemoryFetch.scala 45:19]
-  wire  _T_9 = offsetSW == 2'h1; // @[MemoryFetch.scala 47:25]
+  wire  _T_3 = offsetSW == 2'h0; // @[MemoryFetch.scala 45:19]
+  wire  _T_4 = offsetSW == 2'h1; // @[MemoryFetch.scala 47:25]
   wire [7:0] _GEN_2 = offsetSW == 2'h2 ? io_writeData[15:8] : io_writeData[15:8]; // @[MemoryFetch.scala 53:33 MemoryFetch.scala 54:16 MemoryFetch.scala 60:16]
   wire [7:0] _GEN_3 = offsetSW == 2'h2 ? io_writeData[23:16] : io_writeData[23:16]; // @[MemoryFetch.scala 53:33 MemoryFetch.scala 55:16 MemoryFetch.scala 61:16]
   wire [7:0] _GEN_4 = offsetSW == 2'h2 ? io_writeData[7:0] : io_writeData[31:24]; // @[MemoryFetch.scala 53:33 MemoryFetch.scala 56:16 MemoryFetch.scala 62:16]
@@ -2532,16 +2639,16 @@
   wire [7:0] _GEN_14 = offsetSW == 2'h0 ? io_writeData[15:8] : _GEN_8; // @[MemoryFetch.scala 45:27 MemoryFetch.scala 39:12]
   wire [7:0] _GEN_15 = offsetSW == 2'h0 ? io_writeData[23:16] : _GEN_9; // @[MemoryFetch.scala 45:27 MemoryFetch.scala 40:12]
   wire [7:0] _GEN_16 = offsetSW == 2'h0 ? io_writeData[31:24] : _GEN_10; // @[MemoryFetch.scala 45:27 MemoryFetch.scala 41:12]
-  wire [3:0] _GEN_17 = _T_9 ? 4'h6 : 4'hc; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 75:38 MemoryFetch.scala 82:38]
-  wire [7:0] _GEN_18 = _T_9 ? io_writeData[23:16] : io_writeData[23:16]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 76:16 MemoryFetch.scala 85:16]
-  wire [7:0] _GEN_19 = _T_9 ? io_writeData[7:0] : io_writeData[31:24]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 77:16 MemoryFetch.scala 86:16]
-  wire [7:0] _GEN_20 = _T_9 ? io_writeData[15:8] : io_writeData[7:0]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 78:16 MemoryFetch.scala 83:16]
-  wire [7:0] _GEN_21 = _T_9 ? io_writeData[31:24] : io_writeData[15:8]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 79:16 MemoryFetch.scala 84:16]
-  wire [3:0] _GEN_22 = _T_8 ? 4'h3 : _GEN_17; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 72:38]
-  wire [7:0] _GEN_23 = _T_8 ? io_writeData[7:0] : _GEN_18; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 38:12]
-  wire [7:0] _GEN_24 = _T_8 ? io_writeData[15:8] : _GEN_19; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 39:12]
-  wire [7:0] _GEN_25 = _T_8 ? io_writeData[23:16] : _GEN_20; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 40:12]
-  wire [7:0] _GEN_26 = _T_8 ? io_writeData[31:24] : _GEN_21; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 41:12]
+  wire [3:0] _GEN_17 = _T_4 ? 4'h6 : 4'hc; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 75:38 MemoryFetch.scala 82:38]
+  wire [7:0] _GEN_18 = _T_4 ? io_writeData[23:16] : io_writeData[23:16]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 76:16 MemoryFetch.scala 85:16]
+  wire [7:0] _GEN_19 = _T_4 ? io_writeData[7:0] : io_writeData[31:24]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 77:16 MemoryFetch.scala 86:16]
+  wire [7:0] _GEN_20 = _T_4 ? io_writeData[15:8] : io_writeData[7:0]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 78:16 MemoryFetch.scala 83:16]
+  wire [7:0] _GEN_21 = _T_4 ? io_writeData[31:24] : io_writeData[15:8]; // @[MemoryFetch.scala 73:33 MemoryFetch.scala 79:16 MemoryFetch.scala 84:16]
+  wire [3:0] _GEN_22 = _T_3 ? 4'h3 : _GEN_17; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 72:38]
+  wire [7:0] _GEN_23 = _T_3 ? io_writeData[7:0] : _GEN_18; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 38:12]
+  wire [7:0] _GEN_24 = _T_3 ? io_writeData[15:8] : _GEN_19; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 39:12]
+  wire [7:0] _GEN_25 = _T_3 ? io_writeData[23:16] : _GEN_20; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 40:12]
+  wire [7:0] _GEN_26 = _T_3 ? io_writeData[31:24] : _GEN_21; // @[MemoryFetch.scala 70:27 MemoryFetch.scala 41:12]
   wire [3:0] _GEN_27 = io_writeEnable & io_f3 == 3'h1 ? _GEN_22 : 4'hf; // @[MemoryFetch.scala 68:52 MemoryFetch.scala 91:36]
   wire [7:0] _GEN_28 = io_writeEnable & io_f3 == 3'h1 ? _GEN_23 : io_writeData[7:0]; // @[MemoryFetch.scala 68:52 MemoryFetch.scala 38:12]
   wire [7:0] _GEN_29 = io_writeEnable & io_f3 == 3'h1 ? _GEN_24 : io_writeData[15:8]; // @[MemoryFetch.scala 68:52 MemoryFetch.scala 39:12]
@@ -2551,60 +2658,60 @@
   wire [7:0] wdata_1 = io_writeEnable & io_f3 == 3'h0 ? _GEN_14 : _GEN_29; // @[MemoryFetch.scala 44:45]
   wire [7:0] wdata_2 = io_writeEnable & io_f3 == 3'h0 ? _GEN_15 : _GEN_30; // @[MemoryFetch.scala 44:45]
   wire [7:0] wdata_3 = io_writeEnable & io_f3 == 3'h0 ? _GEN_16 : _GEN_31; // @[MemoryFetch.scala 44:45]
-  wire [15:0] lo = {wdata_1,wdata_0}; // @[MemoryFetch.scala 94:46]
-  wire [15:0] hi = {wdata_3,wdata_2}; // @[MemoryFetch.scala 94:46]
-  wire  _T_36 = io_writeEnable | io_readEnable; // @[MemoryFetch.scala 97:42]
+  wire [15:0] io_dccmReq_bits_dataRequest_lo = {wdata_1,wdata_0}; // @[MemoryFetch.scala 94:46]
+  wire [15:0] io_dccmReq_bits_dataRequest_hi = {wdata_3,wdata_2}; // @[MemoryFetch.scala 94:46]
+  wire  _io_dccmReq_valid_T = io_writeEnable | io_readEnable; // @[MemoryFetch.scala 97:42]
   wire [31:0] rdata = io_dccmRsp_valid ? io_dccmRsp_bits_dataResponse : 32'h0; // @[MemoryFetch.scala 101:15]
-  wire  _T_44 = offset == 2'h0; // @[MemoryFetch.scala 111:21]
-  wire [23:0] hi_1 = rdata[7] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
-  wire [7:0] lo_1 = rdata[7:0]; // @[MemoryFetch.scala 113:53]
-  wire [31:0] _T_47 = {hi_1,lo_1}; // @[Cat.scala 30:58]
-  wire  _T_48 = offset == 2'h1; // @[MemoryFetch.scala 114:28]
-  wire [23:0] hi_2 = rdata[15] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
-  wire [7:0] lo_2 = rdata[15:8]; // @[MemoryFetch.scala 116:55]
-  wire [31:0] _T_51 = {hi_2,lo_2}; // @[Cat.scala 30:58]
-  wire  _T_52 = offset == 2'h2; // @[MemoryFetch.scala 117:28]
-  wire [23:0] hi_3 = rdata[23] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
-  wire [7:0] lo_3 = rdata[23:16]; // @[MemoryFetch.scala 119:55]
-  wire [31:0] _T_55 = {hi_3,lo_3}; // @[Cat.scala 30:58]
-  wire [23:0] hi_4 = rdata[31] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
-  wire [7:0] lo_4 = rdata[31:24]; // @[MemoryFetch.scala 122:55]
-  wire [31:0] _T_59 = {hi_4,lo_4}; // @[Cat.scala 30:58]
-  wire [31:0] _GEN_38 = offset == 2'h2 ? _T_55 : _T_59; // @[MemoryFetch.scala 117:41 MemoryFetch.scala 119:23]
-  wire [31:0] _GEN_39 = offset == 2'h1 ? _T_51 : _GEN_38; // @[MemoryFetch.scala 114:41 MemoryFetch.scala 116:23]
-  wire [31:0] _GEN_40 = offset == 2'h0 ? _T_47 : _GEN_39; // @[MemoryFetch.scala 111:34 MemoryFetch.scala 113:23]
-  wire [31:0] _T_62 = {24'h0,lo_1}; // @[Cat.scala 30:58]
-  wire [31:0] _T_64 = {24'h0,lo_2}; // @[Cat.scala 30:58]
-  wire [31:0] _T_66 = {24'h0,lo_3}; // @[Cat.scala 30:58]
-  wire [31:0] _T_68 = {24'h0,lo_4}; // @[Cat.scala 30:58]
-  wire [31:0] _GEN_42 = _T_52 ? _T_66 : _T_68; // @[MemoryFetch.scala 136:40 MemoryFetch.scala 138:23]
-  wire [31:0] _GEN_43 = _T_48 ? _T_64 : _GEN_42; // @[MemoryFetch.scala 133:40 MemoryFetch.scala 135:23]
-  wire [31:0] _GEN_44 = _T_44 ? _T_62 : _GEN_43; // @[MemoryFetch.scala 130:34 MemoryFetch.scala 132:23]
-  wire [15:0] lo_9 = rdata[15:0]; // @[MemoryFetch.scala 151:49]
-  wire [31:0] _T_71 = {16'h0,lo_9}; // @[Cat.scala 30:58]
-  wire [15:0] lo_10 = rdata[23:8]; // @[MemoryFetch.scala 154:49]
-  wire [31:0] _T_73 = {16'h0,lo_10}; // @[Cat.scala 30:58]
-  wire [15:0] lo_11 = rdata[31:16]; // @[MemoryFetch.scala 157:49]
-  wire [31:0] _T_75 = {16'h0,lo_11}; // @[Cat.scala 30:58]
-  wire [31:0] _GEN_46 = _T_48 ? _T_73 : _T_75; // @[MemoryFetch.scala 152:41 MemoryFetch.scala 154:23]
-  wire [31:0] _GEN_47 = _T_44 ? _T_71 : _GEN_46; // @[MemoryFetch.scala 149:34 MemoryFetch.scala 151:23]
-  wire [15:0] hi_12 = rdata[15] ? 16'hffff : 16'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_80 = {hi_12,lo_9}; // @[Cat.scala 30:58]
-  wire [15:0] hi_13 = rdata[23] ? 16'hffff : 16'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_84 = {hi_13,lo_10}; // @[Cat.scala 30:58]
-  wire [15:0] hi_14 = rdata[31] ? 16'hffff : 16'h0; // @[Bitwise.scala 72:12]
-  wire [31:0] _T_88 = {hi_14,lo_11}; // @[Cat.scala 30:58]
-  wire [31:0] _GEN_49 = _T_48 ? _T_84 : _T_88; // @[MemoryFetch.scala 168:41 MemoryFetch.scala 170:23]
-  wire [31:0] _GEN_50 = _T_44 ? _T_80 : _GEN_49; // @[MemoryFetch.scala 165:34 MemoryFetch.scala 167:23]
+  wire  _T_12 = offset == 2'h0; // @[MemoryFetch.scala 111:21]
+  wire [23:0] io_readData_hi = rdata[7] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
+  wire [7:0] io_readData_lo = rdata[7:0]; // @[MemoryFetch.scala 113:53]
+  wire [31:0] _io_readData_T_2 = {io_readData_hi,io_readData_lo}; // @[Cat.scala 30:58]
+  wire  _T_13 = offset == 2'h1; // @[MemoryFetch.scala 114:28]
+  wire [23:0] io_readData_hi_1 = rdata[15] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
+  wire [7:0] io_readData_lo_1 = rdata[15:8]; // @[MemoryFetch.scala 116:55]
+  wire [31:0] _io_readData_T_5 = {io_readData_hi_1,io_readData_lo_1}; // @[Cat.scala 30:58]
+  wire  _T_14 = offset == 2'h2; // @[MemoryFetch.scala 117:28]
+  wire [23:0] io_readData_hi_2 = rdata[23] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
+  wire [7:0] io_readData_lo_2 = rdata[23:16]; // @[MemoryFetch.scala 119:55]
+  wire [31:0] _io_readData_T_8 = {io_readData_hi_2,io_readData_lo_2}; // @[Cat.scala 30:58]
+  wire [23:0] io_readData_hi_3 = rdata[31] ? 24'hffffff : 24'h0; // @[Bitwise.scala 72:12]
+  wire [7:0] io_readData_lo_3 = rdata[31:24]; // @[MemoryFetch.scala 122:55]
+  wire [31:0] _io_readData_T_11 = {io_readData_hi_3,io_readData_lo_3}; // @[Cat.scala 30:58]
+  wire [31:0] _GEN_38 = offset == 2'h2 ? _io_readData_T_8 : _io_readData_T_11; // @[MemoryFetch.scala 117:41 MemoryFetch.scala 119:23]
+  wire [31:0] _GEN_39 = offset == 2'h1 ? _io_readData_T_5 : _GEN_38; // @[MemoryFetch.scala 114:41 MemoryFetch.scala 116:23]
+  wire [31:0] _GEN_40 = offset == 2'h0 ? _io_readData_T_2 : _GEN_39; // @[MemoryFetch.scala 111:34 MemoryFetch.scala 113:23]
+  wire [31:0] _io_readData_T_12 = {24'h0,io_readData_lo}; // @[Cat.scala 30:58]
+  wire [31:0] _io_readData_T_13 = {24'h0,io_readData_lo_1}; // @[Cat.scala 30:58]
+  wire [31:0] _io_readData_T_14 = {24'h0,io_readData_lo_2}; // @[Cat.scala 30:58]
+  wire [31:0] _io_readData_T_15 = {24'h0,io_readData_lo_3}; // @[Cat.scala 30:58]
+  wire [31:0] _GEN_42 = _T_14 ? _io_readData_T_14 : _io_readData_T_15; // @[MemoryFetch.scala 136:40 MemoryFetch.scala 138:23]
+  wire [31:0] _GEN_43 = _T_13 ? _io_readData_T_13 : _GEN_42; // @[MemoryFetch.scala 133:40 MemoryFetch.scala 135:23]
+  wire [31:0] _GEN_44 = _T_12 ? _io_readData_T_12 : _GEN_43; // @[MemoryFetch.scala 130:34 MemoryFetch.scala 132:23]
+  wire [15:0] io_readData_lo_8 = rdata[15:0]; // @[MemoryFetch.scala 151:49]
+  wire [31:0] _io_readData_T_16 = {16'h0,io_readData_lo_8}; // @[Cat.scala 30:58]
+  wire [15:0] io_readData_lo_9 = rdata[23:8]; // @[MemoryFetch.scala 154:49]
+  wire [31:0] _io_readData_T_17 = {16'h0,io_readData_lo_9}; // @[Cat.scala 30:58]
+  wire [15:0] io_readData_lo_10 = rdata[31:16]; // @[MemoryFetch.scala 157:49]
+  wire [31:0] _io_readData_T_18 = {16'h0,io_readData_lo_10}; // @[Cat.scala 30:58]
+  wire [31:0] _GEN_46 = _T_13 ? _io_readData_T_17 : _io_readData_T_18; // @[MemoryFetch.scala 152:41 MemoryFetch.scala 154:23]
+  wire [31:0] _GEN_47 = _T_12 ? _io_readData_T_16 : _GEN_46; // @[MemoryFetch.scala 149:34 MemoryFetch.scala 151:23]
+  wire [15:0] io_readData_hi_11 = rdata[15] ? 16'hffff : 16'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] _io_readData_T_21 = {io_readData_hi_11,io_readData_lo_8}; // @[Cat.scala 30:58]
+  wire [15:0] io_readData_hi_12 = rdata[23] ? 16'hffff : 16'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] _io_readData_T_24 = {io_readData_hi_12,io_readData_lo_9}; // @[Cat.scala 30:58]
+  wire [15:0] io_readData_hi_13 = rdata[31] ? 16'hffff : 16'h0; // @[Bitwise.scala 72:12]
+  wire [31:0] _io_readData_T_27 = {io_readData_hi_13,io_readData_lo_10}; // @[Cat.scala 30:58]
+  wire [31:0] _GEN_49 = _T_13 ? _io_readData_T_24 : _io_readData_T_27; // @[MemoryFetch.scala 168:41 MemoryFetch.scala 170:23]
+  wire [31:0] _GEN_50 = _T_12 ? _io_readData_T_21 : _GEN_49; // @[MemoryFetch.scala 165:34 MemoryFetch.scala 167:23]
   wire [31:0] _GEN_52 = funct3 == 3'h5 ? _GEN_47 : _GEN_50; // @[MemoryFetch.scala 147:38]
   wire [31:0] _GEN_53 = funct3 == 3'h4 ? _GEN_44 : _GEN_52; // @[MemoryFetch.scala 128:38]
   wire [31:0] _GEN_54 = funct3 == 3'h0 ? _GEN_40 : _GEN_53; // @[MemoryFetch.scala 109:38]
-  wire  _T_91 = io_writeEnable & io_aluResultIn[31:28] == 4'h8; // @[MemoryFetch.scala 188:23]
+  wire  _T_31 = io_writeEnable & io_aluResultIn[31:28] == 4'h8; // @[MemoryFetch.scala 188:23]
   assign io_readData = funct3 == 3'h2 ? rdata : _GEN_54; // @[MemoryFetch.scala 105:31 MemoryFetch.scala 107:19]
-  assign io_stall = _T_36 & ~io_dccmRsp_valid; // @[MemoryFetch.scala 99:49]
+  assign io_stall = _io_dccmReq_valid_T & ~io_dccmRsp_valid; // @[MemoryFetch.scala 99:49]
   assign io_dccmReq_valid = io_writeEnable | io_readEnable; // @[MemoryFetch.scala 97:42]
   assign io_dccmReq_bits_addrRequest = io_aluResultIn; // @[MemoryFetch.scala 95:31]
-  assign io_dccmReq_bits_dataRequest = {hi,lo}; // @[MemoryFetch.scala 94:46]
+  assign io_dccmReq_bits_dataRequest = {io_dccmReq_bits_dataRequest_hi,io_dccmReq_bits_dataRequest_lo}; // @[MemoryFetch.scala 94:46]
   assign io_dccmReq_bits_activeByteLane = io_writeEnable & io_f3 == 3'h0 ? _GEN_12 : _GEN_27; // @[MemoryFetch.scala 44:45]
   assign io_dccmReq_bits_isWrite = io_writeEnable; // @[MemoryFetch.scala 96:27]
   always @(posedge clock) begin
@@ -2622,7 +2729,7 @@
     `ifdef PRINTF_COND
       if (`PRINTF_COND) begin
     `endif
-        if (_T_91 & ~reset) begin
+        if (_T_31 & ~reset) begin
           $fwrite(32'h80000002,"%x\n",io_writeData); // @[MemoryFetch.scala 189:11]
         end
     `ifdef PRINTF_COND
@@ -2690,9 +2797,9 @@
   reg [31:0] _RAND_0;
 `endif // RANDOMIZE_REG_INIT
   reg [31:0] pc_reg; // @[PC.scala 12:23]
-  wire [31:0] _T_2 = $signed(pc_reg) + 32'sh4; // @[PC.scala 15:41]
+  wire [31:0] _io_pc4_T_2 = $signed(pc_reg) + 32'sh4; // @[PC.scala 15:41]
   assign io_out = pc_reg; // @[PC.scala 14:10]
-  assign io_pc4 = io_halt ? $signed(pc_reg) : $signed(_T_2); // @[PC.scala 15:16]
+  assign io_pc4 = io_halt ? $signed(pc_reg) : $signed(_io_pc4_T_2); // @[PC.scala 15:16]
   always @(posedge clock) begin
     if (reset) begin // @[PC.scala 12:23]
       pc_reg <= -32'sh4; // @[PC.scala 12:23]
@@ -2749,7 +2856,6 @@
 module Core(
   input         clock,
   input         reset,
-  input         io_stall,
   output        io_dmemReq_valid,
   output [31:0] io_dmemReq_bits_addrRequest,
   output [31:0] io_dmemReq_bits_dataRequest,
@@ -2799,7 +2905,6 @@
 `endif // RANDOMIZE_REG_INIT
   wire [31:0] InstructionFetch_io_address; // @[Core.scala 71:18]
   wire [31:0] InstructionFetch_io_instruction; // @[Core.scala 71:18]
-  wire  InstructionFetch_io_stall; // @[Core.scala 71:18]
   wire  InstructionFetch_io_coreInstrReq_ready; // @[Core.scala 71:18]
   wire  InstructionFetch_io_coreInstrReq_valid; // @[Core.scala 71:18]
   wire [31:0] InstructionFetch_io_coreInstrReq_bits_addrRequest; // @[Core.scala 71:18]
@@ -2915,14 +3020,14 @@
   reg [1:0] mem_reg_ctl_memToReg; // @[Core.scala 66:37]
   reg  mem_reg_ctl_regWrite; // @[Core.scala 67:37]
   reg [31:0] mem_reg_pc; // @[Core.scala 68:27]
-  wire  _T_2 = ~MEM_io_stall; // @[Core.scala 91:37]
-  wire [31:0] _T_5 = InstructionDecode_io_pcSrc ? $signed(InstructionDecode_io_pcPlusOffset) : $signed(pc_io_pc4); // @[Core.scala 91:55]
-  wire [4:0] _T_17 = io_dmemRsp_valid ? mem_reg_wra : 5'h0; // @[Core.scala 229:19]
+  wire  _pc_io_in_T = ~MEM_io_stall; // @[Core.scala 91:37]
+  wire [31:0] _pc_io_in_T_3 = InstructionDecode_io_pcSrc ? $signed(InstructionDecode_io_pcPlusOffset) : $signed(
+    pc_io_pc4); // @[Core.scala 91:55]
+  wire [4:0] _wb_addr_T = io_dmemRsp_valid ? mem_reg_wra : 5'h0; // @[Core.scala 229:19]
   wire [31:0] _GEN_14 = mem_reg_ctl_memToReg == 2'h2 ? mem_reg_pc : mem_reg_result; // @[Core.scala 230:44 Core.scala 231:15 Core.scala 235:15]
   InstructionFetch InstructionFetch ( // @[Core.scala 71:18]
     .io_address(InstructionFetch_io_address),
     .io_instruction(InstructionFetch_io_instruction),
-    .io_stall(InstructionFetch_io_stall),
     .io_coreInstrReq_ready(InstructionFetch_io_coreInstrReq_ready),
     .io_coreInstrReq_valid(InstructionFetch_io_coreInstrReq_valid),
     .io_coreInstrReq_bits_addrRequest(InstructionFetch_io_coreInstrReq_bits_addrRequest),
@@ -3023,7 +3128,6 @@
   assign io_imemReq_valid = InstructionFetch_io_coreInstrReq_valid; // @[Core.scala 84:14]
   assign io_imemReq_bits_addrRequest = InstructionFetch_io_coreInstrReq_bits_addrRequest; // @[Core.scala 84:14]
   assign InstructionFetch_io_address = pc_io_in; // @[Core.scala 87:32]
-  assign InstructionFetch_io_stall = io_stall; // @[Core.scala 82:12]
   assign InstructionFetch_io_coreInstrReq_ready = io_imemReq_ready; // @[Core.scala 84:14]
   assign InstructionFetch_io_coreInstrResp_valid = io_imemRsp_valid; // @[Core.scala 85:20]
   assign InstructionFetch_io_coreInstrResp_bits_dataResponse = io_imemRsp_bits_dataResponse; // @[Core.scala 85:20]
@@ -3031,7 +3135,7 @@
   assign InstructionDecode_reset = reset;
   assign InstructionDecode_io_id_instruction = if_reg_ins; // @[Core.scala 125:21]
   assign InstructionDecode_io_writeData = mem_reg_ctl_memToReg == 2'h1 ? MEM_io_readData : _GEN_14; // @[Core.scala 227:38 Core.scala 228:13]
-  assign InstructionDecode_io_writeReg = mem_reg_ctl_memToReg == 2'h1 ? _T_17 : mem_reg_wra; // @[Core.scala 227:38 Core.scala 229:13]
+  assign InstructionDecode_io_writeReg = mem_reg_ctl_memToReg == 2'h1 ? _wb_addr_T : mem_reg_wra; // @[Core.scala 227:38 Core.scala 229:13]
   assign InstructionDecode_io_pcAddress = if_reg_pc; // @[Core.scala 126:16]
   assign InstructionDecode_io_ctl_writeEnable = mem_reg_ctl_regWrite; // @[Core.scala 244:22]
   assign InstructionDecode_io_id_ex_mem_read = id_reg_ctl_memRead; // @[Core.scala 162:21]
@@ -3072,19 +3176,19 @@
   assign MEM_io_dccmRsp_bits_dataResponse = io_dmemRsp_bits_dataResponse; // @[Core.scala 181:18]
   assign pc_clock = clock;
   assign pc_reset = reset;
-  assign pc_io_in = InstructionDecode_io_hdu_pcWrite & ~MEM_io_stall ? $signed(_T_5) : $signed(pc_io_out); // @[Core.scala 91:18]
+  assign pc_io_in = InstructionDecode_io_hdu_pcWrite & ~MEM_io_stall ? $signed(_pc_io_in_T_3) : $signed(pc_io_out); // @[Core.scala 91:18]
   assign pc_io_halt = io_imemReq_valid ? 1'h0 : 1'h1; // @[Core.scala 90:20]
   always @(posedge clock) begin
     if (reset) begin // @[Core.scala 24:26]
       if_reg_pc <= 32'h0; // @[Core.scala 24:26]
-    end else if (InstructionDecode_io_hdu_if_reg_write & _T_2) begin // @[Core.scala 94:46]
+    end else if (InstructionDecode_io_hdu_if_reg_write & _pc_io_in_T) begin // @[Core.scala 94:46]
       if_reg_pc <= pc_io_out; // @[Core.scala 95:15]
     end
     if (reset) begin // @[Core.scala 25:27]
       if_reg_ins <= 32'h0; // @[Core.scala 25:27]
     end else if (InstructionDecode_io_ifid_flush) begin // @[Core.scala 98:23]
       if_reg_ins <= 32'h0; // @[Core.scala 99:16]
-    end else if (InstructionDecode_io_hdu_if_reg_write & _T_2) begin // @[Core.scala 94:46]
+    end else if (InstructionDecode_io_hdu_if_reg_write & _pc_io_in_T) begin // @[Core.scala 94:46]
       if (io_imemRsp_valid) begin // @[Core.scala 88:24]
         if_reg_ins <= InstructionFetch_io_instruction;
       end else begin
@@ -3414,734 +3518,354 @@
   assign io_devOut_2_bits_cyc = io_hostIn_bits_cyc; // @[Switch1toN.scala 31:33]
   assign io_devOut_2_bits_stb = io_hostIn_bits_stb; // @[Switch1toN.scala 31:33]
 endmodule
-module Rx(
-  input         clock,
-  input         reset,
-  input  [15:0] io_CLK_PER_BIT,
-  input         io_rxd,
-  output        io_valid,
-  output [7:0]  io_data
-);
-`ifdef RANDOMIZE_REG_INIT
-  reg [31:0] _RAND_0;
-  reg [31:0] _RAND_1;
-  reg [31:0] _RAND_2;
-  reg [31:0] _RAND_3;
-  reg [31:0] _RAND_4;
-  reg [31:0] _RAND_5;
-  reg [31:0] _RAND_6;
-`endif // RANDOMIZE_REG_INIT
-  reg [2:0] stateReg; // @[Rx.scala 19:25]
-  reg [7:0] clockCount; // @[Rx.scala 21:27]
-  reg [3:0] bitIndex; // @[Rx.scala 22:25]
-  reg  validReg; // @[Rx.scala 23:25]
-  reg  rxReg_REG; // @[Rx.scala 25:30]
-  reg  rxReg; // @[Rx.scala 25:22]
-  reg [7:0] shiftReg; // @[Rx.scala 26:25]
-  wire  _T = 3'h0 == stateReg; // @[Conditional.scala 37:30]
-  wire  _T_1 = ~io_rxd; // @[Rx.scala 34:19]
-  wire  _T_2 = 3'h1 == stateReg; // @[Conditional.scala 37:30]
-  wire [31:0] CLCK_PER_BIT = {{16'd0}, io_CLK_PER_BIT}; // @[Rx.scala 15:36 Rx.scala 16:16]
-  wire [31:0] _T_4 = CLCK_PER_BIT - 32'h1; // @[Rx.scala 42:42]
-  wire [31:0] _T_5 = _T_4 / 2'h2; // @[Rx.scala 42:49]
-  wire [31:0] _GEN_34 = {{24'd0}, clockCount}; // @[Rx.scala 42:23]
-  wire [7:0] _GEN_1 = _T_1 ? 8'h0 : clockCount; // @[Rx.scala 43:30 Rx.scala 44:22 Rx.scala 21:27]
-  wire [2:0] _GEN_2 = _T_1 ? 3'h2 : 3'h0; // @[Rx.scala 43:30 Rx.scala 45:20 Rx.scala 47:20]
-  wire [7:0] _clockCount_T_1 = clockCount + 8'h1; // @[Rx.scala 50:34]
-  wire  _T_8 = 3'h2 == stateReg; // @[Conditional.scala 37:30]
-  wire  _T_11 = _GEN_34 < _T_4; // @[Rx.scala 56:23]
-  wire [6:0] shiftReg_lo = shiftReg[7:1]; // @[Rx.scala 61:41]
-  wire [7:0] _shiftReg_T = {rxReg,shiftReg_lo}; // @[Cat.scala 30:58]
-  wire [3:0] _bitIndex_T_1 = bitIndex + 4'h1; // @[Rx.scala 65:32]
-  wire [3:0] _GEN_5 = bitIndex < 4'h7 ? _bitIndex_T_1 : 4'h0; // @[Rx.scala 64:30 Rx.scala 65:20 Rx.scala 68:20]
-  wire [2:0] _GEN_6 = bitIndex < 4'h7 ? 3'h2 : 3'h3; // @[Rx.scala 64:30 Rx.scala 66:20 Rx.scala 69:20]
-  wire [7:0] _GEN_7 = _GEN_34 < _T_4 ? _clockCount_T_1 : 8'h0; // @[Rx.scala 56:47 Rx.scala 57:20 Rx.scala 60:20]
-  wire [2:0] _GEN_8 = _GEN_34 < _T_4 ? 3'h2 : _GEN_6; // @[Rx.scala 56:47 Rx.scala 58:18]
-  wire [7:0] _GEN_9 = _GEN_34 < _T_4 ? shiftReg : _shiftReg_T; // @[Rx.scala 56:47 Rx.scala 26:25 Rx.scala 61:18]
-  wire [3:0] _GEN_10 = _GEN_34 < _T_4 ? bitIndex : _GEN_5; // @[Rx.scala 56:47 Rx.scala 22:25]
-  wire  _T_13 = 3'h3 == stateReg; // @[Conditional.scala 37:30]
-  wire [2:0] _GEN_12 = _T_11 ? 3'h3 : 3'h4; // @[Rx.scala 75:47 Rx.scala 77:18 Rx.scala 81:18]
-  wire  _GEN_13 = _T_11 ? validReg : 1'h1; // @[Rx.scala 75:47 Rx.scala 23:25 Rx.scala 79:18]
-  wire  _T_17 = 3'h4 == stateReg; // @[Conditional.scala 37:30]
-  wire [2:0] _GEN_14 = _T_17 ? 3'h0 : stateReg; // @[Conditional.scala 39:67 Rx.scala 86:16 Rx.scala 19:25]
-  wire  _GEN_15 = _T_17 ? 1'h0 : validReg; // @[Conditional.scala 39:67 Rx.scala 87:16 Rx.scala 23:25]
-  wire [7:0] _GEN_16 = _T_13 ? _GEN_7 : clockCount; // @[Conditional.scala 39:67 Rx.scala 21:27]
-  wire [2:0] _GEN_17 = _T_13 ? _GEN_12 : _GEN_14; // @[Conditional.scala 39:67]
-  wire  _GEN_18 = _T_13 ? _GEN_13 : _GEN_15; // @[Conditional.scala 39:67]
-  assign io_valid = validReg; // @[Rx.scala 93:12]
-  assign io_data = shiftReg; // @[Rx.scala 91:11]
-  always @(posedge clock) begin
-    if (reset) begin // @[Rx.scala 19:25]
-      stateReg <= 3'h0; // @[Rx.scala 19:25]
-    end else if (_T) begin // @[Conditional.scala 40:58]
-      if (~io_rxd) begin // @[Rx.scala 34:28]
-        stateReg <= 3'h1; // @[Rx.scala 35:18]
-      end else begin
-        stateReg <= 3'h0; // @[Rx.scala 37:18]
-      end
-    end else if (_T_2) begin // @[Conditional.scala 39:67]
-      if (_GEN_34 == _T_5) begin // @[Rx.scala 42:57]
-        stateReg <= _GEN_2;
-      end else begin
-        stateReg <= 3'h1; // @[Rx.scala 51:18]
-      end
-    end else if (_T_8) begin // @[Conditional.scala 39:67]
-      stateReg <= _GEN_8;
-    end else begin
-      stateReg <= _GEN_17;
-    end
-    if (reset) begin // @[Rx.scala 21:27]
-      clockCount <= 8'h0; // @[Rx.scala 21:27]
-    end else if (_T) begin // @[Conditional.scala 40:58]
-      clockCount <= 8'h0; // @[Rx.scala 31:18]
-    end else if (_T_2) begin // @[Conditional.scala 39:67]
-      if (_GEN_34 == _T_5) begin // @[Rx.scala 42:57]
-        clockCount <= _GEN_1;
-      end else begin
-        clockCount <= _clockCount_T_1; // @[Rx.scala 50:20]
-      end
-    end else if (_T_8) begin // @[Conditional.scala 39:67]
-      clockCount <= _GEN_7;
-    end else begin
-      clockCount <= _GEN_16;
-    end
-    if (reset) begin // @[Rx.scala 22:25]
-      bitIndex <= 4'h0; // @[Rx.scala 22:25]
-    end else if (_T) begin // @[Conditional.scala 40:58]
-      bitIndex <= 4'h0; // @[Rx.scala 32:16]
-    end else if (!(_T_2)) begin // @[Conditional.scala 39:67]
-      if (_T_8) begin // @[Conditional.scala 39:67]
-        bitIndex <= _GEN_10;
-      end
-    end
-    if (reset) begin // @[Rx.scala 23:25]
-      validReg <= 1'h0; // @[Rx.scala 23:25]
-    end else if (_T) begin // @[Conditional.scala 40:58]
-      validReg <= 1'h0; // @[Rx.scala 30:16]
-    end else if (!(_T_2)) begin // @[Conditional.scala 39:67]
-      if (!(_T_8)) begin // @[Conditional.scala 39:67]
-        validReg <= _GEN_18;
-      end
-    end
-    rxReg_REG <= reset | io_rxd; // @[Rx.scala 25:30 Rx.scala 25:30 Rx.scala 25:30]
-    rxReg <= reset | rxReg_REG; // @[Rx.scala 25:22 Rx.scala 25:22 Rx.scala 25:22]
-    if (reset) begin // @[Rx.scala 26:25]
-      shiftReg <= 8'h41; // @[Rx.scala 26:25]
-    end else if (!(_T)) begin // @[Conditional.scala 40:58]
-      if (!(_T_2)) begin // @[Conditional.scala 39:67]
-        if (_T_8) begin // @[Conditional.scala 39:67]
-          shiftReg <= _GEN_9;
-        end
-      end
-    end
-  end
-// Register and memory initialization
-`ifdef RANDOMIZE_GARBAGE_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_INVALID_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_REG_INIT
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-`define RANDOMIZE
-`endif
-`ifndef RANDOM
-`define RANDOM $random
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-  integer initvar;
-`endif
-`ifndef SYNTHESIS
-`ifdef FIRRTL_BEFORE_INITIAL
-`FIRRTL_BEFORE_INITIAL
-`endif
-initial begin
-  `ifdef RANDOMIZE
-    `ifdef INIT_RANDOM
-      `INIT_RANDOM
-    `endif
-    `ifndef VERILATOR
-      `ifdef RANDOMIZE_DELAY
-        #`RANDOMIZE_DELAY begin end
-      `else
-        #0.002 begin end
-      `endif
-    `endif
-`ifdef RANDOMIZE_REG_INIT
-  _RAND_0 = {1{`RANDOM}};
-  stateReg = _RAND_0[2:0];
-  _RAND_1 = {1{`RANDOM}};
-  clockCount = _RAND_1[7:0];
-  _RAND_2 = {1{`RANDOM}};
-  bitIndex = _RAND_2[3:0];
-  _RAND_3 = {1{`RANDOM}};
-  validReg = _RAND_3[0:0];
-  _RAND_4 = {1{`RANDOM}};
-  rxReg_REG = _RAND_4[0:0];
-  _RAND_5 = {1{`RANDOM}};
-  rxReg = _RAND_5[0:0];
-  _RAND_6 = {1{`RANDOM}};
-  shiftReg = _RAND_6[7:0];
-`endif // RANDOMIZE_REG_INIT
-  `endif // RANDOMIZE
-end // initial
-`ifdef FIRRTL_AFTER_INITIAL
-`FIRRTL_AFTER_INITIAL
-`endif
-`endif // SYNTHESIS
-endmodule
-module PUart(
-  input         clock,
-  input         reset,
-  input         io_isStalled,
-  output [31:0] io_rx_data_o,
-  output [7:0]  io_addr_o,
-  input  [15:0] io_CLK_PER_BIT,
-  input         io_rxd,
-  output        io_valid,
-  output        io_done
-);
-`ifdef RANDOMIZE_REG_INIT
-  reg [31:0] _RAND_0;
-  reg [31:0] _RAND_1;
-  reg [31:0] _RAND_2;
-  reg [31:0] _RAND_3;
-  reg [31:0] _RAND_4;
-  reg [31:0] _RAND_5;
-  reg [31:0] _RAND_6;
-  reg [31:0] _RAND_7;
-  reg [31:0] _RAND_8;
-`endif // RANDOMIZE_REG_INIT
-  wire  rx_clock; // @[PUart.scala 25:18]
-  wire  rx_reset; // @[PUart.scala 25:18]
-  wire [15:0] rx_io_CLK_PER_BIT; // @[PUart.scala 25:18]
-  wire  rx_io_rxd; // @[PUart.scala 25:18]
-  wire  rx_io_valid; // @[PUart.scala 25:18]
-  wire [7:0] rx_io_data; // @[PUart.scala 25:18]
-  reg  regDone; // @[PUart.scala 19:24]
-  reg [2:0] count; // @[PUart.scala 20:22]
-  reg [31:0] regFinalData; // @[PUart.scala 21:29]
-  reg [13:0] regAddr; // @[PUart.scala 22:24]
-  reg  regValid; // @[PUart.scala 23:25]
-  reg [7:0] dataReg; // @[PUart.scala 30:24]
-  reg [7:0] regLSB1; // @[PUart.scala 31:24]
-  reg [7:0] regLSB2; // @[PUart.scala 32:24]
-  reg [7:0] regMSB1; // @[PUart.scala 33:24]
-  wire [2:0] _count_T_1 = count + 3'h1; // @[PUart.scala 41:22]
-  wire  _GEN_2 = rx_io_valid ? 1'h0 : regValid; // @[PUart.scala 37:31 PUart.scala 42:16 PUart.scala 23:25]
-  wire  _GEN_5 = io_isStalled & ~regDone ? _GEN_2 : regValid; // @[PUart.scala 36:34 PUart.scala 23:25]
-  wire  _T_3 = 3'h1 == count; // @[Conditional.scala 37:30]
-  wire  _T_4 = 3'h2 == count; // @[Conditional.scala 37:30]
-  wire  _T_5 = 3'h3 == count; // @[Conditional.scala 37:30]
-  wire  _T_6 = 3'h4 == count; // @[Conditional.scala 37:30]
-  wire [31:0] data = {dataReg,regMSB1,regLSB2,regLSB1}; // @[Cat.scala 30:58]
-  wire [13:0] _regAddr_T_1 = regAddr + 14'h1; // @[PUart.scala 65:28]
-  wire  _GEN_6 = data == 32'hfff | regDone; // @[PUart.scala 58:36 PUart.scala 59:17 PUart.scala 19:24]
-  wire [31:0] _GEN_7 = data == 32'hfff ? 32'h0 : data; // @[PUart.scala 58:36 PUart.scala 60:22 PUart.scala 64:22]
-  wire [13:0] _GEN_8 = data == 32'hfff ? 14'h0 : _regAddr_T_1; // @[PUart.scala 58:36 PUart.scala 61:17 PUart.scala 65:17]
-  wire  _GEN_9 = data == 32'hfff ? 1'h0 : 1'h1; // @[PUart.scala 58:36 PUart.scala 62:18 PUart.scala 66:18]
-  wire  _GEN_10 = _T_6 ? _GEN_6 : regDone; // @[Conditional.scala 39:67 PUart.scala 19:24]
-  wire [31:0] _GEN_11 = _T_6 ? _GEN_7 : regFinalData; // @[Conditional.scala 39:67 PUart.scala 21:29]
-  wire [13:0] _GEN_12 = _T_6 ? _GEN_8 : regAddr; // @[Conditional.scala 39:67 PUart.scala 22:24]
-  wire  _GEN_13 = _T_6 ? _GEN_9 : _GEN_5; // @[Conditional.scala 39:67]
-  Rx rx ( // @[PUart.scala 25:18]
-    .clock(rx_clock),
-    .reset(rx_reset),
-    .io_CLK_PER_BIT(rx_io_CLK_PER_BIT),
-    .io_rxd(rx_io_rxd),
-    .io_valid(rx_io_valid),
-    .io_data(rx_io_data)
-  );
-  assign io_rx_data_o = regFinalData; // @[PUart.scala 77:16]
-  assign io_addr_o = regAddr[7:0]; // @[PUart.scala 76:13]
-  assign io_valid = regValid; // @[PUart.scala 78:12]
-  assign io_done = regDone; // @[PUart.scala 79:11]
-  assign rx_clock = clock;
-  assign rx_reset = reset;
-  assign rx_io_CLK_PER_BIT = io_CLK_PER_BIT; // @[PUart.scala 27:21]
-  assign rx_io_rxd = io_rxd; // @[PUart.scala 28:13]
-  always @(posedge clock) begin
-    if (reset) begin // @[PUart.scala 19:24]
-      regDone <= 1'h0; // @[PUart.scala 19:24]
-    end else if (!(_T_3)) begin // @[Conditional.scala 40:58]
-      if (!(_T_4)) begin // @[Conditional.scala 39:67]
-        if (!(_T_5)) begin // @[Conditional.scala 39:67]
-          regDone <= _GEN_10;
-        end
-      end
-    end
-    if (reset) begin // @[PUart.scala 20:22]
-      count <= 3'h0; // @[PUart.scala 20:22]
-    end else if (count == 3'h4) begin // @[PUart.scala 72:23]
-      count <= 3'h0; // @[PUart.scala 73:11]
-    end else if (io_isStalled & ~regDone) begin // @[PUart.scala 36:34]
-      if (rx_io_valid) begin // @[PUart.scala 37:31]
-        count <= _count_T_1; // @[PUart.scala 41:13]
-      end
-    end
-    if (reset) begin // @[PUart.scala 21:29]
-      regFinalData <= 32'h0; // @[PUart.scala 21:29]
-    end else if (!(_T_3)) begin // @[Conditional.scala 40:58]
-      if (!(_T_4)) begin // @[Conditional.scala 39:67]
-        if (!(_T_5)) begin // @[Conditional.scala 39:67]
-          regFinalData <= _GEN_11;
-        end
-      end
-    end
-    if (reset) begin // @[PUart.scala 22:24]
-      regAddr <= 14'h3fff; // @[PUart.scala 22:24]
-    end else if (!(_T_3)) begin // @[Conditional.scala 40:58]
-      if (!(_T_4)) begin // @[Conditional.scala 39:67]
-        if (!(_T_5)) begin // @[Conditional.scala 39:67]
-          regAddr <= _GEN_12;
-        end
-      end
-    end
-    if (reset) begin // @[PUart.scala 23:25]
-      regValid <= 1'h0; // @[PUart.scala 23:25]
-    end else if (_T_3) begin // @[Conditional.scala 40:58]
-      regValid <= _GEN_5;
-    end else if (_T_4) begin // @[Conditional.scala 39:67]
-      regValid <= _GEN_5;
-    end else if (_T_5) begin // @[Conditional.scala 39:67]
-      regValid <= _GEN_5;
-    end else begin
-      regValid <= _GEN_13;
-    end
-    if (reset) begin // @[PUart.scala 30:24]
-      dataReg <= 8'h0; // @[PUart.scala 30:24]
-    end else if (io_isStalled & ~regDone) begin // @[PUart.scala 36:34]
-      if (rx_io_valid) begin // @[PUart.scala 37:31]
-        dataReg <= rx_io_data; // @[PUart.scala 40:15]
-      end
-    end
-    if (reset) begin // @[PUart.scala 31:24]
-      regLSB1 <= 8'h0; // @[PUart.scala 31:24]
-    end else if (_T_3) begin // @[Conditional.scala 40:58]
-      regLSB1 <= dataReg; // @[PUart.scala 47:15]
-    end
-    if (reset) begin // @[PUart.scala 32:24]
-      regLSB2 <= 8'h0; // @[PUart.scala 32:24]
-    end else if (!(_T_3)) begin // @[Conditional.scala 40:58]
-      if (_T_4) begin // @[Conditional.scala 39:67]
-        regLSB2 <= dataReg; // @[PUart.scala 50:15]
-      end
-    end
-    if (reset) begin // @[PUart.scala 33:24]
-      regMSB1 <= 8'h0; // @[PUart.scala 33:24]
-    end else if (!(_T_3)) begin // @[Conditional.scala 40:58]
-      if (!(_T_4)) begin // @[Conditional.scala 39:67]
-        if (_T_5) begin // @[Conditional.scala 39:67]
-          regMSB1 <= dataReg; // @[PUart.scala 53:15]
-        end
-      end
-    end
-  end
-// Register and memory initialization
-`ifdef RANDOMIZE_GARBAGE_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_INVALID_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_REG_INIT
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-`define RANDOMIZE
-`endif
-`ifndef RANDOM
-`define RANDOM $random
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-  integer initvar;
-`endif
-`ifndef SYNTHESIS
-`ifdef FIRRTL_BEFORE_INITIAL
-`FIRRTL_BEFORE_INITIAL
-`endif
-initial begin
-  `ifdef RANDOMIZE
-    `ifdef INIT_RANDOM
-      `INIT_RANDOM
-    `endif
-    `ifndef VERILATOR
-      `ifdef RANDOMIZE_DELAY
-        #`RANDOMIZE_DELAY begin end
-      `else
-        #0.002 begin end
-      `endif
-    `endif
-`ifdef RANDOMIZE_REG_INIT
-  _RAND_0 = {1{`RANDOM}};
-  regDone = _RAND_0[0:0];
-  _RAND_1 = {1{`RANDOM}};
-  count = _RAND_1[2:0];
-  _RAND_2 = {1{`RANDOM}};
-  regFinalData = _RAND_2[31:0];
-  _RAND_3 = {1{`RANDOM}};
-  regAddr = _RAND_3[13:0];
-  _RAND_4 = {1{`RANDOM}};
-  regValid = _RAND_4[0:0];
-  _RAND_5 = {1{`RANDOM}};
-  dataReg = _RAND_5[7:0];
-  _RAND_6 = {1{`RANDOM}};
-  regLSB1 = _RAND_6[7:0];
-  _RAND_7 = {1{`RANDOM}};
-  regLSB2 = _RAND_7[7:0];
-  _RAND_8 = {1{`RANDOM}};
-  regMSB1 = _RAND_8[7:0];
-`endif // RANDOMIZE_REG_INIT
-  `endif // RANDOMIZE
-end // initial
-`ifdef FIRRTL_AFTER_INITIAL
-`FIRRTL_AFTER_INITIAL
-`endif
-`endif // SYNTHESIS
-endmodule
-module Caravel_Top(
+module Top(
   input         clock,
   input         reset,
   output [31:0] io_gpio_o,
   output [31:0] io_gpio_en_o,
   input  [31:0] io_gpio_i,
-  input         io_rx_i,
-  input  [15:0] io_CLK_PER_BIT
+  input         io_rx_we_i,
+  input  [31:0] io_rx_addr_i,
+  input  [31:0] io_rx_wdata_i,
+  input         io_rx_reset_i
 );
-`ifdef RANDOMIZE_REG_INIT
-  reg [31:0] _RAND_0;
-  reg [31:0] _RAND_1;
-  reg [31:0] _RAND_2;
-  reg [31:0] _RAND_3;
-`endif // RANDOMIZE_REG_INIT
-  wire  gen_imem_host_clock; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_reset; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbMasterTransmitter_ready; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbMasterTransmitter_valid; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbMasterTransmitter_bits_cyc; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbMasterTransmitter_bits_stb; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbMasterTransmitter_bits_we; // @[WBGenerator.scala 158:29]
-  wire [31:0] gen_imem_host_io_wbMasterTransmitter_bits_adr; // @[WBGenerator.scala 158:29]
-  wire [31:0] gen_imem_host_io_wbMasterTransmitter_bits_dat; // @[WBGenerator.scala 158:29]
-  wire [3:0] gen_imem_host_io_wbMasterTransmitter_bits_sel; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbSlaveReceiver_ready; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbSlaveReceiver_bits_ack; // @[WBGenerator.scala 158:29]
-  wire [31:0] gen_imem_host_io_wbSlaveReceiver_bits_dat; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_wbSlaveReceiver_bits_err; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_reqIn_ready; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_reqIn_valid; // @[WBGenerator.scala 158:29]
-  wire [31:0] gen_imem_host_io_reqIn_bits_addrRequest; // @[WBGenerator.scala 158:29]
-  wire [31:0] gen_imem_host_io_reqIn_bits_dataRequest; // @[WBGenerator.scala 158:29]
-  wire [3:0] gen_imem_host_io_reqIn_bits_activeByteLane; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_reqIn_bits_isWrite; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_host_io_rspOut_valid; // @[WBGenerator.scala 158:29]
-  wire [31:0] gen_imem_host_io_rspOut_bits_dataResponse; // @[WBGenerator.scala 158:29]
-  wire  gen_imem_slave_io_wbSlaveTransmitter_ready; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbSlaveTransmitter_bits_ack; // @[WBGenerator.scala 159:30]
-  wire [31:0] gen_imem_slave_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbMasterReceiver_ready; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbMasterReceiver_valid; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbMasterReceiver_bits_cyc; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbMasterReceiver_bits_stb; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_wbMasterReceiver_bits_we; // @[WBGenerator.scala 159:30]
-  wire [31:0] gen_imem_slave_io_wbMasterReceiver_bits_adr; // @[WBGenerator.scala 159:30]
-  wire [31:0] gen_imem_slave_io_wbMasterReceiver_bits_dat; // @[WBGenerator.scala 159:30]
-  wire [3:0] gen_imem_slave_io_wbMasterReceiver_bits_sel; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_reqOut_valid; // @[WBGenerator.scala 159:30]
-  wire [31:0] gen_imem_slave_io_reqOut_bits_addrRequest; // @[WBGenerator.scala 159:30]
-  wire [31:0] gen_imem_slave_io_reqOut_bits_dataRequest; // @[WBGenerator.scala 159:30]
-  wire [3:0] gen_imem_slave_io_reqOut_bits_activeByteLane; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_reqOut_bits_isWrite; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_rspIn_valid; // @[WBGenerator.scala 159:30]
-  wire [31:0] gen_imem_slave_io_rspIn_bits_dataResponse; // @[WBGenerator.scala 159:30]
-  wire  gen_imem_slave_io_rspIn_bits_error; // @[WBGenerator.scala 159:30]
-  wire  gen_dmem_host_clock; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_reset; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbMasterTransmitter_ready; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbMasterTransmitter_valid; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbMasterTransmitter_bits_cyc; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbMasterTransmitter_bits_stb; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbMasterTransmitter_bits_we; // @[WBGenerator.scala 160:29]
-  wire [31:0] gen_dmem_host_io_wbMasterTransmitter_bits_adr; // @[WBGenerator.scala 160:29]
-  wire [31:0] gen_dmem_host_io_wbMasterTransmitter_bits_dat; // @[WBGenerator.scala 160:29]
-  wire [3:0] gen_dmem_host_io_wbMasterTransmitter_bits_sel; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbSlaveReceiver_ready; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbSlaveReceiver_bits_ack; // @[WBGenerator.scala 160:29]
-  wire [31:0] gen_dmem_host_io_wbSlaveReceiver_bits_dat; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_wbSlaveReceiver_bits_err; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_reqIn_ready; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_reqIn_valid; // @[WBGenerator.scala 160:29]
-  wire [31:0] gen_dmem_host_io_reqIn_bits_addrRequest; // @[WBGenerator.scala 160:29]
-  wire [31:0] gen_dmem_host_io_reqIn_bits_dataRequest; // @[WBGenerator.scala 160:29]
-  wire [3:0] gen_dmem_host_io_reqIn_bits_activeByteLane; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_reqIn_bits_isWrite; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_host_io_rspOut_valid; // @[WBGenerator.scala 160:29]
-  wire [31:0] gen_dmem_host_io_rspOut_bits_dataResponse; // @[WBGenerator.scala 160:29]
-  wire  gen_dmem_slave_io_wbSlaveTransmitter_ready; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbSlaveTransmitter_bits_ack; // @[WBGenerator.scala 161:30]
-  wire [31:0] gen_dmem_slave_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbMasterReceiver_ready; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbMasterReceiver_valid; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbMasterReceiver_bits_cyc; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbMasterReceiver_bits_stb; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_wbMasterReceiver_bits_we; // @[WBGenerator.scala 161:30]
-  wire [31:0] gen_dmem_slave_io_wbMasterReceiver_bits_adr; // @[WBGenerator.scala 161:30]
-  wire [31:0] gen_dmem_slave_io_wbMasterReceiver_bits_dat; // @[WBGenerator.scala 161:30]
-  wire [3:0] gen_dmem_slave_io_wbMasterReceiver_bits_sel; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_reqOut_valid; // @[WBGenerator.scala 161:30]
-  wire [31:0] gen_dmem_slave_io_reqOut_bits_addrRequest; // @[WBGenerator.scala 161:30]
-  wire [31:0] gen_dmem_slave_io_reqOut_bits_dataRequest; // @[WBGenerator.scala 161:30]
-  wire [3:0] gen_dmem_slave_io_reqOut_bits_activeByteLane; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_reqOut_bits_isWrite; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_rspIn_valid; // @[WBGenerator.scala 161:30]
-  wire [31:0] gen_dmem_slave_io_rspIn_bits_dataResponse; // @[WBGenerator.scala 161:30]
-  wire  gen_dmem_slave_io_rspIn_bits_error; // @[WBGenerator.scala 161:30]
-  wire  gpio_clock; // @[WBGenerator.scala 165:20]
-  wire  gpio_reset; // @[WBGenerator.scala 165:20]
-  wire  gpio_io_req_valid; // @[WBGenerator.scala 165:20]
-  wire [31:0] gpio_io_req_bits_addrRequest; // @[WBGenerator.scala 165:20]
-  wire [31:0] gpio_io_req_bits_dataRequest; // @[WBGenerator.scala 165:20]
-  wire [3:0] gpio_io_req_bits_activeByteLane; // @[WBGenerator.scala 165:20]
-  wire  gpio_io_req_bits_isWrite; // @[WBGenerator.scala 165:20]
-  wire  gpio_io_rsp_valid; // @[WBGenerator.scala 165:20]
-  wire [31:0] gpio_io_rsp_bits_dataResponse; // @[WBGenerator.scala 165:20]
-  wire  gpio_io_rsp_bits_error; // @[WBGenerator.scala 165:20]
-  wire [31:0] gpio_io_cio_gpio_i; // @[WBGenerator.scala 165:20]
-  wire [31:0] gpio_io_cio_gpio_o; // @[WBGenerator.scala 165:20]
-  wire [31:0] gpio_io_cio_gpio_en_o; // @[WBGenerator.scala 165:20]
-  wire  gen_gpio_slave_io_wbSlaveTransmitter_ready; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbSlaveTransmitter_bits_ack; // @[WBGenerator.scala 166:30]
-  wire [31:0] gen_gpio_slave_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbMasterReceiver_ready; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbMasterReceiver_valid; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbMasterReceiver_bits_cyc; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbMasterReceiver_bits_stb; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_wbMasterReceiver_bits_we; // @[WBGenerator.scala 166:30]
-  wire [31:0] gen_gpio_slave_io_wbMasterReceiver_bits_adr; // @[WBGenerator.scala 166:30]
-  wire [31:0] gen_gpio_slave_io_wbMasterReceiver_bits_dat; // @[WBGenerator.scala 166:30]
-  wire [3:0] gen_gpio_slave_io_wbMasterReceiver_bits_sel; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_reqOut_valid; // @[WBGenerator.scala 166:30]
-  wire [31:0] gen_gpio_slave_io_reqOut_bits_addrRequest; // @[WBGenerator.scala 166:30]
-  wire [31:0] gen_gpio_slave_io_reqOut_bits_dataRequest; // @[WBGenerator.scala 166:30]
-  wire [3:0] gen_gpio_slave_io_reqOut_bits_activeByteLane; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_reqOut_bits_isWrite; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_rspIn_valid; // @[WBGenerator.scala 166:30]
-  wire [31:0] gen_gpio_slave_io_rspIn_bits_dataResponse; // @[WBGenerator.scala 166:30]
-  wire  gen_gpio_slave_io_rspIn_bits_error; // @[WBGenerator.scala 166:30]
-  wire  imem_clock; // @[WBGenerator.scala 265:20]
-  wire  imem_reset; // @[WBGenerator.scala 265:20]
-  wire  imem_io_req_valid; // @[WBGenerator.scala 265:20]
-  wire [31:0] imem_io_req_bits_addrRequest; // @[WBGenerator.scala 265:20]
-  wire [31:0] imem_io_req_bits_dataRequest; // @[WBGenerator.scala 265:20]
-  wire [3:0] imem_io_req_bits_activeByteLane; // @[WBGenerator.scala 265:20]
-  wire  imem_io_req_bits_isWrite; // @[WBGenerator.scala 265:20]
-  wire  imem_io_rsp_valid; // @[WBGenerator.scala 265:20]
-  wire [31:0] imem_io_rsp_bits_dataResponse; // @[WBGenerator.scala 265:20]
-  wire  dmem_clock; // @[WBGenerator.scala 266:20]
-  wire  dmem_reset; // @[WBGenerator.scala 266:20]
-  wire  dmem_io_req_valid; // @[WBGenerator.scala 266:20]
-  wire [31:0] dmem_io_req_bits_addrRequest; // @[WBGenerator.scala 266:20]
-  wire [31:0] dmem_io_req_bits_dataRequest; // @[WBGenerator.scala 266:20]
-  wire [3:0] dmem_io_req_bits_activeByteLane; // @[WBGenerator.scala 266:20]
-  wire  dmem_io_req_bits_isWrite; // @[WBGenerator.scala 266:20]
-  wire  dmem_io_rsp_valid; // @[WBGenerator.scala 266:20]
-  wire [31:0] dmem_io_rsp_bits_dataResponse; // @[WBGenerator.scala 266:20]
-  wire  wbErr_clock; // @[WBGenerator.scala 268:21]
-  wire  wbErr_reset; // @[WBGenerator.scala 268:21]
-  wire [31:0] wbErr_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 268:21]
-  wire  wbErr_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 268:21]
-  wire  wbErr_io_wbMasterReceiver_valid; // @[WBGenerator.scala 268:21]
-  wire  wbErr_io_wbMasterReceiver_bits_cyc; // @[WBGenerator.scala 268:21]
-  wire  wbErr_io_wbMasterReceiver_bits_stb; // @[WBGenerator.scala 268:21]
-  wire  core_clock; // @[WBGenerator.scala 269:20]
-  wire  core_reset; // @[WBGenerator.scala 269:20]
-  wire  core_io_stall; // @[WBGenerator.scala 269:20]
-  wire  core_io_dmemReq_valid; // @[WBGenerator.scala 269:20]
-  wire [31:0] core_io_dmemReq_bits_addrRequest; // @[WBGenerator.scala 269:20]
-  wire [31:0] core_io_dmemReq_bits_dataRequest; // @[WBGenerator.scala 269:20]
-  wire [3:0] core_io_dmemReq_bits_activeByteLane; // @[WBGenerator.scala 269:20]
-  wire  core_io_dmemReq_bits_isWrite; // @[WBGenerator.scala 269:20]
-  wire  core_io_dmemRsp_valid; // @[WBGenerator.scala 269:20]
-  wire [31:0] core_io_dmemRsp_bits_dataResponse; // @[WBGenerator.scala 269:20]
-  wire  core_io_imemReq_ready; // @[WBGenerator.scala 269:20]
-  wire  core_io_imemReq_valid; // @[WBGenerator.scala 269:20]
-  wire [31:0] core_io_imemReq_bits_addrRequest; // @[WBGenerator.scala 269:20]
-  wire  core_io_imemRsp_valid; // @[WBGenerator.scala 269:20]
-  wire [31:0] core_io_imemRsp_bits_dataResponse; // @[WBGenerator.scala 269:20]
-  wire  switch_io_hostIn_valid; // @[WBGenerator.scala 282:22]
-  wire  switch_io_hostIn_bits_cyc; // @[WBGenerator.scala 282:22]
-  wire  switch_io_hostIn_bits_stb; // @[WBGenerator.scala 282:22]
-  wire  switch_io_hostIn_bits_we; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_hostIn_bits_adr; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_hostIn_bits_dat; // @[WBGenerator.scala 282:22]
-  wire [3:0] switch_io_hostIn_bits_sel; // @[WBGenerator.scala 282:22]
-  wire  switch_io_hostOut_bits_ack; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_hostOut_bits_dat; // @[WBGenerator.scala 282:22]
-  wire  switch_io_hostOut_bits_err; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_0_valid; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_0_bits_cyc; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_0_bits_stb; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_0_bits_we; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devOut_0_bits_adr; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devOut_0_bits_dat; // @[WBGenerator.scala 282:22]
-  wire [3:0] switch_io_devOut_0_bits_sel; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_1_valid; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_1_bits_cyc; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_1_bits_stb; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_1_bits_we; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devOut_1_bits_adr; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devOut_1_bits_dat; // @[WBGenerator.scala 282:22]
-  wire [3:0] switch_io_devOut_1_bits_sel; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_2_valid; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_2_bits_cyc; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devOut_2_bits_stb; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devIn_0_bits_ack; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devIn_0_bits_dat; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devIn_0_bits_err; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devIn_1_bits_ack; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devIn_1_bits_dat; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devIn_1_bits_err; // @[WBGenerator.scala 282:22]
-  wire [31:0] switch_io_devIn_2_bits_dat; // @[WBGenerator.scala 282:22]
-  wire  switch_io_devIn_2_bits_err; // @[WBGenerator.scala 282:22]
-  wire [1:0] switch_io_devSel; // @[WBGenerator.scala 282:22]
-  wire  puart_clock; // @[WBGenerator.scala 285:21]
-  wire  puart_reset; // @[WBGenerator.scala 285:21]
-  wire  puart_io_isStalled; // @[WBGenerator.scala 285:21]
-  wire [31:0] puart_io_rx_data_o; // @[WBGenerator.scala 285:21]
-  wire [7:0] puart_io_addr_o; // @[WBGenerator.scala 285:21]
-  wire [15:0] puart_io_CLK_PER_BIT; // @[WBGenerator.scala 285:21]
-  wire  puart_io_rxd; // @[WBGenerator.scala 285:21]
-  wire  puart_io_valid; // @[WBGenerator.scala 285:21]
-  wire  puart_io_done; // @[WBGenerator.scala 285:21]
-  reg [1:0] state; // @[WBGenerator.scala 293:22]
-  reg  reset_reg; // @[WBGenerator.scala 294:26]
-  reg [31:0] rx_data_reg; // @[WBGenerator.scala 296:52]
-  reg [31:0] rx_addr_reg; // @[WBGenerator.scala 297:52]
-  wire [1:0] _GEN_1 = puart_io_done ? 2'h3 : 2'h1; // @[WBGenerator.scala 330:35 WBGenerator.scala 334:36 WBGenerator.scala 340:36]
-  wire [1:0] _GEN_2 = puart_io_valid ? 2'h2 : _GEN_1; // @[WBGenerator.scala 327:30 WBGenerator.scala 328:38]
-  wire [31:0] _rx_data_reg_T = puart_io_valid ? puart_io_rx_data_o : 32'h0; // @[WBGenerator.scala 353:52]
-  wire [9:0] _rx_addr_reg_T = {puart_io_addr_o, 2'h0}; // @[WBGenerator.scala 355:85]
-  wire [9:0] _rx_addr_reg_T_1 = puart_io_valid ? _rx_addr_reg_T : 10'h0; // @[WBGenerator.scala 355:52]
-  wire  _T_7 = state == 2'h2; // @[WBGenerator.scala 357:21]
-  wire [1:0] _GEN_4 = state == 2'h3 ? 2'h0 : state; // @[WBGenerator.scala 381:37 WBGenerator.scala 390:36 WBGenerator.scala 293:22]
-  wire [1:0] _GEN_5 = state == 2'h2 ? _GEN_1 : _GEN_4; // @[WBGenerator.scala 357:36]
-  wire [31:0] _GEN_7 = state == 2'h2 ? rx_addr_reg : 32'h0; // @[WBGenerator.scala 357:36 WBGenerator.scala 373:49 WBGenerator.scala 301:45]
-  wire [31:0] _GEN_8 = state == 2'h2 ? rx_data_reg : 32'h0; // @[WBGenerator.scala 357:36 WBGenerator.scala 374:49 WBGenerator.scala 302:45]
-  wire  _GEN_12 = state == 2'h1 ? 1'h0 : _T_7; // @[WBGenerator.scala 324:35 WBGenerator.scala 345:38]
-  wire  _GEN_13 = state == 2'h1 | _T_7; // @[WBGenerator.scala 324:35 WBGenerator.scala 346:33]
-  wire [31:0] _GEN_16 = state == 2'h1 ? 32'h0 : _GEN_7; // @[WBGenerator.scala 324:35 WBGenerator.scala 301:45]
-  wire [31:0] _GEN_17 = state == 2'h1 ? 32'h0 : _GEN_8; // @[WBGenerator.scala 324:35 WBGenerator.scala 302:45]
-  wire  _GEN_21 = state == 2'h0 ? 1'h0 : _GEN_12; // @[WBGenerator.scala 307:25 WBGenerator.scala 317:38]
-  wire  _GEN_22 = state == 2'h0 | _GEN_13; // @[WBGenerator.scala 307:25 WBGenerator.scala 321:23]
-  wire  _GEN_23 = state == 2'h0 ? 1'h0 : _GEN_13; // @[WBGenerator.scala 307:25 WBGenerator.scala 322:30]
-  wire [31:0] _GEN_26 = state == 2'h0 ? 32'h0 : _GEN_16; // @[WBGenerator.scala 307:25 WBGenerator.scala 301:45]
-  wire [31:0] _GEN_27 = state == 2'h0 ? 32'h0 : _GEN_17; // @[WBGenerator.scala 307:25 WBGenerator.scala 302:45]
-  wire [15:0] _GEN_32 = ~puart_io_done ? 16'hffff : 16'hf; // @[WBGenerator.scala 300:23 WBGenerator.scala 402:32]
-  wire [31:0] _switch_io_devSel_addr_hit_0_T_1 = 32'hfffff000 & gen_dmem_host_io_wbMasterTransmitter_bits_adr; // @[BusDecoder.scala 45:60]
-  wire  switch_io_devSel_addr_hit_0 = _switch_io_devSel_addr_hit_0_T_1 == 32'h40002000; // @[BusDecoder.scala 45:68]
+  wire  wb_imem_host_clock; // @[Top.scala 67:28]
+  wire  wb_imem_host_reset; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbMasterTransmitter_ready; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbMasterTransmitter_valid; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbMasterTransmitter_bits_cyc; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbMasterTransmitter_bits_stb; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbMasterTransmitter_bits_we; // @[Top.scala 67:28]
+  wire [31:0] wb_imem_host_io_wbMasterTransmitter_bits_adr; // @[Top.scala 67:28]
+  wire [31:0] wb_imem_host_io_wbMasterTransmitter_bits_dat; // @[Top.scala 67:28]
+  wire [3:0] wb_imem_host_io_wbMasterTransmitter_bits_sel; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbSlaveReceiver_ready; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbSlaveReceiver_bits_ack; // @[Top.scala 67:28]
+  wire [31:0] wb_imem_host_io_wbSlaveReceiver_bits_dat; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_wbSlaveReceiver_bits_err; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_reqIn_ready; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_reqIn_valid; // @[Top.scala 67:28]
+  wire [31:0] wb_imem_host_io_reqIn_bits_addrRequest; // @[Top.scala 67:28]
+  wire [31:0] wb_imem_host_io_reqIn_bits_dataRequest; // @[Top.scala 67:28]
+  wire [3:0] wb_imem_host_io_reqIn_bits_activeByteLane; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_reqIn_bits_isWrite; // @[Top.scala 67:28]
+  wire  wb_imem_host_io_rspOut_valid; // @[Top.scala 67:28]
+  wire [31:0] wb_imem_host_io_rspOut_bits_dataResponse; // @[Top.scala 67:28]
+  wire  wb_imem_slave_io_wbSlaveTransmitter_ready; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbSlaveTransmitter_bits_ack; // @[Top.scala 68:29]
+  wire [31:0] wb_imem_slave_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbSlaveTransmitter_bits_err; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbMasterReceiver_ready; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbMasterReceiver_valid; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbMasterReceiver_bits_cyc; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbMasterReceiver_bits_stb; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_wbMasterReceiver_bits_we; // @[Top.scala 68:29]
+  wire [31:0] wb_imem_slave_io_wbMasterReceiver_bits_adr; // @[Top.scala 68:29]
+  wire [31:0] wb_imem_slave_io_wbMasterReceiver_bits_dat; // @[Top.scala 68:29]
+  wire [3:0] wb_imem_slave_io_wbMasterReceiver_bits_sel; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_reqOut_valid; // @[Top.scala 68:29]
+  wire [31:0] wb_imem_slave_io_reqOut_bits_addrRequest; // @[Top.scala 68:29]
+  wire [31:0] wb_imem_slave_io_reqOut_bits_dataRequest; // @[Top.scala 68:29]
+  wire [3:0] wb_imem_slave_io_reqOut_bits_activeByteLane; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_reqOut_bits_isWrite; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_rspIn_valid; // @[Top.scala 68:29]
+  wire [31:0] wb_imem_slave_io_rspIn_bits_dataResponse; // @[Top.scala 68:29]
+  wire  wb_imem_slave_io_rspIn_bits_error; // @[Top.scala 68:29]
+  wire  wb_dmem_host_clock; // @[Top.scala 69:28]
+  wire  wb_dmem_host_reset; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbMasterTransmitter_ready; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbMasterTransmitter_valid; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbMasterTransmitter_bits_cyc; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbMasterTransmitter_bits_stb; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbMasterTransmitter_bits_we; // @[Top.scala 69:28]
+  wire [31:0] wb_dmem_host_io_wbMasterTransmitter_bits_adr; // @[Top.scala 69:28]
+  wire [31:0] wb_dmem_host_io_wbMasterTransmitter_bits_dat; // @[Top.scala 69:28]
+  wire [3:0] wb_dmem_host_io_wbMasterTransmitter_bits_sel; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbSlaveReceiver_ready; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbSlaveReceiver_bits_ack; // @[Top.scala 69:28]
+  wire [31:0] wb_dmem_host_io_wbSlaveReceiver_bits_dat; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_wbSlaveReceiver_bits_err; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_reqIn_ready; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_reqIn_valid; // @[Top.scala 69:28]
+  wire [31:0] wb_dmem_host_io_reqIn_bits_addrRequest; // @[Top.scala 69:28]
+  wire [31:0] wb_dmem_host_io_reqIn_bits_dataRequest; // @[Top.scala 69:28]
+  wire [3:0] wb_dmem_host_io_reqIn_bits_activeByteLane; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_reqIn_bits_isWrite; // @[Top.scala 69:28]
+  wire  wb_dmem_host_io_rspOut_valid; // @[Top.scala 69:28]
+  wire [31:0] wb_dmem_host_io_rspOut_bits_dataResponse; // @[Top.scala 69:28]
+  wire  wb_dmem_slave_io_wbSlaveTransmitter_ready; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbSlaveTransmitter_bits_ack; // @[Top.scala 70:29]
+  wire [31:0] wb_dmem_slave_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbSlaveTransmitter_bits_err; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbMasterReceiver_ready; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbMasterReceiver_valid; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbMasterReceiver_bits_cyc; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbMasterReceiver_bits_stb; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_wbMasterReceiver_bits_we; // @[Top.scala 70:29]
+  wire [31:0] wb_dmem_slave_io_wbMasterReceiver_bits_adr; // @[Top.scala 70:29]
+  wire [31:0] wb_dmem_slave_io_wbMasterReceiver_bits_dat; // @[Top.scala 70:29]
+  wire [3:0] wb_dmem_slave_io_wbMasterReceiver_bits_sel; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_reqOut_valid; // @[Top.scala 70:29]
+  wire [31:0] wb_dmem_slave_io_reqOut_bits_addrRequest; // @[Top.scala 70:29]
+  wire [31:0] wb_dmem_slave_io_reqOut_bits_dataRequest; // @[Top.scala 70:29]
+  wire [3:0] wb_dmem_slave_io_reqOut_bits_activeByteLane; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_reqOut_bits_isWrite; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_rspIn_valid; // @[Top.scala 70:29]
+  wire [31:0] wb_dmem_slave_io_rspIn_bits_dataResponse; // @[Top.scala 70:29]
+  wire  wb_dmem_slave_io_rspIn_bits_error; // @[Top.scala 70:29]
+  wire  wb_gpio_slave_io_wbSlaveTransmitter_ready; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbSlaveTransmitter_bits_ack; // @[Top.scala 71:29]
+  wire [31:0] wb_gpio_slave_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbSlaveTransmitter_bits_err; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbMasterReceiver_ready; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbMasterReceiver_valid; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbMasterReceiver_bits_cyc; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbMasterReceiver_bits_stb; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_wbMasterReceiver_bits_we; // @[Top.scala 71:29]
+  wire [31:0] wb_gpio_slave_io_wbMasterReceiver_bits_adr; // @[Top.scala 71:29]
+  wire [31:0] wb_gpio_slave_io_wbMasterReceiver_bits_dat; // @[Top.scala 71:29]
+  wire [3:0] wb_gpio_slave_io_wbMasterReceiver_bits_sel; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_reqOut_valid; // @[Top.scala 71:29]
+  wire [31:0] wb_gpio_slave_io_reqOut_bits_addrRequest; // @[Top.scala 71:29]
+  wire [31:0] wb_gpio_slave_io_reqOut_bits_dataRequest; // @[Top.scala 71:29]
+  wire [3:0] wb_gpio_slave_io_reqOut_bits_activeByteLane; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_reqOut_bits_isWrite; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_rspIn_valid; // @[Top.scala 71:29]
+  wire [31:0] wb_gpio_slave_io_rspIn_bits_dataResponse; // @[Top.scala 71:29]
+  wire  wb_gpio_slave_io_rspIn_bits_error; // @[Top.scala 71:29]
+  wire  dmem_clock; // @[Top.scala 74:20]
+  wire  dmem_reset; // @[Top.scala 74:20]
+  wire  dmem_io_req_valid; // @[Top.scala 74:20]
+  wire [31:0] dmem_io_req_bits_addrRequest; // @[Top.scala 74:20]
+  wire [31:0] dmem_io_req_bits_dataRequest; // @[Top.scala 74:20]
+  wire [3:0] dmem_io_req_bits_activeByteLane; // @[Top.scala 74:20]
+  wire  dmem_io_req_bits_isWrite; // @[Top.scala 74:20]
+  wire  dmem_io_rsp_valid; // @[Top.scala 74:20]
+  wire [31:0] dmem_io_rsp_bits_dataResponse; // @[Top.scala 74:20]
+  wire  imem_clock; // @[Top.scala 75:20]
+  wire  imem_reset; // @[Top.scala 75:20]
+  wire  imem_io_req_valid; // @[Top.scala 75:20]
+  wire [31:0] imem_io_req_bits_addrRequest; // @[Top.scala 75:20]
+  wire  imem_io_req_bits_isWrite; // @[Top.scala 75:20]
+  wire  imem_io_rsp_valid; // @[Top.scala 75:20]
+  wire [31:0] imem_io_rsp_bits_dataResponse; // @[Top.scala 75:20]
+  wire  imem_io_writeEnable; // @[Top.scala 75:20]
+  wire [31:0] imem_io_addrIn; // @[Top.scala 75:20]
+  wire [31:0] imem_io_dataIn; // @[Top.scala 75:20]
+  wire  gpio_clock; // @[Top.scala 76:20]
+  wire  gpio_reset; // @[Top.scala 76:20]
+  wire  gpio_io_req_valid; // @[Top.scala 76:20]
+  wire [31:0] gpio_io_req_bits_addrRequest; // @[Top.scala 76:20]
+  wire [31:0] gpio_io_req_bits_dataRequest; // @[Top.scala 76:20]
+  wire [3:0] gpio_io_req_bits_activeByteLane; // @[Top.scala 76:20]
+  wire  gpio_io_req_bits_isWrite; // @[Top.scala 76:20]
+  wire  gpio_io_rsp_valid; // @[Top.scala 76:20]
+  wire [31:0] gpio_io_rsp_bits_dataResponse; // @[Top.scala 76:20]
+  wire  gpio_io_rsp_bits_error; // @[Top.scala 76:20]
+  wire [31:0] gpio_io_cio_gpio_i; // @[Top.scala 76:20]
+  wire [31:0] gpio_io_cio_gpio_o; // @[Top.scala 76:20]
+  wire [31:0] gpio_io_cio_gpio_en_o; // @[Top.scala 76:20]
+  wire  wbErr_clock; // @[Top.scala 77:21]
+  wire  wbErr_reset; // @[Top.scala 77:21]
+  wire [31:0] wbErr_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 77:21]
+  wire  wbErr_io_wbSlaveTransmitter_bits_err; // @[Top.scala 77:21]
+  wire  wbErr_io_wbMasterReceiver_valid; // @[Top.scala 77:21]
+  wire  wbErr_io_wbMasterReceiver_bits_cyc; // @[Top.scala 77:21]
+  wire  wbErr_io_wbMasterReceiver_bits_stb; // @[Top.scala 77:21]
+  wire  core_clock; // @[Top.scala 79:20]
+  wire  core_reset; // @[Top.scala 79:20]
+  wire  core_io_dmemReq_valid; // @[Top.scala 79:20]
+  wire [31:0] core_io_dmemReq_bits_addrRequest; // @[Top.scala 79:20]
+  wire [31:0] core_io_dmemReq_bits_dataRequest; // @[Top.scala 79:20]
+  wire [3:0] core_io_dmemReq_bits_activeByteLane; // @[Top.scala 79:20]
+  wire  core_io_dmemReq_bits_isWrite; // @[Top.scala 79:20]
+  wire  core_io_dmemRsp_valid; // @[Top.scala 79:20]
+  wire [31:0] core_io_dmemRsp_bits_dataResponse; // @[Top.scala 79:20]
+  wire  core_io_imemReq_ready; // @[Top.scala 79:20]
+  wire  core_io_imemReq_valid; // @[Top.scala 79:20]
+  wire [31:0] core_io_imemReq_bits_addrRequest; // @[Top.scala 79:20]
+  wire  core_io_imemRsp_valid; // @[Top.scala 79:20]
+  wire [31:0] core_io_imemRsp_bits_dataResponse; // @[Top.scala 79:20]
+  wire  switch_io_hostIn_valid; // @[Top.scala 88:22]
+  wire  switch_io_hostIn_bits_cyc; // @[Top.scala 88:22]
+  wire  switch_io_hostIn_bits_stb; // @[Top.scala 88:22]
+  wire  switch_io_hostIn_bits_we; // @[Top.scala 88:22]
+  wire [31:0] switch_io_hostIn_bits_adr; // @[Top.scala 88:22]
+  wire [31:0] switch_io_hostIn_bits_dat; // @[Top.scala 88:22]
+  wire [3:0] switch_io_hostIn_bits_sel; // @[Top.scala 88:22]
+  wire  switch_io_hostOut_bits_ack; // @[Top.scala 88:22]
+  wire [31:0] switch_io_hostOut_bits_dat; // @[Top.scala 88:22]
+  wire  switch_io_hostOut_bits_err; // @[Top.scala 88:22]
+  wire  switch_io_devOut_0_valid; // @[Top.scala 88:22]
+  wire  switch_io_devOut_0_bits_cyc; // @[Top.scala 88:22]
+  wire  switch_io_devOut_0_bits_stb; // @[Top.scala 88:22]
+  wire  switch_io_devOut_0_bits_we; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devOut_0_bits_adr; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devOut_0_bits_dat; // @[Top.scala 88:22]
+  wire [3:0] switch_io_devOut_0_bits_sel; // @[Top.scala 88:22]
+  wire  switch_io_devOut_1_valid; // @[Top.scala 88:22]
+  wire  switch_io_devOut_1_bits_cyc; // @[Top.scala 88:22]
+  wire  switch_io_devOut_1_bits_stb; // @[Top.scala 88:22]
+  wire  switch_io_devOut_1_bits_we; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devOut_1_bits_adr; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devOut_1_bits_dat; // @[Top.scala 88:22]
+  wire [3:0] switch_io_devOut_1_bits_sel; // @[Top.scala 88:22]
+  wire  switch_io_devOut_2_valid; // @[Top.scala 88:22]
+  wire  switch_io_devOut_2_bits_cyc; // @[Top.scala 88:22]
+  wire  switch_io_devOut_2_bits_stb; // @[Top.scala 88:22]
+  wire  switch_io_devIn_0_bits_ack; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devIn_0_bits_dat; // @[Top.scala 88:22]
+  wire  switch_io_devIn_0_bits_err; // @[Top.scala 88:22]
+  wire  switch_io_devIn_1_bits_ack; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devIn_1_bits_dat; // @[Top.scala 88:22]
+  wire  switch_io_devIn_1_bits_err; // @[Top.scala 88:22]
+  wire [31:0] switch_io_devIn_2_bits_dat; // @[Top.scala 88:22]
+  wire  switch_io_devIn_2_bits_err; // @[Top.scala 88:22]
+  wire [1:0] switch_io_devSel; // @[Top.scala 88:22]
+  wire [31:0] _switch_io_devSel_addr_hit_0_T_1 = 32'hfffff000 & wb_dmem_host_io_wbMasterTransmitter_bits_adr; // @[BusDecoder.scala 45:60]
+  wire  switch_io_devSel_addr_hit_0 = _switch_io_devSel_addr_hit_0_T_1 == 32'h40000000; // @[BusDecoder.scala 45:68]
   wire [1:0] switch_io_devSel_id_0 = switch_io_devSel_addr_hit_0 ? 2'h1 : 2'h2; // @[BusDecoder.scala 46:19]
-  wire  switch_io_devSel_addr_hit_1 = _switch_io_devSel_addr_hit_0_T_1 == 32'h40000000; // @[BusDecoder.scala 45:68]
+  wire  switch_io_devSel_addr_hit_1 = _switch_io_devSel_addr_hit_0_T_1 == 32'h40001000; // @[BusDecoder.scala 45:68]
   wire [1:0] switch_io_devSel_id_1 = switch_io_devSel_addr_hit_1 ? 2'h0 : 2'h2; // @[BusDecoder.scala 46:19]
   wire [1:0] _switch_io_devSel_T = switch_io_devSel_addr_hit_1 ? switch_io_devSel_id_1 : 2'h2; // @[Mux.scala 98:16]
-  WishboneHost gen_imem_host ( // @[WBGenerator.scala 158:29]
-    .clock(gen_imem_host_clock),
-    .reset(gen_imem_host_reset),
-    .io_wbMasterTransmitter_ready(gen_imem_host_io_wbMasterTransmitter_ready),
-    .io_wbMasterTransmitter_valid(gen_imem_host_io_wbMasterTransmitter_valid),
-    .io_wbMasterTransmitter_bits_cyc(gen_imem_host_io_wbMasterTransmitter_bits_cyc),
-    .io_wbMasterTransmitter_bits_stb(gen_imem_host_io_wbMasterTransmitter_bits_stb),
-    .io_wbMasterTransmitter_bits_we(gen_imem_host_io_wbMasterTransmitter_bits_we),
-    .io_wbMasterTransmitter_bits_adr(gen_imem_host_io_wbMasterTransmitter_bits_adr),
-    .io_wbMasterTransmitter_bits_dat(gen_imem_host_io_wbMasterTransmitter_bits_dat),
-    .io_wbMasterTransmitter_bits_sel(gen_imem_host_io_wbMasterTransmitter_bits_sel),
-    .io_wbSlaveReceiver_ready(gen_imem_host_io_wbSlaveReceiver_ready),
-    .io_wbSlaveReceiver_bits_ack(gen_imem_host_io_wbSlaveReceiver_bits_ack),
-    .io_wbSlaveReceiver_bits_dat(gen_imem_host_io_wbSlaveReceiver_bits_dat),
-    .io_wbSlaveReceiver_bits_err(gen_imem_host_io_wbSlaveReceiver_bits_err),
-    .io_reqIn_ready(gen_imem_host_io_reqIn_ready),
-    .io_reqIn_valid(gen_imem_host_io_reqIn_valid),
-    .io_reqIn_bits_addrRequest(gen_imem_host_io_reqIn_bits_addrRequest),
-    .io_reqIn_bits_dataRequest(gen_imem_host_io_reqIn_bits_dataRequest),
-    .io_reqIn_bits_activeByteLane(gen_imem_host_io_reqIn_bits_activeByteLane),
-    .io_reqIn_bits_isWrite(gen_imem_host_io_reqIn_bits_isWrite),
-    .io_rspOut_valid(gen_imem_host_io_rspOut_valid),
-    .io_rspOut_bits_dataResponse(gen_imem_host_io_rspOut_bits_dataResponse)
+  WishboneHost wb_imem_host ( // @[Top.scala 67:28]
+    .clock(wb_imem_host_clock),
+    .reset(wb_imem_host_reset),
+    .io_wbMasterTransmitter_ready(wb_imem_host_io_wbMasterTransmitter_ready),
+    .io_wbMasterTransmitter_valid(wb_imem_host_io_wbMasterTransmitter_valid),
+    .io_wbMasterTransmitter_bits_cyc(wb_imem_host_io_wbMasterTransmitter_bits_cyc),
+    .io_wbMasterTransmitter_bits_stb(wb_imem_host_io_wbMasterTransmitter_bits_stb),
+    .io_wbMasterTransmitter_bits_we(wb_imem_host_io_wbMasterTransmitter_bits_we),
+    .io_wbMasterTransmitter_bits_adr(wb_imem_host_io_wbMasterTransmitter_bits_adr),
+    .io_wbMasterTransmitter_bits_dat(wb_imem_host_io_wbMasterTransmitter_bits_dat),
+    .io_wbMasterTransmitter_bits_sel(wb_imem_host_io_wbMasterTransmitter_bits_sel),
+    .io_wbSlaveReceiver_ready(wb_imem_host_io_wbSlaveReceiver_ready),
+    .io_wbSlaveReceiver_bits_ack(wb_imem_host_io_wbSlaveReceiver_bits_ack),
+    .io_wbSlaveReceiver_bits_dat(wb_imem_host_io_wbSlaveReceiver_bits_dat),
+    .io_wbSlaveReceiver_bits_err(wb_imem_host_io_wbSlaveReceiver_bits_err),
+    .io_reqIn_ready(wb_imem_host_io_reqIn_ready),
+    .io_reqIn_valid(wb_imem_host_io_reqIn_valid),
+    .io_reqIn_bits_addrRequest(wb_imem_host_io_reqIn_bits_addrRequest),
+    .io_reqIn_bits_dataRequest(wb_imem_host_io_reqIn_bits_dataRequest),
+    .io_reqIn_bits_activeByteLane(wb_imem_host_io_reqIn_bits_activeByteLane),
+    .io_reqIn_bits_isWrite(wb_imem_host_io_reqIn_bits_isWrite),
+    .io_rspOut_valid(wb_imem_host_io_rspOut_valid),
+    .io_rspOut_bits_dataResponse(wb_imem_host_io_rspOut_bits_dataResponse)
   );
-  WishboneDevice gen_imem_slave ( // @[WBGenerator.scala 159:30]
-    .io_wbSlaveTransmitter_ready(gen_imem_slave_io_wbSlaveTransmitter_ready),
-    .io_wbSlaveTransmitter_bits_ack(gen_imem_slave_io_wbSlaveTransmitter_bits_ack),
-    .io_wbSlaveTransmitter_bits_dat(gen_imem_slave_io_wbSlaveTransmitter_bits_dat),
-    .io_wbSlaveTransmitter_bits_err(gen_imem_slave_io_wbSlaveTransmitter_bits_err),
-    .io_wbMasterReceiver_ready(gen_imem_slave_io_wbMasterReceiver_ready),
-    .io_wbMasterReceiver_valid(gen_imem_slave_io_wbMasterReceiver_valid),
-    .io_wbMasterReceiver_bits_cyc(gen_imem_slave_io_wbMasterReceiver_bits_cyc),
-    .io_wbMasterReceiver_bits_stb(gen_imem_slave_io_wbMasterReceiver_bits_stb),
-    .io_wbMasterReceiver_bits_we(gen_imem_slave_io_wbMasterReceiver_bits_we),
-    .io_wbMasterReceiver_bits_adr(gen_imem_slave_io_wbMasterReceiver_bits_adr),
-    .io_wbMasterReceiver_bits_dat(gen_imem_slave_io_wbMasterReceiver_bits_dat),
-    .io_wbMasterReceiver_bits_sel(gen_imem_slave_io_wbMasterReceiver_bits_sel),
-    .io_reqOut_valid(gen_imem_slave_io_reqOut_valid),
-    .io_reqOut_bits_addrRequest(gen_imem_slave_io_reqOut_bits_addrRequest),
-    .io_reqOut_bits_dataRequest(gen_imem_slave_io_reqOut_bits_dataRequest),
-    .io_reqOut_bits_activeByteLane(gen_imem_slave_io_reqOut_bits_activeByteLane),
-    .io_reqOut_bits_isWrite(gen_imem_slave_io_reqOut_bits_isWrite),
-    .io_rspIn_valid(gen_imem_slave_io_rspIn_valid),
-    .io_rspIn_bits_dataResponse(gen_imem_slave_io_rspIn_bits_dataResponse),
-    .io_rspIn_bits_error(gen_imem_slave_io_rspIn_bits_error)
+  WishboneDevice wb_imem_slave ( // @[Top.scala 68:29]
+    .io_wbSlaveTransmitter_ready(wb_imem_slave_io_wbSlaveTransmitter_ready),
+    .io_wbSlaveTransmitter_bits_ack(wb_imem_slave_io_wbSlaveTransmitter_bits_ack),
+    .io_wbSlaveTransmitter_bits_dat(wb_imem_slave_io_wbSlaveTransmitter_bits_dat),
+    .io_wbSlaveTransmitter_bits_err(wb_imem_slave_io_wbSlaveTransmitter_bits_err),
+    .io_wbMasterReceiver_ready(wb_imem_slave_io_wbMasterReceiver_ready),
+    .io_wbMasterReceiver_valid(wb_imem_slave_io_wbMasterReceiver_valid),
+    .io_wbMasterReceiver_bits_cyc(wb_imem_slave_io_wbMasterReceiver_bits_cyc),
+    .io_wbMasterReceiver_bits_stb(wb_imem_slave_io_wbMasterReceiver_bits_stb),
+    .io_wbMasterReceiver_bits_we(wb_imem_slave_io_wbMasterReceiver_bits_we),
+    .io_wbMasterReceiver_bits_adr(wb_imem_slave_io_wbMasterReceiver_bits_adr),
+    .io_wbMasterReceiver_bits_dat(wb_imem_slave_io_wbMasterReceiver_bits_dat),
+    .io_wbMasterReceiver_bits_sel(wb_imem_slave_io_wbMasterReceiver_bits_sel),
+    .io_reqOut_valid(wb_imem_slave_io_reqOut_valid),
+    .io_reqOut_bits_addrRequest(wb_imem_slave_io_reqOut_bits_addrRequest),
+    .io_reqOut_bits_dataRequest(wb_imem_slave_io_reqOut_bits_dataRequest),
+    .io_reqOut_bits_activeByteLane(wb_imem_slave_io_reqOut_bits_activeByteLane),
+    .io_reqOut_bits_isWrite(wb_imem_slave_io_reqOut_bits_isWrite),
+    .io_rspIn_valid(wb_imem_slave_io_rspIn_valid),
+    .io_rspIn_bits_dataResponse(wb_imem_slave_io_rspIn_bits_dataResponse),
+    .io_rspIn_bits_error(wb_imem_slave_io_rspIn_bits_error)
   );
-  WishboneHost gen_dmem_host ( // @[WBGenerator.scala 160:29]
-    .clock(gen_dmem_host_clock),
-    .reset(gen_dmem_host_reset),
-    .io_wbMasterTransmitter_ready(gen_dmem_host_io_wbMasterTransmitter_ready),
-    .io_wbMasterTransmitter_valid(gen_dmem_host_io_wbMasterTransmitter_valid),
-    .io_wbMasterTransmitter_bits_cyc(gen_dmem_host_io_wbMasterTransmitter_bits_cyc),
-    .io_wbMasterTransmitter_bits_stb(gen_dmem_host_io_wbMasterTransmitter_bits_stb),
-    .io_wbMasterTransmitter_bits_we(gen_dmem_host_io_wbMasterTransmitter_bits_we),
-    .io_wbMasterTransmitter_bits_adr(gen_dmem_host_io_wbMasterTransmitter_bits_adr),
-    .io_wbMasterTransmitter_bits_dat(gen_dmem_host_io_wbMasterTransmitter_bits_dat),
-    .io_wbMasterTransmitter_bits_sel(gen_dmem_host_io_wbMasterTransmitter_bits_sel),
-    .io_wbSlaveReceiver_ready(gen_dmem_host_io_wbSlaveReceiver_ready),
-    .io_wbSlaveReceiver_bits_ack(gen_dmem_host_io_wbSlaveReceiver_bits_ack),
-    .io_wbSlaveReceiver_bits_dat(gen_dmem_host_io_wbSlaveReceiver_bits_dat),
-    .io_wbSlaveReceiver_bits_err(gen_dmem_host_io_wbSlaveReceiver_bits_err),
-    .io_reqIn_ready(gen_dmem_host_io_reqIn_ready),
-    .io_reqIn_valid(gen_dmem_host_io_reqIn_valid),
-    .io_reqIn_bits_addrRequest(gen_dmem_host_io_reqIn_bits_addrRequest),
-    .io_reqIn_bits_dataRequest(gen_dmem_host_io_reqIn_bits_dataRequest),
-    .io_reqIn_bits_activeByteLane(gen_dmem_host_io_reqIn_bits_activeByteLane),
-    .io_reqIn_bits_isWrite(gen_dmem_host_io_reqIn_bits_isWrite),
-    .io_rspOut_valid(gen_dmem_host_io_rspOut_valid),
-    .io_rspOut_bits_dataResponse(gen_dmem_host_io_rspOut_bits_dataResponse)
+  WishboneHost wb_dmem_host ( // @[Top.scala 69:28]
+    .clock(wb_dmem_host_clock),
+    .reset(wb_dmem_host_reset),
+    .io_wbMasterTransmitter_ready(wb_dmem_host_io_wbMasterTransmitter_ready),
+    .io_wbMasterTransmitter_valid(wb_dmem_host_io_wbMasterTransmitter_valid),
+    .io_wbMasterTransmitter_bits_cyc(wb_dmem_host_io_wbMasterTransmitter_bits_cyc),
+    .io_wbMasterTransmitter_bits_stb(wb_dmem_host_io_wbMasterTransmitter_bits_stb),
+    .io_wbMasterTransmitter_bits_we(wb_dmem_host_io_wbMasterTransmitter_bits_we),
+    .io_wbMasterTransmitter_bits_adr(wb_dmem_host_io_wbMasterTransmitter_bits_adr),
+    .io_wbMasterTransmitter_bits_dat(wb_dmem_host_io_wbMasterTransmitter_bits_dat),
+    .io_wbMasterTransmitter_bits_sel(wb_dmem_host_io_wbMasterTransmitter_bits_sel),
+    .io_wbSlaveReceiver_ready(wb_dmem_host_io_wbSlaveReceiver_ready),
+    .io_wbSlaveReceiver_bits_ack(wb_dmem_host_io_wbSlaveReceiver_bits_ack),
+    .io_wbSlaveReceiver_bits_dat(wb_dmem_host_io_wbSlaveReceiver_bits_dat),
+    .io_wbSlaveReceiver_bits_err(wb_dmem_host_io_wbSlaveReceiver_bits_err),
+    .io_reqIn_ready(wb_dmem_host_io_reqIn_ready),
+    .io_reqIn_valid(wb_dmem_host_io_reqIn_valid),
+    .io_reqIn_bits_addrRequest(wb_dmem_host_io_reqIn_bits_addrRequest),
+    .io_reqIn_bits_dataRequest(wb_dmem_host_io_reqIn_bits_dataRequest),
+    .io_reqIn_bits_activeByteLane(wb_dmem_host_io_reqIn_bits_activeByteLane),
+    .io_reqIn_bits_isWrite(wb_dmem_host_io_reqIn_bits_isWrite),
+    .io_rspOut_valid(wb_dmem_host_io_rspOut_valid),
+    .io_rspOut_bits_dataResponse(wb_dmem_host_io_rspOut_bits_dataResponse)
   );
-  WishboneDevice gen_dmem_slave ( // @[WBGenerator.scala 161:30]
-    .io_wbSlaveTransmitter_ready(gen_dmem_slave_io_wbSlaveTransmitter_ready),
-    .io_wbSlaveTransmitter_bits_ack(gen_dmem_slave_io_wbSlaveTransmitter_bits_ack),
-    .io_wbSlaveTransmitter_bits_dat(gen_dmem_slave_io_wbSlaveTransmitter_bits_dat),
-    .io_wbSlaveTransmitter_bits_err(gen_dmem_slave_io_wbSlaveTransmitter_bits_err),
-    .io_wbMasterReceiver_ready(gen_dmem_slave_io_wbMasterReceiver_ready),
-    .io_wbMasterReceiver_valid(gen_dmem_slave_io_wbMasterReceiver_valid),
-    .io_wbMasterReceiver_bits_cyc(gen_dmem_slave_io_wbMasterReceiver_bits_cyc),
-    .io_wbMasterReceiver_bits_stb(gen_dmem_slave_io_wbMasterReceiver_bits_stb),
-    .io_wbMasterReceiver_bits_we(gen_dmem_slave_io_wbMasterReceiver_bits_we),
-    .io_wbMasterReceiver_bits_adr(gen_dmem_slave_io_wbMasterReceiver_bits_adr),
-    .io_wbMasterReceiver_bits_dat(gen_dmem_slave_io_wbMasterReceiver_bits_dat),
-    .io_wbMasterReceiver_bits_sel(gen_dmem_slave_io_wbMasterReceiver_bits_sel),
-    .io_reqOut_valid(gen_dmem_slave_io_reqOut_valid),
-    .io_reqOut_bits_addrRequest(gen_dmem_slave_io_reqOut_bits_addrRequest),
-    .io_reqOut_bits_dataRequest(gen_dmem_slave_io_reqOut_bits_dataRequest),
-    .io_reqOut_bits_activeByteLane(gen_dmem_slave_io_reqOut_bits_activeByteLane),
-    .io_reqOut_bits_isWrite(gen_dmem_slave_io_reqOut_bits_isWrite),
-    .io_rspIn_valid(gen_dmem_slave_io_rspIn_valid),
-    .io_rspIn_bits_dataResponse(gen_dmem_slave_io_rspIn_bits_dataResponse),
-    .io_rspIn_bits_error(gen_dmem_slave_io_rspIn_bits_error)
+  WishboneDevice wb_dmem_slave ( // @[Top.scala 70:29]
+    .io_wbSlaveTransmitter_ready(wb_dmem_slave_io_wbSlaveTransmitter_ready),
+    .io_wbSlaveTransmitter_bits_ack(wb_dmem_slave_io_wbSlaveTransmitter_bits_ack),
+    .io_wbSlaveTransmitter_bits_dat(wb_dmem_slave_io_wbSlaveTransmitter_bits_dat),
+    .io_wbSlaveTransmitter_bits_err(wb_dmem_slave_io_wbSlaveTransmitter_bits_err),
+    .io_wbMasterReceiver_ready(wb_dmem_slave_io_wbMasterReceiver_ready),
+    .io_wbMasterReceiver_valid(wb_dmem_slave_io_wbMasterReceiver_valid),
+    .io_wbMasterReceiver_bits_cyc(wb_dmem_slave_io_wbMasterReceiver_bits_cyc),
+    .io_wbMasterReceiver_bits_stb(wb_dmem_slave_io_wbMasterReceiver_bits_stb),
+    .io_wbMasterReceiver_bits_we(wb_dmem_slave_io_wbMasterReceiver_bits_we),
+    .io_wbMasterReceiver_bits_adr(wb_dmem_slave_io_wbMasterReceiver_bits_adr),
+    .io_wbMasterReceiver_bits_dat(wb_dmem_slave_io_wbMasterReceiver_bits_dat),
+    .io_wbMasterReceiver_bits_sel(wb_dmem_slave_io_wbMasterReceiver_bits_sel),
+    .io_reqOut_valid(wb_dmem_slave_io_reqOut_valid),
+    .io_reqOut_bits_addrRequest(wb_dmem_slave_io_reqOut_bits_addrRequest),
+    .io_reqOut_bits_dataRequest(wb_dmem_slave_io_reqOut_bits_dataRequest),
+    .io_reqOut_bits_activeByteLane(wb_dmem_slave_io_reqOut_bits_activeByteLane),
+    .io_reqOut_bits_isWrite(wb_dmem_slave_io_reqOut_bits_isWrite),
+    .io_rspIn_valid(wb_dmem_slave_io_rspIn_valid),
+    .io_rspIn_bits_dataResponse(wb_dmem_slave_io_rspIn_bits_dataResponse),
+    .io_rspIn_bits_error(wb_dmem_slave_io_rspIn_bits_error)
   );
-  Gpio gpio ( // @[WBGenerator.scala 165:20]
+  WishboneDevice wb_gpio_slave ( // @[Top.scala 71:29]
+    .io_wbSlaveTransmitter_ready(wb_gpio_slave_io_wbSlaveTransmitter_ready),
+    .io_wbSlaveTransmitter_bits_ack(wb_gpio_slave_io_wbSlaveTransmitter_bits_ack),
+    .io_wbSlaveTransmitter_bits_dat(wb_gpio_slave_io_wbSlaveTransmitter_bits_dat),
+    .io_wbSlaveTransmitter_bits_err(wb_gpio_slave_io_wbSlaveTransmitter_bits_err),
+    .io_wbMasterReceiver_ready(wb_gpio_slave_io_wbMasterReceiver_ready),
+    .io_wbMasterReceiver_valid(wb_gpio_slave_io_wbMasterReceiver_valid),
+    .io_wbMasterReceiver_bits_cyc(wb_gpio_slave_io_wbMasterReceiver_bits_cyc),
+    .io_wbMasterReceiver_bits_stb(wb_gpio_slave_io_wbMasterReceiver_bits_stb),
+    .io_wbMasterReceiver_bits_we(wb_gpio_slave_io_wbMasterReceiver_bits_we),
+    .io_wbMasterReceiver_bits_adr(wb_gpio_slave_io_wbMasterReceiver_bits_adr),
+    .io_wbMasterReceiver_bits_dat(wb_gpio_slave_io_wbMasterReceiver_bits_dat),
+    .io_wbMasterReceiver_bits_sel(wb_gpio_slave_io_wbMasterReceiver_bits_sel),
+    .io_reqOut_valid(wb_gpio_slave_io_reqOut_valid),
+    .io_reqOut_bits_addrRequest(wb_gpio_slave_io_reqOut_bits_addrRequest),
+    .io_reqOut_bits_dataRequest(wb_gpio_slave_io_reqOut_bits_dataRequest),
+    .io_reqOut_bits_activeByteLane(wb_gpio_slave_io_reqOut_bits_activeByteLane),
+    .io_reqOut_bits_isWrite(wb_gpio_slave_io_reqOut_bits_isWrite),
+    .io_rspIn_valid(wb_gpio_slave_io_rspIn_valid),
+    .io_rspIn_bits_dataResponse(wb_gpio_slave_io_rspIn_bits_dataResponse),
+    .io_rspIn_bits_error(wb_gpio_slave_io_rspIn_bits_error)
+  );
+  SRAM1kb dmem ( // @[Top.scala 74:20]
+    .clock(dmem_clock),
+    .reset(dmem_reset),
+    .io_req_valid(dmem_io_req_valid),
+    .io_req_bits_addrRequest(dmem_io_req_bits_addrRequest),
+    .io_req_bits_dataRequest(dmem_io_req_bits_dataRequest),
+    .io_req_bits_activeByteLane(dmem_io_req_bits_activeByteLane),
+    .io_req_bits_isWrite(dmem_io_req_bits_isWrite),
+    .io_rsp_valid(dmem_io_rsp_valid),
+    .io_rsp_bits_dataResponse(dmem_io_rsp_bits_dataResponse)
+  );
+  SramImem imem ( // @[Top.scala 75:20]
+    .clock(imem_clock),
+    .reset(imem_reset),
+    .io_req_valid(imem_io_req_valid),
+    .io_req_bits_addrRequest(imem_io_req_bits_addrRequest),
+    .io_req_bits_isWrite(imem_io_req_bits_isWrite),
+    .io_rsp_valid(imem_io_rsp_valid),
+    .io_rsp_bits_dataResponse(imem_io_rsp_bits_dataResponse),
+    .io_writeEnable(imem_io_writeEnable),
+    .io_addrIn(imem_io_addrIn),
+    .io_dataIn(imem_io_dataIn)
+  );
+  Gpio gpio ( // @[Top.scala 76:20]
     .clock(gpio_clock),
     .reset(gpio_reset),
     .io_req_valid(gpio_io_req_valid),
@@ -4156,51 +3880,7 @@
     .io_cio_gpio_o(gpio_io_cio_gpio_o),
     .io_cio_gpio_en_o(gpio_io_cio_gpio_en_o)
   );
-  WishboneDevice gen_gpio_slave ( // @[WBGenerator.scala 166:30]
-    .io_wbSlaveTransmitter_ready(gen_gpio_slave_io_wbSlaveTransmitter_ready),
-    .io_wbSlaveTransmitter_bits_ack(gen_gpio_slave_io_wbSlaveTransmitter_bits_ack),
-    .io_wbSlaveTransmitter_bits_dat(gen_gpio_slave_io_wbSlaveTransmitter_bits_dat),
-    .io_wbSlaveTransmitter_bits_err(gen_gpio_slave_io_wbSlaveTransmitter_bits_err),
-    .io_wbMasterReceiver_ready(gen_gpio_slave_io_wbMasterReceiver_ready),
-    .io_wbMasterReceiver_valid(gen_gpio_slave_io_wbMasterReceiver_valid),
-    .io_wbMasterReceiver_bits_cyc(gen_gpio_slave_io_wbMasterReceiver_bits_cyc),
-    .io_wbMasterReceiver_bits_stb(gen_gpio_slave_io_wbMasterReceiver_bits_stb),
-    .io_wbMasterReceiver_bits_we(gen_gpio_slave_io_wbMasterReceiver_bits_we),
-    .io_wbMasterReceiver_bits_adr(gen_gpio_slave_io_wbMasterReceiver_bits_adr),
-    .io_wbMasterReceiver_bits_dat(gen_gpio_slave_io_wbMasterReceiver_bits_dat),
-    .io_wbMasterReceiver_bits_sel(gen_gpio_slave_io_wbMasterReceiver_bits_sel),
-    .io_reqOut_valid(gen_gpio_slave_io_reqOut_valid),
-    .io_reqOut_bits_addrRequest(gen_gpio_slave_io_reqOut_bits_addrRequest),
-    .io_reqOut_bits_dataRequest(gen_gpio_slave_io_reqOut_bits_dataRequest),
-    .io_reqOut_bits_activeByteLane(gen_gpio_slave_io_reqOut_bits_activeByteLane),
-    .io_reqOut_bits_isWrite(gen_gpio_slave_io_reqOut_bits_isWrite),
-    .io_rspIn_valid(gen_gpio_slave_io_rspIn_valid),
-    .io_rspIn_bits_dataResponse(gen_gpio_slave_io_rspIn_bits_dataResponse),
-    .io_rspIn_bits_error(gen_gpio_slave_io_rspIn_bits_error)
-  );
-  SRAM1kb imem ( // @[WBGenerator.scala 265:20]
-    .clock(imem_clock),
-    .reset(imem_reset),
-    .io_req_valid(imem_io_req_valid),
-    .io_req_bits_addrRequest(imem_io_req_bits_addrRequest),
-    .io_req_bits_dataRequest(imem_io_req_bits_dataRequest),
-    .io_req_bits_activeByteLane(imem_io_req_bits_activeByteLane),
-    .io_req_bits_isWrite(imem_io_req_bits_isWrite),
-    .io_rsp_valid(imem_io_rsp_valid),
-    .io_rsp_bits_dataResponse(imem_io_rsp_bits_dataResponse)
-  );
-  SRAM1kb dmem ( // @[WBGenerator.scala 266:20]
-    .clock(dmem_clock),
-    .reset(dmem_reset),
-    .io_req_valid(dmem_io_req_valid),
-    .io_req_bits_addrRequest(dmem_io_req_bits_addrRequest),
-    .io_req_bits_dataRequest(dmem_io_req_bits_dataRequest),
-    .io_req_bits_activeByteLane(dmem_io_req_bits_activeByteLane),
-    .io_req_bits_isWrite(dmem_io_req_bits_isWrite),
-    .io_rsp_valid(dmem_io_rsp_valid),
-    .io_rsp_bits_dataResponse(dmem_io_rsp_bits_dataResponse)
-  );
-  WishboneErr wbErr ( // @[WBGenerator.scala 268:21]
+  WishboneErr wbErr ( // @[Top.scala 77:21]
     .clock(wbErr_clock),
     .reset(wbErr_reset),
     .io_wbSlaveTransmitter_bits_dat(wbErr_io_wbSlaveTransmitter_bits_dat),
@@ -4209,10 +3889,9 @@
     .io_wbMasterReceiver_bits_cyc(wbErr_io_wbMasterReceiver_bits_cyc),
     .io_wbMasterReceiver_bits_stb(wbErr_io_wbMasterReceiver_bits_stb)
   );
-  Core core ( // @[WBGenerator.scala 269:20]
+  Core core ( // @[Top.scala 79:20]
     .clock(core_clock),
     .reset(core_reset),
-    .io_stall(core_io_stall),
     .io_dmemReq_valid(core_io_dmemReq_valid),
     .io_dmemReq_bits_addrRequest(core_io_dmemReq_bits_addrRequest),
     .io_dmemReq_bits_dataRequest(core_io_dmemReq_bits_dataRequest),
@@ -4226,7 +3905,7 @@
     .io_imemRsp_valid(core_io_imemRsp_valid),
     .io_imemRsp_bits_dataResponse(core_io_imemRsp_bits_dataResponse)
   );
-  Switch1toN switch ( // @[WBGenerator.scala 282:22]
+  Switch1toN switch ( // @[Top.scala 88:22]
     .io_hostIn_valid(switch_io_hostIn_valid),
     .io_hostIn_bits_cyc(switch_io_hostIn_bits_cyc),
     .io_hostIn_bits_stb(switch_io_hostIn_bits_stb),
@@ -4264,215 +3943,112 @@
     .io_devIn_2_bits_err(switch_io_devIn_2_bits_err),
     .io_devSel(switch_io_devSel)
   );
-  PUart puart ( // @[WBGenerator.scala 285:21]
-    .clock(puart_clock),
-    .reset(puart_reset),
-    .io_isStalled(puart_io_isStalled),
-    .io_rx_data_o(puart_io_rx_data_o),
-    .io_addr_o(puart_io_addr_o),
-    .io_CLK_PER_BIT(puart_io_CLK_PER_BIT),
-    .io_rxd(puart_io_rxd),
-    .io_valid(puart_io_valid),
-    .io_done(puart_io_done)
-  );
-  assign io_gpio_o = gpio_io_cio_gpio_o; // @[WBGenerator.scala 171:34]
-  assign io_gpio_en_o = gpio_io_cio_gpio_en_o; // @[WBGenerator.scala 172:40]
-  assign gen_imem_host_clock = clock;
-  assign gen_imem_host_reset = reset;
-  assign gen_imem_host_io_wbMasterTransmitter_ready = gen_imem_slave_io_wbMasterReceiver_ready; // @[WBGenerator.scala 414:40]
-  assign gen_imem_host_io_wbSlaveReceiver_bits_ack = gen_imem_slave_io_wbSlaveTransmitter_bits_ack; // @[WBGenerator.scala 415:40]
-  assign gen_imem_host_io_wbSlaveReceiver_bits_dat = gen_imem_slave_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 415:40]
-  assign gen_imem_host_io_wbSlaveReceiver_bits_err = gen_imem_slave_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 415:40]
-  assign gen_imem_host_io_reqIn_valid = ~puart_io_done ? _GEN_21 : core_io_imemReq_valid; // @[WBGenerator.scala 300:23 WBGenerator.scala 402:32]
-  assign gen_imem_host_io_reqIn_bits_addrRequest = ~puart_io_done ? _GEN_26 : core_io_imemReq_bits_addrRequest; // @[WBGenerator.scala 300:23 WBGenerator.scala 402:32]
-  assign gen_imem_host_io_reqIn_bits_dataRequest = ~puart_io_done ? _GEN_27 : 32'h0; // @[WBGenerator.scala 300:23 WBGenerator.scala 402:32]
-  assign gen_imem_host_io_reqIn_bits_activeByteLane = _GEN_32[3:0];
-  assign gen_imem_host_io_reqIn_bits_isWrite = ~puart_io_done & _GEN_21; // @[WBGenerator.scala 300:23 WBGenerator.scala 402:32]
-  assign gen_imem_slave_io_wbSlaveTransmitter_ready = gen_imem_host_io_wbSlaveReceiver_ready; // @[WBGenerator.scala 415:40]
-  assign gen_imem_slave_io_wbMasterReceiver_valid = gen_imem_host_io_wbMasterTransmitter_valid; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_wbMasterReceiver_bits_cyc = gen_imem_host_io_wbMasterTransmitter_bits_cyc; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_wbMasterReceiver_bits_stb = gen_imem_host_io_wbMasterTransmitter_bits_stb; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_wbMasterReceiver_bits_we = gen_imem_host_io_wbMasterTransmitter_bits_we; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_wbMasterReceiver_bits_adr = gen_imem_host_io_wbMasterTransmitter_bits_adr; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_wbMasterReceiver_bits_dat = gen_imem_host_io_wbMasterTransmitter_bits_dat; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_wbMasterReceiver_bits_sel = gen_imem_host_io_wbMasterTransmitter_bits_sel; // @[WBGenerator.scala 414:40]
-  assign gen_imem_slave_io_rspIn_valid = imem_io_rsp_valid; // @[WBGenerator.scala 411:27]
-  assign gen_imem_slave_io_rspIn_bits_dataResponse = imem_io_rsp_bits_dataResponse; // @[WBGenerator.scala 411:27]
-  assign gen_imem_slave_io_rspIn_bits_error = 1'h0; // @[WBGenerator.scala 411:27]
-  assign gen_dmem_host_clock = clock;
-  assign gen_dmem_host_reset = reset;
-  assign gen_dmem_host_io_wbMasterTransmitter_ready = 1'h1; // @[WBGenerator.scala 425:20]
-  assign gen_dmem_host_io_wbSlaveReceiver_bits_ack = switch_io_hostOut_bits_ack; // @[WBGenerator.scala 426:21]
-  assign gen_dmem_host_io_wbSlaveReceiver_bits_dat = switch_io_hostOut_bits_dat; // @[WBGenerator.scala 426:21]
-  assign gen_dmem_host_io_wbSlaveReceiver_bits_err = switch_io_hostOut_bits_err; // @[WBGenerator.scala 426:21]
-  assign gen_dmem_host_io_reqIn_valid = core_io_dmemReq_valid; // @[WBGenerator.scala 418:26]
-  assign gen_dmem_host_io_reqIn_bits_addrRequest = core_io_dmemReq_bits_addrRequest; // @[WBGenerator.scala 418:26]
-  assign gen_dmem_host_io_reqIn_bits_dataRequest = core_io_dmemReq_bits_dataRequest; // @[WBGenerator.scala 418:26]
-  assign gen_dmem_host_io_reqIn_bits_activeByteLane = core_io_dmemReq_bits_activeByteLane; // @[WBGenerator.scala 418:26]
-  assign gen_dmem_host_io_reqIn_bits_isWrite = core_io_dmemReq_bits_isWrite; // @[WBGenerator.scala 418:26]
-  assign gen_dmem_slave_io_wbSlaveTransmitter_ready = 1'h1; // @[WBGenerator.scala 428:53]
-  assign gen_dmem_slave_io_wbMasterReceiver_valid = switch_io_devOut_0_valid; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_wbMasterReceiver_bits_cyc = switch_io_devOut_0_bits_cyc; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_wbMasterReceiver_bits_stb = switch_io_devOut_0_bits_stb; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_wbMasterReceiver_bits_we = switch_io_devOut_0_bits_we; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_wbMasterReceiver_bits_adr = switch_io_devOut_0_bits_adr; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_wbMasterReceiver_bits_dat = switch_io_devOut_0_bits_dat; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_wbMasterReceiver_bits_sel = switch_io_devOut_0_bits_sel; // @[WBGenerator.scala 429:54]
-  assign gen_dmem_slave_io_rspIn_valid = dmem_io_rsp_valid; // @[WBGenerator.scala 421:27]
-  assign gen_dmem_slave_io_rspIn_bits_dataResponse = dmem_io_rsp_bits_dataResponse; // @[WBGenerator.scala 421:27]
-  assign gen_dmem_slave_io_rspIn_bits_error = 1'h0; // @[WBGenerator.scala 421:27]
-  assign gpio_clock = clock;
-  assign gpio_reset = reset;
-  assign gpio_io_req_valid = gen_gpio_slave_io_reqOut_valid; // @[WBGenerator.scala 168:28]
-  assign gpio_io_req_bits_addrRequest = gen_gpio_slave_io_reqOut_bits_addrRequest; // @[WBGenerator.scala 168:28]
-  assign gpio_io_req_bits_dataRequest = gen_gpio_slave_io_reqOut_bits_dataRequest; // @[WBGenerator.scala 168:28]
-  assign gpio_io_req_bits_activeByteLane = gen_gpio_slave_io_reqOut_bits_activeByteLane; // @[WBGenerator.scala 168:28]
-  assign gpio_io_req_bits_isWrite = gen_gpio_slave_io_reqOut_bits_isWrite; // @[WBGenerator.scala 168:28]
-  assign gpio_io_cio_gpio_i = io_gpio_i; // @[WBGenerator.scala 173:22]
-  assign gen_gpio_slave_io_wbSlaveTransmitter_ready = 1'h1; // @[WBGenerator.scala 428:53]
-  assign gen_gpio_slave_io_wbMasterReceiver_valid = switch_io_devOut_1_valid; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_wbMasterReceiver_bits_cyc = switch_io_devOut_1_bits_cyc; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_wbMasterReceiver_bits_stb = switch_io_devOut_1_bits_stb; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_wbMasterReceiver_bits_we = switch_io_devOut_1_bits_we; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_wbMasterReceiver_bits_adr = switch_io_devOut_1_bits_adr; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_wbMasterReceiver_bits_dat = switch_io_devOut_1_bits_dat; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_wbMasterReceiver_bits_sel = switch_io_devOut_1_bits_sel; // @[WBGenerator.scala 429:54]
-  assign gen_gpio_slave_io_rspIn_valid = gpio_io_rsp_valid; // @[WBGenerator.scala 169:27]
-  assign gen_gpio_slave_io_rspIn_bits_dataResponse = gpio_io_rsp_bits_dataResponse; // @[WBGenerator.scala 169:27]
-  assign gen_gpio_slave_io_rspIn_bits_error = gpio_io_rsp_bits_error; // @[WBGenerator.scala 169:27]
-  assign imem_clock = clock;
-  assign imem_reset = reset;
-  assign imem_io_req_valid = gen_imem_slave_io_reqOut_valid; // @[WBGenerator.scala 410:28]
-  assign imem_io_req_bits_addrRequest = gen_imem_slave_io_reqOut_bits_addrRequest; // @[WBGenerator.scala 410:28]
-  assign imem_io_req_bits_dataRequest = gen_imem_slave_io_reqOut_bits_dataRequest; // @[WBGenerator.scala 410:28]
-  assign imem_io_req_bits_activeByteLane = gen_imem_slave_io_reqOut_bits_activeByteLane; // @[WBGenerator.scala 410:28]
-  assign imem_io_req_bits_isWrite = gen_imem_slave_io_reqOut_bits_isWrite; // @[WBGenerator.scala 410:28]
+  assign io_gpio_o = gpio_io_cio_gpio_o; // @[Top.scala 256:34]
+  assign io_gpio_en_o = gpio_io_cio_gpio_en_o; // @[Top.scala 257:40]
+  assign wb_imem_host_clock = clock;
+  assign wb_imem_host_reset = reset;
+  assign wb_imem_host_io_wbMasterTransmitter_ready = wb_imem_slave_io_wbMasterReceiver_ready; // @[Top.scala 231:39]
+  assign wb_imem_host_io_wbSlaveReceiver_bits_ack = wb_imem_slave_io_wbSlaveTransmitter_bits_ack; // @[Top.scala 232:39]
+  assign wb_imem_host_io_wbSlaveReceiver_bits_dat = wb_imem_slave_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 232:39]
+  assign wb_imem_host_io_wbSlaveReceiver_bits_err = wb_imem_slave_io_wbSlaveTransmitter_bits_err; // @[Top.scala 232:39]
+  assign wb_imem_host_io_reqIn_valid = core_io_imemReq_valid; // @[Top.scala 225:25]
+  assign wb_imem_host_io_reqIn_bits_addrRequest = core_io_imemReq_bits_addrRequest; // @[Top.scala 225:25]
+  assign wb_imem_host_io_reqIn_bits_dataRequest = 32'h0; // @[Top.scala 225:25]
+  assign wb_imem_host_io_reqIn_bits_activeByteLane = 4'hf; // @[Top.scala 225:25]
+  assign wb_imem_host_io_reqIn_bits_isWrite = 1'h0; // @[Top.scala 225:25]
+  assign wb_imem_slave_io_wbSlaveTransmitter_ready = wb_imem_host_io_wbSlaveReceiver_ready; // @[Top.scala 232:39]
+  assign wb_imem_slave_io_wbMasterReceiver_valid = wb_imem_host_io_wbMasterTransmitter_valid; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_wbMasterReceiver_bits_cyc = wb_imem_host_io_wbMasterTransmitter_bits_cyc; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_wbMasterReceiver_bits_stb = wb_imem_host_io_wbMasterTransmitter_bits_stb; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_wbMasterReceiver_bits_we = wb_imem_host_io_wbMasterTransmitter_bits_we; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_wbMasterReceiver_bits_adr = wb_imem_host_io_wbMasterTransmitter_bits_adr; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_wbMasterReceiver_bits_dat = wb_imem_host_io_wbMasterTransmitter_bits_dat; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_wbMasterReceiver_bits_sel = wb_imem_host_io_wbMasterTransmitter_bits_sel; // @[Top.scala 231:39]
+  assign wb_imem_slave_io_rspIn_valid = imem_io_rsp_valid; // @[Top.scala 228:26]
+  assign wb_imem_slave_io_rspIn_bits_dataResponse = imem_io_rsp_bits_dataResponse; // @[Top.scala 228:26]
+  assign wb_imem_slave_io_rspIn_bits_error = 1'h0; // @[Top.scala 228:26]
+  assign wb_dmem_host_clock = clock;
+  assign wb_dmem_host_reset = reset;
+  assign wb_dmem_host_io_wbMasterTransmitter_ready = 1'h1; // @[Top.scala 242:20]
+  assign wb_dmem_host_io_wbSlaveReceiver_bits_ack = switch_io_hostOut_bits_ack; // @[Top.scala 243:21]
+  assign wb_dmem_host_io_wbSlaveReceiver_bits_dat = switch_io_hostOut_bits_dat; // @[Top.scala 243:21]
+  assign wb_dmem_host_io_wbSlaveReceiver_bits_err = switch_io_hostOut_bits_err; // @[Top.scala 243:21]
+  assign wb_dmem_host_io_reqIn_valid = core_io_dmemReq_valid; // @[Top.scala 235:25]
+  assign wb_dmem_host_io_reqIn_bits_addrRequest = core_io_dmemReq_bits_addrRequest; // @[Top.scala 235:25]
+  assign wb_dmem_host_io_reqIn_bits_dataRequest = core_io_dmemReq_bits_dataRequest; // @[Top.scala 235:25]
+  assign wb_dmem_host_io_reqIn_bits_activeByteLane = core_io_dmemReq_bits_activeByteLane; // @[Top.scala 235:25]
+  assign wb_dmem_host_io_reqIn_bits_isWrite = core_io_dmemReq_bits_isWrite; // @[Top.scala 235:25]
+  assign wb_dmem_slave_io_wbSlaveTransmitter_ready = 1'h1; // @[Top.scala 245:53]
+  assign wb_dmem_slave_io_wbMasterReceiver_valid = switch_io_devOut_1_valid; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_wbMasterReceiver_bits_cyc = switch_io_devOut_1_bits_cyc; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_wbMasterReceiver_bits_stb = switch_io_devOut_1_bits_stb; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_wbMasterReceiver_bits_we = switch_io_devOut_1_bits_we; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_wbMasterReceiver_bits_adr = switch_io_devOut_1_bits_adr; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_wbMasterReceiver_bits_dat = switch_io_devOut_1_bits_dat; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_wbMasterReceiver_bits_sel = switch_io_devOut_1_bits_sel; // @[Top.scala 246:54]
+  assign wb_dmem_slave_io_rspIn_valid = dmem_io_rsp_valid; // @[Top.scala 238:26]
+  assign wb_dmem_slave_io_rspIn_bits_dataResponse = dmem_io_rsp_bits_dataResponse; // @[Top.scala 238:26]
+  assign wb_dmem_slave_io_rspIn_bits_error = 1'h0; // @[Top.scala 238:26]
+  assign wb_gpio_slave_io_wbSlaveTransmitter_ready = 1'h1; // @[Top.scala 245:53]
+  assign wb_gpio_slave_io_wbMasterReceiver_valid = switch_io_devOut_0_valid; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_wbMasterReceiver_bits_cyc = switch_io_devOut_0_bits_cyc; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_wbMasterReceiver_bits_stb = switch_io_devOut_0_bits_stb; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_wbMasterReceiver_bits_we = switch_io_devOut_0_bits_we; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_wbMasterReceiver_bits_adr = switch_io_devOut_0_bits_adr; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_wbMasterReceiver_bits_dat = switch_io_devOut_0_bits_dat; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_wbMasterReceiver_bits_sel = switch_io_devOut_0_bits_sel; // @[Top.scala 246:54]
+  assign wb_gpio_slave_io_rspIn_valid = gpio_io_rsp_valid; // @[Top.scala 254:26]
+  assign wb_gpio_slave_io_rspIn_bits_dataResponse = gpio_io_rsp_bits_dataResponse; // @[Top.scala 254:26]
+  assign wb_gpio_slave_io_rspIn_bits_error = gpio_io_rsp_bits_error; // @[Top.scala 254:26]
   assign dmem_clock = clock;
   assign dmem_reset = reset;
-  assign dmem_io_req_valid = gen_dmem_slave_io_reqOut_valid; // @[WBGenerator.scala 420:28]
-  assign dmem_io_req_bits_addrRequest = gen_dmem_slave_io_reqOut_bits_addrRequest; // @[WBGenerator.scala 420:28]
-  assign dmem_io_req_bits_dataRequest = gen_dmem_slave_io_reqOut_bits_dataRequest; // @[WBGenerator.scala 420:28]
-  assign dmem_io_req_bits_activeByteLane = gen_dmem_slave_io_reqOut_bits_activeByteLane; // @[WBGenerator.scala 420:28]
-  assign dmem_io_req_bits_isWrite = gen_dmem_slave_io_reqOut_bits_isWrite; // @[WBGenerator.scala 420:28]
+  assign dmem_io_req_valid = wb_dmem_slave_io_reqOut_valid; // @[Top.scala 237:27]
+  assign dmem_io_req_bits_addrRequest = wb_dmem_slave_io_reqOut_bits_addrRequest; // @[Top.scala 237:27]
+  assign dmem_io_req_bits_dataRequest = wb_dmem_slave_io_reqOut_bits_dataRequest; // @[Top.scala 237:27]
+  assign dmem_io_req_bits_activeByteLane = wb_dmem_slave_io_reqOut_bits_activeByteLane; // @[Top.scala 237:27]
+  assign dmem_io_req_bits_isWrite = wb_dmem_slave_io_reqOut_bits_isWrite; // @[Top.scala 237:27]
+  assign imem_clock = clock;
+  assign imem_reset = reset;
+  assign imem_io_req_valid = wb_imem_slave_io_reqOut_valid; // @[Top.scala 227:27]
+  assign imem_io_req_bits_addrRequest = wb_imem_slave_io_reqOut_bits_addrRequest; // @[Top.scala 227:27]
+  assign imem_io_req_bits_isWrite = wb_imem_slave_io_reqOut_bits_isWrite; // @[Top.scala 227:27]
+  assign imem_io_writeEnable = io_rx_we_i; // @[Top.scala 220:23]
+  assign imem_io_addrIn = io_rx_addr_i; // @[Top.scala 221:18]
+  assign imem_io_dataIn = io_rx_wdata_i; // @[Top.scala 222:18]
+  assign gpio_clock = clock;
+  assign gpio_reset = reset;
+  assign gpio_io_req_valid = wb_gpio_slave_io_reqOut_valid; // @[Top.scala 253:27]
+  assign gpio_io_req_bits_addrRequest = wb_gpio_slave_io_reqOut_bits_addrRequest; // @[Top.scala 253:27]
+  assign gpio_io_req_bits_dataRequest = wb_gpio_slave_io_reqOut_bits_dataRequest; // @[Top.scala 253:27]
+  assign gpio_io_req_bits_activeByteLane = wb_gpio_slave_io_reqOut_bits_activeByteLane; // @[Top.scala 253:27]
+  assign gpio_io_req_bits_isWrite = wb_gpio_slave_io_reqOut_bits_isWrite; // @[Top.scala 253:27]
+  assign gpio_io_cio_gpio_i = io_gpio_i; // @[Top.scala 258:22]
   assign wbErr_clock = clock;
   assign wbErr_reset = reset;
-  assign wbErr_io_wbMasterReceiver_valid = switch_io_devOut_2_valid; // @[WBGenerator.scala 432:34]
-  assign wbErr_io_wbMasterReceiver_bits_cyc = switch_io_devOut_2_bits_cyc; // @[WBGenerator.scala 432:34]
-  assign wbErr_io_wbMasterReceiver_bits_stb = switch_io_devOut_2_bits_stb; // @[WBGenerator.scala 432:34]
+  assign wbErr_io_wbMasterReceiver_valid = switch_io_devOut_2_valid; // @[Top.scala 249:34]
+  assign wbErr_io_wbMasterReceiver_bits_cyc = switch_io_devOut_2_bits_cyc; // @[Top.scala 249:34]
+  assign wbErr_io_wbMasterReceiver_bits_stb = switch_io_devOut_2_bits_stb; // @[Top.scala 249:34]
   assign core_clock = clock;
   assign core_reset = reset;
-  assign core_io_stall = ~puart_io_done & _GEN_22; // @[WBGenerator.scala 300:23 WBGenerator.scala 289:17]
-  assign core_io_dmemRsp_valid = gen_dmem_host_io_rspOut_valid; // @[WBGenerator.scala 419:19]
-  assign core_io_dmemRsp_bits_dataResponse = gen_dmem_host_io_rspOut_bits_dataResponse; // @[WBGenerator.scala 419:19]
-  assign core_io_imemReq_ready = ~puart_io_done | gen_imem_host_io_reqIn_ready; // @[WBGenerator.scala 300:23 WBGenerator.scala 398:27 WBGenerator.scala 402:32]
-  assign core_io_imemRsp_valid = ~puart_io_done ? 1'h0 : gen_imem_host_io_rspOut_valid; // @[WBGenerator.scala 300:23 WBGenerator.scala 397:27 WBGenerator.scala 403:25]
-  assign core_io_imemRsp_bits_dataResponse = ~puart_io_done ? 32'h0 : gen_imem_host_io_rspOut_bits_dataResponse; // @[WBGenerator.scala 300:23 WBGenerator.scala 394:39 WBGenerator.scala 403:25]
-  assign switch_io_hostIn_valid = gen_dmem_host_io_wbMasterTransmitter_valid; // @[WBGenerator.scala 425:20]
-  assign switch_io_hostIn_bits_cyc = gen_dmem_host_io_wbMasterTransmitter_bits_cyc; // @[WBGenerator.scala 425:20]
-  assign switch_io_hostIn_bits_stb = gen_dmem_host_io_wbMasterTransmitter_bits_stb; // @[WBGenerator.scala 425:20]
-  assign switch_io_hostIn_bits_we = gen_dmem_host_io_wbMasterTransmitter_bits_we; // @[WBGenerator.scala 425:20]
-  assign switch_io_hostIn_bits_adr = gen_dmem_host_io_wbMasterTransmitter_bits_adr; // @[WBGenerator.scala 425:20]
-  assign switch_io_hostIn_bits_dat = gen_dmem_host_io_wbMasterTransmitter_bits_dat; // @[WBGenerator.scala 425:20]
-  assign switch_io_hostIn_bits_sel = gen_dmem_host_io_wbMasterTransmitter_bits_sel; // @[WBGenerator.scala 425:20]
-  assign switch_io_devIn_0_bits_ack = gen_dmem_slave_io_wbSlaveTransmitter_bits_ack; // @[WBGenerator.scala 428:53]
-  assign switch_io_devIn_0_bits_dat = gen_dmem_slave_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 428:53]
-  assign switch_io_devIn_0_bits_err = gen_dmem_slave_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 428:53]
-  assign switch_io_devIn_1_bits_ack = gen_gpio_slave_io_wbSlaveTransmitter_bits_ack; // @[WBGenerator.scala 428:53]
-  assign switch_io_devIn_1_bits_dat = gen_gpio_slave_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 428:53]
-  assign switch_io_devIn_1_bits_err = gen_gpio_slave_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 428:53]
-  assign switch_io_devIn_2_bits_dat = wbErr_io_wbSlaveTransmitter_bits_dat; // @[WBGenerator.scala 431:33]
-  assign switch_io_devIn_2_bits_err = wbErr_io_wbSlaveTransmitter_bits_err; // @[WBGenerator.scala 431:33]
+  assign core_io_dmemRsp_valid = wb_dmem_host_io_rspOut_valid; // @[Top.scala 236:19]
+  assign core_io_dmemRsp_bits_dataResponse = wb_dmem_host_io_rspOut_bits_dataResponse; // @[Top.scala 236:19]
+  assign core_io_imemReq_ready = wb_imem_host_io_reqIn_ready; // @[Top.scala 225:25]
+  assign core_io_imemRsp_valid = wb_imem_host_io_rspOut_valid; // @[Top.scala 226:19]
+  assign core_io_imemRsp_bits_dataResponse = wb_imem_host_io_rspOut_bits_dataResponse; // @[Top.scala 226:19]
+  assign switch_io_hostIn_valid = wb_dmem_host_io_wbMasterTransmitter_valid; // @[Top.scala 242:20]
+  assign switch_io_hostIn_bits_cyc = wb_dmem_host_io_wbMasterTransmitter_bits_cyc; // @[Top.scala 242:20]
+  assign switch_io_hostIn_bits_stb = wb_dmem_host_io_wbMasterTransmitter_bits_stb; // @[Top.scala 242:20]
+  assign switch_io_hostIn_bits_we = wb_dmem_host_io_wbMasterTransmitter_bits_we; // @[Top.scala 242:20]
+  assign switch_io_hostIn_bits_adr = wb_dmem_host_io_wbMasterTransmitter_bits_adr; // @[Top.scala 242:20]
+  assign switch_io_hostIn_bits_dat = wb_dmem_host_io_wbMasterTransmitter_bits_dat; // @[Top.scala 242:20]
+  assign switch_io_hostIn_bits_sel = wb_dmem_host_io_wbMasterTransmitter_bits_sel; // @[Top.scala 242:20]
+  assign switch_io_devIn_0_bits_ack = wb_gpio_slave_io_wbSlaveTransmitter_bits_ack; // @[Top.scala 245:53]
+  assign switch_io_devIn_0_bits_dat = wb_gpio_slave_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 245:53]
+  assign switch_io_devIn_0_bits_err = wb_gpio_slave_io_wbSlaveTransmitter_bits_err; // @[Top.scala 245:53]
+  assign switch_io_devIn_1_bits_ack = wb_dmem_slave_io_wbSlaveTransmitter_bits_ack; // @[Top.scala 245:53]
+  assign switch_io_devIn_1_bits_dat = wb_dmem_slave_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 245:53]
+  assign switch_io_devIn_1_bits_err = wb_dmem_slave_io_wbSlaveTransmitter_bits_err; // @[Top.scala 245:53]
+  assign switch_io_devIn_2_bits_dat = wbErr_io_wbSlaveTransmitter_bits_dat; // @[Top.scala 248:33]
+  assign switch_io_devIn_2_bits_err = wbErr_io_wbSlaveTransmitter_bits_err; // @[Top.scala 248:33]
   assign switch_io_devSel = switch_io_devSel_addr_hit_0 ? switch_io_devSel_id_0 : _switch_io_devSel_T; // @[Mux.scala 98:16]
-  assign puart_clock = clock;
-  assign puart_reset = reset;
-  assign puart_io_isStalled = ~puart_io_done & _GEN_23; // @[WBGenerator.scala 300:23 WBGenerator.scala 290:24]
-  assign puart_io_CLK_PER_BIT = io_CLK_PER_BIT; // @[WBGenerator.scala 287:24]
-  assign puart_io_rxd = io_rx_i; // @[WBGenerator.scala 286:16]
-  always @(posedge clock) begin
-    if (reset) begin // @[WBGenerator.scala 293:22]
-      state <= 2'h0; // @[WBGenerator.scala 293:22]
-    end else if (~puart_io_done) begin // @[WBGenerator.scala 300:23]
-      if (state == 2'h0) begin // @[WBGenerator.scala 307:25]
-        if (reset_reg & ~reset) begin // @[WBGenerator.scala 309:66]
-          state <= 2'h1; // @[WBGenerator.scala 310:19]
-        end else begin
-          state <= 2'h0; // @[WBGenerator.scala 312:19]
-        end
-      end else if (state == 2'h1) begin // @[WBGenerator.scala 324:35]
-        state <= _GEN_2;
-      end else begin
-        state <= _GEN_5;
-      end
-    end
-    reset_reg <= reset; // @[WBGenerator.scala 294:26 WBGenerator.scala 294:26 WBGenerator.scala 295:13]
-    if (reset) begin // @[WBGenerator.scala 296:52]
-      rx_data_reg <= 32'h0; // @[WBGenerator.scala 296:52]
-    end else if (~puart_io_done) begin // @[WBGenerator.scala 300:23]
-      if (!(state == 2'h0)) begin // @[WBGenerator.scala 307:25]
-        if (state == 2'h1) begin // @[WBGenerator.scala 324:35]
-          rx_data_reg <= _rx_data_reg_T; // @[WBGenerator.scala 353:40]
-        end
-      end
-    end
-    if (reset) begin // @[WBGenerator.scala 297:52]
-      rx_addr_reg <= 32'h0; // @[WBGenerator.scala 297:52]
-    end else if (~puart_io_done) begin // @[WBGenerator.scala 300:23]
-      if (!(state == 2'h0)) begin // @[WBGenerator.scala 307:25]
-        if (state == 2'h1) begin // @[WBGenerator.scala 324:35]
-          rx_addr_reg <= {{22'd0}, _rx_addr_reg_T_1}; // @[WBGenerator.scala 355:40]
-        end
-      end
-    end
-  end
-// Register and memory initialization
-`ifdef RANDOMIZE_GARBAGE_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_INVALID_ASSIGN
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_REG_INIT
-`define RANDOMIZE
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-`define RANDOMIZE
-`endif
-`ifndef RANDOM
-`define RANDOM $random
-`endif
-`ifdef RANDOMIZE_MEM_INIT
-  integer initvar;
-`endif
-`ifndef SYNTHESIS
-`ifdef FIRRTL_BEFORE_INITIAL
-`FIRRTL_BEFORE_INITIAL
-`endif
-initial begin
-  `ifdef RANDOMIZE
-    `ifdef INIT_RANDOM
-      `INIT_RANDOM
-    `endif
-    `ifndef VERILATOR
-      `ifdef RANDOMIZE_DELAY
-        #`RANDOMIZE_DELAY begin end
-      `else
-        #0.002 begin end
-      `endif
-    `endif
-`ifdef RANDOMIZE_REG_INIT
-  _RAND_0 = {1{`RANDOM}};
-  state = _RAND_0[1:0];
-  _RAND_1 = {1{`RANDOM}};
-  reset_reg = _RAND_1[0:0];
-  _RAND_2 = {1{`RANDOM}};
-  rx_data_reg = _RAND_2[31:0];
-  _RAND_3 = {1{`RANDOM}};
-  rx_addr_reg = _RAND_3[31:0];
-`endif // RANDOMIZE_REG_INIT
-  `endif // RANDOMIZE
-end // initial
-`ifdef FIRRTL_AFTER_INITIAL
-`FIRRTL_AFTER_INITIAL
-`endif
-`endif // SYNTHESIS
 endmodule
diff --git a/verilog/rtl/iccm_controller.v b/verilog/rtl/iccm_controller.v
new file mode 100644
index 0000000..b69a743
--- /dev/null
+++ b/verilog/rtl/iccm_controller.v
@@ -0,0 +1,135 @@
+
+
+// Licensed under the Apache License, Version 2.0, see LICENSE for details.
+// SPDX-License-Identifier: Apache-2.0
+
+module iccm_controller (
+	clk_i,
+	rst_ni,
+	prog_i,
+	rx_dv_i,
+	rx_byte_i,
+	we_o,
+	addr_o,
+	wdata_o,
+	reset_o
+);
+	input wire clk_i;
+	input wire rst_ni;
+	input wire prog_i;
+	input wire rx_dv_i;
+	input wire [7:0] rx_byte_i;
+	output wire we_o;
+	output wire [11:0] addr_o;
+	output wire [31:0] wdata_o;
+	output wire reset_o;
+	reg [1:0] ctrl_fsm_cs;
+	reg [1:0] ctrl_fsm_ns;
+	wire [7:0] rx_byte_d;
+	reg [7:0] rx_byte_q0;
+	reg [7:0] rx_byte_q1;
+	reg [7:0] rx_byte_q2;
+	reg [7:0] rx_byte_q3;
+	reg we_q;
+	reg we_d;
+	reg [11:0] addr_q;
+	reg [11:0] addr_d;
+	reg reset_q;
+	reg reset_d;
+	reg [1:0] byte_count;
+	localparam [1:0] DONE = 3;
+	localparam [1:0] LOAD = 1;
+	localparam [1:0] PROG = 2;
+	localparam [1:0] RESET = 0;
+	always @(*) begin
+		we_d    = we_q;
+		addr_d  = addr_q;
+		reset_d = reset_q;
+		ctrl_fsm_ns = ctrl_fsm_cs;
+		case (ctrl_fsm_cs)
+			RESET: begin
+				we_d = 1'b0;
+				reset_d = 1'b0;
+				if (rx_dv_i)
+					ctrl_fsm_ns = LOAD;
+				else
+					ctrl_fsm_ns = RESET;
+			end
+			LOAD:
+				if (((byte_count == 2'b11) && (rx_byte_q2 != 8'h0f)) && (rx_byte_d != 8'hff)) begin
+					we_d = 1'b1;
+					ctrl_fsm_ns = PROG;
+				end
+				else
+					ctrl_fsm_ns = DONE;
+			PROG: begin
+				we_d = 1'b0;
+				ctrl_fsm_ns = DONE;
+			end
+			DONE:
+				if (wdata_o == 32'h00000fff || (!rst_ni)) begin
+					ctrl_fsm_ns = DONE;
+					reset_d = 1'b1;
+				end
+				else if (rx_dv_i)
+					ctrl_fsm_ns = LOAD;
+				else
+					ctrl_fsm_ns = DONE;
+		//	default: ctrl_fsm_ns = RESET;
+		endcase
+	end
+	assign rx_byte_d = rx_byte_i;
+	assign we_o = we_q;
+	assign addr_o = addr_q;
+	assign wdata_o = {rx_byte_q0, rx_byte_q1, rx_byte_q2, rx_byte_q3};
+	assign reset_o = reset_q;
+	always @(posedge clk_i or negedge rst_ni)
+		if (!rst_ni) begin
+			we_q <= 1'b0;
+			addr_q <= 12'b000000000000;
+			rx_byte_q0 <= 8'b00000000;
+			rx_byte_q1 <= 8'b00000000;
+			rx_byte_q2 <= 8'b00000000;
+			rx_byte_q3 <= 8'b00000000;
+			reset_q <= 1'b1;
+			byte_count <= 2'b00;
+			ctrl_fsm_cs <= DONE;
+		end
+		else if (prog_i) begin
+            we_q <= 1'b0;
+            addr_q <= 12'b000000000000;
+            rx_byte_q0 <= 8'b00000000;
+            rx_byte_q1 <= 8'b00000000;
+            rx_byte_q2 <= 8'b00000000;
+            rx_byte_q3 <= 8'b00000000;
+            reset_q <= 1'b0;
+            byte_count <= 2'b00;
+            ctrl_fsm_cs <= RESET;
+		end
+		else begin
+			we_q <= we_d;
+			if (ctrl_fsm_cs == LOAD) begin
+				if (byte_count == 2'b00) begin
+					rx_byte_q0 <= rx_byte_d;
+					byte_count <= 2'b01;
+				end
+				else if (byte_count == 2'b01) begin
+					rx_byte_q1 <= rx_byte_d;
+					byte_count <= 2'b10;
+				end
+				else if (byte_count == 2'b10) begin
+					rx_byte_q2 <= rx_byte_d;
+					byte_count <= 2'b11;
+				end
+				else begin
+					rx_byte_q3 <= rx_byte_d;
+					byte_count <= 2'b00;
+				end
+				addr_q <= addr_d;
+			end
+			if (ctrl_fsm_cs == PROG)
+				addr_q <= addr_d + 1'b1;
+			reset_q <= reset_d;
+			ctrl_fsm_cs <= ctrl_fsm_ns;
+		end
+endmodule
diff --git a/verilog/rtl/prog_uart_top.v b/verilog/rtl/prog_uart_top.v
new file mode 100644
index 0000000..2b1957d
--- /dev/null
+++ b/verilog/rtl/prog_uart_top.v
@@ -0,0 +1,46 @@
+module prog_uart_top(  
+  input           clock,
+  input           reset,
+  output [31:0]   io_gpio_o,
+  output [31:0]   io_gpio_en_o,
+  input  [31:0]   io_gpio_i,
+  input           io_rx_i,
+  input  [15:0]   io_CLK_PER_BIT,
+  output          boot,
+  input           prog_i);
+
+wire        io_rx_we;
+wire [31:0] io_rx_wdata;
+wire        rst;
+wire [31:0] io_rx_addr;
+wire        a_clk;
+
+assign boot = rst;
+
+Top u_top(
+  .clock(clock),
+  .reset(reset | ~rst),
+  .io_gpio_o(io_gpio_o),
+  .io_gpio_en_o(io_gpio_en_o),
+  .io_gpio_i(io_gpio_i),
+  .io_rx_we_i(~io_rx_we),
+  .io_rx_addr_i(io_rx_addr),
+  .io_rx_wdata_i(io_rx_wdata),
+  .io_rx_reset_i(rst)
+);
+
+programmer u_programmer(
+  .clk_i(clock),
+  .rst_ni(~reset),
+  .prog_i(prog_i),
+  .rx_i(io_rx_i),
+  .clks_per_bit(io_CLK_PER_BIT),
+  .we_o(io_rx_we),
+  .addr_o(io_rx_addr),
+  .wdata_o(io_rx_wdata),
+  .reset_o(rst));
+
+
+
+
+endmodule
diff --git a/verilog/rtl/programmer.v b/verilog/rtl/programmer.v
new file mode 100644
index 0000000..9980bb5
--- /dev/null
+++ b/verilog/rtl/programmer.v
@@ -0,0 +1,44 @@
+
+module programmer
+(
+
+  input wire clk_i,
+  input wire rst_ni,
+
+  input wire        prog_i,
+  input wire        rx_i,
+  input wire [15:0] clks_per_bit,
+
+  output wire 	     we_o,
+  output wire [11:0] addr_o,
+  output wire [31:0] wdata_o,
+  output wire 	     reset_o
+);
+
+  wire       rx_dv;
+  wire [7:0] rx_byte;
+
+iccm_controller u_iccm_ctrl(
+ .clk_i		(clk_i),
+ .rst_ni	(rst_ni),
+ .prog_i	(prog_i),
+ .rx_dv_i	(rx_dv),
+ .rx_byte_i	(rx_byte),
+ .we_o		(we_o),
+ .addr_o	(addr_o),
+ .wdata_o	(wdata_o),
+ .reset_o	(reset_o)
+);
+
+
+uart_rx_prog u_prog_uart(
+  .clk_i	(clk_i),
+  .rst_ni	(rst_ni),
+  .i_Rx_Serial	(rx_i),
+  .CLKS_PER_BIT	(clks_per_bit),
+  .o_Rx_DV	(rx_dv),
+  .o_Rx_Byte	(rx_byte)
+);
+
+
+endmodule
diff --git a/verilog/rtl/soc_now_caravel_top.v b/verilog/rtl/soc_now_caravel_top.v
index 01887dd..01567ce 100644
--- a/verilog/rtl/soc_now_caravel_top.v
+++ b/verilog/rtl/soc_now_caravel_top.v
@@ -84,12 +84,15 @@
 assign io_oeb[5] = 1'b1;
 assign io_out[5] = 1'b0;
 
+assign io_oeb[3] = 1'b0;
+assign io_oeb[4] = 1'b1;
+
 // gpio
 assign io_out[37:6] = gpio_o;
 assign gpio_i = io_in[37:6];
 assign io_oeb[37:6] = ~gpio_oe;
 
-Caravel_Top soc_top (
+prog_uart_top soc_top (
 `ifdef USE_POWER_PINS
 	.vccd1(vccd1),	// User area 1 1.8V power
 	.vssd1(vssd1),	// User area 1 digital ground
@@ -101,7 +104,9 @@
   .io_gpio_en_o (gpio_oe),
   .io_gpio_i (gpio_i),
   .io_rx_i (io_in[5]),
-  .io_CLK_PER_BIT (la_data_in[15:0])
+  .io_CLK_PER_BIT (la_data_in[15:0]),
+  .boot(io_out[3]),
+  .prog_i(io_in[4])
 );
 
 endmodule	// user_project_wrapper