Added N5 simulations
diff --git a/verilog/dv/caravel/user_proj_example/io_ports/Makefile b/verilog/dv/caravel/user_proj_example/io_ports/Makefile
index d396704..91ad1ee 100644
--- a/verilog/dv/caravel/user_proj_example/io_ports/Makefile
+++ b/verilog/dv/caravel/user_proj_example/io_ports/Makefile
@@ -36,7 +36,7 @@
 
 %.vvp: %_tb.v %.hex test.hex
 ifeq ($(SIM),RTL)
-	iverilog -DFUNCTIONAL -DSIM -DFAST -I $(BEHAVIOURAL_MODELS) \
+	iverilog -DFUNCTIONAL -DSIM -DFAST -DUSE_POWER_PINS -I $(BEHAVIOURAL_MODELS) \
 	-I $(PDK_PATH) -I .. -I $(RTL_PATH) \
 	$< -o $@
 else
diff --git a/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v b/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v
index 068f2a2..4162781 100644
--- a/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v
+++ b/verilog/dv/caravel/user_proj_example/io_ports/io_ports_tb.v
@@ -18,12 +18,11 @@
 `timescale 1 ns / 1 ps
 
 `define   TEST_FILE   "../sw_n5/test.hex" 
-`define   SIM_TIME    600_000
+`define   SIM_TIME    3000_000
 `define   SIM_LEVEL   0
 
 `define SOC_SETUP_TIME 800*2001
 
-`include "caravel.v"
 `include "spiflash.v"
 
 `include "sst26wf080b.v"
@@ -76,6 +75,8 @@
 `include "user_project/NfiVe32.v"
 `include "user_project/soc_core.v"
 
+`include "caravel.v"
+
 `endif
 
 module io_ports_tb;
@@ -142,7 +143,6 @@
 		RSTB <= 1'b1;	    // Release reset
 		#(`SOC_SETUP_TIME);
 		#(`SIM_TIME);
-	    $display("Monitor: Test 1 Mega-Project IO (RTL) Passed");
 	    $finish;
 	end
 
@@ -217,7 +217,7 @@
 
 endmodule
 
-module terminal #(parameter bit_time = 160) (input rx);
+module terminal #(parameter bit_time = 400) (input rx);
 
     integer i;
     reg [7:0] char;
diff --git a/verilog/rtl/user_project/IPs/DFFRAMBB.v b/verilog/rtl/user_project/IPs/DFFRAMBB.v
index 5599bc8..2825426 100644
--- a/verilog/rtl/user_project/IPs/DFFRAMBB.v
+++ b/verilog/rtl/user_project/IPs/DFFRAMBB.v
@@ -67,14 +67,46 @@
 endmodule
 
 module DEC2x4 (
+`ifdef USE_POWER_PINS
+    input VPWR,
+    input VGND,
+`endif
     input           EN,
     input   [1:0]   A,
     output  [3:0]   SEL
 );
-    sky130_fd_sc_hd__nor3b_4    AND0 ( .Y(SEL[0]), .A(A[0]),   .B(A[1]), .C_N(EN) );
-    sky130_fd_sc_hd__and3b_4    AND1 ( .X(SEL[1]), .A_N(A[1]), .B(A[0]), .C(EN) );
-    sky130_fd_sc_hd__and3b_4    AND2 ( .X(SEL[2]), .A_N(A[0]), .B(A[1]), .C(EN) );
-    sky130_fd_sc_hd__and3_4     AND3 ( .X(SEL[3]), .A(A[1]),   .B(A[0]), .C(EN) );
+    sky130_fd_sc_hd__nor3b_4    AND0 ( 
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif
+        .Y(SEL[0]), .A(A[0]),   .B(A[1]), .C_N(EN) );
+    sky130_fd_sc_hd__and3b_4    AND1 ( 
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif
+        .X(SEL[1]), .A_N(A[1]), .B(A[0]), .C(EN) );
+    sky130_fd_sc_hd__and3b_4    AND2 ( 
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif
+        .X(SEL[2]), .A_N(A[0]), .B(A[1]), .C(EN) );
+    sky130_fd_sc_hd__and3_4     AND3 ( 
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif
+        .X(SEL[3]), .A(A[1]),   .B(A[0]), .C(EN) );
     
 endmodule
 
@@ -123,11 +155,22 @@
 endmodule
 
 module MUX4x1_32(
+`ifdef USE_POWER_PINS
+    input VPWR,
+    input VGND,
+`endif
     input   [31:0]      A0, A1, A2, A3,
     input   [1:0]       S,
     output  [31:0]      X
 );
-    sky130_fd_sc_hd__mux4_1 MUX[31:0] (.A0(A0), .A1(A1), .A2(A2), .A3(A3), .S0(S[0]), .S1(S[1]), .X(X) );
+    sky130_fd_sc_hd__mux4_1 MUX[31:0] (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif
+        .A0(A0), .A1(A1), .A2(A2), .A3(A3), .S0(S[0]), .S1(S[1]), .X(X) );
 endmodule
 
 module PASS (input [31:0] A, output [31:0] X);
diff --git a/verilog/rtl/user_project/IPs/RAM_3Kx32.v b/verilog/rtl/user_project/IPs/RAM_3Kx32.v
index 57f8fa5..f7dbf25 100644
--- a/verilog/rtl/user_project/IPs/RAM_3Kx32.v
+++ b/verilog/rtl/user_project/IPs/RAM_3Kx32.v
@@ -2,6 +2,10 @@
 `default_nettype none
 
 module RAM_3Kx32 (
+`ifdef USE_POWER_PINS
+    VPWR,
+    VGND,
+`endif
     CLK,
     WE,
     EN,
@@ -9,6 +13,12 @@
     Do,
     A
 );
+
+`ifdef USE_POWER_PINS
+    input VPWR;
+    input VGND;
+`endif
+
     input           CLK;
     input   [3:0]   WE;
     input           EN;
@@ -41,9 +51,29 @@
         
     endgenerate 
     
-    MUX4x1_32 MUX ( .A0(_Do_[0]), .A1(_Do_[1]), .A2(_Do_[2]), .A3(32'b0), .S(A[11:10]), .X(Do_pre) );
-    DEC2x4 DEC ( .EN(EN), .A(A[11:10]), .SEL(_EN_) );
+    MUX4x1_32 MUX ( 
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+    `endif
+        .A0(_Do_[0]), .A1(_Do_[1]), .A2(_Do_[2]), .A3(32'b0), .S(A[11:10]), .X(Do_pre) 
+    );
+    DEC2x4 DEC ( 
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+    `endif
+        .EN(EN), .A(A[11:10]), .SEL(_EN_)
+    );
 
-    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (.X(Do), .A(Do_pre));
+    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (
+    `ifdef USE_POWER_PINS
+        .VPWR(VPWR),
+        .VGND(VGND),
+        .VPB(VPWR),
+        .VNB(VGND),
+    `endif
+        .X(Do), .A(Do_pre)
+    );
     
-endmodule
\ No newline at end of file
+endmodule
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_GPIO.v b/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_GPIO.v
deleted file mode 100644
index 8441800..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_GPIO.v
+++ /dev/null
@@ -1,165 +0,0 @@
-`timescale 1ns/1ns
-    module AHBlite_GPIO (
-    // AHB Interface
-    // clock and reset 
-    input  wire        HCLK,    
-    //input  wire        HCLKG,   // Gated clock
-    input  wire        HRESETn, // Reset
-
-    // input ports
-    input   wire        HSEL,    // Select
-    input   wire [23:2] HADDR,   // Address
-    input   wire        HREADY, // 
-    input   wire        HWRITE,  // Write control
-    input   wire [1:0]  HTRANS,    // AHB transfer type
-    input   wire [2:0]  HSIZE,    // AHB hsize
-    input   wire [31:0] HWDATA,  // Write data
-
-    // output ports
-    output wire [31:0] HRDATA,  // Read data
-    output wire        HREADYOUT,  // Device ready
-    output wire [1:0]   HRESP,
-
-    output wire [15:0] IRQ,
-	
-    // IP Interface
-	// WGPIODIN register/fields
-	input [15:0] WGPIODIN,
-	// WGPIODOUT register/fields
-	output [15:0] WGPIODOUT,
-	// WGPIOPU register/fields
-	output [15:0] WGPIOPU,
-	// WGPIOPD register/fields
-	output [15:0] WGPIOPD,
-	// WGPIODIR register/fields
-	output [15:0] WGPIODIR
-);
-    reg         IOSEL;
-    reg [23:0]  IOADDR;
-    reg         IOWRITE;    // I/O transfer direction
-    reg [2:0]   IOSIZE;     // I/O transfer size
-    reg         IOTRANS;
-
-    // registered HSEL, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn) begin
-        if (~HRESETn)
-            IOSEL <= 1'b0;
-        else
-            IOSEL <= HSEL & HREADY;
-    end
-    
-    // registered address, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn) begin
-        if (~HRESETn)
-            IOADDR <= 24'd0;
-        else
-            IOADDR <= {HADDR[23:2], 2'b0};
-    end
-
-    // Data phase write control
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-      if (~HRESETn)
-        IOWRITE <= 1'b0;
-      else
-        IOWRITE <= HWRITE;
-    end
-  
-    // registered hsize, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-      if (~HRESETn)
-        IOSIZE <= {3{1'b0}};
-      else
-        IOSIZE <= HSIZE[2:0];
-    end
-  
-    // registered HTRANS, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-      if (~HRESETn)
-        IOTRANS <= 1'b0;
-      else
-        IOTRANS <= HTRANS[1];
-    end
-    
-    wire rd_enable;
-    assign  rd_enable = IOSEL & (~IOWRITE) & IOTRANS; 
-    wire wr_enable = IOTRANS & IOWRITE & IOSEL;
-    
-
-    reg [15:0] WGPIODOUT;
-    reg [15:0] WGPIOPU;
-    reg [15:0] WGPIOPD;
-    reg [15:0] WGPIODIR;
-    reg [15:0] WGPIOIM;
-    wire[15:0] WGPIODIN;
-
-	// Register: WGPIODOUT
-    wire WGPIODOUT_select = wr_enable & (IOADDR[23:2] == 22'h1);
-    
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-        if (~HRESETn)
-            WGPIODOUT <= 16'h0;
-        else if (WGPIODOUT_select)
-            WGPIODOUT <= HWDATA;
-    end
-    
-	// Register: WGPIOPU
-    wire WGPIOPU_select = wr_enable & (IOADDR[23:2] == 22'h2);
-    
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-        if (~HRESETn)
-            WGPIOPU <= 16'h0;
-        else if (WGPIOPU_select)
-            WGPIOPU <= HWDATA;
-    end
-    
-	// Register: WGPIOPD
-    wire WGPIOPD_select = wr_enable & (IOADDR[23:2] == 22'h3);
-    
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-        if (~HRESETn)
-            WGPIOPD <= 16'h0;
-        else if (WGPIOPD_select)
-            WGPIOPD <= HWDATA;
-    end
-    
-	// Register: WGPIODIR
-    wire WGPIODIR_select = wr_enable & (IOADDR[23:2] == 22'h4);
-    
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-        if (~HRESETn)
-            WGPIODIR <= 16'h0;
-        else if (WGPIODIR_select)
-            WGPIODIR <= HWDATA;
-    end
-    
-    // Register: IM
-    wire WGPIOIM_select = wr_enable & (IOADDR[23:2] == 22'h5);
-    
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-        if (~HRESETn)
-            WGPIOIM <= 16'h0;
-        else if (WGPIOIM_select)
-            WGPIOIM <= HWDATA;
-    end
-    
-    assign IRQ = (~WGPIODIR) & WGPIOIM;
-
-    assign HRDATA = 
-      	(IOADDR[23:2] == 22'h0) ? {16'd0,WGPIODIN} : 
-      	(IOADDR[23:2] == 22'h1) ? {16'd0,WGPIODOUT} : 
-      	(IOADDR[23:2] == 22'h2) ? {16'd0,WGPIOPU} : 
-      	(IOADDR[23:2] == 22'h3) ? {16'd0,WGPIOPD} : 
-      	(IOADDR[23:2] == 22'h4) ? {16'd0,WGPIODIR} :
-        (IOADDR[23:2] == 22'h5) ? {16'd0,WGPIOIM} : 
-	32'hDEADBEEF;
-	assign HREADYOUT = 1'b1;     // Always ready
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_bus0.v b/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_bus0.v
deleted file mode 100644
index b655a1a..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_bus0.v
+++ /dev/null
@@ -1,77 +0,0 @@
-
-    `timescale 1ns/1ns
-    module AHBlite_BUS0(
-        input wire HCLK,
-        input wire HRESETn,
-      
-        // Master Interface
-        input wire [31:0] HADDR,
-        input wire [31:0] HWDATA, 
-        output wire [31:0] HRDATA,
-        output wire        HREADY,
-        // Slave # 0
-        output wire         HSEL_S0,
-        input wire          HREADY_S0,
-        input wire  [31:0]  HRDATA_S0,
-        // Slave # 1
-        output wire         HSEL_S1,
-        input wire          HREADY_S1,
-        input wire  [31:0]  HRDATA_S1,
-        // Slave # 2
-        output wire         HSEL_S2,
-        input wire          HREADY_S2,
-        input wire  [31:0]  HRDATA_S2,
-        // Slave # 3
-        output wire         HSEL_S3,
-        input wire          HREADY_S3,
-        input wire  [31:0]  HRDATA_S3,
-
-        // Slave # 4
-        output wire         HSEL_S4,
-        input wire          HREADY_S4,
-        input wire  [31:0]  HRDATA_S4,
-
-
-        // SubSystem # 0
-        output wire         HSEL_SS0,
-        input wire          HREADY_SS0,
-        input wire  [31:0]  HRDATA_SS0
-    );
-        wire [7:0]  PAGE = HADDR[31:24];
-        reg [7:0] APAGE;
-
-        always@ (posedge HCLK or negedge HRESETn) begin
-        if(!HRESETn)
-            APAGE <= 8'h0;
-        else if(HREADY)
-            APAGE <= PAGE;
-        end
-
-    	assign HSEL_S0 = (PAGE == 8'h00);
-		assign HSEL_S1 = (PAGE == 8'h20);
-		assign HSEL_S2 = (PAGE == 8'h48);
-		assign HSEL_S3 = (PAGE == 8'h49);
-        assign HSEL_S4 = (PAGE == 8'h4A);
-		assign HSEL_SS0 = (PAGE == 8'h40);
-	
-
-        assign HREADY =
-			(APAGE == 8'h00) ? HREADY_S0 :
-			(APAGE == 8'h20) ? HREADY_S1 :
-			(APAGE == 8'h48) ? HREADY_S2 :
-			(APAGE == 8'h49) ? HREADY_S3 :
-            (APAGE == 8'h4A) ? HREADY_S4 :
-			(APAGE == 8'h40) ? HREADY_SS0 :
-			1'b1;
-
-
-        assign HRDATA =
-			(APAGE == 8'h00) ? HRDATA_S0 :
-			(APAGE == 8'h20) ? HRDATA_S1 :
-			(APAGE == 8'h48) ? HRDATA_S2 :
-			(APAGE == 8'h49) ? HRDATA_S3 :
-            (APAGE == 8'h4A) ? HRDATA_S4 :
-			(APAGE == 8'h40) ? HRDATA_SS0 :
-			32'hDEADBEEF;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_db_reg.v b/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_db_reg.v
deleted file mode 100644
index b46d639..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_db_reg.v
+++ /dev/null
@@ -1,101 +0,0 @@
-`timescale 1ns/1ns
-    module AHBlite_db_reg (
-    // AHB Interface
-    // clock and reset 
-    input  wire        HCLK,    
-    //input  wire        HCLKG,   // Gated clock
-    input  wire        HRESETn, // Reset
-
-    // input ports
-    input   wire        HSEL,    // Select
-    input   wire [23:2] HADDR,   // Address
-    input   wire        HREADY, // 
-    input   wire        HWRITE,  // Write control
-    input   wire [1:0]  HTRANS,    // AHB transfer type
-    input   wire [2:0]  HSIZE,    // AHB hsize
-    input   wire [31:0] HWDATA,  // Write data
-
-    // output ports
-    output wire [31:0] HRDATA,  // Read data
-    output wire        HREADYOUT,  // Device ready
-    output wire [1:0]   HRESP,
-		// IP Interface
-	// db_reg register/fields
-	output [3:0] db_reg
-
-
-);
-    reg         IOSEL;
-    reg [23:0]  IOADDR;
-    reg         IOWRITE;    // I/O transfer direction
-    reg [2:0]   IOSIZE;     // I/O transfer size
-    reg         IOTRANS;
-
-    // registered HSEL, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn) begin
-        if (~HRESETn)
-            IOSEL <= 1'b0;
-        else
-            IOSEL <= HSEL & HREADY;
-    end
-    
-    // registered address, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn) begin
-        if (~HRESETn)
-            IOADDR <= 24'd0;
-        else
-            IOADDR <= HADDR[23:0];
-    end
-
-    // Data phase write control
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-      if (~HRESETn)
-        IOWRITE <= 1'b0;
-      else
-        IOWRITE <= HWRITE;
-    end
-  
-    // registered hsize, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-      if (~HRESETn)
-        IOSIZE <= {3{1'b0}};
-      else
-        IOSIZE <= HSIZE[2:0];
-    end
-  
-    // registered HTRANS, update only if selected to reduce toggling
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-      if (~HRESETn)
-        IOTRANS <= 1'b0;
-      else
-        IOTRANS <= HTRANS[1];
-    end
-    
-    wire rd_enable;
-    assign  rd_enable = IOSEL & (~IOWRITE) & IOTRANS; 
-    wire wr_enable = IOTRANS & IOWRITE & IOSEL;
-    
-
-    reg [3:0] db_reg;
-
-
-	// Register: db_reg
-    wire db_reg_select = wr_enable & (IOADDR[23:2] == 20'h0);
-    
-    always @(posedge HCLK or negedge HRESETn)
-    begin
-        if (~HRESETn)
-            db_reg <= 4'h0;
-        else if (db_reg_select)
-            db_reg <= HWDATA;
-    end
-    
-    assign HRDATA = 
-      	(IOADDR[23:2] == 22'h0) ? {28'd0,db_reg} : 
-	32'hDEADBEEF;
-	assign HREADYOUT = 1'b1;     // Always ready
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_sys_0.v b/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_sys_0.v
deleted file mode 100644
index 9b931cb..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/AHBlite_sys_0.v
+++ /dev/null
@@ -1,309 +0,0 @@
-
-`timescale 1ns/1ns
-
-//`define DBG
-module AHBlite_sys_0(
-		input HCLK,
-		input HRESETn,
-     
-		input [31: 0] HADDR,
-		input [31: 0] HWDATA,
-		input HWRITE,
-		input [1: 0] HTRANS,
-		input [2:0] HSIZE,
-
-		output HREADY,
-		output [31: 0] HRDATA,
-
-		input wire [3: 0] fdi_S0,
-		output wire [3: 0] fdo_S0,
-		output wire [0: 0] fdoe_S0,
-		output wire [0: 0] fsclk_S0,
-		output wire [0: 0] fcen_S0,
-		input wire [31: 0] SRAMRDATA_S1,
-		output wire [3: 0] SRAMWEN_S1,
-		output wire [31: 0] SRAMWDATA_S1,
-		output wire [0: 0] SRAMCS0_S1,
-		//output wire [0: 0] SRAMCS1_S1,
-		//output wire [0: 0] SRAMCS2_S1,
-		//output wire [0: 0] SRAMCS3_S1,
-		output wire [11: 0] SRAMADDR_S1,
-		input wire [15: 0] GPIOIN_S2,
-		output wire [15: 0] GPIOOUT_S2,
-		output wire [15: 0] GPIOPU_S2,
-		output wire [15: 0] GPIOPD_S2,
-		output wire [15: 0] GPIOOEN_S2,
-		output wire [3:0] db_reg,
-		input wire [0: 0] RsRx_SS0_S0,
-		output wire [0: 0] RsTx_SS0_S0,
-		output wire [0: 0] uart_irq_SS0_S0,
-		input wire [0: 0] RsRx_SS0_S1,
-		output wire [0: 0] RsTx_SS0_S1,
-		output wire [0: 0] uart_irq_SS0_S1,
-		input wire [0: 0] MSI_SS0_S2,
-		output wire [0: 0] MSO_SS0_S2,
-		output wire [0: 0] SSn_SS0_S2,
-		output wire [0: 0] SCLK_SS0_S2,
-		input wire [0: 0] MSI_SS0_S3,
-		output wire [0: 0] MSO_SS0_S3,
-		output wire [0: 0] SSn_SS0_S3,
-		output wire [0: 0] SCLK_SS0_S3,
-		input wire [0: 0] scl_i_SS0_S4,
-		output wire [0: 0] scl_o_SS0_S4,
-		output wire [0: 0] scl_oen_o_SS0_S4,
-		input wire [0: 0] sda_i_SS0_S4,
-		output wire [0: 0] sda_o_SS0_S4,
-		output wire [0: 0] sda_oen_o_SS0_S4,
-		input wire [0: 0] scl_i_SS0_S5,
-		output wire [0: 0] scl_o_SS0_S5,
-		output wire [0: 0] scl_oen_o_SS0_S5,
-		input wire [0: 0] sda_i_SS0_S5,
-		output wire [0: 0] sda_o_SS0_S5,
-		output wire [0: 0] sda_oen_o_SS0_S5,
-		output wire [0: 0] pwm_SS0_S6,
-		output wire [0: 0] pwm_SS0_S7,
-
-		output wire [31:0] IRQ
-	);
-        
-		//assign IRQ[15:0] = 0;
-
-        //Inputs
-        wire HSEL_S0, HSEL_S1, HSEL_S2, HSEL_S3, HSEL_S4, HSEL_SS0;
-
-        //Outputs
-        wire    [31:0]   HRDATA_S0, HRDATA_S1, HRDATA_S2, HRDATA_S3, HRDATA_S4, HRDATA_SS0, HRDATA;
-        wire             HREADY_S0, HREADY_S1, HREADY_S2, HREADY_S3, HREADY_S4, HREADY_SS0, HREADY;
-        wire  [1:0]   HRESP;
-       // wire          IRQ;
-        
-		wire [15: 0] WGPIODIN_S2;
-		wire [15: 0] WGPIODOUT_S2;
-		wire [15: 0] WGPIOPU_S2;
-		wire [15: 0] WGPIOPD_S2;
-		wire [15: 0] WGPIODIR_S2;
-
-	//Digital module # 0
-	QSPI_XIP_CTRL S0 ( 
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-		.HSEL(HSEL_S0),
-		.HADDR(HADDR),
-		.HREADY(HREADY),
-		.HWRITE(HWRITE),
-		.HTRANS(HTRANS),
-		//.HSIZE(HSIZE),
-		.HRDATA(HRDATA_S0),
-		.HREADYOUT(HREADY_S0),
-		.din(fdi_S0),
-		.dout(fdo_S0),
-		.douten(fdoe_S0),
-		.sck(fsclk_S0),
-		.ce_n(fcen_S0)
-	);
-
-		
-	//Digital module # 1
-	AHBSRAM S1 ( 
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-		.HSEL(HSEL_S1),
-		.HADDR(HADDR),
-		.HREADY(HREADY),
-		.HWRITE(HWRITE),
-		.HTRANS(HTRANS),
-		.HSIZE(HSIZE),
-		.HWDATA(HWDATA),
-		.HRDATA(HRDATA_S1),
-		.HREADYOUT(HREADY_S1),
-		.SRAMRDATA(SRAMRDATA_S1),
-		.SRAMWEN(SRAMWEN_S1),
-		.SRAMWDATA(SRAMWDATA_S1),
-		.SRAMCS0(SRAMCS0_S1),
-		//.SRAMCS1(SRAMCS1_S1),
-		//.SRAMCS2(SRAMCS2_S1),
-		//.SRAMCS3(SRAMCS3_S1),
-		.SRAMADDR(SRAMADDR_S1)
-	);
-		
-	//Digital module # 2
-	GPIO S2 ( 
-		.WGPIODIN(WGPIODIN_S2),
-		.WGPIODOUT(WGPIODOUT_S2),
-		.WGPIOPU(WGPIOPU_S2),
-		.WGPIOPD(WGPIOPD_S2),
-		.WGPIODIR(WGPIODIR_S2),
-		.GPIOIN(GPIOIN_S2),
-		.GPIOOUT(GPIOOUT_S2),
-		.GPIOPU(GPIOPU_S2),
-		.GPIOPD(GPIOPD_S2),
-		.GPIOOEN(GPIOOEN_S2)
-	);
-		
-	//AHB Slave # 2
-	AHBlite_GPIO S_2 (
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-		.HSEL(HSEL_S2),
-		.HADDR(HADDR[23:2]),
-		.HREADY(HREADY),
-		.HWRITE(HWRITE),
-		.HTRANS(HTRANS),
-		.HSIZE(HSIZE),
-		.HWDATA(HWDATA),
-
-		.WGPIODIN(WGPIODIN_S2),
-		.WGPIODOUT(WGPIODOUT_S2),
-		.WGPIOPU(WGPIOPU_S2),
-		.WGPIOPD(WGPIOPD_S2),
-		.WGPIODIR(WGPIODIR_S2),
-		.HRDATA(HRDATA_S2),
-		.HREADYOUT(HREADY_S2),
-		.HRESP(HRESP), 
-
-		.IRQ(IRQ[15:0])
-	);
-			
-	//AHB Slave # 3
-/*	
-	AHBlite_db_reg S_3 (
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-		.HSEL(HSEL_S3),
-		.HADDR(HADDR[23:2]),
-		.HREADY(HREADY),
-		.HWRITE(HWRITE),
-		.HTRANS(HTRANS),
-		.HSIZE(HSIZE),
-		.HWDATA(HWDATA),
-		.db_reg(db_reg),
-
-		.HRDATA(HRDATA_S3),
-		.HREADYOUT(HREADY_S3),
-		.HRESP(HRESP)
-	);
-*/
-
-	AHB_SPM S_3 (
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-		.HSEL(HSEL_S3),
-		.HADDR(HADDR),
-		.HREADY(HREADY),
-		.HWRITE(HWRITE),
-		.HTRANS(HTRANS),
-		.HSIZE(HSIZE),
-		.HWDATA(HWDATA),
-		//.db_reg(db_reg),
-
-		.HRDATA(HRDATA_S3),
-		.HREADYOUT(HREADY_S3),
-		.HRESP(HRESP)
-	);		
-
-
-	// SLAVE 4
-	assign HREADY_S4 = 1;
-
-
-	//AHB Bus
-	AHBlite_BUS0 AHB(
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-		
-		// Master Interface
-		.HADDR(HADDR),
-		.HWDATA(HWDATA), 
-		.HREADY(HREADY),
-		.HRDATA(HRDATA),
-		
-		// Slave # 0
-		.HSEL_S0(HSEL_S0),
-		.HREADY_S0(HREADY_S0),
-		.HRDATA_S0(HRDATA_S0),
-		
-		// Slave # 1
-		.HSEL_S1(HSEL_S1),
-		.HREADY_S1(HREADY_S1),
-		.HRDATA_S1(HRDATA_S1),
-		
-		// Slave # 2
-		.HSEL_S2(HSEL_S2),
-		.HREADY_S2(HREADY_S2),
-		.HRDATA_S2(HRDATA_S2),
-		
-		// Slave # 3
-		.HSEL_S3(HSEL_S3),
-		.HREADY_S3(HREADY_S3),
-		.HRDATA_S3(HRDATA_S3),
-		
-		// Slave # 4
-		.HSEL_S4(HSEL_S4),
-		.HREADY_S4(HREADY_S4),
-		.HRDATA_S4(HRDATA_S4),
-
-		// Subsystem # 0
-		.HSEL_SS0(HSEL_SS0),
-		.HREADY_SS0(HREADY_SS0),
-		.HRDATA_SS0(HRDATA_SS0)
-	);
-
-    //SubSystem Instantiation #0 
-    apb_sys_0 apb_sys_inst_0(
-        // Global signals 
-        .HCLK(HCLK),
-        .HRESETn(HRESETn),
-    
-        // AHB Slave inputs 
-        .HADDR(HADDR),
-        .HTRANS(HTRANS),
-        .HWRITE(HWRITE),
-        .HWDATA(HWDATA),
-        .HSEL(HSEL_SS0),
-        .HREADY(HREADY),
-    
-        // AHB Slave outputs 
-        .HRDATA(HRDATA_SS0),
-        .HREADYOUT(HREADY_SS0),
-		.RsRx_S0(RsRx_SS0_S0),
-		.RsTx_S0(RsTx_SS0_S0),
-
-		.RsRx_S1(RsRx_SS0_S1),
-		.RsTx_S1(RsTx_SS0_S1),
-
-		.MSI_S2(MSI_SS0_S2),
-		.MSO_S2(MSO_SS0_S2),
-		.SSn_S2(SSn_SS0_S2),
-		.SCLK_S2(SCLK_SS0_S2),
-
-		.MSI_S3(MSI_SS0_S3),
-		.MSO_S3(MSO_SS0_S3),
-		.SSn_S3(SSn_SS0_S3),
-		.SCLK_S3(SCLK_SS0_S3),
-
-		.scl_i_S4(scl_i_SS0_S4),
-		.scl_o_S4(scl_o_SS0_S4),
-		.scl_oen_o_S4(scl_oen_o_SS0_S4),
-		.sda_i_S4(sda_i_SS0_S4),
-		.sda_o_S4(sda_o_SS0_S4),
-		.sda_oen_o_S4(sda_oen_o_SS0_S4),
-
-		.scl_i_S5(scl_i_SS0_S5),
-		.scl_o_S5(scl_o_SS0_S5),
-		.scl_oen_o_S5(scl_oen_o_SS0_S5),
-		.sda_i_S5(sda_i_SS0_S5),
-		.sda_o_S5(sda_o_SS0_S5),
-		.sda_oen_o_S5(sda_oen_o_SS0_S5),
-
-		.pwm_S6(pwm_SS0_S6),
-		.pwm_S7(pwm_SS0_S7),
-
-		.IRQ(IRQ[31:16])
-    );
-`ifdef DBG
-    always @(posedge HCLK)
-	if(HTRANS[1] & HREADY)
-        $display("Mem request (%d) A:%X", HWRITE, HADDR);
-`endif
-    endmodule
-        
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/AHB_2_APB.v b/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/AHB_2_APB.v
deleted file mode 100644
index 813c8be..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/AHB_2_APB.v
+++ /dev/null
@@ -1,214 +0,0 @@
-
-`timescale 1ns/1ns
-module ahb_2_apb(
-// Global signals --------------------------------------------------------------
-  input wire          HCLK,
-  input wire          HRESETn,
-  
-// AHB Slave inputs ------------------------------------------------------------  
-  input wire  [31:0]  HADDR,
-  input wire  [1:0]   HTRANS,
-  input wire          HWRITE,
-  input wire  [31:0]  HWDATA,
-  input wire          HSEL,
-  input wire          HREADY,
-  
-// APB Master inputs -----------------------------------------------------------
-  input wire  [31:0]  PRDATA,
-  input wire          PREADY,
-  
-// AHB Slave outputs -----------------------------------------------------------
-  output wire [31:0]  HRDATA,
-  output reg          HREADYOUT,
-  
-// APB Master outputs ----------------------------------------------------------
-  output wire [31:0]  PWDATA,
-  output reg          PENABLE,
-  output reg  [31:0]  PADDR,
-  output reg          PWRITE,
-  
-  output wire         PCLK,
-  output wire         PRESETn
-);
-  
-//Constants
-
-  `define ST_IDLE 2'b00
-  `define ST_SETUP 2'b01
-  `define ST_ACCESS 2'b11
-
-
-  wire          Transfer;
-  wire          ACRegEn;
-  reg   [31:0]  last_HADDR;
-  reg           last_HWRITE;
-  
-  wire  [31:0]  HADDR_Mux;
-  
-  reg   [1:0]   CurrentState;
-  reg   [1:0]   NextState;
-  
-  reg           HREADY_next;  
-  wire          PWRITE_next;
-  wire          PENABLE_next;
-  wire          APBEn;
-  
-  
-  assign PCLK = HCLK;
-  assign PRESETn = HRESETn;
-  
-  assign Transfer = HSEL & HREADY & HTRANS[1];
-  
-  assign ACRegEn = HSEL & HREADY;
-  
-  //Set register values of AHB signals
-  
-  always @ (posedge HCLK, negedge HRESETn)
-  begin
-    if(!HRESETn)
-      begin
-        last_HADDR <= {32{1'b0}};
-        last_HWRITE <= 1'b0;
-      end
-    
-    else
-      begin
-        if(ACRegEn)
-          begin
-            last_HADDR <= HADDR;
-            last_HWRITE <= HWRITE;
-          end
-      end
-  end
-  
-  
-// Next State Logic
-
-  always @ (CurrentState,PREADY, Transfer)
-  begin
-    case (CurrentState)
-      `ST_IDLE: 
-        begin
-          if(Transfer)
-            NextState = `ST_SETUP;
-          else
-            NextState = `ST_IDLE;
-        end
-      
-      `ST_SETUP:
-        begin
-          NextState = `ST_ACCESS;
-        end
-      
-      `ST_ACCESS:
-        begin
-          if(!PREADY)
-            NextState = `ST_ACCESS;
-          else
-            begin
-              if(Transfer)
-                NextState = `ST_SETUP;
-              else
-                NextState = `ST_IDLE;
-            end
-        end
-      default:
-        NextState = `ST_IDLE;
-    endcase
-  end
-  
-// State Machine
-
-  always @ (posedge HCLK, negedge HRESETn)
-  begin
-    if(!HRESETn)
-      CurrentState <= `ST_IDLE;
-    else
-      CurrentState <= NextState;
-  end
-  
-  
-//HREADYOUT
-
-  always @ (NextState, PREADY)
-  begin
-    case (NextState)
-      `ST_IDLE:
-        HREADY_next = 1'b1;
-      `ST_SETUP:
-        HREADY_next = 1'b0;
-      `ST_ACCESS: 
-        HREADY_next = PREADY;
-      default:
-        HREADY_next = 1'b1;
-    endcase
-  end
-
-  always @(posedge HCLK, negedge HRESETn)
-  begin
-    if(!HRESETn)
-      HREADYOUT <= 1'b1;
-    else
-      HREADYOUT <= HREADY_next;
-  end
-
-  
-// HADDRMux
-  assign HADDR_Mux = ((NextState == `ST_SETUP) ? HADDR :
-                      last_HADDR);
-
-//APBen
-  assign APBEn = ((NextState == `ST_SETUP) ? 1'b1 : 1'b0);
-
-//PADDR
-
-  always @ (posedge HCLK, negedge HRESETn)
-  begin
-    if (!HRESETn)
-      PADDR <= {31{1'b0}};
-    else
-      begin
-        if (APBEn)
-          PADDR <= HADDR_Mux;
-      end
-  end
-
-//PWDATA
-
-  assign PWDATA = HWDATA;
-
-
-//PENABLE
-
-  assign PENABLE_next = ((NextState == `ST_ACCESS) ? 1'b1 : 1'b0);
-  
-  always @ (posedge HCLK, negedge HRESETn)
-  begin
-    if(!HRESETn)
-      PENABLE <= 1'b0;
-    else
-      PENABLE <= PENABLE_next;
-  end
-  
-//PWRITE
-
-  assign PWRITE_next = ((NextState == `ST_SETUP) ? HWRITE : last_HWRITE);
-
-  always @ (posedge HCLK, negedge HRESETn)
-  begin
-    if(!HRESETn)
-      PWRITE <= 1'b0;
-    else
-      begin
-        if (APBEn)
-          PWRITE <= PWRITE_next;
-      end
-  end
-
-
-//HRDATA
-  assign HRDATA = PRDATA;
-
-
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_PWM32.v b/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_PWM32.v
deleted file mode 100644
index bc7aa6f..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_PWM32.v
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
-        APB Wrapper for PWM32 macro 
-        Automatically generated from a JSON description by Mohamed Shalan
-        Generated at 2020-11-26 12:31:7 
-*/
-
-`timescale 1ns/1ns
-   
-module APB_PWM32 (
-	// APB Interface
-	// clock and reset 
-	input  wire        PCLK,    
-	//input  wire        PCLKG,   // Gated clock
-	input  wire        PRESETn, // Reset
-
-	// input ports
-	input  wire        PSEL,    // Select
-	input  wire [19:2] PADDR,   // Address
-	input  wire        PENABLE, // Transfer control
-	input  wire        PWRITE,  // Write control
-	input  wire [31:0] PWDATA,  // Write data
-
-	// output ports
-	output wire [31:0] PRDATA,  // Read data
-	output wire        PREADY,
-	// Device ready
-
-	// IP Interface
-	// PRE register/fields
-	output [31:0] PRE,
-
-
-	// TMRCMP1 register/fields
-	output [31:0] TMRCMP1,
-
-
-	// TMRCMP2 register/fields
-	output [31:0] TMRCMP2,
-
-
-	// TMREN register/fields
-	output [0:0] TMREN
-
-);
-	wire rd_enable;
-	wire wr_enable;
-	assign  rd_enable = PSEL & (~PWRITE); 
-	assign  wr_enable = PSEL & PWRITE & (PENABLE); 
-	assign  PREADY = 1'b1;
-    
-
-    reg [31:0] PRE;
-
-    reg [31:0] TMRCMP1;
-
-    reg [31:0] TMRCMP2;
-
-    reg [0:0] TMREN;
-
-
-	// Register: PRE
-	wire PRE_select = wr_enable & (PADDR[19:2] == 18'h4);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            PRE <= 32'h0;
-        else if (PRE_select)
-            PRE <= PWDATA;
-    end
-    
-	// Register: TMRCMP1
-	wire TMRCMP1_select = wr_enable & (PADDR[19:2] == 18'h1);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            TMRCMP1 <= 32'h0;
-        else if (TMRCMP1_select)
-            TMRCMP1 <= PWDATA;
-    end
-    
-	// Register: TMRCMP2
-	wire TMRCMP2_select = wr_enable & (PADDR[19:2] == 18'h2);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            TMRCMP2 <= 32'h0;
-        else if (TMRCMP2_select)
-            TMRCMP2 <= PWDATA;
-    end
-    
-	// Register: TMREN
-	wire TMREN_select = wr_enable & (PADDR[19:2] == 18'h8);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            TMREN <= 1'h0;
-        else if (TMREN_select)
-            TMREN <= PWDATA;
-    end
-    
-	assign PRDATA = 
-		(PADDR[19:2] == 18'h4) ? PRE : 
-		(PADDR[19:2] == 18'h1) ? TMRCMP1 : 
-		(PADDR[19:2] == 18'h2) ? TMRCMP2 : 
-		(PADDR[19:2] == 18'h8) ? {31'd0,TMREN} : 
-		32'hDEADBEEF;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_TIMER32.v b/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_TIMER32.v
deleted file mode 100644
index cfdfe7a..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_TIMER32.v
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
-        APB Wrapper for TIMER32 macro 
-        Automatically generated from a JSON description by Mohamed Shalan
-        Generated at 2020-11-26 12:31:7 
-*/
-
-`timescale 1ns/1ns
-   
-module APB_TIMER32 (
-	// APB Interface
-	// clock and reset 
-	input  wire        PCLK,    
-	//input  wire        PCLKG,   // Gated clock
-	input  wire        PRESETn, // Reset
-
-	// input ports
-	input  wire        PSEL,    // Select
-	input  wire [19:2] PADDR,   // Address
-	input  wire        PENABLE, // Transfer control
-	input  wire        PWRITE,  // Write control
-	input  wire [31:0] PWDATA,  // Write data
-
-	// output ports
-	output wire [31:0] PRDATA,  // Read data
-	output wire        PREADY,
-	// Device ready
-
-	// IP Interface
-	output		IRQ,
-
-	// TMR register/fields
-	input [31:0] TMR,
-
-
-	// PRE register/fields
-	output [31:0] PRE,
-
-
-	// TMRCMP register/fields
-	output [31:0] TMRCMP,
-
-
-	// TMROV register/fields
-	input [0:0] TMROV,
-
-
-	// TMROVCLR register/fields
-	output [0:0] TMROVCLR,
-
-
-	// TMREN register/fields
-	output [0:0] TMREN
-
-);
-	wire rd_enable;
-	wire wr_enable;
-	assign  rd_enable = PSEL & (~PWRITE); 
-	assign  wr_enable = PSEL & PWRITE & (PENABLE); 
-	assign  PREADY = 1'b1;
-    
-
-    reg [31:0] PRE;
-
-    reg [31:0] TMRCMP;
-
-    reg [0:0] TMROVCLR;
-
-    reg [0:0] TMREN;
-
-    wire[31:0] TMR;
-    wire[0:0] TMROV;
-
-	// Register: PRE
-	wire PRE_select = wr_enable & (PADDR[19:2] == 18'h1);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            PRE <= 32'h0;
-        else if (PRE_select)
-            PRE <= PWDATA;
-    end
-    
-	// Register: TMRCMP
-	wire TMRCMP_select = wr_enable & (PADDR[19:2] == 18'h2);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            TMRCMP <= 32'h0;
-        else if (TMRCMP_select)
-            TMRCMP <= PWDATA;
-    end
-    
-	// Register: TMROVCLR
-	wire TMROVCLR_select = wr_enable & (PADDR[19:2] == 18'h4);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            TMROVCLR <= 1'h0;
-        else if (TMROVCLR_select)
-            TMROVCLR <= PWDATA;
-    end
-    
-	// Register: TMREN
-	wire TMREN_select = wr_enable & (PADDR[19:2] == 18'h5);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            TMREN <= 1'h0;
-        else if (TMREN_select)
-            TMREN <= PWDATA;
-    end
-    
-
-	// IRQ Enable Register @ offset 0x100
-	reg[0:0] IRQEN;
-	wire IRQEN_select = wr_enable & (PADDR[19:2] == 18'h40);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            IRQEN <= 1'h0;
-        else if (IRQEN_select)
-            IRQEN <= PWDATA;
-    end
-    
-	assign IRQ = ( TMROV & IRQEN[0] ) ;
-
-	assign PRDATA = 
-		(PADDR[19:2] == 18'h0) ? TMR : 
-		(PADDR[19:2] == 18'h1) ? PRE : 
-		(PADDR[19:2] == 18'h2) ? TMRCMP : 
-		(PADDR[19:2] == 18'h3) ? {31'd0,TMROV} : 
-		(PADDR[19:2] == 18'h4) ? {31'd0,TMROVCLR} : 
-		(PADDR[19:2] == 18'h5) ? {31'd0,TMREN} : 
-		(PADDR[19:2] == 18'h40) ? {31'd0,IRQEN} : 
-		32'hDEADBEEF;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_WDT32.v b/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_WDT32.v
deleted file mode 100644
index 06348d8..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_WDT32.v
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
-        APB Wrapper for WDT32 macro 
-        Automatically generated from a JSON description by Mohamed Shalan
-        Generated at 2020-11-26 12:31:7 
-*/
-
-`timescale 1ns/1ns
-   
-module APB_WDT32 (
-	// APB Interface
-	// clock and reset 
-	input  wire        PCLK,    
-	//input  wire        PCLKG,   // Gated clock
-	input  wire        PRESETn, // Reset
-
-	// input ports
-	input  wire        PSEL,    // Select
-	input  wire [19:2] PADDR,   // Address
-	input  wire        PENABLE, // Transfer control
-	input  wire        PWRITE,  // Write control
-	input  wire [31:0] PWDATA,  // Write data
-
-	// output ports
-	output wire [31:0] PRDATA,  // Read data
-	output wire        PREADY,
-	// Device ready
-
-	// IP Interface
-	output		IRQ,
-
-	// WDTMR register/fields
-	input [31:0] WDTMR,
-
-
-	// WDLOAD register/fields
-	output [31:0] WDLOAD,
-
-
-	// WDOV register/fields
-	input [0:0] WDOV,
-
-
-	// WDOVCLR register/fields
-	output [0:0] WDOVCLR,
-
-
-	// WDEN register/fields
-	output [0:0] WDEN
-
-);
-	wire rd_enable;
-	wire wr_enable;
-	assign  rd_enable = PSEL & (~PWRITE); 
-	assign  wr_enable = PSEL & PWRITE & (PENABLE); 
-	assign  PREADY = 1'b1;
-    
-
-    reg [31:0] WDLOAD;
-
-    reg [0:0] WDOVCLR;
-
-    reg [0:0] WDEN;
-
-    wire[31:0] WDTMR;
-    wire[0:0] WDOV;
-
-	// Register: WDLOAD
-	wire WDLOAD_select = wr_enable & (PADDR[19:2] == 18'h1);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            WDLOAD <= 32'h0;
-        else if (WDLOAD_select)
-            WDLOAD <= PWDATA;
-    end
-    
-	// Register: WDOVCLR
-	wire WDOVCLR_select = wr_enable & (PADDR[19:2] == 18'h4);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            WDOVCLR <= 1'h0;
-        else if (WDOVCLR_select)
-            WDOVCLR <= PWDATA;
-    end
-    
-	// Register: WDEN
-	wire WDEN_select = wr_enable & (PADDR[19:2] == 18'h5);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            WDEN <= 1'h0;
-        else if (WDEN_select)
-            WDEN <= PWDATA;
-    end
-    
-
-	// IRQ Enable Register @ offset 0x100
-	reg[0:0] IRQEN;
-	wire IRQEN_select = wr_enable & (PADDR[19:2] == 18'h40);
-
-    always @(posedge PCLK or negedge PRESETn)
-    begin
-        if (~PRESETn)
-            IRQEN <= 1'h0;
-        else if (IRQEN_select)
-            IRQEN <= PWDATA;
-    end
-    
-	assign IRQ = ( WDOV & IRQEN[0] ) ;
-
-	assign PRDATA = 
-		(PADDR[19:2] == 18'h0) ? WDTMR : 
-		(PADDR[19:2] == 18'h1) ? WDLOAD : 
-		(PADDR[19:2] == 18'h3) ? {31'd0,WDOV} : 
-		(PADDR[19:2] == 18'h4) ? {31'd0,WDOVCLR} : 
-		(PADDR[19:2] == 18'h5) ? {31'd0,WDEN} : 
-		(PADDR[19:2] == 18'h40) ? {31'd0,IRQEN} : 
-		32'hDEADBEEF;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_bus0.v b/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_bus0.v
deleted file mode 100644
index 403e27c..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_bus0.v
+++ /dev/null
@@ -1,236 +0,0 @@
-
-`timescale 1ns/1ns
-
-module APB_BUS0 #(
-    // Parameters to enable/disable ports
-    
-    parameter PORT0_ENABLE  = 1,
-    parameter PORT1_ENABLE  = 1,
-    parameter PORT2_ENABLE  = 1,
-    parameter PORT3_ENABLE  = 1,
-    parameter PORT4_ENABLE  = 1,
-    parameter PORT5_ENABLE  = 1,
-    parameter PORT6_ENABLE  = 1,
-    parameter PORT7_ENABLE  = 1,
-    parameter PORT8_ENABLE  = 1,
-    parameter PORT9_ENABLE  = 1,
-    parameter PORT10_ENABLE  = 1,
-    parameter PORT11_ENABLE  = 1,
-    parameter PORT12_ENABLE  = 1,
-    parameter PORT13_ENABLE  = 1,
-    parameter PORT14_ENABLE  = 1,
-    parameter PORT15_ENABLE  = 1
-    )
-
-
-    (
-    // --------------------------------------------------------------------------
-    // Port Definitions
-    // --------------------------------------------------------------------------
-    //MODULE INPUTS
-      input  wire  [3:0]  DEC_BITS,
-      input  wire         PSEL,
-          
-    // Slave # 0
-    output wire         PSEL_S0,
-    input wire          PREADY_S0,
-    input wire  [31:0]  PRDATA_S0,
-    input wire          PSLVERR_S0,
-    // Slave # 1
-    output wire         PSEL_S1,
-    input wire          PREADY_S1,
-    input wire  [31:0]  PRDATA_S1,
-    input wire          PSLVERR_S1,
-    // Slave # 2
-    output wire         PSEL_S2,
-    input wire          PREADY_S2,
-    input wire  [31:0]  PRDATA_S2,
-    input wire          PSLVERR_S2,
-    // Slave # 3
-    output wire         PSEL_S3,
-    input wire          PREADY_S3,
-    input wire  [31:0]  PRDATA_S3,
-    input wire          PSLVERR_S3,
-    // Slave # 4
-    output wire         PSEL_S4,
-    input wire          PREADY_S4,
-    input wire  [31:0]  PRDATA_S4,
-    input wire          PSLVERR_S4,
-    // Slave # 5
-    output wire         PSEL_S5,
-    input wire          PREADY_S5,
-    input wire  [31:0]  PRDATA_S5,
-    input wire          PSLVERR_S5,
-    // Slave # 6
-    output wire         PSEL_S6,
-    input wire          PREADY_S6,
-    input wire  [31:0]  PRDATA_S6,
-    input wire          PSLVERR_S6,
-    // Slave # 7
-    output wire         PSEL_S7,
-    input wire          PREADY_S7,
-    input wire  [31:0]  PRDATA_S7,
-    input wire          PSLVERR_S7,
-    // Slave # 8
-    output wire         PSEL_S8,
-    input wire          PREADY_S8,
-    input wire  [31:0]  PRDATA_S8,
-    input wire          PSLVERR_S8,
-    // Slave # 9
-    output wire         PSEL_S9,
-    input wire          PREADY_S9,
-    input wire  [31:0]  PRDATA_S9,
-    input wire          PSLVERR_S9,
-    // Slave # 10
-    output wire         PSEL_S10,
-    input wire          PREADY_S10,
-    input wire  [31:0]  PRDATA_S10,
-    input wire          PSLVERR_S10,
-    // Slave # 11
-    output wire         PSEL_S11,
-    input wire          PREADY_S11,
-    input wire  [31:0]  PRDATA_S11,
-    input wire          PSLVERR_S11,
-    // Slave # 12
-    output wire         PSEL_S12,
-    input wire          PREADY_S12,
-    input wire  [31:0]  PRDATA_S12,
-    input wire          PSLVERR_S12,
-    // Slave # 13
-    output wire         PSEL_S13,
-    input wire          PREADY_S13,
-    input wire  [31:0]  PRDATA_S13,
-    input wire          PSLVERR_S13,
-    // Slave # 14
-    output wire         PSEL_S14,
-    input wire          PREADY_S14,
-    input wire  [31:0]  PRDATA_S14,
-    input wire          PSLVERR_S14,
-    // Slave # 15
-    output wire         PSEL_S15,
-    input wire          PREADY_S15,
-    input wire  [31:0]  PRDATA_S15,
-    input wire          PSLVERR_S15,
-    //MODULE OUTPUTS
-    output wire         PREADY,
-    output wire [31:0]  PRDATA,
-    output wire         PSLVERR
-);
- 
-    wire [15:0] en  = { 
-                        (PORT15_ENABLE  == 1),
-                        (PORT14_ENABLE  == 1),
-                        (PORT13_ENABLE  == 1),
-                        (PORT12_ENABLE  == 1),
-                        (PORT11_ENABLE  == 1),
-                        (PORT10_ENABLE  == 1),
-                        (PORT9_ENABLE  == 1),
-                        (PORT8_ENABLE  == 1),
-                        (PORT7_ENABLE  == 1),
-                        (PORT6_ENABLE  == 1),
-                        (PORT5_ENABLE  == 1),
-                        (PORT4_ENABLE  == 1),
-                        (PORT3_ENABLE  == 1),
-                        (PORT2_ENABLE  == 1),
-                        (PORT1_ENABLE  == 1),
-                        (PORT0_ENABLE  == 1)
-                        };
-
-    wire [15:0] dec  = { 
-                        (DEC_BITS  == 4'd15),
-                        (DEC_BITS  == 4'd14),
-                        (DEC_BITS  == 4'd13),
-                        (DEC_BITS  == 4'd12),
-                        (DEC_BITS  == 4'd11),
-                        (DEC_BITS  == 4'd10),
-                        (DEC_BITS  == 4'd9),
-                        (DEC_BITS  == 4'd8),
-                        (DEC_BITS  == 4'd7),
-                        (DEC_BITS  == 4'd6),
-                        (DEC_BITS  == 4'd5),
-                        (DEC_BITS  == 4'd4),
-                        (DEC_BITS  == 4'd3),
-                        (DEC_BITS  == 4'd2),
-                        (DEC_BITS  == 4'd1),
-                        (DEC_BITS  == 4'd0)
-                        };
-
-
-    // Setting PSEL 
-    assign PSEL_S0 = PSEL & dec[0] & en[0];
-    assign PSEL_S1 = PSEL & dec[1] & en[1];
-    assign PSEL_S2 = PSEL & dec[2] & en[2];
-    assign PSEL_S3 = PSEL & dec[3] & en[3];
-    assign PSEL_S4 = PSEL & dec[4] & en[4];
-    assign PSEL_S5 = PSEL & dec[5] & en[5];
-    assign PSEL_S6 = PSEL & dec[6] & en[6];
-    assign PSEL_S7 = PSEL & dec[7] & en[7];
-    assign PSEL_S8 = PSEL & dec[8] & en[8];
-    assign PSEL_S9 = PSEL & dec[9] & en[9];
-    assign PSEL_S10 = PSEL & dec[10] & en[10];
-    assign PSEL_S11 = PSEL & dec[11] & en[11];
-    assign PSEL_S12 = PSEL & dec[12] & en[12];
-    assign PSEL_S13 = PSEL & dec[13] & en[13];
-    assign PSEL_S14 = PSEL & dec[14] & en[14];
-    assign PSEL_S15 = PSEL & dec[15] & en[15];
-
-    // Setting PREADY
-
-    assign PREADY = ~PSEL |
-        ( dec[0] & ( PREADY_S0 | en[0] ) ) |
-        ( dec[1] & ( PREADY_S1 | en[1] ) ) |
-        ( dec[2] & ( PREADY_S2 | en[2] ) ) |
-        ( dec[3] & ( PREADY_S3 | en[3] ) ) |
-        ( dec[4] & ( PREADY_S4 | en[4] ) ) |
-        ( dec[5] & ( PREADY_S5 | en[5] ) ) |
-        ( dec[6] & ( PREADY_S6 | en[6] ) ) |
-        ( dec[7] & ( PREADY_S7 | en[7] ) ) |
-        ( dec[8] & ( PREADY_S8 | en[8] ) ) |
-        ( dec[9] & ( PREADY_S9 | en[9] ) ) |
-        ( dec[10] & ( PREADY_S10 | en[10] ) ) |
-        ( dec[11] & ( PREADY_S11 | en[11] ) ) |
-        ( dec[12] & ( PREADY_S12 | en[12] ) ) |
-        ( dec[13] & ( PREADY_S13 | en[13] ) ) |
-        ( dec[14] & ( PREADY_S14 | en[14] ) ) |
-        ( dec[15] & ( PREADY_S15 | en[15] ) );
-
-    // Setting PSLVERR
-
-    assign PSLVERR = ( PSEL_S0 & PSLVERR_S0 ) |
-        ( PSEL_S1 & PSLVERR_S1 ) |
-        ( PSEL_S2 & PSLVERR_S2 ) |
-        ( PSEL_S3 & PSLVERR_S3 ) |
-        ( PSEL_S4 & PSLVERR_S4 ) |
-        ( PSEL_S5 & PSLVERR_S5 ) |
-        ( PSEL_S6 & PSLVERR_S6 ) |
-        ( PSEL_S7 & PSLVERR_S7 ) |
-        ( PSEL_S8 & PSLVERR_S8 ) |
-        ( PSEL_S9 & PSLVERR_S9 ) |
-        ( PSEL_S10 & PSLVERR_S10 ) |
-        ( PSEL_S11 & PSLVERR_S11 ) |
-        ( PSEL_S12 & PSLVERR_S12 ) |
-        ( PSEL_S13 & PSLVERR_S13 ) |
-        ( PSEL_S14 & PSLVERR_S14 ) |
-        ( PSEL_S15 & PSLVERR_S15 );
-
-    // Setting PRDATA
-
-    assign PRDATA = ( {32{PSEL_S0}} & PRDATA_S0 ) |
-        ( {32{PSEL_S1}} & PRDATA_S1 ) |
-        ( {32{PSEL_S2}} & PRDATA_S2 ) |
-        ( {32{PSEL_S3}} & PRDATA_S3 ) |
-        ( {32{PSEL_S4}} & PRDATA_S4 ) |
-        ( {32{PSEL_S5}} & PRDATA_S5 ) |
-        ( {32{PSEL_S6}} & PRDATA_S6 ) |
-        ( {32{PSEL_S7}} & PRDATA_S7 ) |
-        ( {32{PSEL_S8}} & PRDATA_S8 ) |
-        ( {32{PSEL_S9}} & PRDATA_S9 ) |
-        ( {32{PSEL_S10}} & PRDATA_S10 ) |
-        ( {32{PSEL_S11}} & PRDATA_S11 ) |
-        ( {32{PSEL_S12}} & PRDATA_S12 ) |
-        ( {32{PSEL_S13}} & PRDATA_S13 ) |
-        ( {32{PSEL_S14}} & PRDATA_S14 ) |
-        ( {32{PSEL_S15}} & PRDATA_S15 );
-    
-endmodule
-    
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_sys_0.v b/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_sys_0.v
deleted file mode 100644
index 4fd19ac..0000000
--- a/verilog/rtl/user_project/rtl/AHB_sys_0/APB_sys_0/APB_sys_0.v
+++ /dev/null
@@ -1,756 +0,0 @@
-
-`timescale 1ns/1ns
-module apb_sys_0(
-    // Global signals 
-    input wire          HCLK,
-    input wire          HRESETn,
-
-    // AHB Slave inputs 
-    input wire  [31:0]  HADDR,
-    input wire  [1:0]   HTRANS,
-    input wire          HWRITE,
-    input wire  [31:0]  HWDATA,
-    input wire          HSEL,
-    input wire          HREADY,
-
-    // AHB Slave outputs 
-    output wire [31:0]  HRDATA,
-    output wire         HREADYOUT,
-	input wire [0: 0] RsRx_S0,
-	output wire [0: 0] RsTx_S0,
-
-	input wire [0: 0] RsRx_S1,
-	output wire [0: 0] RsTx_S1,
-
-	input wire [0: 0] MSI_S2,
-	output wire [0: 0] MSO_S2,
-	output wire [0: 0] SSn_S2,
-	output wire [0: 0] SCLK_S2,
-
-	input wire [0: 0] MSI_S3,
-	output wire [0: 0] MSO_S3,
-	output wire [0: 0] SSn_S3,
-	output wire [0: 0] SCLK_S3,
-
-	input wire [0: 0] scl_i_S4,
-	output wire [0: 0] scl_o_S4,
-	output wire [0: 0] scl_oen_o_S4,
-	input wire [0: 0] sda_i_S4,
-	output wire [0: 0] sda_o_S4,
-	output wire [0: 0] sda_oen_o_S4,
-
-	input wire [0: 0] scl_i_S5,
-	output wire [0: 0] scl_o_S5,
-	output wire [0: 0] scl_oen_o_S5,
-	input wire [0: 0] sda_i_S5,
-	output wire [0: 0] sda_o_S5,
-	output wire [0: 0] sda_oen_o_S5,
-
-	output wire [0: 0] pwm_S6,
-	output wire [0: 0] pwm_S7,
-
-    output [31:16] IRQ
-);
-    
-    // APB Master Signals
-    wire PCLK;
-    wire PRESETn;
-    wire [31:0] PADDR;
-    wire PWRITE;
-    wire [31:0] PWDATA;
-    wire PENABLE;
-    
-    // APB Slave Signals
-    wire PREADY;
-    wire [31:0] PRDATA ;
-    wire 		PSLVERR;
-
-    //ADDED PSEL Signal
-    //wire PSEL = HSEL; 
-    wire PSEL_next = HSEL;
-    reg PSEL_next_next;
-    reg PSEL;
-    always @ (posedge HCLK, negedge HRESETn)
-    begin
-        if(!HRESETn)
-        PSEL <= 1'b0;
-        else begin
-            PSEL_next_next <= PSEL_next;
-            PSEL <= PSEL_next | PSEL_next_next;
-        end
-    end
-    //Instantiating the bridge
-
-    ahb_2_apb AHB2APB_BR (
-        .HCLK(HCLK),
-        .HRESETn(HRESETn),
-        .HADDR(HADDR[31:0]),
-        .HSEL(HSEL),
-        .HREADY(HREADY),
-        .HTRANS(HTRANS[1:0]),
-        .HWDATA(HWDATA[31:0]),
-        .HWRITE(HWRITE),
-        .HRDATA(HRDATA),
-        .HREADYOUT(HREADYOUT),
-        .PCLK(PCLK),
-        .PRESETn(PRESETn),
-        .PADDR(PADDR[31:0]),
-        .PWRITE(PWRITE),
-        .PWDATA(PWDATA[31:0]),
-        .PENABLE(PENABLE),
-        .PREADY(PREADY),
-        .PRDATA(PRDATA[31:0])
-    );
-        
-        
-    //Bus Signals
-        
-    //Slave #0
-    wire PSEL_S0;
-    wire [31:0] PRDATA_S0;
-    wire PREADY_S0;
-    wire PSLVERR_S0;
-    
-    //Slave #1
-    wire PSEL_S1;
-    wire [31:0] PRDATA_S1;
-    wire PREADY_S1;
-    wire PSLVERR_S1;
-    
-    //Slave #2
-    wire PSEL_S2;
-    wire [31:0] PRDATA_S2;
-    wire PREADY_S2;
-    wire PSLVERR_S2;
-    
-    //Slave #3
-    wire PSEL_S3;
-    wire [31:0] PRDATA_S3;
-    wire PREADY_S3;
-    wire PSLVERR_S3;
-    
-    //Slave #4
-    wire PSEL_S4;
-    wire [31:0] PRDATA_S4;
-    wire PREADY_S4;
-    wire PSLVERR_S4;
-    
-    //Slave #5
-    wire PSEL_S5;
-    wire [31:0] PRDATA_S5;
-    wire PREADY_S5;
-    wire PSLVERR_S5;
-    
-    //Slave #6
-    wire PSEL_S6;
-    wire [31:0] PRDATA_S6;
-    wire PREADY_S6;
-    wire PSLVERR_S6;
-    
-    //Slave #7
-    wire PSEL_S7;
-    wire [31:0] PRDATA_S7;
-    wire PREADY_S7;
-    wire PSLVERR_S7;
-    
-    //Slave #8
-    wire PSEL_S8;
-    wire [31:0] PRDATA_S8;
-    wire PREADY_S8;
-    wire PSLVERR_S8;
-    
-    //Slave #9
-    wire PSEL_S9;
-    wire [31:0] PRDATA_S9;
-    wire PREADY_S9;
-    wire PSLVERR_S9;
-    
-    //Slave #10
-    wire PSEL_S10;
-    wire [31:0] PRDATA_S10;
-    wire PREADY_S10;
-    wire PSLVERR_S10;
-    
-    //Slave #11
-    wire PSEL_S11;
-    wire [31:0] PRDATA_S11;
-    wire PREADY_S11;
-    wire PSLVERR_S11;
-    
-    //Slave #12
-    wire PSEL_S12;
-    wire [31:0] PRDATA_S12;
-    wire PREADY_S12;
-    wire PSLVERR_S12;
-    
-    //Slave #13
-    wire PSEL_S13;
-    wire [31:0] PRDATA_S13;
-    wire PREADY_S13;
-    wire PSLVERR_S13;
-    
-    //Unused Ports Signals
-    wire PSEL_S14;
-    wire PSEL_S15;
-
-    wire [31: 0] PRE_S6;
-    wire [31: 0] TMRCMP1_S6;
-    wire [31: 0] TMRCMP2_S6;
-    wire [0: 0] TMREN_S6;
-    wire [31: 0] PRE_S7;
-    wire [31: 0] TMRCMP1_S7;
-    wire [31: 0] TMRCMP2_S7;
-    wire [0: 0] TMREN_S7;
-    wire [31: 0] TMR_S8;
-    wire [31: 0] PRE_S8;
-    wire [31: 0] TMRCMP_S8;
-    wire [0: 0] TMROV_S8;
-    wire [0: 0] TMROVCLR_S8;
-    wire [0: 0] TMREN_S8;
-    wire [31: 0] TMR_S9;
-    wire [31: 0] PRE_S9;
-    wire [31: 0] TMRCMP_S9;
-    wire [0: 0] TMROV_S9;
-    wire [0: 0] TMROVCLR_S9;
-    wire [0: 0] TMREN_S9;
-    wire [31: 0] TMR_S10;
-    wire [31: 0] PRE_S10;
-    wire [31: 0] TMRCMP_S10;
-    wire [0: 0] TMROV_S10;
-    wire [0: 0] TMROVCLR_S10;
-    wire [0: 0] TMREN_S10;
-    wire [31: 0] TMR_S11;
-    wire [31: 0] PRE_S11;
-    wire [31: 0] TMRCMP_S11;
-    wire [0: 0] TMROV_S11;
-    wire [0: 0] TMROVCLR_S11;
-    wire [0: 0] TMREN_S11;
-    wire [31: 0] WDTMR_S12;
-    wire [31: 0] WDLOAD_S12;
-    wire [0: 0] WDOV_S12;
-    wire [0: 0] WDOVCLR_S12;
-    wire [0: 0] WDEN_S12;
-    wire [31: 0] WDTMR_S13;
-    wire [31: 0] WDLOAD_S13;
-    wire [0: 0] WDOV_S13;
-    wire [0: 0] WDOVCLR_S13;
-    wire [0: 0] WDEN_S13;
-
-    assign IRQ[31:28] = 4'd0;
-
-        //Digital module # 0
-        APB_UART S0 (
-            .PCLK(PCLK),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S0),
-            .PADDR(PADDR),
-            .PREADY(PREADY_S0),
-            .PWRITE(PWRITE),
-            .PWDATA(PWDATA),
-            .PRDATA(PRDATA_S0),
-            .PENABLE(PENABLE),
-
-            .RsRx(RsRx_S0),   
-            .RsTx(RsTx_S0),   
-            .uart_irq(IRQ[16])
-        );
-
-        //Digital module # 1
-        APB_UART S1 (
-            .PCLK(PCLK),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S1),
-            .PADDR(PADDR),
-            .PREADY(PREADY_S1),
-            .PWRITE(PWRITE),
-            .PWDATA(PWDATA),
-            .PRDATA(PRDATA_S1),
-            .PENABLE(PENABLE),
-
-            .RsRx(RsRx_S1),   
-            .RsTx(RsTx_S1),   
-            .uart_irq(IRQ[17])
-        );
-
-        //Digital module # 2
-        APB_SPI S2 (
-            .PCLK(PCLK),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S2),
-            .PADDR(PADDR),
-            .PREADY(PREADY_S2),
-            .PWRITE(PWRITE),
-            .PWDATA(PWDATA),
-            .PRDATA(PRDATA_S2),
-            .PENABLE(PENABLE),
-
-            .MSI(MSI_S2),   
-            .MSO(MSO_S2),   
-            .SSn(SSn_S2),   
-            .SCLK(SCLK_S2),
-
-            .IRQ(IRQ[18])
-        );
-
-        //Digital module # 3
-        APB_SPI S3 (
-            .PCLK(PCLK),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S3),
-            .PADDR(PADDR),
-            .PREADY(PREADY_S3),
-            .PWRITE(PWRITE),
-            .PWDATA(PWDATA),
-            .PRDATA(PRDATA_S3),
-            .PENABLE(PENABLE),
-
-            .MSI(MSI_S3),   
-            .MSO(MSO_S3),   
-            .SSn(SSn_S3),   
-            .SCLK(SCLK_S3),
-
-            .IRQ(IRQ[19])
-        );
-
-        //Digital module # 4
-        APB_I2C S4 (
-            .PCLK(PCLK),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S4),
-            .PADDR(PADDR),
-            .PREADY(PREADY_S4),
-            .PWRITE(PWRITE),
-            .PWDATA(PWDATA),
-            .PRDATA(PRDATA_S4),
-            .PENABLE(PENABLE),
-
-            .scl_i(scl_i_S4),   
-            .scl_o(scl_o_S4),   
-            .scl_oen_o(scl_oen_o_S4),   
-            .sda_i(sda_i_S4),   
-            .sda_o(sda_o_S4),   
-            .sda_oen_o(sda_oen_o_S4),
-
-            .IRQ(IRQ[20])
-        );
-
-        //Digital module # 5
-        APB_I2C S5 (
-            .PCLK(PCLK),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S5),
-            .PADDR(PADDR),
-            .PREADY(PREADY_S5),
-            .PWRITE(PWRITE),
-            .PWDATA(PWDATA),
-            .PRDATA(PRDATA_S5),
-            .PENABLE(PENABLE),
-
-            .scl_i(scl_i_S5),   
-            .scl_o(scl_o_S5),   
-            .scl_oen_o(scl_oen_o_S5),   
-            .sda_i(sda_i_S5),   
-            .sda_o(sda_o_S5),   
-            .sda_oen_o(sda_oen_o_S5),
-
-            .IRQ(IRQ[21])
-        );
-
-        //Digital module # 6
-        PWM32 S6 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .PRE(PRE_S6),
-            .TMRCMP1(TMRCMP1_S6),
-            .TMRCMP2(TMRCMP2_S6),
-            .TMREN(TMREN_S6),
-
-            .pwm(pwm_S6)
-        );
-
-        //APB Slave # 6
-        APB_PWM32 S_6 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S6),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S6),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .PRE(PRE_S6),
-            .TMRCMP1(TMRCMP1_S6),
-            .TMRCMP2(TMRCMP2_S6),
-            .TMREN(TMREN_S6),
-            .PRDATA(PRDATA_S6)
-        );
-
-        //Digital module # 7
-        PWM32 S7 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .PRE(PRE_S7),
-            .TMRCMP1(TMRCMP1_S7),
-            .TMRCMP2(TMRCMP2_S7),
-            .TMREN(TMREN_S7),
-
-            .pwm(pwm_S7)
-        );
-
-        //APB Slave # 7
-        APB_PWM32 S_7 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S7),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S7),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .PRE(PRE_S7),
-            .TMRCMP1(TMRCMP1_S7),
-            .TMRCMP2(TMRCMP2_S7),
-            .TMREN(TMREN_S7),
-            .PRDATA(PRDATA_S7)
-        );
-
-        //Digital module # 8
-        TIMER32 S8 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .TMR(TMR_S8),
-            .PRE(PRE_S8),
-            .TMRCMP(TMRCMP_S8),
-            .TMROV(TMROV_S8),
-            .TMROVCLR(TMROVCLR_S8),
-            .TMREN(TMREN_S8)
-
-        );
-
-        //APB Slave # 8
-        APB_TIMER32 S_8 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S8),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S8),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .TMR(TMR_S8),
-            .PRE(PRE_S8),
-            .TMRCMP(TMRCMP_S8),
-            .TMROV(TMROV_S8),
-            .TMROVCLR(TMROVCLR_S8),
-            .TMREN(TMREN_S8),
-
-            .IRQ(IRQ[22]),
-            .PRDATA(PRDATA_S8)
-        );
-
-        //Digital module # 9
-        TIMER32 S9 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .TMR(TMR_S9),
-            .PRE(PRE_S9),
-            .TMRCMP(TMRCMP_S9),
-            .TMROV(TMROV_S9),
-            .TMROVCLR(TMROVCLR_S9),
-            .TMREN(TMREN_S9)
-
-        );
-
-        //APB Slave # 9
-        APB_TIMER32 S_9 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S9),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S9),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .TMR(TMR_S9),
-            .PRE(PRE_S9),
-            .TMRCMP(TMRCMP_S9),
-            .TMROV(TMROV_S9),
-            .TMROVCLR(TMROVCLR_S9),
-            .TMREN(TMREN_S9),
-
-            .IRQ(IRQ[23]),
-            .PRDATA(PRDATA_S9)
-        );
-
-        //Digital module # 10
-        TIMER32 S10 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .TMR(TMR_S10),
-            .PRE(PRE_S10),
-            .TMRCMP(TMRCMP_S10),
-            .TMROV(TMROV_S10),
-            .TMROVCLR(TMROVCLR_S10),
-            .TMREN(TMREN_S10)
-        );
-
-        //APB Slave # 10
-        APB_TIMER32 S_10 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S10),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S10),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .TMR(TMR_S10),
-            .PRE(PRE_S10),
-            .TMRCMP(TMRCMP_S10),
-            .TMROV(TMROV_S10),
-            .TMROVCLR(TMROVCLR_S10),
-            .TMREN(TMREN_S10),
-
-            .IRQ(IRQ[24]),
-            .PRDATA(PRDATA_S10)
-        );
-
-        //Digital module # 11
-        TIMER32 S11 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .TMR(TMR_S11),
-            .PRE(PRE_S11),
-            .TMRCMP(TMRCMP_S11),
-            .TMROV(TMROV_S11),
-            .TMROVCLR(TMROVCLR_S11),
-            .TMREN(TMREN_S11)
-
-        );
-
-        //APB Slave # 11
-        APB_TIMER32 S_11 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S11),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S11),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .TMR(TMR_S11),
-            .PRE(PRE_S11),
-            .TMRCMP(TMRCMP_S11),
-            .TMROV(TMROV_S11),
-            .TMROVCLR(TMROVCLR_S11),
-            .TMREN(TMREN_S11),
-            .IRQ(IRQ[25]),
-            .PRDATA(PRDATA_S11)
-        );
-
-        //Digital module # 12
-        WDT32 S12 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .WDTMR(WDTMR_S12),
-            .WDLOAD(WDLOAD_S12),
-            .WDOV(WDOV_S12),
-            .WDOVCLR(WDOVCLR_S12),
-            .WDEN(WDEN_S12)
-
-        );
-
-        //APB Slave # 12
-        APB_WDT32 S_12 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S12),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S12),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .WDTMR(WDTMR_S12),
-            .WDLOAD(WDLOAD_S12),
-            .WDOV(WDOV_S12),
-            .WDOVCLR(WDOVCLR_S12),
-            .WDEN(WDEN_S12),
-            .IRQ(IRQ[26]),
-            .PRDATA(PRDATA_S12)
-        );
-
-        //Digital module # 13
-        WDT32 S13 (
-            .clk(PCLK),
-            .rst(~PRESETn),
-            .WDTMR(WDTMR_S13),
-            .WDLOAD(WDLOAD_S13),
-            .WDOV(WDOV_S13),
-            .WDOVCLR(WDOVCLR_S13),
-            .WDEN(WDEN_S13)
-
-        );
-
-        //APB Slave # 13
-        APB_WDT32 S_13 (
-            .PCLK(PCLK),
-            //.PCLKG(),
-            .PRESETn(PRESETn),
-            .PSEL(PSEL_S13),
-            .PADDR(PADDR [19:2]),
-            .PREADY(PREADY_S13),
-            .PWRITE(PWRITE),
-            .PENABLE(PENABLE),
-            .PWDATA(PWDATA),
-
-            .WDTMR(WDTMR_S13),
-            .WDLOAD(WDLOAD_S13),
-            .WDOV(WDOV_S13),
-            .WDOVCLR(WDOVCLR_S13),
-            .WDEN(WDEN_S13),
-
-            .IRQ(IRQ[27]),
-            .PRDATA(PRDATA_S13)
-        );
-
-
-        //APB Bus
-        APB_BUS0 #(
-            .PORT0_ENABLE   (1),
-            .PORT1_ENABLE   (1),
-            .PORT2_ENABLE   (1),
-            .PORT3_ENABLE   (1),
-            .PORT4_ENABLE   (1),
-            .PORT5_ENABLE   (1),
-            .PORT6_ENABLE   (1),
-            .PORT7_ENABLE   (1),
-            .PORT8_ENABLE   (1),
-            .PORT9_ENABLE   (1),
-            .PORT10_ENABLE   (1),
-            .PORT11_ENABLE   (1),
-            .PORT12_ENABLE   (1),
-            .PORT13_ENABLE   (1),
-            .PORT14_ENABLE   (0),
-            .PORT15_ENABLE   (0)
-        )
-        apbBus(
-            // Inputs
-            .DEC_BITS   (PADDR[23:20]),
-            .PSEL       (PSEL),
-
-            .PSEL_S0         (PSEL_S0),
-            .PREADY_S0       (PREADY_S0),
-            .PRDATA_S0       (PRDATA_S0),
-            // .PSLVERR0     (timer0_pslverr),
-            .PSLVERR_S0      (1'b0),
-
-            .PSEL_S1         (PSEL_S1),
-            .PREADY_S1       (PREADY_S1),
-            .PRDATA_S1       (PRDATA_S1),
-            // .PSLVERR1     (timer1_pslverr),
-            .PSLVERR_S1      (1'b0),
-
-            .PSEL_S2         (PSEL_S2),
-            .PREADY_S2       (PREADY_S2),
-            .PRDATA_S2       (PRDATA_S2),
-            // .PSLVERR2     (timer2_pslverr),
-            .PSLVERR_S2      (1'b0),
-
-            .PSEL_S3         (PSEL_S3),
-            .PREADY_S3       (PREADY_S3),
-            .PRDATA_S3       (PRDATA_S3),
-            // .PSLVERR3     (timer3_pslverr),
-            .PSLVERR_S3      (1'b0),
-
-            .PSEL_S4         (PSEL_S4),
-            .PREADY_S4       (PREADY_S4),
-            .PRDATA_S4       (PRDATA_S4),
-            // .PSLVERR4     (timer4_pslverr),
-            .PSLVERR_S4      (1'b0),
-
-            .PSEL_S5         (PSEL_S5),
-            .PREADY_S5       (PREADY_S5),
-            .PRDATA_S5       (PRDATA_S5),
-            // .PSLVERR5     (timer5_pslverr),
-            .PSLVERR_S5      (1'b0),
-
-            .PSEL_S6         (PSEL_S6),
-            .PREADY_S6       (PREADY_S6),
-            .PRDATA_S6       (PRDATA_S6),
-            // .PSLVERR6     (timer6_pslverr),
-            .PSLVERR_S6      (1'b0),
-
-            .PSEL_S7         (PSEL_S7),
-            .PREADY_S7       (PREADY_S7),
-            .PRDATA_S7       (PRDATA_S7),
-            // .PSLVERR7     (timer7_pslverr),
-            .PSLVERR_S7      (1'b0),
-
-            .PSEL_S8         (PSEL_S8),
-            .PREADY_S8       (PREADY_S8),
-            .PRDATA_S8       (PRDATA_S8),
-            // .PSLVERR8     (timer8_pslverr),
-            .PSLVERR_S8      (1'b0),
-
-            .PSEL_S9         (PSEL_S9),
-            .PREADY_S9       (PREADY_S9),
-            .PRDATA_S9       (PRDATA_S9),
-            // .PSLVERR9     (timer9_pslverr),
-            .PSLVERR_S9      (1'b0),
-
-            .PSEL_S10         (PSEL_S10),
-            .PREADY_S10       (PREADY_S10),
-            .PRDATA_S10       (PRDATA_S10),
-            // .PSLVERR10     (timer10_pslverr),
-            .PSLVERR_S10      (1'b0),
-
-            .PSEL_S11         (PSEL_S11),
-            .PREADY_S11       (PREADY_S11),
-            .PRDATA_S11       (PRDATA_S11),
-            // .PSLVERR11     (timer11_pslverr),
-            .PSLVERR_S11      (1'b0),
-
-            .PSEL_S12         (PSEL_S12),
-            .PREADY_S12       (PREADY_S12),
-            .PRDATA_S12       (PRDATA_S12),
-            // .PSLVERR12     (timer12_pslverr),
-            .PSLVERR_S12      (1'b0),
-
-            .PSEL_S13         (PSEL_S13),
-            .PREADY_S13       (PREADY_S13),
-            .PRDATA_S13       (PRDATA_S13),
-            // .PSLVERR13     (timer13_pslverr),
-            .PSLVERR_S13      (1'b0),
-
-            .PSEL_S14         (PSEL_S14),
-            .PREADY_S14       (1'b1),
-            .PRDATA_S14       (32'h00000000),
-            .PSLVERR_S14      (1'b0),
-
-            .PSEL_S15         (PSEL_S15),
-            .PREADY_S15       (1'b1),
-            .PRDATA_S15       (32'h00000000),
-            .PSLVERR_S15      (1'b0),
-
-            // Output
-            .PREADY            (PREADY),
-            .PRDATA            (PRDATA),
-            .PSLVERR           (PSLVERR)
-        );
-       
-endmodule
-    
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/DFFRFile.v b/verilog/rtl/user_project/rtl/DFFRFile.v
deleted file mode 100644
index 9fb40b2..0000000
--- a/verilog/rtl/user_project/rtl/DFFRFile.v
+++ /dev/null
@@ -1,140 +0,0 @@
-/* 
-	DFFRFile
-	32x32 Register File with 2RW1W ports and clock gating for SKY130A 
-	~ 3550 Cells
-	< 2ns (no input or output delays)
-*/
-/*
-    	Author: Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-
-`timescale 1ns / 1ps
-`default_nettype none
-
-module DFFRFile (
-	input [4:0] 	R1, R2, RW,
-	input [31:0] 	DW,
-	output [31:0]	D1, D2,
-	input CLK,
-	input WE
-);
-
-	wire [31:0] sel1, sel2, selw;
-
-	DEC5x32 DEC0 ( .A(R1), .SEL(sel1) );
-	DEC5x32 DEC1 ( .A(R2), .SEL(sel2) );
-	DEC5x32 DEC2 ( .A(RW), .SEL(selw) );
-	
-	RFWORD0 RFW0 ( .CLK(CLK), .WE(), .SEL1(sel1[0]), .SEL2(sel2[0]), .SELW(), .D1(D1), .D2(D2), .DW() );	
-
-	generate
-		genvar e;
-		for(e=1; e<32; e=e+1)
-			RFWORD RFW ( .CLK(CLK), .WE(WE), .SEL1(sel1[e]), .SEL2(sel2[e]), .SELW(selw[e]), .D1(D1), .D2(D2), .DW(DW) );	
-	endgenerate
-
-endmodule
-module RFWORD (
-    input CLK,
-    input WE,
-    input SEL1, SEL2, SELW,
-    output [31:0] D1, D2,
-    input [31:0] DW
-);
-
-    wire [31:0]  q_wire;
-    wire   we_wire;
-    wire [3:0]   SEL1_B, SEL2_B;
-    wire [3:0]  GCLK;
-
-    sky130_fd_sc_hd__inv_2 INV1[3:0] (.Y(SEL1_B), .A(SEL1));
-	sky130_fd_sc_hd__inv_2 INV2[3:0] (.Y(SEL2_B), .A(SEL2));
-
-    sky130_fd_sc_hd__and2_1 CGAND ( .A(SELW), .B(WE), .X(we_wire) );
-    sky130_fd_sc_hd__dlclkp_1 CG[3:0] ( .CLK(CLK), .GCLK(GCLK), .GATE(we_wire) );
-
-    generate 
-        genvar i;
-        for(i=0; i<32; i=i+1) begin : BIT
-            sky130_fd_sc_hd__dfxtp_1 FF ( .D(DW[i]), .Q(q_wire[i]), .CLK(GCLK[i/8]) );
-            sky130_fd_sc_hd__ebufn_2 OBUF1 ( .A(q_wire[i]), .Z(D1[i]), .TE_B(SEL1_B[i/8]) );
-			sky130_fd_sc_hd__ebufn_2 OBUF2 ( .A(q_wire[i]), .Z(D2[i]), .TE_B(SEL2_B[i/8]) );
-        end
-		
-    endgenerate 
-endmodule
-
-module RFWORD0 (
-    input CLK,
-    input WE,
-    input SEL1, SEL2, SELW,
-    output [31:0] D1, D2,
-    input [31:0] DW
-);
-
-    wire [31:0]  q_wire;
-    wire   we_wire;
-    wire [3:0]   SEL1_B, SEL2_B;
-    wire [3:0]  GCLK;
-	wire [1:0]	lo;
-
-    sky130_fd_sc_hd__inv_2 INV1[3:0] (.Y(SEL1_B), .A(SEL1));
-	sky130_fd_sc_hd__inv_2 INV2[3:0] (.Y(SEL2_B), .A(SEL2));
-
-	sky130_fd_sc_hd__conb_1 TIE [1:0] (.LO(lo), .HI());
-
-    //sky130_fd_sc_hd__and2_1 CGAND ( .A(SELW), .B(WE), .X(we_wire) );
-    //sky130_fd_sc_hd__dlclkp_1 CG[3:0] ( .CLK(CLK), .GCLK(GCLK), .GATE(we_wire) );
-
-    generate 
-        genvar i;
-        for(i=0; i<32; i=i+1) begin : BIT
-            //sky130_fd_sc_hd__dfxtp_1 FF ( .D(DW[i]), .Q(q_wire[i]), .CLK(GCLK[i/8]) );
-            sky130_fd_sc_hd__ebufn_2 OBUF1 ( .A(lo[0]), .Z(D1[i]), .TE_B(SEL1_B[i/8]) );
-			sky130_fd_sc_hd__ebufn_2 OBUF2 ( .A(lo[1]), .Z(D2[i]), .TE_B(SEL2_B[i/8]) );
-        end
-		
-    endgenerate 
-endmodule
-
-/*
-module DEC2x4 (
-    input           EN,
-    input   [1:0]   A,
-    output  [3:0]   SEL
-);
-    sky130_fd_sc_hd__nor3b_4    AND0 ( .Y(SEL[0]), .A(A[0]),   .B(A[1]), .C_N(EN) );
-    sky130_fd_sc_hd__and3b_4    AND1 ( .X(SEL[1]), .A_N(A[1]), .B(A[0]), .C(EN) );
-    sky130_fd_sc_hd__and3b_4    AND2 ( .X(SEL[2]), .A_N(A[0]), .B(A[1]), .C(EN) );
-    sky130_fd_sc_hd__and3_4     AND3 ( .X(SEL[3]), .A(A[1]),   .B(A[0]), .C(EN) );
-    
-endmodule
-
-module DEC3x8 (
-    input           EN,
-    input [2:0]     A,
-    output [7:0]    SEL
-);
-    sky130_fd_sc_hd__nor4b_2   AND0 ( .Y(SEL[0])  , .A(A[0]), .B(A[1])  , .C(A[2]), .D_N(EN) ); // 000
-    sky130_fd_sc_hd__and4bb_2   AND1 ( .X(SEL[1])  , .A_N(A[2]), .B_N(A[1]), .C(A[0])  , .D(EN) ); // 001
-    sky130_fd_sc_hd__and4bb_2   AND2 ( .X(SEL[2])  , .A_N(A[2]), .B_N(A[0]), .C(A[1])  , .D(EN) ); // 010
-    sky130_fd_sc_hd__and4b_2    AND3 ( .X(SEL[3])  , .A_N(A[2]), .B(A[1]), .C(A[0])  , .D(EN) );   // 011
-    sky130_fd_sc_hd__and4bb_2   AND4 ( .X(SEL[4])  , .A_N(A[0]), .B_N(A[1]), .C(A[2])  , .D(EN) ); // 100
-    sky130_fd_sc_hd__and4b_2    AND5 ( .X(SEL[5])  , .A_N(A[1]), .B(A[0]), .C(A[2])  , .D(EN) );   // 101
-    sky130_fd_sc_hd__and4b_2    AND6 ( .X(SEL[6])  , .A_N(A[0]), .B(A[1]), .C(A[2])  , .D(EN) );   // 110
-    sky130_fd_sc_hd__and4_2     AND7 ( .X(SEL[7])  , .A(A[0]), .B(A[1]), .C(A[2])  , .D(EN) ); // 111
-endmodule
-*/
-
-module DEC5x32 (
-    input   [4:0]   A,
-    output  [31:0]   SEL
-);
-	wire [3:0] EN;
-	DEC3x8 D0 ( .A(A[2:0]), .SEL(SEL[7:0]), .EN(EN[0]) );
-	DEC3x8 D1 ( .A(A[2:0]), .SEL(SEL[15:8]), .EN(EN[1]) );
-	DEC3x8 D2 ( .A(A[2:0]), .SEL(SEL[23:16]), .EN(EN[2]) );
-	DEC3x8 D3 ( .A(A[2:0]), .SEL(SEL[31:24]), .EN(EN[3]) );
-
-	DEC2x4 D ( .A(A[4:3]), .SEL(EN), .EN(1'b1) );
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/AHBSRAM.v b/verilog/rtl/user_project/rtl/IPs/AHBSRAM.v
deleted file mode 100644
index ed0c1c1..0000000
--- a/verilog/rtl/user_project/rtl/IPs/AHBSRAM.v
+++ /dev/null
@@ -1,334 +0,0 @@
-/*
-module AHBSRAM#( parameter AW = 14)( // Address width 
-     input           HCLK,      // system bus clock 
-     input           HRESETn,   // system bus reset 
-     input           HSEL,      // AHB peripheral select 
-     input           HREADY,    // AHB ready input 
-     input     [1:0] HTRANS,    // AHB transfer type 
-     input     [2:0] HSIZE,     // AHB hsize 
-     input           HWRITE,    // AHB hwrite 
-     input  [AW-1:0] HADDR,     // AHB address bus 
-     input    [31:0] HWDATA,    // AHB write data bus 
-     output          HREADYOUT, // AHB ready output to S->M mux 
-     output          HRESP,     // AHB response 
-     output   [31:0] HRDATA,    // AHB read data bus 
-      
-     input    [31:0] SRAMRDATA, // SRAM Read Data 
-     output [AW-3:0] SRAMADDR,  // SRAM address 
-     output    [3:0] SRAMWEN,   // SRAM write enable (active high) 
-     output   [31:0] SRAMWDATA, // SRAM write data 
-     output          SRAMCS     // SRAM Chip Select  (active high) 
-   ); 
-   reg  [(AW-3):0] buf_addr; // Write address buffer   
-   reg  [ 3:0]     buf_we;   // Write enable buffer (data phase)  
-   reg             buf_hit;  // High when AHB read address  
-                             // matches buffered address 
-   reg  [31:0]     buf_data; // AHB write bus buffered  
-   reg             buf_pend; // Buffer write data valid  
-   reg                       buf_data_en;//Data buffer write enable (data phase) 
-   wire  ahb_access   = HTRANS[1] & HSEL & HREADY; 
-   wire  ahb_write    = ahb_access &  HWRITE; 
-   wire  ahb_read     = ahb_access & (~HWRITE); 
-    
-   // Stored write data in pending state if new transfer is read 
-   //   buf_data_en indicate new write (data phase) 
-   //   ahb_read    indicate new read  (address phase) 
-   //   buf_pend    is registered version of buf_pend_nxt 
-   wire        buf_pend_nxt = (buf_pend | buf_data_en) & ahb_read; 
-   
-   // RAM write happens when  
-   // - write pending (buf_pend), or 
-   // - new AHB write seen (buf_data_en) at data phase, 
-   // - and not reading (address phase) 
-   wire        ram_write    = (buf_pend | buf_data_en)  & (~ahb_read); // ahb_write 
-   // RAM WE is the buffered WE 
-   assign      SRAMWEN  = {4{ram_write}} & buf_we[3:0]; 
-   // RAM address is the buffered address for RAM write otherwise HADDR 
-   assign      SRAMADDR = ahb_read ? HADDR[AW-1:2] : buf_addr; 
-   // RAM chip select during read or write 
-   assign      SRAMCS   = ahb_read | ram_write; 
-   // Byte lane decoder and next state logic 
-   wire       tx_byte    = (~HSIZE[1]) & (~HSIZE[0]); 
-   wire       tx_half    = (~HSIZE[1]) &  HSIZE[0]; 
-   wire       tx_word    =   HSIZE[1]; 
-   wire       byte_at_00 = tx_byte & (~HADDR[1]) & (~HADDR[0]); 
-   wire       byte_at_01 = tx_byte & (~HADDR[1]) &   HADDR[0]; 
-   wire       byte_at_10 = tx_byte &   HADDR[1]  & (~HADDR[0]); 
-   wire       byte_at_11 = tx_byte &   HADDR[1]  &   HADDR[0]; 
-   wire       half_at_00 = tx_half & (~HADDR[1]); 
-   wire       half_at_10 = tx_half &   HADDR[1]; 
-   wire       word_at_00 = tx_word; 
-   wire       byte_sel_0 = word_at_00 | half_at_00 | byte_at_00; 
-   wire       byte_sel_1 = word_at_00 | half_at_00 | byte_at_01; 
-   wire       byte_sel_2 = word_at_00 | half_at_10 | byte_at_10; 
-   wire       byte_sel_3 = word_at_00 | half_at_10 | byte_at_11; 
-  // Address phase byte lane strobe 
-   wire [3:0] buf_we_nxt ={byte_sel_3 & ahb_write, byte_sel_2 & ahb_write, 
-                           byte_sel_1 & ahb_write,byte_sel_0 & ahb_write};  
-   // buf_data_en is data phase write control 
-   always @(posedge HCLK or negedge HRESETn) 
-     if (~HRESETn) 
-       buf_data_en <= 1'b0; 
-     else   
-       buf_data_en <= ahb_write; 
- 
-   always @(posedge HCLK) 
-     if(buf_we[3] & buf_data_en) 
-       buf_data[31:24] <= HWDATA[31:24]; 
- 
-   always @(posedge HCLK) 
-     if(buf_we[2] & buf_data_en) 
-       buf_data[23:16] <= HWDATA[23:16]; 
-  
-   always @(posedge HCLK) 
-     if(buf_we[1] & buf_data_en) 
-       buf_data[15: 8] <= HWDATA[15: 8]; 
-       
-   always @(posedge HCLK) 
-     if(buf_we[0] & buf_data_en) 
-       buf_data[ 7: 0] <= HWDATA[ 7: 0]; 
- 
-   // buf_we keep the valid status of each byte (data phase) 
-   always @(posedge HCLK or negedge HRESETn) 
-     if (~HRESETn) 
-       buf_we <= 4'b0000; 
-     else if(ahb_write) 
-       buf_we <= buf_we_nxt; 
- 
-   always @(posedge HCLK or negedge HRESETn) 
-     begin 
-     if (~HRESETn) 
-       buf_addr <= {(AW-2){1'b0}}; 
-     else if (ahb_write) 
-         buf_addr <= HADDR[(AW-1):2]; 
-     end 
-   // Buf_hit detection logic 
-   wire  buf_hit_nxt = (HADDR[AW-1:2] == buf_addr[AW-3:0]); 
-   // ---------------------------------------------------------- 
-   // Read data merge : This is for the case when there is a AHB  
-   // write followed by AHB read to the same address. In this case 
-   // the data is merged from the buffer as the RAM write to that 
-   // address hasn't happened yet 
-   // ---------------------------------------------------------- 
-   wire [ 3:0] merge1  = {4{buf_hit}} & buf_we; // data phase, buf_we indicates data is valid 
-   assign HRDATA={merge1[3] ? buf_data[31:24] : SRAMRDATA[31:24], 
-                  merge1[2] ? buf_data[23:16] : SRAMRDATA[23:16], 
-                  merge1[1] ? buf_data[15: 8] : SRAMRDATA[15: 8], 
-                  merge1[0] ? buf_data[ 7: 0] : SRAMRDATA[ 7: 0]}; 
- 
-   // Synchronous state update 
-   always @(posedge HCLK or negedge HRESETn) 
-     if (~HRESETn) 
-       buf_hit <= 1'b0; 
-     else if(ahb_read) 
-       buf_hit <= buf_hit_nxt; 
- 
-   always @(posedge HCLK or negedge HRESETn) 
-     if (~HRESETn) 
-       buf_pend <= 1'b0; 
-     else 
-       buf_pend <= buf_pend_nxt; 
- 
-   // if there is an AHB write and valid data in the buffer, RAM write data 
-   // comes from the buffer. otherwise comes from the HWDATA 
-   assign SRAMWDATA = (buf_pend) ? buf_data : HWDATA[31:0]; 
-   assign HREADYOUT = 1'b1; 
-   assign HRESP     = 1'b0; 
-endmodule 
-*/
-module AHBSRAM #(
-// --------------------------------------------------------------------------
-// Parameter Declarations
-// --------------------------------------------------------------------------
-  parameter AW       = 14) // Address width
- (
-// --------------------------------------------------------------------------
-// Port Definitions
-// --------------------------------------------------------------------------
-  input  wire          HCLK,      // system bus clock
-  input  wire          HRESETn,   // system bus reset
-  input  wire          HSEL,      // AHB peripheral select
-  input  wire          HREADY,    // AHB ready input
-  input  wire    [1:0] HTRANS,    // AHB transfer type
-  input  wire    [2:0] HSIZE,     // AHB hsize
-  input  wire          HWRITE,    // AHB hwrite
-  input  wire [31:0] HADDR,     // AHB address bus
-  input  wire   [31:0] HWDATA,    // AHB write data bus
-  output wire          HREADYOUT, // AHB ready output to S->M mux
-  output wire   [1:0]       HRESP,     // AHB response
-  output wire   [31:0] HRDATA,    // AHB read data bus
-
-  input  wire   [31:0] SRAMRDATA, // SRAM Read Data
-  output wire    [3:0] SRAMWEN,   // SRAM write enable (active high)
-  output wire   [31:0] SRAMWDATA, // SRAM write data
-  output wire          SRAMCS0,
-  //output wire          SRAMCS1,
-  //output wire          SRAMCS2,
-  //output wire          SRAMCS3,
-  output wire [AW:0]   SRAMADDR  // SRAM address
-);   // SRAM Chip Select  (active high)
-
-   // ----------------------------------------------------------
-   // Internal state
-   // ----------------------------------------------------------
-   reg  [(AW-3 - 0):0]           buf_addr;        // Write address buffer
-   reg  [ 3:0]               buf_we;          // Write enable buffer (data phase)
-   reg                       buf_hit;         // High when AHB read address
-                                              // matches buffered address
-   reg  [31:0]               buf_data;        // AHB write bus buffered
-   reg                       buf_pend;        // Buffer write data valid
-   reg                       buf_data_en;     // Data buffer write enable (data phase)
-
-   // ----------------------------------------------------------
-   // Read/write control logic
-   // ----------------------------------------------------------
-
-   wire        ahb_access   = HTRANS[1] & HSEL & HREADY;
-   wire        ahb_write    = ahb_access &  HWRITE;
-   wire        ahb_read     = ahb_access & (~HWRITE);
-
-
-   // Stored write data in pending state if new transfer is read
-   //   buf_data_en indicate new write (data phase)
-   //   ahb_read    indicate new read  (address phase)
-   //   buf_pend    is registered version of buf_pend_nxt
-   wire        buf_pend_nxt = (buf_pend | buf_data_en) & ahb_read;
-
-   // RAM write happens when
-   // - write pending (buf_pend), or
-   // - new AHB write seen (buf_data_en) at data phase,
-   // - and not reading (address phase)
-   wire        ram_write    = (buf_pend | buf_data_en)  & (~ahb_read); // ahb_write
-
-   // RAM WE is the buffered WE
-   assign      SRAMWEN  = {4{ram_write}} & buf_we[3:0];
-
-   // RAM address is the buffered address for RAM write otherwise HADDR
-   assign      SRAMADDR = ahb_read ? HADDR[AW-1:2] : buf_addr;
-
-   // RAM chip select during read or write
-   wire SRAMCS_src; 
-   assign      SRAMCS_src   = ahb_read | ram_write;
-   assign SRAMCS0 = SRAMCS_src; // & (~HADDR[AW + 3]) & (~HADDR[AW + 2]);
-   //assign SRAMCS1 = SRAMCS_src & (~HADDR[AW + 3]) & (HADDR[AW + 2]);
-   //assign SRAMCS2 = SRAMCS_src & (HADDR[AW + 3]) & (~HADDR[AW + 2]);
-   //assign SRAMCS3 = SRAMCS_src & (HADDR[AW + 3]) & (HADDR[AW + 2]);
-   // ----------------------------------------------------------
-   // Byte lane decoder and next state logic
-   // ----------------------------------------------------------
-
-   wire       tx_byte    = (~HSIZE[1]) & (~HSIZE[0]);
-   wire       tx_half    = (~HSIZE[1]) &  HSIZE[0];
-   wire       tx_word    =   HSIZE[1];
-
-   wire       byte_at_00 = tx_byte & (~HADDR[1]) & (~HADDR[0]);
-   wire       byte_at_01 = tx_byte & (~HADDR[1]) &   HADDR[0];
-   wire       byte_at_10 = tx_byte &   HADDR[1]  & (~HADDR[0]);
-   wire       byte_at_11 = tx_byte &   HADDR[1]  &   HADDR[0];
-
-   wire       half_at_00 = tx_half & (~HADDR[1]);
-   wire       half_at_10 = tx_half &   HADDR[1];
-
-   wire       word_at_00 = tx_word;
-
-   wire       byte_sel_0 = word_at_00 | half_at_00 | byte_at_00;
-   wire       byte_sel_1 = word_at_00 | half_at_00 | byte_at_01;
-   wire       byte_sel_2 = word_at_00 | half_at_10 | byte_at_10;
-   wire       byte_sel_3 = word_at_00 | half_at_10 | byte_at_11;
-
-   // Address phase byte lane strobe
-   wire [3:0] buf_we_nxt = { byte_sel_3 & ahb_write,
-                             byte_sel_2 & ahb_write,
-                             byte_sel_1 & ahb_write,
-                             byte_sel_0 & ahb_write };
-
-   // ----------------------------------------------------------
-   // Write buffer
-   // ----------------------------------------------------------
-
-   // buf_data_en is data phase write control
-   always @(posedge HCLK or negedge HRESETn)
-     if (~HRESETn)
-       buf_data_en <= 1'b0;
-     else
-       buf_data_en <= ahb_write;
-
-   always @(posedge HCLK)
-     if(buf_we[3] & buf_data_en)
-       buf_data[31:24] <= HWDATA[31:24];
-
-   always @(posedge HCLK)
-     if(buf_we[2] & buf_data_en)
-       buf_data[23:16] <= HWDATA[23:16];
-
-   always @(posedge HCLK)
-     if(buf_we[1] & buf_data_en)
-       buf_data[15: 8] <= HWDATA[15: 8];
-
-   always @(posedge HCLK)
-     if(buf_we[0] & buf_data_en)
-       buf_data[ 7: 0] <= HWDATA[ 7: 0];
-
-   // buf_we keep the valid status of each byte (data phase)
-   always @(posedge HCLK or negedge HRESETn)
-     if (~HRESETn)
-       buf_we <= 4'b0000;
-     else if(ahb_write)
-       buf_we <= buf_we_nxt;
-
-   always @(posedge HCLK or negedge HRESETn)
-     begin
-     if (~HRESETn)
-       buf_addr <= {(AW-2){1'b0}};
-     else if (ahb_write)
-         buf_addr <= HADDR[(AW-1):2];
-     end
-   // ----------------------------------------------------------
-   // Buf_hit detection logic
-   // ----------------------------------------------------------
-
-   wire  buf_hit_nxt = (HADDR[AW-1:2] == buf_addr[AW-3 - 0:0]);
-
-   // ----------------------------------------------------------
-   // Read data merge : This is for the case when there is a AHB
-   // write followed by AHB read to the same address. In this case
-   // the data is merged from the buffer as the RAM write to that
-   // address hasn't happened yet
-   // ----------------------------------------------------------
-
-   wire [ 3:0] merge1  = {4{buf_hit}} & buf_we; // data phase, buf_we indicates data is valid
-
-   assign HRDATA =
-              { merge1[3] ? buf_data[31:24] : SRAMRDATA[31:24],
-                merge1[2] ? buf_data[23:16] : SRAMRDATA[23:16],
-                merge1[1] ? buf_data[15: 8] : SRAMRDATA[15: 8],
-                merge1[0] ? buf_data[ 7: 0] : SRAMRDATA[ 7: 0] };
-
-   // ----------------------------------------------------------
-   // Synchronous state update
-   // ----------------------------------------------------------
-
-   always @(posedge HCLK or negedge HRESETn)
-     if (~HRESETn)
-       buf_hit <= 1'b0;
-     else if(ahb_read)
-       buf_hit <= buf_hit_nxt;
-
-   always @(posedge HCLK or negedge HRESETn)
-     if (~HRESETn)
-       buf_pend <= 1'b0;
-     else
-       buf_pend <= buf_pend_nxt;
-
-   // if there is an AHB write and valid data in the buffer, RAM write data
-   // comes from the buffer. otherwise comes from the HWDATA
-   assign SRAMWDATA = (buf_pend) ? buf_data : HWDATA[31:0];
-
-   // ----------------------------------------------------------
-   // Assign outputs
-   // ----------------------------------------------------------
-   assign HREADYOUT = 1'b1;
-   assign HRESP     = 2'b0;
-
-
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/APB_I2C.v b/verilog/rtl/user_project/rtl/IPs/APB_I2C.v
deleted file mode 100644
index 1840960..0000000
--- a/verilog/rtl/user_project/rtl/IPs/APB_I2C.v
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
-	Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-/*
-	APB interface for the OC i2c master controller.
-	The registers:
-
-*/
-
-`timescale 1ns/1ps
-`default_nettype none
-
-module APB_I2C(
-    //APB Inputs
-    input wire PCLK,
-    input wire PRESETn,
-    input wire PWRITE,
-    input wire [31:0] PWDATA,
-    input wire [31:0] PADDR,
-    input wire PENABLE,
-    
-    input PSEL,
-    
-    //APB Outputs
-    output wire PREADY,
-    output wire [31:0] PRDATA,
-
-	output wire IRQ,
-
-    // i2c Ports
-    input 	wire scl_i,	    // SCL-line input
-	output 	wire scl_o,	    // SCL-line output (always 1'b0)
-	output 	wire scl_oen_o, // SCL-line output enable (active low)
-	input	wire sda_i,     // SDA-line input
-	output	wire sda_o,	    // SDA-line output (always 1'b0)
-	output	wire sda_oen_o // SDA-line output enable (active low)
-    
-);
-
-  assign PREADY = 1'b1; //always ready
-  
-  wire[7:0] io_do;
-  wire io_we = PENABLE & PWRITE & PREADY & PSEL;
-  wire io_re = PENABLE & ~PWRITE & PREADY & PSEL;
-
-  wire i2c_irq;
-
-  reg I2C_IM_REG;
-
-  assign IRQ = i2c_irq & I2C_IM_REG;
-
-  // IM Register -- Size: 1 -- Offset: 0x14
-  always @(posedge PCLK, negedge PRESETn)
-  begin
-    if(!PRESETn)
-    begin
-      I2C_IM_REG <= 1'b0;
-    end
-    else if(PENABLE & PWRITE & PREADY & PSEL & (PADDR[4:2] == 3'h7))
-      I2C_IM_REG <= PWDATA[0:0];
-  end
-
-
-  i2c_master i2c (
-    		.sys_clk(PCLK),
-    		.sys_rst(~PRESETn),
-    		//
-    		.io_a(PADDR[7:2]),
-		    .io_di(PWDATA[7:0]),
-			.io_do(io_do),
-			.io_re(io_re),
-			.io_we(io_we),
-			//
-			.i2c_irq(i2c_irq),
-			//
-			.scl_i(scl_i),	   // SCL-line input
-			.scl_o(scl_o),	   // SCL-line output (always 1'b0)
-			.scl_oen_o(scl_oen_o), // SCL-line output enable (active low)
-			.sda_i(sda_i),		// SDA-line input
-			.sda_o(sda_o),	   // SDA-line output (always 1'b0)
-			.sda_oen_o(sda_oen_o)  // SDA-line output enable (active low)
-	);
-  
-  assign PRDATA[31:0] = (PADDR[4:2] == 3'h7) ? I2C_IM_REG : io_do;//I2C_DATA_REG;
-  
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/APB_SPI.v b/verilog/rtl/user_project/rtl/IPs/APB_SPI.v
deleted file mode 100644
index 4e99d28..0000000
--- a/verilog/rtl/user_project/rtl/IPs/APB_SPI.v
+++ /dev/null
@@ -1,153 +0,0 @@
-/*
-	Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-/*
-  Registers
-    cfg (W): 0:cpol, 1:cpha, 8-15: clock divider  [0x08]
-    ctrl (W): 0: go, 1:ssb    [0x04]
-    status (R): 0: done       [0x10]
-    datain (W): 0-7: data in  [0x00]
-    datao (R): 0-7: data out  [0x00]
-*/
-
-`timescale 1ns/1ps
-`default_nettype none
-
-module APB_SPI(
-
-    input wire PCLK,
-    input wire PRESETn,
-    input wire PWRITE,
-    input wire [31:0] PWDATA,
-    input wire [31:0] PADDR,
-    input wire PENABLE,
-
-    input PSEL,
-
-    output wire PREADY,
-    output wire [31:0] PRDATA,
-
-    input  wire MSI,
-    output wire MSO,
-    output wire SSn,
-    output wire SCLK,
-
-    output IRQ
-
-);
-
-  reg   [7:0]   SPI_DATAi_REG;
-  wire  [7:0]   SPI_DATAo_REG;
-
-  reg   [1:0]   SPI_CTRL_REG;
-  wire          SPI_STATUS_REG;
-  reg   [9:0]   SPI_CFG_REG;
-
-  reg   [0:0]   SPI_IM_REG;
-
-  wire go, cpol, cpha, done, busy, csb;
-  wire [7:0] datai, datao, clkdiv;
-
-  // The Control Register -- Size: 2 -- offset: 4
-  always @(posedge PCLK, negedge PRESETn)
-  begin
-    if(!PRESETn)
-    begin
-      SPI_CTRL_REG <= 2'b0;
-    end
-    else if(PENABLE & PWRITE & PREADY & PSEL & PADDR[2] & ~PADDR[3] & ~PADDR[4])
-      SPI_CTRL_REG <= PWDATA[1:0];
-  end
-
-  // Configuration Register -- Size; 10 -- Offset: 8
-  always @(posedge PCLK, negedge PRESETn)
-  begin
-    if(!PRESETn)
-    begin
-      SPI_CFG_REG <= 10'b0;
-    end
-    else if(PENABLE & PWRITE & PREADY & PSEL & PADDR[3] & ~PADDR[2] & ~PADDR[4])
-      SPI_CFG_REG <= PWDATA[9:0];
-  end
-
-  // Data Register -- Size: 8 -- Offset: 0
-  always @(posedge PCLK, negedge PRESETn)
-  begin
-    if(!PRESETn)
-    begin
-      SPI_DATAi_REG <= 8'b0;
-    end
-    else if(PENABLE & PWRITE & PREADY & PSEL & ~PADDR[2] & ~PADDR[3] & ~PADDR[4])
-      SPI_DATAi_REG <= PWDATA[7:0];
-  end
-
-
-  // IM Register -- Size: 1 -- Offset: 0x14
-  always @(posedge PCLK, negedge PRESETn)
-  begin
-    if(!PRESETn)
-    begin
-      SPI_IM_REG <= 1'b0;
-    end
-    else if(PENABLE & PWRITE & PREADY & PSEL & PADDR[2] & ~PADDR[3] & PADDR[4])
-      SPI_IM_REG <= PWDATA[0:0];
-  end
-
-  assign datai          = SPI_DATAi_REG[7:0];
-  assign go             = SPI_CTRL_REG[0];
-  assign SSn            = ~SPI_CTRL_REG[1];
-  assign cpol           = SPI_CFG_REG[0];
-  assign cpha           = SPI_CFG_REG[1];
-  assign clkdiv         = SPI_CFG_REG[9:2];
-
-  assign SPI_STATUS_REG = DONE;
-  assign SPI_DATAo_REG  = datao;
-  
-  reg DONE;
-
-  always @(posedge PCLK, negedge PRESETn)
-     begin
-       if(!PRESETn)
-       begin
-         DONE <= 1'b0;
-       end
-       else if(done)
-         DONE <= 1'b1;
-       else if(go)
-         DONE <= 1'b0;
-  end
-
-  spi_master
-    #(
-      .DATA_WIDTH(8),
-      .CLK_DIVIDER_WIDTH(8)
-      ) SPI_CTRL (
-         .clk(PCLK),
-         .resetb(PRESETn),
-         .CPOL(cpol),
-         .CPHA(cpha),
-         .clk_divider(clkdiv),
-
-         .go(go),
-         .datai(datai),
-         .datao(datao),
-         //.busy(busy),
-         .done(done),
-
-         .dout(MSI),
-         .din(MSO),
-         //.csb(ss),
-         .sclk(SCLK)
-  );
-
-  assign PRDATA[31:0] = (PADDR[2] & PADDR[4]) ? {31'd0, SPI_IM_REG} :
-                        (PADDR[2]) ? {30'd0,SPI_CTRL_REG} :
-                        (PADDR[3]) ? {{22'd0,SPI_CFG_REG}} :
-                        (PADDR[4]) ? {31'd0,SPI_STATUS_REG} :
-                        {24'd0,SPI_DATAo_REG};
-
-  assign PREADY = 1'b1;
-
-  assign IRQ = SPI_IM_REG[0] & DONE;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/IPs/APB_UART.v b/verilog/rtl/user_project/rtl/IPs/APB_UART.v
deleted file mode 100644
index daddc6e..0000000
--- a/verilog/rtl/user_project/rtl/IPs/APB_UART.v
+++ /dev/null
@@ -1,724 +0,0 @@
-/*
-	Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-/*
-  APB UART that supports 8N1 with the following features
-  - 16-byte TX and RX FIFOs with programmable thresholds
-  - 16-bit prescaler (PR) for programable baud rate generation
-    Baudrate = CLK/((PR+1)*16)
-  - Four Interrupt Sources:
-    + TX Fifo not full
-    + RX Fifo not empty
-    + RX Fifo level exceeded the threshold
-    + TX Fifo level is below the threshold
-
-  offset    I/O Register
-  ------    ------------
-  00        data in/out (RW)
-  04        status: 0:TX_Full, 1: TX_Empty, 2:RX_Full, 3:RX_Empty, 4:tx_less_threshold, 5:rx_more_threshold  (R)
-  04        control: 0: Enable UART 
-  08        PRESCALER (RW)
-  0C        IM: 0: All, 1:~TX_full, 2:~RX_Empty, 3:tx_less_threshold, 4: rx_more_threshold (RW)
-*/
-
-`timescale 1ns/1ps
-`default_nettype none
-
-// `define VERIFY
-
-`define   DATA_ADDR       8'h00
-`define   STATUS_ADDR     8'h04
-`define   CTRL_ADDR       8'h04
-`define   PRESCALE_ADDR   8'h08
-`define   IMASK_ADDR      8'h0c
-`define   TXFIFOTR_ADDR   8'h10
-`define   RXFIFOTR_ADDR   8'h14
-
-
-
-module APB_UART(
-    // APB Bus Interface
-    // APB Inputs
-    input wire        PCLK,
-    input wire        PRESETn,
-    input wire        PWRITE,
-    input wire [31:0] PWDATA,
-    input wire [31:0] PADDR,
-    input wire        PENABLE,
-    input wire        PSEL,
-    // APB Outputs
-    output wire       PREADY,
-    output wire [31:0]PRDATA,
-
-    // Serial Port
-    input wire        RsRx,  
-    output wire       RsTx,  
-
-    // UART Interrupt
-    output wire       uart_irq  //Interrupt
-);
-
-
-    // I/O Registers
-    reg [1:0] STATUS;
-    reg [15:0] PRESCALE;
-    reg [4:0] IMASK;
-    reg [0:0] CTRL;
-    reg [7:0] TXFIFOTR;
-    reg [7:0] RXFIFOTR;
-
-    //Internal Signals
-
-    //Data I/O between Bus and FIFO
-    wire [7:0] uart_wdata;  
-    wire [7:0] uart_rdata;
-
-    //Signals from TX/RX to FIFOs
-    wire uart_wr;
-    wire uart_rd;
-
-    //wires between FIFO and TX/RX
-    wire [7:0] tx_data;
-    wire [7:0] rx_data;
-
-    //FIFO Status
-    wire tx_full;
-    wire tx_empty;
-    wire rx_full;
-    wire rx_empty;
-
-    //UART status ticks
-    wire tx_done;
-    wire rx_done;
-
-    //baud rate signal
-    wire b_tick;
-  
-    // FIFO level
-    wire [7:0] tx_level;
-    wire [7:0] rx_level;
-
-
-    always @(posedge PCLK, negedge PRESETn)
-      if(!PRESETn) begin
-        IMASK <= 3'd0;
-        PRESCALE <= 16'd0;
-        CTRL <= 1'b0;
-      end
-      else if(PSEL & PWRITE & PENABLE) begin
-          if(PADDR[7:0] == `PRESCALE_ADDR) PRESCALE <= PWDATA[15:0];
-          else if(PADDR[7:0] == `IMASK_ADDR) IMASK <= PWDATA[4:0]; 
-          else if(PADDR[7:0] == `CTRL_ADDR) CTRL <= PWDATA[0:0]; 
-          else if(PADDR[7:0] == `TXFIFOTR_ADDR) TXFIFOTR <= PWDATA[7:0];
-          else if(PADDR[7:0] == `RXFIFOTR_ADDR) RXFIFOTR <= PWDATA[7:0];
-          //$display("write to %d data %d, %d", PADDR[3:0], PWDATA, CTRL);
-      end
-
-
-    //assign HREADYOUT = ~tx_full;
-    assign PREADY = 1; //~tx_full;
-    
-    //UART  write select
-    //assign uart_wr = last_HTRANS[1] & last_HWRITE & last_HSEL;
-    assign uart_wr = PSEL & PWRITE & PENABLE & (PADDR[7:0]==`DATA_ADDR);
-    
-    //Only write last 8 bits of Data
-    //assign uart_wdata = HWDATA[7:0];
-    assign uart_wdata = PWDATA;
-
-    //UART read select
-    //assign uart_rd = last_HTRANS[1] & ~last_HWRITE & last_HSEL;
-    //PENABLE & PWRITE & PREADY & PSEL & ~PADDR[2])
-    assign uart_rd = PSEL & ~PWRITE & PENABLE & (PADDR[7:0]==`DATA_ADDR);
-    
-    //Assign UART output to AHB RDATA
-    //assign HRDATA = {24'h0000_00,uart_rdata};
-    assign PRDATA = (PADDR[7:0] == `DATA_ADDR )     ?   {24'h0000_00,uart_rdata}     :
-                    (PADDR[7:0] == `STATUS_ADDR )   ?   {26'h0,rx_more_threshold, tx_less_threshold ,rx_empty, rx_full ,tx_empty, tx_full}  :
-                    (PADDR[7:0] == `PRESCALE_ADDR ) ?   {16'h0, PRESCALE}            :
-                    (PADDR[7:0] == `IMASK_ADDR )    ?   {29'h0,IMASK}                : 
-                    (PADDR[7:0] == `TXFIFOTR_ADDR ) ?   {24'h0,TXFIFOTR}             : 
-                    (PADDR[7:0] == `RXFIFOTR_ADDR ) ?   {24'h0,RXFIFOTR}             :
-                                                        32'hDEADDEAD;
-    
-    wire tx_less_threshold = (tx_level < TXFIFOTR);
-    wire rx_more_threshold = (rx_level > TXFIFOTR);
-    
-
-    assign uart_irq = IMASK[0] & (  (~rx_empty & IMASK[2])  | 
-                                    (~tx_full & IMASK[1])    | 
-                                    (tx_less_threshold & IMASK[3]) | 
-                                    (rx_more_threshold & IMASK[4])
-                                  ); 
-  
-  BAUDGEN uBAUDGEN(
-    .clk(PCLK),
-    .rst_n(PRESETn),
-	  .prescale(PRESCALE),
-    .en(CTRL[0]),
-    .baudtick(b_tick)
-  );
-  
-  FIFO uFIFO_TX 
-  (
-    .clk(PCLK),
-    .rst_n(PRESETn),
-    .rd(tx_done),
-    .wr(uart_wr),
-    .w_data(uart_wdata[7:0]),
-    .empty(tx_empty),
-    .full(tx_full),
-    .r_data(tx_data[7:0]),
-    .level(tx_level)
-  );
-  
-  FIFO uFIFO_RX(
-    .clk(PCLK),
-    .rst_n(PRESETn),
-    .rd(uart_rd),
-    .wr(rx_done),
-    .w_data(rx_data[7:0]),
-    .empty(rx_empty),
-    .full(rx_full),
-    .r_data(uart_rdata[7:0]),
-    .level(rx_level)
-  );
-  
-  UART_RX uUART_RX(
-    .clk(PCLK),
-    .resetn(PRESETn),
-    .b_tick(b_tick),
-    .rx(RsRx),
-    .rx_done(rx_done),
-    .dout(rx_data[7:0])
-  );
-  
-  UART_TX uUART_TX(
-    .clk(PCLK),
-    .resetn(PRESETn),
-    .tx_start(!tx_empty),
-    .b_tick(b_tick),
-    .d_in(tx_data[7:0]),
-    .tx_done(tx_done),
-    .tx(RsTx)
-  );
-  
-  
-endmodule
-
-
-module FIFO #(parameter DWIDTH=8, AWIDTH=4)
-(
-  input wire clk,
-  input wire rst_n,
-  input wire rd,
-  input wire wr,
-  input wire [DWIDTH-1:0] w_data,
-  output wire empty,
-  output wire full,
-  output wire [DWIDTH-1:0] r_data,
-  output wire [AWIDTH-1:0] level
-);
-
-//Internal Signal declarations
-
-  reg [DWIDTH-1:0] array_reg [2**AWIDTH-1:0];
-  reg [AWIDTH-1:0] w_ptr_reg;
-  reg [AWIDTH-1:0] w_ptr_next;
-  reg [AWIDTH-1:0] w_ptr_succ;
-  reg [AWIDTH-1:0] r_ptr_reg;
-  reg [AWIDTH-1:0] r_ptr_next;
-  reg [AWIDTH-1:0] r_ptr_succ;
-
-  // Level
-  reg [AWIDTH-1:0] level_reg;
-  reg [AWIDTH-1:0] level_next; 
-  
-  reg full_reg;
-  reg empty_reg;
-  reg full_next;
-  reg empty_next;
-  
-  wire w_en;
-  
-
-  always @ (posedge clk)
-    if(w_en)
-    begin
-      array_reg[w_ptr_reg] <= w_data;
-    end
-
-  assign r_data = array_reg[r_ptr_reg];   
-
-  assign w_en = wr & ~full_reg;           
-
-//State Machine
-  always @ (posedge clk, negedge rst_n)
-  begin
-    if(!rst_n)
-      begin
-        w_ptr_reg <= 0;
-        r_ptr_reg <= 0;
-        full_reg <= 1'b0;
-        empty_reg <= 1'b1;
-        level_reg <= 4'd0;
-      end
-    else
-      begin
-        w_ptr_reg <= w_ptr_next;
-        r_ptr_reg <= r_ptr_next;
-        full_reg <= full_next;
-        empty_reg <= empty_next;
-        level_reg <= level_next;
-      end
-  end
-
-
-//Next State Logic
-  always @*
-  begin
-    w_ptr_succ = w_ptr_reg + 1;
-    r_ptr_succ = r_ptr_reg + 1;
-    
-    w_ptr_next = w_ptr_reg;
-    r_ptr_next = r_ptr_reg;
-    full_next = full_reg;
-    empty_next = empty_reg;
-    level_next = level_reg;
-    
-    case({w_en,rd})
-      //2'b00: nop
-      2'b01:
-        if(~empty_reg)
-          begin
-            r_ptr_next = r_ptr_succ;
-            full_next = 1'b0;
-            level_next = level_reg - 1;
-            if (r_ptr_succ == w_ptr_reg)
-              empty_next = 1'b1;
-          end
-      2'b10:
-        if(~full_reg)
-          begin
-            w_ptr_next = w_ptr_succ;
-            empty_next = 1'b0;
-            level_next = level_reg + 1;
-            if (w_ptr_succ == r_ptr_reg)
-              full_next = 1'b1;
-          end
-      2'b11:
-        begin
-          w_ptr_next = w_ptr_succ;
-          r_ptr_next = r_ptr_succ;
-        end
-    endcase
-  end
-
-//Set Full and Empty
-
-  assign full = full_reg;
-  assign empty = empty_reg;
-
-  assign level = level_reg;
-  
-endmodule
-
-
-// Baudrate = Clk/((prescale+1)*16)
-// 19200 = 50,000,000 / ((prescale+1)*16)
-// prescale = 161.76 ==> 162
-module BAUDGEN
-(
-  input wire clk,
-  input wire rst_n,
-  input wire [15:0] prescale, 
-  input wire en,
-  output wire baudtick
-);
-
-reg [15:0] count_reg;
-wire [15:0] count_next;
-
-//Counter
-always @ (posedge clk, negedge rst_n)
-  begin
-    if(!rst_n)
-      count_reg <= 0;
-    else if(en)
-      count_reg <= count_next;
-end
-
-assign count_next = ((count_reg == prescale) ? 0 : count_reg + 1'b1);
-assign baudtick = ((count_reg == prescale) ? 1'b1 : 1'b0);
-
-endmodule
-
-
-module UART_RX(
-  input wire clk,
-  input wire resetn,
-  input wire b_tick,        //Baud generator tick
-  input wire rx,            //RS-232 data port
-  
-  output reg rx_done,       //transfer completed
-  output wire [7:0] dout    //output data
-);
-
-//STATE DEFINES  
-  localparam [1:0] idle_st = 2'b00;
-  localparam [1:0] start_st = 2'b01;
-  localparam [1:0] data_st = 2'b11;
-  localparam [1:0] stop_st = 2'b10;
-
-//Internal Signals  
-  reg [1:0] current_state;
-  reg [1:0] next_state;
-  reg [3:0] b_reg; //baud-rate/over sampling counter
-  reg [3:0] b_next;
-  reg [2:0] count_reg; //data-bit counter
-  reg [2:0] count_next;
-  reg [7:0] data_reg; //data register
-  reg [7:0] data_next;
-  
-//State Machine  
-  always @ (posedge clk, negedge resetn)
-  begin
-    if(!resetn)
-      begin
-        current_state <= idle_st;
-        b_reg <= 0;
-        count_reg <= 0;
-        data_reg <=0;
-      end
-    else
-      begin
-        current_state <= next_state;
-        b_reg <= b_next;
-        count_reg <= count_next;
-        data_reg <= data_next;
-      end
-  end
-
-//Next State Logic 
-  always @*
-  begin
-    next_state = current_state;
-    b_next = b_reg;
-    count_next = count_reg;
-    data_next = data_reg;
-    rx_done = 1'b0;
-        
-    case(current_state)
-      idle_st:
-        if(~rx)
-          begin
-            next_state = start_st;
-            b_next = 0;
-          end
-          
-      start_st:
-        if(b_tick)
-          if(b_reg == 7)
-            begin
-              next_state = data_st;
-              b_next = 0;
-              count_next = 0;
-            end
-          else
-            b_next = b_reg + 1'b1;
-            
-      data_st:
-        if(b_tick)
-          if(b_reg == 15)
-            begin
-              b_next = 0;
-              data_next = {rx, data_reg [7:1]};
-              if(count_next ==7) // 8 Data bits
-                next_state = stop_st;
-              else
-                count_next = count_reg + 1'b1;
-            end
-          else
-            b_next = b_reg + 1;
-            
-      stop_st:
-        if(b_tick)
-          if(b_reg == 15) //One stop bit
-            begin
-              next_state = idle_st;
-              rx_done = 1'b1;
-            end
-          else
-           b_next = b_reg + 1;
-    endcase
-  end
-  
-  assign dout = data_reg;
-  
-endmodule
-
-module UART_TX(
-  input wire clk,
-  input wire resetn,
-  input wire tx_start,        
-  input wire b_tick,          //baud rate tick
-  input wire [7:0] d_in,      //input data
-  output reg tx_done,         //transfer finished
-  output wire tx              //output data to RS-232
-  );
-  
-  
-//STATE DEFINES  
-  localparam [1:0] idle_st = 2'b00;
-  localparam [1:0] start_st = 2'b01;
-  localparam [1:0] data_st = 2'b11;
-  localparam [1:0] stop_st = 2'b10;
-  
-//Internal Signals  
-  reg [1:0] current_state;
-  reg [1:0] next_state;
-  reg [3:0] b_reg;          //baud tick counter
-  reg [3:0] b_next;
-  reg [2:0] count_reg;      //data bit counter
-  reg [2:0] count_next;
-  reg [7:0] data_reg;       //data register
-  reg [7:0] data_next;
-  reg tx_reg;               //output data reg
-  reg tx_next;
-  
-//State Machine  
-  always @(posedge clk, negedge resetn)
-  begin
-    if(!resetn)
-      begin
-        current_state <= idle_st;
-        b_reg <= 0;
-        count_reg <= 0;
-        data_reg <= 0;
-        tx_reg <= 1'b1;
-      end
-    else
-      begin
-        current_state <= next_state;
-        b_reg <= b_next;
-        count_reg <= count_next;
-        data_reg <= data_next;
-        tx_reg <= tx_next;
-      end
-  end
-
-
-//Next State Logic  
-  always @*
-  begin
-    next_state = current_state;
-    tx_done = 1'b0;
-    b_next = b_reg;
-    count_next = count_reg;
-    data_next = data_reg;
-    tx_next = tx_reg;
-    
-    case(current_state)
-      idle_st:
-      begin
-        tx_next = 1'b1;
-        if(tx_start)
-        begin
-          next_state = start_st;
-          b_next = 0;
-          data_next = d_in;
-        end
-      end
-      
-      start_st: //send start bit
-      begin
-        tx_next = 1'b0;
-        if(b_tick)
-          if(b_reg==15)
-            begin
-              next_state = data_st;
-              b_next = 0;
-              count_next = 0;
-            end
-          else
-            b_next = b_reg + 1;
-      end
-      
-      data_st: //send data serially
-      begin
-        tx_next = data_reg[0];
-        
-        if(b_tick)
-          if(b_reg == 15)
-            begin
-              b_next = 0;
-              data_next = data_reg >> 1;
-              if(count_reg == 7)    //8 data bits
-                next_state = stop_st;
-              else
-                count_next = count_reg + 1;
-            end
-          else
-            b_next = b_reg + 1;
-      end
-      
-      stop_st: //send stop bit
-      begin
-        tx_next = 1'b1;
-        if(b_tick)
-          if(b_reg == 15)   //one stop bit
-            begin
-              next_state = idle_st;
-              tx_done = 1'b1;
-            end
-          else
-            b_next = b_reg + 1;
-      end
-    endcase
-  end
-  
-  assign tx = tx_reg;
-  
-endmodule
-
-
-`ifdef VERIFY
-
-module uart_tb;
-
-reg PCLK;
-    reg  PRESETn;
-    reg  PWRITE;
-    reg  [31:0] PWDATA;
-    reg  [31:0] PADDR;
-    reg  PENABLE;
-    
-    reg PSEL;
-    
-    //APB Outputs
-     wire PREADY;
-     wire [31:0] PRDATA;
-
-
-  //Serial Port Signals
-   wire         RsRx;  //Input from RS-232
-   wire        RsTx;  //Output to RS-232
-
-  //UART Interrupt
-   wire uart_irq;  //Interrupt
-
-	 always #5 PCLK = !PCLK;
-
-    initial begin
-        $dumpfile("uart.vcd");
-        $dumpvars;
-        # 25000 $finish;
-    end
-
-    initial begin
-        PCLK = 0;
-        PRESETn = 1;
-		PSEL = 0;
-		#10;
-		@(posedge PCLK);
-		PRESETn = 0;
-		#100;
-		@(posedge PCLK);
-		PRESETn = 1;
-
-    // Configure the prescales
-    APB_WR(1, `PRESCALE_ADDR);
-    APB_WR(1, `CTRL_ADDR);
-    APB_WR(0, `IMASK_ADDR);
-    APB_WR(6, `TXFIFOTR_ADDR );
-    APB_WR(9, `IMASK_ADDR);
-    
-
-		// write something
-		APB_WR(8'h7F, 0);
-		APB_WR(8'h7F, 0);
-    APB_WR(8'h7F, 0);
-		APB_WR(8'h7F, 0);
-    APB_WR(8'h7F, 0);
-		APB_WR(8'h7F, 0);
-    APB_WR(8'h7F, 0);
-		APB_WR(8'h7F, 0);
-
-    // wait for the first character to be received
-    APB_RD(`STATUS_ADDR);
-    while (PRDATA!=2) begin
-      APB_RD(`STATUS_ADDR);
-    end  
-
-    // change the baud rate
-    APB_WR(0, `CTRL_ADDR);
-    APB_WR(4, `PRESCALE_ADDR);
-    APB_WR(1, `CTRL_ADDR);
-    
-
-		
-	end
-
-		task APB_WR (input [31:0] data, input [31:0] address);
-			begin
-				@(posedge PCLK);
-				PSEL = 1;
-				PWRITE = 1;
-				PWDATA = data;
-				PENABLE = 0;
-        PADDR = address;
-				@(posedge PCLK);
-        PENABLE = 1;
-				@(posedge PCLK);
-				PSEL = 0;
-				PWRITE = 0;
-				PENABLE = 0;
-			end
-		endtask
-		
-    task APB_RD(input [31:0] address);
-			begin
-				@(posedge PCLK);
-				PSEL = 1;
-				PWRITE = 0;
-				PENABLE = 0;
-        PADDR = address;
-				@(posedge PCLK);
-        PENABLE = 1;
-				@(posedge PCLK);
-				PSEL = 0;
-				PWRITE = 0;
-				PENABLE = 0;
-			end
-		endtask
-	
-
-	APBUART MUV (
-  
-    //APB Inputs
-    PCLK,
-    PRESETn,
-    PWRITE,
-    PWDATA,
-    PADDR,
-    PENABLE,
-    
-    PSEL,
-    
-    //APB Outputs
-    PREADY,
-    PRDATA,
-
-
-  //Serial Port Signals
-  RsRx,  //Input from RS-232
-  RsTx,  //Output to RS-232
-
-  //UART Interrupt
-  uart_irq  //Interrupt
-);
-
-assign RsRx = RsTx;
-
-endmodule
-`endif
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/IPs/DFFRAM.v b/verilog/rtl/user_project/rtl/IPs/DFFRAM.v
deleted file mode 100644
index 7a32654..0000000
--- a/verilog/rtl/user_project/rtl/IPs/DFFRAM.v
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
-    A parameterized DFF based RAM for SKY130A
-    Use the COLS parameter to set the size
-    Valid sizes: 1 (default), 2 or 4
-*/
-/*
-    Author: Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-
-`timescale 1ns / 1ps
-`default_nettype none
-/*
-module DFFRAM #( parameter COLS=4)
-(
-    CLK,
-    WE,
-    EN,
-    Di,
-    Do,
-    A
-);
-
-    input           CLK;
-    input   [3:0]   WE;
-    input           EN;
-    input   [31:0]  Di;
-    output  [31:0]  Do;
-    input   [7+$clog2(COLS):0]   A;
-
-    wire [31:0]     DOUT [COLS-1:0];
-    wire [31:0]     Do_pre;
-    wire [COLS-1:0] EN_lines;
-
-    generate
-        genvar i;
-        for (i=0; i<COLS; i=i+1) begin : COLUMN
-            DFFRAM_COL4 RAMCOLS (   .CLK(CLK), 
-                                    .WE(WE), 
-                                    .EN(EN_lines[i]), 
-                                    .Di(Di), 
-                                    .Do(DOUT[i]), 
-                                    .A(A[7:0]) 
-                                );    
-        end
-        if(COLS==4) begin
-            MUX4x1_32 MUX ( .A0(DOUT[0]), .A1(DOUT[1]), .A2(DOUT[2]), .A3(DOUT[3]), .S(A[9:8]), .X(Do_pre) );
-            DEC2x4 DEC ( .EN(EN), .A(A[9:8]), .SEL(EN_lines) );
-        end
-        else if(COLS==2) begin
-            MUX2x1_32 MUX ( .A0(DOUT[0]), .A1(DOUT[1]), .S(A[8]), .X(Do_pre) );
-            //sky130_fd_sc_hd__inv_4 DEC0 ( .Y(EN_lines[0]), .A(A[8]) );
-            //sky130_fd_sc_hd__clkbuf_4 DEC1 (.X(EN_lines[1]), .A(A[8]) );
-            DEC1x2 DEC ( .EN(EN), .A(A[8]), .SEL(EN_lines[1:0]) );
-            
-        end
-        else begin
-            PASS MUX ( .A(DOUT[0]), .X(Do_pre) );
-            sky130_fd_sc_hd__clkbuf_4 ENBUF (.X(EN_lines[0]), .A(EN) );
-        end
-    endgenerate
-    
-    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (.X(Do), .A(Do_pre));
-
-endmodule
-
-*/
-
-module DFFRAM #( parameter COLS=4)
-(
-    CLK,
-    WE,
-    EN,
-    Di,
-    Do,
-    A
-);
-
-    input           CLK;
-    input   [3:0]   WE;
-    input           EN;
-    input   [31:0]  Di;
-    output  [31:0]  Do;
-    input   [7+$clog2(COLS):0]   A;
-
-    wire [31:0]     DOUT [COLS-1:0];
-    wire [31:0]     Do_pre;
-    wire [COLS-1:0] EN_lines;
-
-    wire [9:8]      A_buf;
-
-    generate
-        genvar i;
-        for (i=0; i<COLS; i=i+1) begin : COLUMN
-            DFFRAM_COL4 RAMCOLS (   .CLK(CLK), 
-                                    .WE(WE), 
-                                    .EN(EN_lines[i]), 
-                                    .Di(Di), 
-                                    .Do(DOUT[i]), 
-                                    .A(A[7:0]) 
-                                );    
-        end
-        if(COLS==4) begin
-            sky130_fd_sc_hd__clkbuf_8 ABUF[1:0] (.X(A_buf[9:8]), .A(A[9:8]) );
-            MUX4x1_32 MUX ( .A0(DOUT[0]), .A1(DOUT[1]), .A2(DOUT[2]), .A3(DOUT[3]), .S(A_buf[9:8]), .X(Do_pre) );
-            DEC2x4 DEC ( .EN(EN), .A(A[9:8]), .SEL(EN_lines) );
-        end
-        else if(COLS==2) begin
-            sky130_fd_sc_hd__clkbuf_8 ABUF[8:8] (.X(A_buf[8]), .A(A[8]) );
-            MUX2x1_32 MUX ( .A0(DOUT[0]), .A1(DOUT[1]), .S(A_buf[8]), .X(Do_pre) );
-            //sky130_fd_sc_hd__inv_4 DEC0 ( .Y(EN_lines[0]), .A(A[8]) );
-            //sky130_fd_sc_hd__clkbuf_4 DEC1 (.X(EN_lines[1]), .A(A[8]) );
-            DEC1x2 DEC ( .EN(EN), .A(A[8]), .SEL(EN_lines[1:0]) );
-            
-        end
-        else begin
-            PASS MUX ( .A(DOUT[0]), .X(Do_pre) );
-            sky130_fd_sc_hd__clkbuf_4 ENBUF (.X(EN_lines[0]), .A(EN) );
-        end
-    endgenerate
-    
-    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (.X(Do), .A(Do_pre));
-
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/DFFRAMBB.v b/verilog/rtl/user_project/rtl/IPs/DFFRAMBB.v
deleted file mode 100644
index 2825426..0000000
--- a/verilog/rtl/user_project/rtl/IPs/DFFRAMBB.v
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
-    Building blocks for DFF based RAM compiler for SKY130A 
-    BYTE        :   8 memory cells used as a building block for WORD module
-    WORD        :   32-bit memory word with select and byte-level WE
-    DEC6x64     :   2x4 Binary Decoder
-    DEC6x64     :   6x64 Binary decoder
-    MUX4x1_32   :   32-bit 4x1 MUX
-    MUX2x1_32   :   32-bit 2x1 MUX
-    SRAM64x32   :   Tri-state buffers based 64x32 DFF RAM 
-    DFFRAM_COL4 :   A single column of 4 SRAM64x32 blocks using 4x1 multiplexors
-*/
-/*
-    Author: Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-
-module BYTE (
-    input CLK,
-    input WE,
-    input SEL,
-    input [7:0] Di,
-    output [7:0] Do
-);
-
-    wire [7:0]  q_wire;
-    wire        we_wire;
-    wire        SEL_B;
-    wire        GCLK;
-
-    sky130_fd_sc_hd__inv_1 INV(.Y(SEL_B), .A(SEL));
-    sky130_fd_sc_hd__and2_1 CGAND( .A(SEL), .B(WE), .X(we_wire) );
-    sky130_fd_sc_hd__dlclkp_1 CG( .CLK(CLK), .GCLK(GCLK), .GATE(we_wire) );
-
-    generate 
-        genvar i;
-        for(i=0; i<8; i=i+1) begin : BIT
-            sky130_fd_sc_hd__dfxtp_1 FF ( .D(Di[i]), .Q(q_wire[i]), .CLK(GCLK) );
-            sky130_fd_sc_hd__ebufn_2 OBUF ( .A(q_wire[i]), .Z(Do[i]), .TE_B(SEL_B) );
-        end
-    endgenerate 
-
-endmodule
-
-
-module WORD32 (
-    input CLK,
-    input [3:0] WE,
-    input SEL,
-    input [31:0] Di,
-    output [31:0] Do
-);
-
-    BYTE B0 ( .CLK(CLK), .WE(WE[0]), .SEL(SEL), .Di(Di[7:0]), .Do(Do[7:0]) );
-    BYTE B1 ( .CLK(CLK), .WE(WE[1]), .SEL(SEL), .Di(Di[15:8]), .Do(Do[15:8]) );
-    BYTE B2 ( .CLK(CLK), .WE(WE[2]), .SEL(SEL), .Di(Di[23:16]), .Do(Do[23:16]) );
-    BYTE B3 ( .CLK(CLK), .WE(WE[3]), .SEL(SEL), .Di(Di[31:24]), .Do(Do[31:24]) );
-    
-endmodule 
-
-module DEC1x2 (
-    input           EN,
-    input   [0:0]   A,
-    output  [1:0]   SEL
-);
-    sky130_fd_sc_hd__and2b_2    AND1 ( .X(SEL[0]), .A_N(A), .B(EN) );
-    sky130_fd_sc_hd__and2_2     AND3 ( .X(SEL[1]), .A(A), .B(A[0]) );
-    
-endmodule
-
-module DEC2x4 (
-`ifdef USE_POWER_PINS
-    input VPWR,
-    input VGND,
-`endif
-    input           EN,
-    input   [1:0]   A,
-    output  [3:0]   SEL
-);
-    sky130_fd_sc_hd__nor3b_4    AND0 ( 
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-        .VPB(VPWR),
-        .VNB(VGND),
-    `endif
-        .Y(SEL[0]), .A(A[0]),   .B(A[1]), .C_N(EN) );
-    sky130_fd_sc_hd__and3b_4    AND1 ( 
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-        .VPB(VPWR),
-        .VNB(VGND),
-    `endif
-        .X(SEL[1]), .A_N(A[1]), .B(A[0]), .C(EN) );
-    sky130_fd_sc_hd__and3b_4    AND2 ( 
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-        .VPB(VPWR),
-        .VNB(VGND),
-    `endif
-        .X(SEL[2]), .A_N(A[0]), .B(A[1]), .C(EN) );
-    sky130_fd_sc_hd__and3_4     AND3 ( 
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-        .VPB(VPWR),
-        .VNB(VGND),
-    `endif
-        .X(SEL[3]), .A(A[1]),   .B(A[0]), .C(EN) );
-    
-endmodule
-
-module DEC3x8 (
-    input           EN,
-    input [2:0]     A,
-    output [7:0]    SEL
-);
-    sky130_fd_sc_hd__nor4b_2   AND0 ( .Y(SEL[0])  , .A(A[0]), .B(A[1])  , .C(A[2]), .D_N(EN) ); // 000
-    sky130_fd_sc_hd__and4bb_2   AND1 ( .X(SEL[1])  , .A_N(A[2]), .B_N(A[1]), .C(A[0])  , .D(EN) ); // 001
-    sky130_fd_sc_hd__and4bb_2   AND2 ( .X(SEL[2])  , .A_N(A[2]), .B_N(A[0]), .C(A[1])  , .D(EN) ); // 010
-    sky130_fd_sc_hd__and4b_2    AND3 ( .X(SEL[3])  , .A_N(A[2]), .B(A[1]), .C(A[0])  , .D(EN) );   // 011
-    sky130_fd_sc_hd__and4bb_2   AND4 ( .X(SEL[4])  , .A_N(A[0]), .B_N(A[1]), .C(A[2])  , .D(EN) ); // 100
-    sky130_fd_sc_hd__and4b_2    AND5 ( .X(SEL[5])  , .A_N(A[1]), .B(A[0]), .C(A[2])  , .D(EN) );   // 101
-    sky130_fd_sc_hd__and4b_2    AND6 ( .X(SEL[6])  , .A_N(A[0]), .B(A[1]), .C(A[2])  , .D(EN) );   // 110
-    sky130_fd_sc_hd__and4_2     AND7 ( .X(SEL[7])  , .A(A[0]), .B(A[1]), .C(A[2])  , .D(EN) ); // 111
-endmodule
-
-
-module DEC6x64 (
-    input           EN,
-    input   [5:0]   A,
-    output  [63:0] SEL
-);
-    wire [7:0] SEL0_w ;
-    wire [2:0] A_buf;
-    
-    DEC3x8 DEC_L0 ( .EN(EN), .A(A[5:3]), .SEL(SEL0_w) );
-
-    sky130_fd_sc_hd__clkbuf_16 ABUF[2:0] (.X(A_buf), .A(A[2:0]));
-
-    generate
-        genvar i;
-        for(i=0; i<8; i=i+1) begin : DEC_L1
-            DEC3x8 U ( .EN(SEL0_w[i]), .A(A_buf), .SEL(SEL[7+8*i: 8*i]) );
-        end
-    endgenerate
-endmodule
-
-module MUX2x1_32(
-    input   [31:0]      A0, A1,
-    input   [0:0]       S,
-    output  [31:0]      X
-);
-    sky130_fd_sc_hd__mux2_1 MUX[31:0] (.A0(A0), .A1(A1), .S(S[0]), .X(X) );
-endmodule
-
-module MUX4x1_32(
-`ifdef USE_POWER_PINS
-    input VPWR,
-    input VGND,
-`endif
-    input   [31:0]      A0, A1, A2, A3,
-    input   [1:0]       S,
-    output  [31:0]      X
-);
-    sky130_fd_sc_hd__mux4_1 MUX[31:0] (
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-        .VPB(VPWR),
-        .VNB(VGND),
-    `endif
-        .A0(A0), .A1(A1), .A2(A2), .A3(A3), .S0(S[0]), .S1(S[1]), .X(X) );
-endmodule
-
-module PASS (input [31:0] A, output [31:0] X);
-    assign X = A;
-endmodule
-
-module SRAM64x32(
-    input CLK,
-    input [3:0] WE,
-    input EN,
-    input [31:0] Di,
-    output [31:0] Do,
-    input [5:0] A
-);
-
-    wire [63:0]     SEL;
-    wire [31:0]     Do_pre;
-    wire [31:0]     Di_buf;
-    wire            CLK_buf;
-    wire [3:0]      WE_buf;
-
-    sky130_fd_sc_hd__clkbuf_16 CLKBUF (.X(CLK_buf), .A(CLK));
-    sky130_fd_sc_hd__clkbuf_16 WEBUF[3:0] (.X(WE_buf), .A(WE));
-    sky130_fd_sc_hd__clkbuf_16 DIBUF[31:0] (.X(Di_buf), .A(Di));
-
-    DEC6x64 DEC  ( .EN(EN), .A(A), .SEL(SEL) );
-
-    generate
-        genvar i;
-        for (i=0; i< 64; i=i+1) begin : WORD
-            WORD32 W ( .CLK(CLK_buf), .WE(WE_buf), .SEL(SEL[i]), .Di(Di_buf), .Do(Do_pre) );
-        end
-    endgenerate
-
-    // Ensure that the Do_pre lines are not floating when EN = 0
-    wire lo;
-    wire float_buf_en;
-    sky130_fd_sc_hd__clkbuf_4 FBUFENBUF( .X(float_buf_en), .A(EN) );
-    sky130_fd_sc_hd__conb_1 TIE (.LO(lo), .HI());
-    sky130_fd_sc_hd__ebufn_4 FLOATBUF[31:0] ( .A( lo ), .Z(Do_pre), .TE_B(float_buf_en) );
-
-    generate 
-        //genvar i;
-        for(i=0; i<32; i=i+1) begin : OUT
-            sky130_fd_sc_hd__dfxtp_1 FF ( .D(Do_pre[i]), .Q(Do[i]), .CLK(CLK) );
-        end
-    endgenerate 
-
-endmodule
-
-/*
-module DFFRAM_COL4 
-(
-    CLK,
-    WE,
-    EN,
-    Di,
-    Do,
-    A
-);
-
-    input           CLK;
-    input   [3:0]   WE;
-    input           EN;
-    input   [31:0]  Di;
-    output  [31:0]  Do;
-    input   [7:0]   A;
-
-    
-    wire [31:0]     Di_buf;
-    wire [31:0]     Do_pre;
-    wire            CLK_buf;
-    wire [3:0]      WE_buf;
-    wire [5:3]      A_buf;
-
-    wire [31:0]     Do_B_0_0;
-    wire [31:0]     Do_B_0_1;
-    wire [31:0]     Do_B_0_2;
-    wire [31:0]     Do_B_0_3;
-
-    wire [3:0]      row_sel;
-
-    sky130_fd_sc_hd__clkbuf_8 CLKBUF (.X(CLK_buf), .A(CLK));
-    sky130_fd_sc_hd__clkbuf_8 WEBUF[3:0] (.X(WE_buf), .A(WE));
-    sky130_fd_sc_hd__clkbuf_8 DIBUF[31:0] (.X(Di_buf), .A(Di));
-
-    sky130_fd_sc_hd__clkbuf_16 ABUF[2:0] ( .X(A_buf), .A(A[5:3]) );
-    
-    DEC2x4 DEC ( .EN(EN), .A(A[7:6]), .SEL(row_sel) );
-
-    SRAM64x32 B_0_0 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[0]), .Di(Di_buf), .Do(Do_B_0_0), .A({A_buf,A[2:0]}) );
-    SRAM64x32 B_0_1 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[1]), .Di(Di_buf), .Do(Do_B_0_1), .A({A_buf,A[2:0]}) );
-    SRAM64x32 B_0_2 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[2]), .Di(Di_buf), .Do(Do_B_0_2), .A({A_buf,A[2:0]}) );
-    SRAM64x32 B_0_3 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[3]), .Di(Di_buf), .Do(Do_B_0_3), .A({A_buf,A[2:0]}) );
-
-    MUX4x1_32 MUX ( .A0(Do_B_0_0), .A1(Do_B_0_1), .A2(Do_B_0_2), .A3(Do_B_0_3), .S(A[7:6]), .X(Do) );
-
-endmodule
-*/
-module DFFRAM_COL4 
-(
-    CLK,
-    WE,
-    EN,
-    Di,
-    Do,
-    A
-);
-
-    input           CLK;
-    input   [3:0]   WE;
-    input           EN;
-    input   [31:0]  Di;
-    output  [31:0]  Do;
-    input   [7:0]   A;
-
-    
-    wire [31:0]     Di_buf;
-    wire [31:0]     Do_pre;
-    wire            CLK_buf;
-    wire [3:0]      WE_buf;
-    wire [7:0]      A_buf;
-
-    wire [31:0]     Do_B_0_0;
-    wire [31:0]     Do_B_0_1;
-    wire [31:0]     Do_B_0_2;
-    wire [31:0]     Do_B_0_3;
-
-    wire [3:0]      row_sel;
-
-    sky130_fd_sc_hd__clkbuf_8 CLKBUF (.X(CLK_buf), .A(CLK));
-    sky130_fd_sc_hd__clkbuf_8 WEBUF[3:0] (.X(WE_buf), .A(WE));
-    sky130_fd_sc_hd__clkbuf_8 DIBUF[31:0] (.X(Di_buf), .A(Di));
-
-    sky130_fd_sc_hd__clkbuf_8 ABUF[7:0] ( .X(A_buf), .A(A[7:0]) );
-  
-    DEC2x4 DEC ( .EN(EN), .A(A[7:6]), .SEL(row_sel) );
-
-    SRAM64x32 B_0_0 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[0]), .Di(Di_buf), .Do(Do_B_0_0), .A(A_buf[5:0]) );
-    SRAM64x32 B_0_1 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[1]), .Di(Di_buf), .Do(Do_B_0_1), .A(A_buf[5:0]) );
-    SRAM64x32 B_0_2 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[2]), .Di(Di_buf), .Do(Do_B_0_2), .A(A_buf[5:0]) );
-    SRAM64x32 B_0_3 ( .CLK(CLK_buf), .WE(WE_buf), .EN(row_sel[3]), .Di(Di_buf), .Do(Do_B_0_3), .A(A_buf[5:0]) );
-
-    MUX4x1_32 MUX ( .A0(Do_B_0_0), .A1(Do_B_0_1), .A2(Do_B_0_2), .A3(Do_B_0_3), .S(A_buf[7:6]), .X(Do) );
-
-endmodule
-
diff --git a/verilog/rtl/user_project/rtl/IPs/DMC_32x16HC.v b/verilog/rtl/user_project/rtl/IPs/DMC_32x16HC.v
deleted file mode 100644
index fa05012..0000000
--- a/verilog/rtl/user_project/rtl/IPs/DMC_32x16HC.v
+++ /dev/null
@@ -1,224 +0,0 @@
-`timescale 1ns / 1ps
-`default_nettype none
-
-//`define     STANDALONE
-/*
-    Hand-crafted 32 lines x 16 bytes Direct Mapped Cache
-    It can operate @ 200MHz clock!
-    Number of instances: 10654
-    ICG cells are used to reduce dynamic power consumption
-    A custom clock tree is embedded
-*/
-
-module HWORD (
-    input CLK,
-    input WE,
-    input SELW,
-    input SELR,
-    input [15:0] Di,
-    output [15:0] Do
-);
-
-    wire [15:0]  q_wire;
-    wire        we_wire;
-    wire        SEL_B;
-    wire        GCLK;
-
-    sky130_fd_sc_hd__inv_2 INV(.Y(SEL_B), .A(SELR));
-    sky130_fd_sc_hd__and2_1 CGAND( .A(SELW), .B(WE), .X(we_wire) );
-    sky130_fd_sc_hd__dlclkp_1 CG( .CLK(CLK), .GCLK(GCLK), .GATE(we_wire) );
-
-    generate 
-        genvar i;
-        for(i=0; i<16; i=i+1) begin : BIT
-            sky130_fd_sc_hd__dfxtp_1 FF ( .D(Di[i]), .Q(q_wire[i]), .CLK(GCLK) );
-            sky130_fd_sc_hd__ebufn_2 OBUF ( .A(q_wire[i]), .Z(Do[i]), .TE_B(SEL_B) );
-        end
-    endgenerate 
-
-endmodule
-
-
-module LINE16 (
-    input CLK,
-    input WE,
-    input SELW,
-    input SELR,
-    input [127:0] Di,
-    output [127:0] Do
-);
-
-    wire [7:0] CLK_buf;
-
-    wire SELW_buf, SELR_buf;
-
-    sky130_fd_sc_hd__clkbuf_4 CLKBUF[7:0] ( .X(CLK_buf), .A(CLK) );
-
-    sky130_fd_sc_hd__clkbuf_4 SELWBUF( .X(SELW_buf), .A(SELW) );
-    sky130_fd_sc_hd__clkbuf_4 SELRBUF ( .X(SELR_buf), .A(SELR) );
-
-    
-    generate 
-        genvar i;
-        for(i=0; i<8; i=i+1)
-            HWORD HW ( .CLK(CLK_buf[i]), .WE(WE), .SELW(SELW_buf), .SELR(SELR_buf), .Di(Di[i*16+15:i*16]), .Do(Do[i*16+15:i*16]) );
-    endgenerate
-
-endmodule 
-
-module DEC2x4_DMC (
-    input   [1:0]   A,
-    output  [3:0]   SEL
-);
-    sky130_fd_sc_hd__nor2_2    AND0 ( .Y(SEL[0]), .A(A[0]),   .B(A[1]) );
-    sky130_fd_sc_hd__and2b_2    AND1 ( .X(SEL[1]), .A_N(A[1]), .B(A[0]) );
-    sky130_fd_sc_hd__and2b_2    AND2 ( .X(SEL[2]), .A_N(A[0]), .B(A[1]) );
-    sky130_fd_sc_hd__and2_2     AND3 ( .X(SEL[3]), .A(A[1]),   .B(A[0]) );
-    
-endmodule
-
-module DEC3x8_DMC (
-    input           EN,
-    input [2:0]     A,
-    output [7:0]    SEL
-);
-
-    wire [2:0] A_buf;
-    sky130_fd_sc_hd__clkbuf_2 ABUF[2:0] (.X(A_buf), .A(A));
-    sky130_fd_sc_hd__nor4b_4   AND0 ( .Y(SEL[0])  , .A(A_buf[0]), .B(A_buf[1]), .C(A_buf[2]), .D_N(EN) ); // 000
-    sky130_fd_sc_hd__and4bb_4   AND1 ( .X(SEL[1])  , .A_N(A_buf[2]), .B_N(A_buf[1]), .C(A_buf[0])  , .D(EN) ); // 001
-    sky130_fd_sc_hd__and4bb_4   AND2 ( .X(SEL[2])  , .A_N(A_buf[2]), .B_N(A_buf[0]), .C(A_buf[1])  , .D(EN) ); // 010
-    sky130_fd_sc_hd__and4b_4    AND3 ( .X(SEL[3])  , .A_N(A_buf[2]), .B(A_buf[1]), .C(A_buf[0])  , .D(EN) );   // 011
-    sky130_fd_sc_hd__and4bb_4   AND4 ( .X(SEL[4])  , .A_N(A_buf[0]), .B_N(A_buf[1]), .C(A_buf[2])  , .D(EN) ); // 100
-    sky130_fd_sc_hd__and4b_4    AND5 ( .X(SEL[5])  , .A_N(A_buf[1]), .B(A_buf[0]), .C(A_buf[2])  , .D(EN) );   // 101
-    sky130_fd_sc_hd__and4b_4    AND6 ( .X(SEL[6])  , .A_N(A_buf[0]), .B(A_buf[1]), .C(A_buf[2])  , .D(EN) );   // 110
-    sky130_fd_sc_hd__and4_4     AND7 ( .X(SEL[7])  , .A(A_buf[0]), .B(A_buf[1]), .C(A_buf[2])  , .D(EN) ); // 111
-endmodule
-
-module DEC5x32_DMC (
-    input   [4:0]   A,
-    output  [31:0]   SEL
-);
-    wire [3:0] en;
-    DEC2x4_DMC DEC0 ( .A(A[4:3]), .SEL(en) );
-
-    generate 
-        genvar i;
-        for(i=0; i<4; i=i+1)
-            DEC3x8_DMC DEC1 ( .A(A[2:0]), .EN(en[i]), .SEL(SEL[i*8+7:i*8]) );
-
-    endgenerate
-
-endmodule
-
-`ifdef STANDALONE
-module MUX4x1_32(
-    input   [31:0]      A0, A1, A2, A3,
-    input   [1:0]       S,
-    output  [31:0]      X
-);
-    sky130_fd_sc_hd__mux4_1 MUX[31:0] (.A0(A0), .A1(A1), .A2(A2), .A3(A3), .S0(S[0]), .S1(S[1]), .X(X) );
-endmodule
-`endif
-
-module OVERHEAD(
-    input CLK,
-    input RSTn,
-    input SELR, SELW,
-    input VDi,
-    output VDo,
-    input[14:0] TDi,
-    output [14:0] TDo,
-    input WE
-);
-
-    wire SEL_B;
-    wire GCLK;
-    wire we_wire;
-    wire[15:0] q_wire;
-    
-    sky130_fd_sc_hd__inv_8 INV(.Y(SEL_B), .A(SELR));
-    sky130_fd_sc_hd__and2_4 CGAND( .A(SELW), .B(WE), .X(we_wire) );
-    sky130_fd_sc_hd__dlclkp_1 CG( .CLK(CLK), .GCLK(GCLK), .GATE(we_wire) );
-
-    // Valid Bit
-    sky130_fd_sc_hd__dfrtp_1 V( .Q(q_wire[15]), .CLK(GCLK), .D(VDi), .RESET_B(RSTn) );
-    sky130_fd_sc_hd__ebufn_2 VOBUF ( .A(q_wire[15]), .Z(VDo), .TE_B(SEL_B) );
-
-    // 15-bit TAG
-    generate 
-        genvar i;
-        for(i=0; i<15; i=i+1) begin : VALID
-            sky130_fd_sc_hd__dfxtp_1 FF ( .D(TDi[i]), .Q(q_wire[i]), .CLK(GCLK) );
-            sky130_fd_sc_hd__ebufn_2 TOBUF ( .A(q_wire[i]), .Z(TDo[i]), .TE_B(SEL_B) );
-        end
-    endgenerate 
-
-endmodule
-
-module DMC_32x16HC (
-    input wire          clk,
-    input wire          rst_n,
-    // 
-    input wire  [23:0]  A,
-    input wire  [23:0]  A_h,
-    output wire [31:0]  Do,
-    output wire         hit,
-    //
-    input wire [127:0]  line,
-    input wire          wr
-);
-
-    wire [127:0] data;
-    wire [3:0]  offset  = A[3:0];
-    wire [4:0]  index   = A[8:4];
-    wire [14:0] tag     = A[23:9];
-
-    wire [4:0]  index_h   = A_h[8:4];
-    wire [14:0] tag_h     = A_h[23:9];
-
-    wire c_valid;
-    wire[14:0] c_tag;
-
-    wire [31:0] SELH, SEL;
-
-    wire [31:0] Do_pre;
-
-    wire CLK_buf;
-
-    wire hi;
-
-    DEC5x32_DMC DECH ( .A(index_h), .SEL(SELH) );
-    DEC5x32_DMC DEC ( .A(index), .SEL(SEL) );
-
-    sky130_fd_sc_hd__conb_1 TIE (.LO(), .HI(hi));
-    sky130_fd_sc_hd__clkbuf_16 CLKBUF (.X(CLK_buf), .A(clk));
-
-    OVERHEAD OVHB [31:0] (
-        .CLK(clk),
-        .RSTn(rst_n),
-        .SELR(SELH), 
-        .SELW(SEL),
-        .VDi(hi),
-        .VDo(c_valid),
-        .TDi(tag),
-        .TDo(c_tag),
-        .WE(wr)
-    );
-
-    LINE16 DATA [31:0] (
-        .CLK(clk),
-        .WE(wr),
-        .SELR(SEL), 
-        .SELW(SEL),
-        .Di(line),
-        .Do(data)
-    );
-
-    assign  hit =   c_valid & (c_tag == tag_h);
-
-    MUX4x1_32 MUX ( .A0(data[31:0]), .A1(data[63:32]), .A2(data[95:64] ), .A3(data[127:96]), .S(offset[3:2]), .X(Do_pre) );
-
-    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (.X(Do), .A(Do_pre));
-
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/GPIO.v b/verilog/rtl/user_project/rtl/IPs/GPIO.v
deleted file mode 100644
index 8f8f978..0000000
--- a/verilog/rtl/user_project/rtl/IPs/GPIO.v
+++ /dev/null
@@ -1,24 +0,0 @@
-
-`timescale 1ns/1ps
-`default_nettype none
-
-module GPIO (
-		// Wrapper ports
-		output 	wire [15:0] WGPIODIN,
-        input 	wire [15:0] WGPIODOUT,
-        input 	wire [15:0] WGPIOPU,
-        input 	wire [15:0] WGPIOPD,
-        input 	wire [15:0] WGPIODIR,		
-		// Externals
-        input 	wire [15:0] GPIOIN,
-        output 	wire [15:0] GPIOOUT,
-        output 	wire [15:0] GPIOPU,
-        output 	wire [15:0] GPIOPD,
-        output 	wire [15:0] GPIOOEN		
-);
-		assign GPIOOEN 	= WGPIODIR;
-		assign GPIOPU 	= WGPIOPU;
-		assign GPIOPD 	= WGPIOPD;
-		assign GPIOOUT	= WGPIODOUT;
-		assign WGPIODIN = GPIOIN;
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/IPs/PWM32.v b/verilog/rtl/user_project/rtl/IPs/PWM32.v
deleted file mode 100644
index 014305b..0000000
--- a/verilog/rtl/user_project/rtl/IPs/PWM32.v
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
-	Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-
-/*
-	A simple 32-bit PWM generator
-	PRE: clock prescalar (tmer_clk = clk / (PRE+1))
-	TMRCMP1: Timer CMP register (period)
-	TMRCMP2: PWN level change Comparator
-
-	PWM period = (TMRCMP1 + 1)/timer_clk = (TMRCMP1 + 1)*(PRE + 1)/clk
-	PWM off cyle % = (TMRCMP1 + 1)/(TMRCMP2 + 1)
-*/
-
-`timescale 1ns/1ps
-`default_nettype none
-
-module PWM32 (
-		input wire clk,
-		input wire rst,
-		input wire [31:0] PRE,
-		input wire [31:0] TMRCMP1,
-		input wire [31:0] TMRCMP2,
-		input wire 				TMREN,
-		output reg pwm
-	);
-
-	reg [31:0]	TMR;
-	reg [31:0] 	clkdiv;
-	wire 		timer_clk = (clkdiv==PRE) ;
-	wire 		tmrov = (TMR == TMRCMP1);
-	wire 		pwmov = (TMR == TMRCMP2);
-
-	// Prescalar
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			clkdiv <= 32'd0;
-		else if(timer_clk)
-			clkdiv <= 32'd0;
-		else if(TMREN)
-			clkdiv <= clkdiv + 32'd1;
-	end
-
-	// Timer
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			TMR <= 32'd0;
-		else if(tmrov)
-			TMR <= 32'd0;
-		else if(timer_clk)
-			TMR <= TMR + 32'd1;
-	end
-
-	// PWM Output
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			pwm <= 1'd0;
-		else if(pwmov)
-			pwm <= 1'd1;
-		else if (tmrov)
-			pwm <= 1'd0;
-	end
-
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/QSPI_XIP_CTRL.v b/verilog/rtl/user_project/rtl/IPs/QSPI_XIP_CTRL.v
deleted file mode 100644
index 482902c..0000000
--- a/verilog/rtl/user_project/rtl/IPs/QSPI_XIP_CTRL.v
+++ /dev/null
@@ -1,296 +0,0 @@
-`timescale 1ns/1ps
-`default_nettype none
-
-// uncomment the following line to use the optimized cache (SKY130A only)
-//`define NO_HC_CACHE
-
-/*
-    AHB-Lite Quad I/O flash reader with 32x16 DM$
-    Intended to be used to execute from an external Quad I/O SPI Flash Memory
-*/
-module QSPI_XIP_CTRL(
-    // AHB-Lite Slave Interface
-    input               HCLK,
-    input               HRESETn,
-    input               HSEL,
-    input wire [31:0]   HADDR,
-    input wire [1:0]    HTRANS,
-    //input wire [31:0]   HWDATA,
-    input wire          HWRITE,
-    input wire          HREADY,
-    output reg          HREADYOUT,
-    output wire [31:0]  HRDATA,
-
-    // External Interface to Quad I/O
-    output              sck,
-    output              ce_n,
-    input   wire[3:0]   din,
-    output      [3:0]   dout,
-    output  wire        douten     
-);
-
-    // Cache wires/buses
-    wire [31:0]     c_datao;
-    wire [127:0]    c_line;
-    wire            c_hit;
-    reg [1:0]       c_wr;
-    wire [23:0]     c_A;
-
-    // Flash Reader wires
-    wire            fr_rd;
-    wire            fr_done;
-
-    // The State Machine
-    localparam [1:0] st_idle    = 2'b00;
-    localparam [1:0] st_wait    = 2'b01;
-    localparam [1:0] st_rw      = 2'b10;
-    reg [1:0]   state, nstate;
-
-    //AHB-Lite Address Phase Regs
-    reg             last_HSEL;
-    reg [31:0]      last_HADDR;
-    reg             last_HWRITE;
-    reg [1:0]       last_HTRANS;
-
-    always@ (posedge HCLK) begin
-        if(HREADY) begin
-            last_HSEL       <= HSEL;
-            last_HADDR      <= HADDR;
-            last_HWRITE     <= HWRITE;
-            last_HTRANS     <= HTRANS;
-        end
-    end
-
-    always @ (posedge HCLK or negedge HRESETn)
-        if(HRESETn == 0) state <= st_idle;
-        else 
-            state <= nstate;
-
-    always @* begin
-        nstate = st_idle;
-        case(state)
-            st_idle :   if(HTRANS[1] & HSEL & HREADY & c_hit) nstate = st_rw;
-                        else if(HTRANS[1] & HSEL & HREADY & ~c_hit) nstate = st_wait;
-            st_wait :   if(c_wr[1]) nstate = st_rw; 
-                        else  nstate = st_wait;
-            st_rw   :   //nstate = st_idle; 
-                        if(HTRANS[1] & HSEL & HREADY & c_hit) nstate = st_rw;
-                        else if(HTRANS[1] & HSEL & HREADY & ~c_hit) nstate = st_wait;
-        endcase
-    end
-    
-    //assign HREADYOUT    = (state==st_rw);
-    always @(posedge HCLK or negedge HRESETn)
-        if(!HRESETn) HREADYOUT <= 1'b1;
-        else
-            case (state)
-                st_idle :   if(HTRANS[1] & HSEL & HREADY & c_hit) HREADYOUT <= 1'b1;
-                            else if(HTRANS[1] & HSEL & HREADY & ~c_hit) HREADYOUT <= 1'b0;
-                            else HREADYOUT <= 1'b1;
-                st_wait :   if(c_wr[1]) HREADYOUT <= 1'b1;
-                            else HREADYOUT <= 1'b0;
-                st_rw   :   if(HTRANS[1] & HSEL & HREADY & c_hit) HREADYOUT <= 1'b1;
-                            else if(HTRANS[1] & HSEL & HREADY & ~c_hit) HREADYOUT <= 1'b0;
-                            //else HREADYOUT <= 1'b1;
-            endcase
-        
-
-    assign fr_rd        =   ( HTRANS[1] & HSEL & HREADY & ~c_hit & (state==st_idle) ) |
-                            ( HTRANS[1] & HSEL & HREADY & ~c_hit & (state==st_rw) );
-
-    assign c_A          = //((state==st_idle) || (state==st_wait)) ? HADDR[23:0] : 
-                            last_HADDR[23:0];
-`ifdef NO_HC_CACHE
-    DMC_32x16
-`else
-    DMC_32x16HC
-`endif
-                CACHE ( .clk(HCLK), .rst_n(HRESETn), 
-                        .A(last_HADDR[23:0]), .A_h(HADDR[23:0]), .Do(c_datao), .hit(c_hit), 
-                        .line(c_line), .wr(c_wr[1]) );
-    
-    FLASH_READER FR (   .clk(HCLK), .rst_n(HRESETn), 
-                        .addr({HADDR[23:4], 4'd0}), .rd(fr_rd), .done(fr_done), .line(c_line),
-                        .sck(sck), .ce_n(ce_n), .din(din), .dout(dout), .douten(douten) );
-
-    assign HRDATA   = c_datao;
-    //always @(posedge HCLK)
-    //    HRDATA <= c_datao;
-
-    //assign c_wr     = fr_done;
-    always @ (posedge HCLK) begin
-        c_wr[0] <= fr_done;
-        c_wr[1] <= c_wr[0];
-    end
-  
-endmodule
-
-/*
-    RTL Model for reading from Quad I/O flash using the QUAD I/O FAST READ (0xEB) command
-    The Quad I/O bit has to be set in the flash memory (through flash programming); the 
-    provided flash memory model has the bit set.
-
-    Every transaction reads 128 bits (16 bytes) from the flash.
-    To start a transaction, provide the memory address and assert rd for 1 clock cycle.
-    done is a sserted for 1 clock cycle when the data is ready
-
-*/
-module FLASH_READER #(parameter LINE_SIZE=128)(
-    input   wire                    clk,
-    input   wire                    rst_n,
-    input   wire [23:0]             addr,
-    input   wire                    rd,
-    output  wire                    done,
-    output  wire [LINE_SIZE-1: 0]   line,      
-
-    output  reg                     sck,
-    output  reg                     ce_n,
-    input   wire[3:0]               din,
-    output      [3:0]               dout,
-    output  wire                    douten
-);
-
-    localparam LINE_BYTES = LINE_SIZE/8;
-    localparam LINE_CYCLES = LINE_BYTES * 8;
-
-    parameter IDLE=1'b0, READ=1'b1;
-
-    reg         state, nstate;
-    reg [7:0]   counter;
-    reg [23:0]  saddr;
-    reg [7:0]   data [LINE_BYTES-1 : 0]; 
-
-    reg         first;
-
-    wire[7:0]   EBH     = 8'heb;
-    
-    // for debugging
-    wire [7:0] data_0 = data[0];
-    wire [7:0] data_1 = data[1];
-    wire [7:0] data_15 = data[15];
-
-
-    always @*
-        case (state)
-            IDLE: if(rd) nstate = READ; else nstate = IDLE;
-            READ: if(done) nstate = IDLE; else nstate = READ;
-        endcase 
-
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) first = 1'b1;
-        else if(first & done) first <= 0;
-
-    
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) state = IDLE;
-        else state <= nstate;
-
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) sck <= 1'b0;
-        else if(~ce_n) sck <= ~ sck;
-        else if(state == IDLE) sck <= 1'b0;
-
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) ce_n <= 1'b1;
-        else if(state == READ) ce_n <= 1'b0;
-        else ce_n <= 1'b1;
-
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) counter <= 8'b0;
-        else if(sck & ~done) counter <= counter + 1'b1;
-        else if(state == IDLE) 
-            if(first) counter <= 8'b0;
-            else counter <= 8'd8;
-
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) saddr <= 24'b0;
-        else if((state == IDLE) && rd) saddr <= addr;
-
-    always @ (posedge clk)
-        if(counter >= 20 && counter <= 19+LINE_BYTES*2)
-            if(sck) data[counter/2 - 10] <= {data[counter/2 - 10][3:0], din}; // Optimize!
-
-    //assign busy = (state == READ);
-
-    assign dout     =   (counter < 8)   ? EBH[7 - counter] :
-                        (counter == 8)  ? saddr[23:20] : 
-                        (counter == 9)  ? saddr[19:16] :
-                        (counter == 10)  ? saddr[15:12] :
-                        (counter == 11)  ? saddr[11:8] :
-                        (counter == 12)  ? saddr[7:4] :
-                        (counter == 13)  ? saddr[3:0] :
-                        (counter == 14)  ? 4'hA :
-                        (counter == 15)  ? 4'h5 : 4'h0;    
-        
-    assign douten   = (counter < 20);
-
-    assign done     = (counter == 19+LINE_BYTES*2);
-
-
-    generate
-        genvar i; 
-        for(i=0; i<LINE_BYTES; i=i+1)
-            assign line[i*8+7: i*8] = data[i];
-    endgenerate
-
-endmodule
-
-
-
-/*
-    32 lines x 16 bytes Direct Mapped Cache
-*/
-`ifdef NO_HC_CACHE
-
-module DMC_32x16 (
-    input wire          clk,
-    input wire          rst_n,
-    // 
-    input wire  [23:0]  A,
-    input wire  [23:0]  A_h,
-    output wire [31:0]  Do,
-    output wire         hit,
-    //
-    input wire [127:0]  line,
-    input wire          wr
-);
-
-    //
-    reg [127:0] LINES   [31:0];
-    reg [14:0]  TAGS    [31:0];
-    reg         VALID   [31:0];
-
-    wire [3:0]  offset  = A[3:0];
-    wire [4:0]  index   = A[8:4];
-    wire [14:0] tag     = A[23:9];
-
-    wire [4:0]  index_h   = A_h[8:4];
-    wire [14:0] tag_h     = A_h[23:9];
-
-    
-    assign  hit =   VALID[index_h] & (TAGS[index_h] == tag_h);
-
-    assign  Do  =   (offset[3:2] == 2'd0) ?  LINES[index][31:0] :
-                    (offset[3:2] == 2'd1) ?  LINES[index][63:32] :
-                    (offset[3:2] == 2'd2) ?  LINES[index][95:64] :
-                    LINES[index][127:96];
-
-    // clear the VALID flags
-    integer i;
-    always @ (posedge clk or negedge rst_n)
-        if(!rst_n) 
-            for(i=0; i<32; i=i+1)
-                VALID[i] <= 1'b0;
-        else  if(wr)  VALID[index]    <= 1'b1;
-
-    always @(posedge clk)
-        if(wr) begin
-            LINES[index]    <= line;
-            TAGS[index]     <= tag;
-        end
-
-endmodule
-`endif
-
-
-
diff --git a/verilog/rtl/user_project/rtl/IPs/RAM_3Kx32.v b/verilog/rtl/user_project/rtl/IPs/RAM_3Kx32.v
deleted file mode 100644
index d9d1125..0000000
--- a/verilog/rtl/user_project/rtl/IPs/RAM_3Kx32.v
+++ /dev/null
@@ -1,73 +0,0 @@
-`timescale 1ns / 1ps
-`default_nettype none
-
-module RAM_3Kx32 (
-`ifdef USE_POWER_PINS
-    VPWR,
-    VGND,
-`endif
-    CLK,
-    WE,
-    EN,
-    Di,
-    Do,
-    A
-);
-    input           CLK;
-    input   [3:0]   WE;
-    input           EN;
-    input   [31:0]  Di;
-    output  [31:0]  Do;
-    input   [11:0]   A;
-
-    localparam BLOCKS=3;
-    wire  [3:0]       _EN_ ;
-    wire [31:0] _Do_ [BLOCKS-1:0];
-    wire [31:0] Do_pre;
-
-    generate 
-        genvar gi;
-        for(gi=0; gi<BLOCKS; gi=gi+1) 
-
-`ifdef NO_DFFRAM
-	DFFRAM_beh 
-`else
-	DFFRAM
-`endif
-            #(.COLS(4)) RAM (
-                .CLK(CLK),
-                .WE(WE),
-                .EN(_EN_[gi]),
-                .Di(Di),
-                .Do(_Do_[gi]),
-                .A(A[9:0])
-            );
-        
-    endgenerate 
-    
-    MUX4x1_32 MUX ( 
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-    `endif
-        .A0(_Do_[0]), .A1(_Do_[1]), .A2(_Do_[2]), .A3(32'b0), .S(A[11:10]), .X(Do_pre) 
-    );
-    DEC2x4 DEC ( 
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-    `endif
-        .EN(EN), .A(A[11:10]), .SEL(_EN_)
-    );
-
-    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (
-    `ifdef USE_POWER_PINS
-        .VPWR(VPWR),
-        .VGND(VGND),
-        .VPB(VPWR),
-        .VNB(VGND),
-    `endif
-        .X(Do), .A(Do_pre)
-    );
-    
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/RAM_4Kx32.v b/verilog/rtl/user_project/rtl/IPs/RAM_4Kx32.v
deleted file mode 100644
index 146ffa2..0000000
--- a/verilog/rtl/user_project/rtl/IPs/RAM_4Kx32.v
+++ /dev/null
@@ -1,52 +0,0 @@
-`timescale 1ns / 1ps
-`default_nettype none
-
-module RAM_4Kx32 (
-    CLK,
-    WE,
-    EN,
-    Di,
-    Do,
-    A
-);
-    input           CLK;
-    input   [3:0]   WE;
-    input           EN;
-    input   [31:0]  Di;
-    output  [31:0]  Do;
-    input   [11:0]   A;
-
-    localparam BLOCKS=4;
-    wire  [BLOCKS-1:0]       _EN_ ;
-    wire [31:0] _Do_ [BLOCKS-1:0];
-    wire [31:0] Do_pre;
-    wire [11:10] A_buf;
-    
-    generate 
-        genvar gi;
-        for(gi=0; gi<BLOCKS; gi=gi+1) 
-
-`ifdef USE_DFFRAM_BEH
-	DFFRAM_beh 
-`else
-	DFFRAM
-`endif
-            #(.COLS(4)) RAM (
-                .CLK(CLK),
-                .WE(WE),
-                .EN(_EN_[gi]),
-                .Di(Di),
-                .Do(_Do_[gi]),
-                .A(A[9:0])
-            );
-        
-    endgenerate 
-    
-    sky130_fd_sc_hd__clkbuf_8 ABUF[11:10] (.X(A_buf), .A(A[11:10]));
-
-    MUX4x1_32 MUX ( .A0(_Do_[0]), .A1(_Do_[1]), .A2(_Do_[2]), .A3(_Do_[3]), .S(A_buf), .X(Do_pre) );
-    DEC2x4 DEC ( .EN(EN), .A(A[11:10]), .SEL(_EN_) );
-
-    sky130_fd_sc_hd__clkbuf_4 DOBUF[31:0] (.X(Do), .A(Do_pre));
-    
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/IPs/TIMER32.v b/verilog/rtl/user_project/rtl/IPs/TIMER32.v
deleted file mode 100644
index dc2f87f..0000000
--- a/verilog/rtl/user_project/rtl/IPs/TIMER32.v
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
-	Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-/*
-	A simple 32-bit timer
-	TMR : 32-bit counter
-	PRE: clock prescalar (tmer_clk = clk / (PRE+1))
-	TMRCMP: Timer CMP register
-	TMROV: Timer overflow (TMR>=TMRCMP)
-	TMROVCLR: Control signal to clear the TMROV flag
-*/
-
-
-`timescale 1ns/1ps
-`default_nettype none
-
-module TIMER32 (
-		input wire clk,
-		input wire rst,
-		output reg [31:0] TMR,
-		input wire [31:0] PRE,
-		input wire [31:0] TMRCMP,
-		output reg TMROV,
-		input wire TMROVCLR,
-		input wire TMREN
-	);
-
-	reg [31:0] 	clkdiv;
-	wire 		timer_clk = (clkdiv==PRE) ;
-	wire 		tmrov = (TMR == TMRCMP);
-
-	// Prescalar
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			clkdiv <= 32'd0;
-		else if(timer_clk)
-			clkdiv <= 32'd0;
-		else if(TMREN)
-			clkdiv <= clkdiv + 32'd1;
-	end
-
-	// Timer
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			TMR <= 32'd0;
-		else if(tmrov)
-			TMR <= 32'd0;
-		else if(timer_clk)
-			TMR <= TMR + 32'd1;
-	end
-
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			TMROV <= 1'd0;
-		else if(TMROVCLR)
-			TMROV <= 1'd0;
-		else if(tmrov)
-			TMROV <= 1'd1;
-	end
-
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/WDT32.v b/verilog/rtl/user_project/rtl/IPs/WDT32.v
deleted file mode 100644
index 3eeea1e..0000000
--- a/verilog/rtl/user_project/rtl/IPs/WDT32.v
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
-	Mohamed Shalan (mshalan@aucegypt.edu)
-*/
-
-/*
-	A simple 32-bit watchdog timer
-	WDTMR	: 32-bit down counter
-	WDLOAD	: 32-bit load value
-	WDOV	: WD Timer overflow (WDTMR==0)
-	TMROVCLR: Control signal to clear the WDOV flag
-*/
-
-
-`timescale 1ns/1ps
-`default_nettype none
-
-module WDT32 (
-		input wire clk,
-		input wire rst,
-		output reg [31:0] WDTMR,
-		input wire [31:0] WDLOAD,
-		output reg WDOV,
-		input wire WDOVCLR,
-		input wire WDEN
-);
-
-	wire	wdov = (WDTMR == 32'd0);
-	
-	// WDTimer
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			WDTMR <= 32'h0;
-		else if(wdov & WDEN)
-			WDTMR <= WDLOAD;
-		else if(WDEN)
-			WDTMR <= WDTMR - 32'd1;
-		else if(~WDEN)
-		  WDTMR <= 32'h0;
-	end
-	
-	reg wden_p;
-	always @(posedge clk) 
-	  wden_p <= WDEN;
-
-	always @(posedge clk or posedge rst)
-	begin
-		if(rst)
-			WDOV <= 1'd0;
-		else if(WDOVCLR)
-			WDOV <= 1'd0;
-		else if(wdov & wden_p)
-			WDOV <= 1'd1;
-	end
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/IPs/apb2i2c/apb2i2c.v b/verilog/rtl/user_project/rtl/IPs/apb2i2c/apb2i2c.v
deleted file mode 100644
index 4995421..0000000
--- a/verilog/rtl/user_project/rtl/IPs/apb2i2c/apb2i2c.v
+++ /dev/null
@@ -1,56 +0,0 @@
-module APB_I2C(
-    //APB Inputs
-    input wire PCLK,
-    input wire PRESETn,
-    input wire PWRITE,
-    input wire [31:0] PWDATA,
-    input wire [31:0] PADDR,
-    input wire PENABLE,
-    
-    input PSEL,
-    
-    //APB Outputs
-    output wire PREADY,
-    output wire [31:0] PRDATA,
-
-    // i2c Ports
-    input 	wire scl_i,	    // SCL-line input
-	output 	wire scl_o,	    // SCL-line output (always 1'b0)
-	output 	wire scl_oen_o, // SCL-line output enable (active low)
-	input	wire sda_i,     // SDA-line input
-	output	wire sda_o,	    // SDA-line output (always 1'b0)
-	output	wire sda_oen_o // SDA-line output enable (active low)
-    
-);
-
-  assign PREADY = 1'b1; //always ready
-  
-  wire[7:0] io_do;
-  wire io_we = PENABLE & PWRITE & PREADY & PSEL;
-  wire io_re = PENABLE & ~PWRITE & PREADY & PSEL;
-
-  wire i2c_irq;
-  
-  i2c_master i2c (
-    		.sys_clk(PCLK),
-    		.sys_rst(~PRESETn),
-    		//
-    		.io_a(PADDR[7:2]),
-		    .io_di(PWDATA[7:0]),
-			.io_do(io_do),
-			.io_re(io_re),
-			.io_we(io_we),
-			//
-			.i2c_irq(i2c_irq),
-			//
-			.scl_i(scl_i),	   // SCL-line input
-			.scl_o(scl_o),	   // SCL-line output (always 1'b0)
-			.scl_oen_o(scl_oen_o), // SCL-line output enable (active low)
-			.sda_i(sda_i),		// SDA-line input
-			.sda_o(sda_o),	   // SDA-line output (always 1'b0)
-			.sda_oen_o(sda_oen_o)  // SDA-line output enable (active low)
-	);
-  
-  assign PRDATA[31:0] = io_do;//I2C_DATA_REG;
-  
-endmodule
diff --git a/verilog/rtl/user_project/rtl/IPs/i2c_master.v b/verilog/rtl/user_project/rtl/IPs/i2c_master.v
deleted file mode 100644
index a729e98..0000000
--- a/verilog/rtl/user_project/rtl/IPs/i2c_master.v
+++ /dev/null
@@ -1,931 +0,0 @@
-/*
-/////////////////////////////////////////////////////////////////////
-////                                                             ////
-//// Copyright (C) 2001 Richard Herveille                        ////
-////                    richard@asics.ws                         ////
-////                                                             ////
-//// This source file may be used and distributed without        ////
-//// restriction provided that this copyright statement is not   ////
-//// removed from the file and that any derivative work contains ////
-//// the original copyright notice and the associated disclaimer.////
-////                                                             ////
-////     THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY     ////
-//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED   ////
-//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS   ////
-//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR      ////
-//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,         ////
-//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES    ////
-//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE   ////
-//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR        ////
-//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF  ////
-//// LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT  ////
-//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT  ////
-//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE         ////
-//// POSSIBILITY OF SUCH DAMAGE.                                 ////
-////                                                             ////
-/////////////////////////////////////////////////////////////////////
-*/
-/*
-	i2c master controller. 
-	Based on the OpenCores i2c master controller by Richard Herveille 
-	Updated to: 
-		(1) remove unnecessary latches and
-		(2) enable asynchronous reading
-	Author: Mohamed Shalan
-*/
-
-
-`timescale 1ns/1ps
-`default_nettype none
-
-
-// bitcontroller states
-`define I2C_CMD_NOP   4'b0000
-`define I2C_CMD_START 4'b0001
-`define I2C_CMD_STOP  4'b0010
-`define I2C_CMD_WRITE 4'b0100
-`define I2C_CMD_READ  4'b1000
-
-
-module i2c_master_bit_ctrl (
-    input             clk,      // system clock
-    input             rst,      // asynchronous active high reset
-    input             ena,      // core enable signal
-
-    input      [15:0] clk_cnt,  // clock prescale value
-
-    input      [ 3:0] cmd,      // command (from byte controller)
-    output reg        cmd_ack,  // command complete acknowledge
-    output reg        busy,     // i2c bus busy
-    output reg        al,       // i2c bus arbitration lost
-
-    input             din,
-    output reg        dout,
-
-    input             scl_i,    // i2c clock line input
-    output            scl_o,    // i2c clock line output
-    output reg        scl_oen,  // i2c clock line output enable (active low)
-    input             sda_i,    // i2c data line input
-    output            sda_o,    // i2c data line output
-    output reg        sda_oen   // i2c data line output enable (active low)
-);
-
-    //
-    // variable declarations
-    //
-
-    reg [ 1:0] cSCL, cSDA;      // capture SCL and SDA
-    reg [ 2:0] fSCL, fSDA;      // SCL and SDA filter inputs
-    reg        sSCL, sSDA;      // filtered and synchronized SCL and SDA inputs
-    reg        dSCL, dSDA;      // delayed versions of sSCL and sSDA
-    reg        dscl_oen;        // delayed scl_oen
-    reg        sda_chk;         // check SDA output (Multi-master arbitration)
-    reg        clk_en;          // clock generation signals
-    reg        slave_wait;      // slave inserts wait states
-    reg [15:0] cnt;             // clock divider counter (synthesis)
-    reg [13:0] filter_cnt;      // clock divider for filter
-
-
-    // state machine variable
-    reg [17:0] c_state;
-
-    //
-    // module body
-    //
-
-    // whenever the slave is not ready it can delay the cycle by pulling SCL low
-    // delay scl_oen
-    always @(posedge clk)
-      dscl_oen <= #1 scl_oen;
-
-    // slave_wait is asserted when master wants to drive SCL high, but the slave pulls it low
-    // slave_wait remains asserted until the slave releases SCL
-    always @(posedge clk or posedge rst)
-      if (rst) slave_wait <= 1'b0;
-      else         slave_wait <= (scl_oen & ~dscl_oen & ~sSCL) | (slave_wait & ~sSCL);
-
-    // master drives SCL high, but another master pulls it low
-    // master start counting down its low cycle now (clock synchronization)
-    wire scl_sync   = dSCL & ~sSCL & scl_oen;
-
-
-    // generate clk enable signal
-    always @(posedge clk or posedge rst)
-      if (rst)
-      begin
-          cnt    <= #1 16'h0;
-          clk_en <= #1 1'b1;
-      end
-      else if ( ~|cnt || !ena || scl_sync)
-      begin
-          cnt    <= #1 clk_cnt;
-          clk_en <= #1 1'b1;
-      end
-      else if (slave_wait)
-      begin
-          cnt    <= #1 cnt;
-          clk_en <= #1 1'b0;    
-      end
-      else
-      begin
-          cnt    <= #1 cnt - 16'h1;
-          clk_en <= #1 1'b0;
-      end
-
-
-    // generate bus status controller
-
-    // capture SDA and SCL
-    // reduce metastability risk
-    always @(posedge clk or posedge rst)
-      if (rst)
-      begin
-          cSCL <= #1 2'b00;
-          cSDA <= #1 2'b00;
-      end
-      else
-      begin
-          cSCL <= {cSCL[0],scl_i};
-          cSDA <= {cSDA[0],sda_i};
-      end
-
-
-    // filter SCL and SDA signals; (attempt to) remove glitches
-    always @(posedge clk or posedge rst)
-      if      (rst) filter_cnt <= 14'h0;
-      else if (!ena ) filter_cnt <= 14'h0;
-      else if (~|filter_cnt) filter_cnt <= clk_cnt >> 2; //16x I2C bus frequency
-      else                   filter_cnt <= filter_cnt -1;
-
-
-    always @(posedge clk or posedge rst)
-      if (rst)
-      begin
-          fSCL <= 3'b111;
-          fSDA <= 3'b111;
-      end
-      else if (~|filter_cnt)
-      begin
-          fSCL <= {fSCL[1:0],cSCL[1]};
-          fSDA <= {fSDA[1:0],cSDA[1]};
-      end
-
-
-    // generate filtered SCL and SDA signals
-    always @(posedge clk or posedge rst)
-	  if (rst)
-      begin
-          sSCL <= #1 1'b1;
-          sSDA <= #1 1'b1;
-
-          dSCL <= #1 1'b1;
-          dSDA <= #1 1'b1;
-      end
-      else
-      begin
-          sSCL <= #1 &fSCL[2:1] | &fSCL[1:0] | (fSCL[2] & fSCL[0]);
-          sSDA <= #1 &fSDA[2:1] | &fSDA[1:0] | (fSDA[2] & fSDA[0]);
-
-          dSCL <= #1 sSCL;
-          dSDA <= #1 sSDA;
-      end
-
-    // detect start condition => detect falling edge on SDA while SCL is high
-    // detect stop condition => detect rising edge on SDA while SCL is high
-    reg sta_condition;
-    reg sto_condition;
-    always @(posedge clk or posedge rst)
-      if (rst)
-      begin
-          sta_condition <= #1 1'b0;
-          sto_condition <= #1 1'b0;
-      end
-      else
-      begin
-          sta_condition <= #1 ~sSDA &  dSDA & sSCL;
-          sto_condition <= #1  sSDA & ~dSDA & sSCL;
-      end
-
-
-    // generate i2c bus busy signal
-    always @(posedge clk or posedge rst)
-      if (rst    ) busy <= #1 1'b0;
-      else              busy <= #1 (sta_condition | busy) & ~sto_condition;
-
-
-    // generate arbitration lost signal
-    // aribitration lost when:
-    // 1) master drives SDA high, but the i2c bus is low
-    // 2) stop detected while not requested
-    reg cmd_stop;
-    always @(posedge clk or posedge rst)
-      if (rst)
-          cmd_stop <= #1 1'b0;
-      else if (clk_en)
-          cmd_stop <= #1 cmd == `I2C_CMD_STOP;
-
-    always @(posedge clk or posedge rst)
-      if (rst)
-          al <= #1 1'b0;
-      else
-          al <= #1 (sda_chk & ~sSDA & sda_oen) | (|c_state & sto_condition & ~cmd_stop);
-
-
-    // generate dout signal (store SDA on rising edge of SCL)
-    always @(posedge clk)
-      if (sSCL & ~dSCL) dout <= #1 sSDA;
-
-
-    // generate statemachine
-
-    // nxt_state decoder
-    parameter [17:0] idle    = 18'b0_0000_0000_0000_0000;
-    parameter [17:0] start_a = 18'b0_0000_0000_0000_0001;
-    parameter [17:0] start_b = 18'b0_0000_0000_0000_0010;
-    parameter [17:0] start_c = 18'b0_0000_0000_0000_0100;
-    parameter [17:0] start_d = 18'b0_0000_0000_0000_1000;
-    parameter [17:0] start_e = 18'b0_0000_0000_0001_0000;
-    parameter [17:0] stop_a  = 18'b0_0000_0000_0010_0000;
-    parameter [17:0] stop_b  = 18'b0_0000_0000_0100_0000;
-    parameter [17:0] stop_c  = 18'b0_0000_0000_1000_0000;
-    parameter [17:0] stop_d  = 18'b0_0000_0001_0000_0000;
-    parameter [17:0] rd_a    = 18'b0_0000_0010_0000_0000;
-    parameter [17:0] rd_b    = 18'b0_0000_0100_0000_0000;
-    parameter [17:0] rd_c    = 18'b0_0000_1000_0000_0000;
-    parameter [17:0] rd_d    = 18'b0_0001_0000_0000_0000;
-    parameter [17:0] wr_a    = 18'b0_0010_0000_0000_0000;
-    parameter [17:0] wr_b    = 18'b0_0100_0000_0000_0000;
-    parameter [17:0] wr_c    = 18'b0_1000_0000_0000_0000;
-    parameter [17:0] wr_d    = 18'b1_0000_0000_0000_0000;
-
-    always @(posedge clk or posedge rst)
-      if (rst)
-      begin
-          c_state <= #1 idle;
-          cmd_ack <= #1 1'b0;
-          scl_oen <= #1 1'b1;
-          sda_oen <= #1 1'b1;
-          sda_chk <= #1 1'b0;
-      end
-      else if (al)
-      begin
-          c_state <= #1 idle;
-          cmd_ack <= #1 1'b0;
-          scl_oen <= #1 1'b1;
-          sda_oen <= #1 1'b1;
-          sda_chk <= #1 1'b0;
-      end
-      else
-      begin
-          cmd_ack   <= #1 1'b0; // default no command acknowledge + assert cmd_ack only 1clk cycle
-
-          if (clk_en)
-              case (c_state)
-                    // idle state
-                    idle:
-                    begin
-                        case (cmd)
-                             `I2C_CMD_START: c_state <= #1 start_a;
-                             `I2C_CMD_STOP:  c_state <= #1 stop_a;
-                             `I2C_CMD_WRITE: c_state <= #1 wr_a;
-                             `I2C_CMD_READ:  c_state <= #1 rd_a;
-                             default:        c_state <= #1 idle;
-                        endcase
-
-                        scl_oen <= #1 scl_oen; // keep SCL in same state
-                        sda_oen <= #1 sda_oen; // keep SDA in same state
-                        sda_chk <= #1 1'b0;    // don't check SDA output
-                    end
-
-                    // start
-                    start_a:
-                    begin
-                        c_state <= #1 start_b;
-                        scl_oen <= #1 scl_oen; // keep SCL in same state
-                        sda_oen <= #1 1'b1;    // set SDA high
-                        sda_chk <= #1 1'b0;    // don't check SDA output
-                    end
-
-                    start_b:
-                    begin
-                        c_state <= #1 start_c;
-                        scl_oen <= #1 1'b1; // set SCL high
-                        sda_oen <= #1 1'b1; // keep SDA high
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    start_c:
-                    begin
-                        c_state <= #1 start_d;
-                        scl_oen <= #1 1'b1; // keep SCL high
-                        sda_oen <= #1 1'b0; // set SDA low
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    start_d:
-                    begin
-                        c_state <= #1 start_e;
-                        scl_oen <= #1 1'b1; // keep SCL high
-                        sda_oen <= #1 1'b0; // keep SDA low
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    start_e:
-                    begin
-                        c_state <= #1 idle;
-                        cmd_ack <= #1 1'b1;
-                        scl_oen <= #1 1'b0; // set SCL low
-                        sda_oen <= #1 1'b0; // keep SDA low
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    // stop
-                    stop_a:
-                    begin
-                        c_state <= #1 stop_b;
-                        scl_oen <= #1 1'b0; // keep SCL low
-                        sda_oen <= #1 1'b0; // set SDA low
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    stop_b:
-                    begin
-                        c_state <= #1 stop_c;
-                        scl_oen <= #1 1'b1; // set SCL high
-                        sda_oen <= #1 1'b0; // keep SDA low
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    stop_c:
-                    begin
-                        c_state <= #1 stop_d;
-                        scl_oen <= #1 1'b1; // keep SCL high
-                        sda_oen <= #1 1'b0; // keep SDA low
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    stop_d:
-                    begin
-                        c_state <= #1 idle;
-                        cmd_ack <= #1 1'b1;
-                        scl_oen <= #1 1'b1; // keep SCL high
-                        sda_oen <= #1 1'b1; // set SDA high
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    // read
-                    rd_a:
-                    begin
-                        c_state <= #1 rd_b;
-                        scl_oen <= #1 1'b0; // keep SCL low
-                        sda_oen <= #1 1'b1; // tri-state SDA
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    rd_b:
-                    begin
-                        c_state <= #1 rd_c;
-                        scl_oen <= #1 1'b1; // set SCL high
-                        sda_oen <= #1 1'b1; // keep SDA tri-stated
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    rd_c:
-                    begin
-                        c_state <= #1 rd_d;
-                        scl_oen <= #1 1'b1; // keep SCL high
-                        sda_oen <= #1 1'b1; // keep SDA tri-stated
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    rd_d:
-                    begin
-                        c_state <= #1 idle;
-                        cmd_ack <= #1 1'b1;
-                        scl_oen <= #1 1'b0; // set SCL low
-                        sda_oen <= #1 1'b1; // keep SDA tri-stated
-                        sda_chk <= #1 1'b0; // don't check SDA output
-                    end
-
-                    // write
-                    wr_a:
-                    begin
-                        c_state <= #1 wr_b;
-                        scl_oen <= #1 1'b0; // keep SCL low
-                        sda_oen <= #1 din;  // set SDA
-                        sda_chk <= #1 1'b0; // don't check SDA output (SCL low)
-                    end
-
-                    wr_b:
-                    begin
-                        c_state <= #1 wr_c;
-                        scl_oen <= #1 1'b1; // set SCL high
-                        sda_oen <= #1 din;  // keep SDA
-                        sda_chk <= #1 1'b0; // don't check SDA output yet
-                                            // allow some time for SDA and SCL to settle
-                    end
-
-                    wr_c:
-                    begin
-                        c_state <= #1 wr_d;
-                        scl_oen <= #1 1'b1; // keep SCL high
-                        sda_oen <= #1 din;
-                        sda_chk <= #1 1'b1; // check SDA output
-                    end
-
-                    wr_d:
-                    begin
-                        c_state <= #1 idle;
-                        cmd_ack <= #1 1'b1;
-                        scl_oen <= #1 1'b0; // set SCL low
-                        sda_oen <= #1 din;
-                        sda_chk <= #1 1'b0; // don't check SDA output (SCL low)
-                    end
-
-              endcase
-      end
-
-
-    // assign scl and sda output (always gnd)
-    assign scl_o = 1'b0;
-    assign sda_o = 1'b0;
-
-endmodule
-
-module i2c_master_byte_ctrl (
-	clk, rst, ena, clk_cnt, start, stop, read, write, ack_in, din,
-	cmd_ack, ack_out, dout, i2c_busy, i2c_al, scl_i, scl_o, scl_oen, sda_i, sda_o, sda_oen );
-
-	//
-	// inputs & outputs
-	//
-	input clk;     // master clock
-	input rst;     // asynchronous active high reset
-	input ena;     // core enable signal
-
-	input [15:0] clk_cnt; // 4x SCL
-
-	// control inputs
-	input       start;
-	input       stop;
-	input       read;
-	input       write;
-	input       ack_in;
-	input [7:0] din;
-
-	// status outputs
-	output       cmd_ack;
-	reg cmd_ack;
-	output       ack_out;
-	reg ack_out;
-	output       i2c_busy;
-	output       i2c_al;
-	output [7:0] dout;
-
-	// I2C signals
-	input  scl_i;
-	output scl_o;
-	output scl_oen;
-	input  sda_i;
-	output sda_o;
-	output sda_oen;
-
-
-	//
-	// Variable declarations
-	//
-
-	// statemachine
-	parameter [4:0] ST_IDLE  = 5'b0_0000;
-	parameter [4:0] ST_START = 5'b0_0001;
-	parameter [4:0] ST_READ  = 5'b0_0010;
-	parameter [4:0] ST_WRITE = 5'b0_0100;
-	parameter [4:0] ST_ACK   = 5'b0_1000;
-	parameter [4:0] ST_STOP  = 5'b1_0000;
-
-	// signals for bit_controller
-	reg  [3:0] core_cmd;
-	reg        core_txd;
-	wire       core_ack, core_rxd;
-
-	// signals for shift register
-	reg [7:0] sr; //8bit shift register
-	reg       shift, ld;
-
-	// signals for state machine
-	wire       go;
-	reg  [2:0] dcnt;
-	wire       cnt_done;
-
-	//
-	// Module body
-	//
-
-	// hookup bit_controller
-	i2c_master_bit_ctrl bit_controller (
-		.clk     ( clk      ),
-		.rst     ( rst      ),
-		.ena     ( ena      ),
-		.clk_cnt ( clk_cnt  ),
-		.cmd     ( core_cmd ),
-		.cmd_ack ( core_ack ),
-		.busy    ( i2c_busy ),
-		.al      ( i2c_al   ),
-		.din     ( core_txd ),
-		.dout    ( core_rxd ),
-		.scl_i   ( scl_i    ),
-		.scl_o   ( scl_o    ),
-		.scl_oen ( scl_oen  ),
-		.sda_i   ( sda_i    ),
-		.sda_o   ( sda_o    ),
-		.sda_oen ( sda_oen  )
-	);
-
-	// generate go-signal
-	assign go = (read | write | stop) & ~cmd_ack;
-
-	// assign dout output to shift-register
-	assign dout = sr;
-
-	// generate shift register
-	always @(posedge clk or posedge rst)
-	  if (rst)
-	    sr <= #1 8'h0;
-	  else if (ld)
-	    sr <= #1 din;
-	  else if (shift)
-	    sr <= #1 {sr[6:0], core_rxd};
-
-	// generate counter
-	always @(posedge clk or posedge rst)
-	  if (rst)
-	    dcnt <= #1 3'h0;
-	  else if (ld)
-	    dcnt <= #1 3'h7;
-	  else if (shift)
-	    dcnt <= #1 dcnt - 3'h1;
-
-	assign cnt_done = ~(|dcnt);
-
-	//
-	// state machine
-	//
-	reg [4:0] c_state;
-
-	always @(posedge clk or posedge rst)
-	  if (rst)
-	    begin
-	        core_cmd <= #1 `I2C_CMD_NOP;
-	        core_txd <= #1 1'b0;
-	        shift    <= #1 1'b0;
-	        ld       <= #1 1'b0;
-	        cmd_ack  <= #1 1'b0;
-	        c_state  <= #1 ST_IDLE;
-	        ack_out  <= #1 1'b0;
-	    end
-	  else if (i2c_al)
-	   begin
-	       core_cmd <= #1 `I2C_CMD_NOP;
-	       core_txd <= #1 1'b0;
-	       shift    <= #1 1'b0;
-	       ld       <= #1 1'b0;
-	       cmd_ack  <= #1 1'b0;
-	       c_state  <= #1 ST_IDLE;
-	       ack_out  <= #1 1'b0;
-	   end
-	else
-	  begin
-	      // initially reset all signals
-	      core_txd <= #1 sr[7];
-	      shift    <= #1 1'b0;
-	      ld       <= #1 1'b0;
-	      cmd_ack  <= #1 1'b0;
-
-	      case (c_state) // synopsys full_case parallel_case
-	        ST_IDLE:
-	          if (go)
-	            begin
-	                if (start)
-	                  begin
-	                      c_state  <= #1 ST_START;
-	                      core_cmd <= #1 `I2C_CMD_START;
-	                  end
-	                else if (read)
-	                  begin
-	                      c_state  <= #1 ST_READ;
-	                      core_cmd <= #1 `I2C_CMD_READ;
-	                  end
-	                else if (write)
-	                  begin
-	                      c_state  <= #1 ST_WRITE;
-	                      core_cmd <= #1 `I2C_CMD_WRITE;
-	                  end
-	                else // stop
-	                  begin
-	                      c_state  <= #1 ST_STOP;
-	                      core_cmd <= #1 `I2C_CMD_STOP;
-	                  end
-
-	                ld <= #1 1'b1;
-	            end
-
-	        ST_START:
-	          if (core_ack)
-	            begin
-	                if (read)
-	                  begin
-	                      c_state  <= #1 ST_READ;
-	                      core_cmd <= #1 `I2C_CMD_READ;
-	                  end
-	                else
-	                  begin
-	                      c_state  <= #1 ST_WRITE;
-	                      core_cmd <= #1 `I2C_CMD_WRITE;
-	                  end
-
-	                ld <= #1 1'b1;
-	            end
-
-	        ST_WRITE:
-	          if (core_ack)
-	            if (cnt_done)
-	              begin
-	                  c_state  <= #1 ST_ACK;
-	                  core_cmd <= #1 `I2C_CMD_READ;
-	              end
-	            else
-	              begin
-	                  c_state  <= #1 ST_WRITE;       // stay in same state
-	                  core_cmd <= #1 `I2C_CMD_WRITE; // write next bit
-	                  shift    <= #1 1'b1;
-	              end
-
-	        ST_READ:
-	          if (core_ack)
-	            begin
-	                if (cnt_done)
-	                  begin
-	                      c_state  <= #1 ST_ACK;
-	                      core_cmd <= #1 `I2C_CMD_WRITE;
-	                  end
-	                else
-	                  begin
-	                      c_state  <= #1 ST_READ;       // stay in same state
-	                      core_cmd <= #1 `I2C_CMD_READ; // read next bit
-	                  end
-
-	                shift    <= #1 1'b1;
-	                core_txd <= #1 ack_in;
-	            end
-
-	        ST_ACK:
-	          if (core_ack)
-	            begin
-	               if (stop)
-	                 begin
-	                     c_state  <= #1 ST_STOP;
-	                     core_cmd <= #1 `I2C_CMD_STOP;
-	                 end
-	               else
-	                 begin
-	                     c_state  <= #1 ST_IDLE;
-	                     core_cmd <= #1 `I2C_CMD_NOP;
-
-	                     // generate command acknowledge signal
-	                     cmd_ack  <= #1 1'b1;
-	                 end
-
-	                 // assign ack_out output to bit_controller_rxd (contains last received bit)
-	                 ack_out <= #1 core_rxd;
-
-	                 core_txd <= #1 1'b1;
-	             end
-	           else
-	             core_txd <= #1 ack_in;
-
-	        ST_STOP:
-	          if (core_ack)
-	            begin
-	                c_state  <= #1 ST_IDLE;
-	                core_cmd <= #1 `I2C_CMD_NOP;
-
-	                // generate command acknowledge signal
-	                cmd_ack  <= #1 1'b1;
-	            end
-
-	      endcase
-	  end
-endmodule
-
-
-module i2c_master #(
-	parameter base_addr = 6'h0
-)
-(
-	//
-    input wire sys_clk,
-    input wire sys_rst,
-    //
-    input wire [5:0] io_a,
-    input wire [7:0] io_di,
-    output reg [7:0] io_do,
-    input wire io_re,
-    input wire io_we,
-    //
-	output reg i2c_irq,
-	//
-	input wire scl_i,	   // SCL-line input
-	output wire scl_o,	   // SCL-line output (always 1'b0)
-	output wire scl_oen_o, // SCL-line output enable (active low)
-	input wire sda_i,      // SDA-line input
-	output wire sda_o,	   // SDA-line output (always 1'b0)
-	output wire sda_oen_o  // SDA-line output enable (active low)
-);
-
-    // register address	
-	localparam prer_low_addr 	= base_addr;
-	localparam prer_high_addr 	= base_addr + 6'd1;
-	localparam ctr_addr  		= base_addr + 6'd2;
-	localparam txr_addr  		= base_addr + 6'd3;
-	localparam rxr_addr  		= base_addr + 6'd4;
-	localparam cr_addr  			= base_addr + 6'd5;
-	localparam sr_addr  			= base_addr + 6'd6;
-	
-	wire csr_selected = (io_a == prer_low_addr) | (io_a == prer_high_addr) |
-						(io_a == ctr_addr) | (io_a == rxr_addr) |
-						(io_a == sr_addr) | (io_a == txr_addr) |
-						(io_a == cr_addr);
-	
-	//
-	// variable declarations
-	//
-
-	// registers
-	reg  [15:0] prer; // clock prescale register
-	reg  [ 7:0] ctr;  // control register
-	reg  [ 7:0] txr;  // transmit register
-	wire [ 7:0] rxr;  // receive register
-	reg  [ 7:0] cr;   // command register
-	wire [ 7:0] sr;   // status register
-
-	// done signal: command completed, clear command register
-	wire done;
-
-	// core enable signal
-	wire core_en;
-	wire ien;
-
-	// status register signals
-	wire irxack;
-	reg  rxack;       // received aknowledge from slave
-	reg  tip;         // transfer in progress
-	reg  irq_flag;    // interrupt pending flag
-	wire i2c_busy;    // bus busy (start signal detected)
-	wire i2c_al;      // i2c bus arbitration lost
-	reg  al;          // status register arbitration lost bit
-
-	//
-	// module body
-	//
-
-	// assign io_do
-	always @*
-	begin
-	  io_do = 8'd00;
-	  if(io_re & csr_selected)
-		case (io_a)
-			prer_low_addr: 		io_do = #1 prer[ 7:0];
-			prer_high_addr: 	io_do = #1 prer[15:8];
-			ctr_addr: 			io_do = #1 ctr;
-			rxr_addr: 			io_do = #1 rxr;
-			sr_addr: 			io_do = #1 sr;
-			txr_addr: 			io_do = #1 txr;
-			cr_addr: 			io_do = #1 cr;
-			default: 			io_do = 8'hff;   			 // reserved
-		endcase
-	end
-
-	/*
-	always @(posedge sys_clk)
-	begin
-	  //io_do <= 8'd00;
-	  if(io_re & csr_selected)
-		case (io_a)
-			prer_low_addr: 		io_do <= #1 prer[ 7:0];
-			prer_high_addr: 	io_do <= #1 prer[15:8];
-			ctr_addr: 			io_do <= #1 ctr;
-			rxr_addr: 			io_do <= #1 rxr;
-			sr_addr: 			io_do <= #1 sr;
-			txr_addr: 			io_do <= #1 txr;
-			cr_addr: 			io_do <= #1 cr;
-			default: 			;   			 // reserved
-		endcase
-	end
-*/
-	// generate registers
-	always @(posedge sys_clk or posedge sys_rst)
-	  if (sys_rst)
-	    begin
-	        prer <= #1 16'hffff;
-	        ctr  <= #1  8'h0;
-	        txr  <= #1  8'h0;
-	    end
-	  else
-	    if (io_we & csr_selected)
-	      case (io_a)
-	         prer_low_addr : 	prer [ 7:0] <= #1 io_di;
-	         prer_high_addr : 	prer [15:8] <= #1 io_di;
-	         ctr_addr : 				ctr <= #1 io_di;
-	         txr_addr : 				txr <= #1 io_di;
-	         default: ;
-	      endcase
-
-	// generate command register (special case)
-	always @(posedge sys_clk or posedge sys_rst)
-	  if (sys_rst)
-	    cr <= #1 8'h0;
-	  else if (io_we & (io_a == cr_addr))
-	    begin
-	        if (core_en)
-	          cr <= #1 io_di;
-	    end
-	  else
-	    begin
-	        if (done | i2c_al)
-	          cr[7:4] <= #1 4'h0;           // clear command bits when done
-	                                        // or when aribitration lost
-	        cr[2:1] <= #1 2'b0;             // reserved bits
-	        cr[0]   <= #1 1'b0;             // clear IRQ_ACK bit
-	    end
-
-
-	// decode command register
-	wire sta  = cr[7];
-	wire sto  = cr[6];
-	wire rd   = cr[5];
-	wire wr   = cr[4];
-	wire ack  = cr[3];
-	wire iack = cr[0];
-
-	// decode control register
-	assign core_en = ctr[7];
-	assign ien = ctr[6];
-
-	// hookup byte controller block
-	i2c_master_byte_ctrl byte_controller (
-		.clk      ( sys_clk     ),
-		.rst      ( sys_rst     ),
-		.ena      ( core_en      ),
-		.clk_cnt  ( prer         ),
-		.start    ( sta          ),
-		.stop     ( sto          ),
-		.read     ( rd           ),
-		.write    ( wr           ),
-		.ack_in   ( ack          ),
-		.din      ( txr          ),
-		.cmd_ack  ( done         ),
-		.ack_out  ( irxack       ),
-		.dout     ( rxr          ),
-		.i2c_busy ( i2c_busy     ),
-		.i2c_al   ( i2c_al       ),
-		.scl_i    ( scl_i    ),
-		.scl_o    ( scl_o    ),
-		.scl_oen  ( scl_oen_o ),
-		.sda_i    ( sda_i    ),
-		.sda_o    ( sda_o    ),
-		.sda_oen  ( sda_oen_o )
-	);
-
-	// status register block + interrupt request signal
-	always @(posedge sys_clk or posedge sys_rst)
-	  if (sys_rst)
-	    begin
-	        al       <= #1 1'b0;
-	        rxack    <= #1 1'b0;
-	        tip      <= #1 1'b0;
-	        irq_flag <= #1 1'b0;
-	    end
-	  else
-	    begin
-	        al       <= #1 i2c_al | (al & ~sta);
-	        rxack    <= #1 irxack;
-	        tip      <= #1 (rd | wr);
-	        irq_flag <= #1 (done | i2c_al /*| irq_flag*/) & ~iack; // interrupt request flag is always generated
-	    end
-
-	// generate interrupt request signals
-	always @(posedge sys_clk or posedge sys_rst)
-	  if (sys_rst)
-	    i2c_irq <= #1 1'b0;
-	  else
-	    i2c_irq <= #1 irq_flag && ien; // interrupt signal is only generated when IEN (interrupt enable bit is set)
-
-	// assign status register bits
-	assign sr[7]   = rxack;
-	assign sr[6]   = i2c_busy;
-	assign sr[5]   = al;
-	assign sr[4:2] = 3'h0; // reserved
-	assign sr[1]   = tip;
-	assign sr[0]   = irq_flag;
-
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/IPs/spi_master.v b/verilog/rtl/user_project/rtl/IPs/spi_master.v
deleted file mode 100644
index c812ee4..0000000
--- a/verilog/rtl/user_project/rtl/IPs/spi_master.v
+++ /dev/null
@@ -1,250 +0,0 @@
-/**
- * Copyright (C) 2009 Ubixum, Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
- **/
-
-// Author:    Lane Brooks
-// Date:      10/31/2009
-// Desc: Implements a low level SPI master interface. Set the
-//       DATA_WIDTH parameter at instatiation. Put the data you want
-//       to send on the 'datai' port and strobe the 'go' signal. The
-//       bits of 'datai' will get serially shifted out to the device
-//       and the bits coming back from the device will get serially
-//       shifted into the 'datao' register.  Hook up the 'csb',
-//       'sclk', 'din', and 'dout' wires to the device.  'busy' is
-//       high while the shift is running and goes low when the shift
-//       is complete.
-//
-//       The NUM_PORTS parameter can be used when the 'csb' and 'sclk'
-//       lines are shared with multiple devices and the 'din' and 'dout'
-//       lines are unique. For example, if you have two devices, the
-//       specify NUM_PORTS=2 and 'din' and 'dout' become width 2 ports
-//       and 'datai' and 'datao' become DATA_WIDTH*NUM_PORTS wide.
-//
-//       Set the CLK_DIVIDER_WIDTH at instantiation. The rate of
-//       'sclk' to the device is then set by the input 'clk_divider'.
-//       'clk_divider' must be at least 4.
-//
-//       The clock polarity and phasing of this master is set via the
-//       CPOL and CPHA inputs. See
-//       http://en.wikipedia.org/wiki/Serial_Peripheral_Interface_Bus
-//       a description of these conventions.
-//
-
-
-`timescale 1ns/1ps
-`default_nettype none
-
-
-module spi_master
-  #(parameter DATA_WIDTH=16,
-    NUM_PORTS=1,
-    CLK_DIVIDER_WIDTH=8,
-    SAMPLE_PHASE=0
-    )
-  (input clk,
-   input resetb,
-   input CPOL,
-   input CPHA,
-   input [CLK_DIVIDER_WIDTH-1:0] clk_divider,
-
-   input go,
-   input [(NUM_PORTS*DATA_WIDTH)-1:0] datai,
-   output [(NUM_PORTS*DATA_WIDTH)-1:0] datao,
-   output reg busy,
-   output reg done,
-
-   input [NUM_PORTS-1:0] dout,
-   output [NUM_PORTS-1:0] din,
-   output reg csb,
-   output reg sclk
-   );
-
-   reg  [CLK_DIVIDER_WIDTH-1:0]  clk_count;
-   wire [CLK_DIVIDER_WIDTH-1:0]  next_clk_count = clk_count + 1;
-   wire pulse = next_clk_count == (clk_divider >> 1);
-   reg    state;
-
-`ifdef verilator
-   localparam LOG2_DATA_WIDTH = $clog2(DATA_WIDTH+1);
-`else
-   function integer log2;
-      input integer value;
-      integer       count;
-      begin
-         value = value-1;
-         for (count=0; value>0; count=count+1)
-           value = value>>1;
-         log2=count;
-      end
-   endfunction
-   localparam LOG2_DATA_WIDTH = log2(DATA_WIDTH+1);
-`endif
-
-   reg [LOG2_DATA_WIDTH:0] shift_count;
-
-   wire start = shift_count == 0;
-   /* verilator lint_off WIDTH */
-   wire stop  = shift_count >= 2*DATA_WIDTH-1;
-   /* verilator lint_on WIDTH */
-   reg 	stop_s;
-
-   localparam IDLE_STATE = 0,
-              RUN_STATE = 1;
-
-   sro #(.DATA_WIDTH(DATA_WIDTH)) sro[NUM_PORTS-1:0]
-     (.clk(clk),
-      .resetb(resetb),
-      .shift(pulse && !csb && (shift_count[0] == SAMPLE_PHASE) && !stop_s),
-      .dout(dout),
-      .datao(datao));
-
-   sri #(.DATA_WIDTH(DATA_WIDTH)) sri[NUM_PORTS-1:0]
-     (.clk(clk),
-      .resetb(resetb),
-      .datai(datai),
-      .sample(go && (state == IDLE_STATE)), // we condition on state so that if the user holds 'go' high, this will sample only at the start of the transfer
-      .shift(pulse && !csb && (shift_count[0] == 1) && !stop),
-      .din(din));
-
-`ifdef SYNC_RESET
-   always @(posedge clk) begin
-`else
-   always @(posedge clk or negedge resetb) begin
-`endif
-      if(!resetb) begin
-         clk_count <= 0;
-         shift_count <= 0;
-         sclk  <= 1;
-         csb   <= 1;
-         state <= IDLE_STATE;
-         busy  <= 0;
-         done  <= 0;
-	 stop_s <= 0;
-      end else begin
-         // generate the pulse train
-         if(pulse) begin
-            clk_count <= 0;
-	    stop_s <= stop;
-         end else begin
-            clk_count <= next_clk_count;
-         end
-
-
-         // generate csb
-         if(state == IDLE_STATE) begin
-            csb  <= 1;
-            shift_count <= 0;
-            done <= 0;
-            if(go && !busy) begin // the !busy condition here allows the user to hold go high and this will then run transactions back-to-back at maximum speed where busy drops at for at least one clock cycle but we stay in this idle state for two clock cycles. Staying in idle state for two cycles probably isn't a big deal since the serial clock is running slower anyway.
-               state  <= RUN_STATE;
-               busy   <= 1;
-            end else begin
-               busy   <= 0;
-            end
-         end else begin
-            if(pulse) begin
-               if(stop) begin
-                  //csb <= 1;
-                  if(done) begin
-		     state <= IDLE_STATE;
-		     done <= 0;
-		     busy <= 0;
-		  end else begin
-                     done  <= 1;
-		  end
-               end else begin
-                  csb <= 0;
-                  if(!csb) begin
-                     shift_count <= shift_count + 1;
-                  end
-               end
-            end
-         end
-
-         // generate sclk
-         if(pulse) begin
-            if((CPHA==1 && state==RUN_STATE && !stop) ||
-               (CPHA==0 && !csb && !stop)) begin
-               sclk <= !sclk;
-            end else begin
-               sclk <= CPOL;
-            end
-         end
-      end
-   end
-endmodule // spi_master
-
-module sri
-  // This is a shift register that sends data out to the di lines of
-  // spi slaves.
-  #(parameter DATA_WIDTH=16)
-  (input clk,
-   input resetb,
-   input [DATA_WIDTH-1:0] datai,
-   input sample,
-   input shift,
-   output din
-   );
-
-   reg [DATA_WIDTH-1:0] sr_reg;
-   assign din = sr_reg[DATA_WIDTH-1];
-
-`ifdef SYNC_RESET
-   always @(posedge clk) begin
-`else
-   always @(posedge clk or negedge resetb) begin
-`endif
-      if(!resetb) begin
-         sr_reg <= 0;
-      end else begin
-         if(sample) begin
-            sr_reg <= datai;
-         end else if(shift) begin
-            sr_reg <= sr_reg << 1;
-         end
-      end
-   end
-endmodule
-
-module sro
-  // This is a shift register that receives data on the dout lines
-  // from spi slaves.
-  #(parameter DATA_WIDTH=16)
-  (input clk,
-   input resetb,
-   input shift,
-   input dout,
-   output reg [DATA_WIDTH-1:0] datao
-   );
-   reg                     dout_s;
-
-`ifdef SYNC_RESET
-   always @(posedge clk) begin
-`else
-   always @(posedge clk or negedge resetb) begin
-`endif
-      if(!resetb) begin
-         dout_s <= 0;
-         datao <= 0;
-      end else begin
-         dout_s <= dout;
-         if(shift) begin
-            datao <= { datao[DATA_WIDTH-2:0], dout_s };
-         end
-      end
-   end
-endmodule
\ No newline at end of file
diff --git a/verilog/rtl/user_project/rtl/NfiVe32.v b/verilog/rtl/user_project/rtl/NfiVe32.v
deleted file mode 100755
index 97f0688..0000000
--- a/verilog/rtl/user_project/rtl/NfiVe32.v
+++ /dev/null
@@ -1,1281 +0,0 @@
-/*
- 	 _   _  __ ___     __   _________  
-	| \ | |/ _(_) \   / /__|___ /___ \ 
-	|  \| | |_| |\ \ / / _ \ |_ \ __) |
-	| |\  |  _| | \ V /  __/___) / __/ 
-	|_| \_|_| |_|  \_/ \___|____/_____|
-	Copyright 2020 Mohamed Shalan
-	
-	Licensed under the Apache License, Version 2.0 (the "License"); 
-	you may not use this file except in compliance with the License. 
-	You may obtain a copy of the License at:
-
-	http://www.apache.org/licenses/LICENSE-2.0
-
-	Unless required by applicable law or agreed to in writing, software 
-	distributed under the License is distributed on an "AS IS" BASIS, 
-	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
-	See the License for the specific language governing permissions and 
-	limitations under the License.
-*/
-/*
-	Started as a One day project on May 2, 2020 by Mohamed Shalan 
-	NfiVe32 is area optimized RV32IC core with the following features:
-	* Target clock frequency > 100MHz in 130nm technologies
-	* CPI ~ 3
-	* ASIC cell count: < 10K 
-		+ SKY130A (HD): ~8.5K @ CP=5.8ns (DLY3)
-	* Instruction Cycles (3/4)
-	    + C0 : Fetch and Decompress, 
-	    + C1 : Fetch cyle 2; optional, only used for unaligned 32-bit instructions
-	    + C2 : RF read, ALU & Branch, 
-	    + C3 : Memory & RF write-back
-	* A single AHB-Lite Master interface for both instructions and data
-	    + Instr: A(C3), I(C0)
-	    + Data: A(C2), D(C3)
-
-	To do:
-		- [X] Exception Handeling + PIC
-		- [X] Bus wait states
-		- [X] Some Performance counters (CYCLE and INSTRET)
-		- [X] Systick timer
-		- [] Wait for Interrupt Instruction (wfi)
-		- [] Comprehensive testing
-		- [X] Add a latch based Register File
-		- [X] Add hand-crafted ALU 
-*/
-
-
-`timescale 1ns/1ps
-`default_nettype none
-
-`define		USE_RF_MODULE
-//`define		USE_HC_REGF
-
-//`define		USE_RF_HC
-//`define		USE_ALU_HC
-
-//`define DBG
-
-// Macros used by all modules
-`define     SYNC_BEGIN(r, v)  always @ (posedge HCLK or negedge HRESETn) if(!HRESETn) r <= v; else begin
-`define     SYNC_END          end
-
-`define     IR_rs1          19:15
-`define     IR_rs2          24:20
-`define     IR_rd           11:7
-`define     IR_opcode       6:2
-`define     IR_funct3       14:12
-`define     IR_cond       	14:12
-`define     IR_funct7       31:25
-`define     IR_shamt        24:20
-`define     IR_csr          31:20
-
-`define     OPCODE_Branch   5'b11_000
-`define     OPCODE_Load     5'b00_000
-`define     OPCODE_Store    5'b01_000
-`define     OPCODE_JALR     5'b11_001
-`define     OPCODE_JAL      5'b11_011
-`define     OPCODE_Arith_I  5'b00_100
-`define     OPCODE_Arith_R  5'b01_100
-`define     OPCODE_AUIPC    5'b00_101
-`define     OPCODE_LUI      5'b01_101
-`define     OPCODE_SYSTEM   5'b11_100
-`define     OPCODE_Custom   5'b10_001
-
-`define     F3_ADD          3'b000
-`define     F3_SLL          3'b001
-`define     F3_SLT          3'b010
-`define     F3_SLTU         3'b011
-`define     F3_XOR          3'b100
-`define     F3_SRL          3'b101
-`define     F3_OR           3'b110
-`define     F3_AND          3'b111
-
-`define     BR_BEQ          3'b000
-`define     BR_BNE          3'b001
-`define     BR_BLT          3'b100
-`define     BR_BGE          3'b101
-`define     BR_BLTU         3'b110
-`define     BR_BGEU         3'b111
-
-//`define     OPCODE          IR[`IR_opcode]
-
-`define     ALU_ADD         4'b00_00
-`define     ALU_SUB         4'b00_01
-`define     ALU_PASS        4'b00_11
-`define     ALU_OR          4'b01_00
-`define     ALU_AND         4'b01_01
-`define     ALU_XOR         4'b01_11
-`define     ALU_SRL         4'b10_00
-`define     ALU_SRA         4'b10_10
-`define     ALU_SLL         4'b10_01
-`define     ALU_SLT         4'b11_01
-`define     ALU_SLTU        4'b11_11
-
-`define     SYS_EC_EB       3'b000
-`define     SYS_CSRRW       3'b001
-`define     SYS_CSRRS       3'b010
-`define     SYS_CSRRC       3'b011
-`define     SYS_CSRRWI      3'b101
-`define     SYS_CSRRSI      3'b110
-`define     SYS_CSRRCI      3'b111
-
-module RV32_DECOMP	(	
-				    	input   [15:0]  IRi,
-				    	output  [31:0]  IRo
-					);
-
-
-	reg     [31:0]  Instout;
-	wire    [15:0]  InstIn;
-
-	assign  InstIn = IRi; 
-
-	assign IRo  =  Instout;
-
-	//signals used for decoding the 16bit instruction: case and if statements
-	wire [1:0] op   =   InstIn[1:0];
-	wire [2:0] fun3 =   InstIn[15:13];
-	wire [1:0] fun2 =   InstIn[11:10];
-	wire [1:0] fun  =   InstIn[6:5];
-	wire [4:0] Brs1 =   InstIn[11:7];
-	wire [4:0] Brs2 =   InstIn[6:2];
-
-	//Decoding and encoding process
-	always @(*) begin
-		Instout = 32'd0;
-	    case(op)
-	        2'b00:begin 					//C0
-	            case(fun3)
-	                3'b000:begin            //C.ADDI4SPN
-	                    //addi rd0, x2, nzuimm[9:2].
-						Instout = {	2'b00,
-									InstIn[10:7],
-									InstIn[12:11],
-									InstIn[5],
-									InstIn[6],
-									2'b00,
-									5'b00010,
-									3'b000,
-									2'b01,
-									InstIn[4:2],
-									7'b0010011
-								};
-	                end
-	                3'b010:begin            //C.LW
-	                   //lw rd',offset[6:2](rs1').
-	                    Instout = {
-	                    			5'd0,InstIn[5],
-	                    			InstIn[12:10],
-	                    			InstIn[6],
-	                    			2'b00,2'b01,
-	                    			InstIn[9:7],
-	                    			3'b010,2'b01,
-	                    			InstIn[4:2],
-	                    			7'b0000011
-	                    		};
-	                end
-	                3'b110:begin 			//C.SW
-	                    //sw rs2',offset[6:2](rs1').
-	                    Instout = {
-	                    			5'd0,InstIn[5],
-	                    			InstIn[12],
-	                    			2'b01,
-	                    			InstIn[4:2],
-	                    			2'b01,
-	                    			InstIn[9:7],
-	                    			3'b010,
-	                    			InstIn[11:10],
-	                    			InstIn[6],
-	                    			2'b00,
-	                    			7'b0100011
-	                    		};
-	                end
-	            endcase
-	        end
-
-	        2'b01:begin                 //C1
-	            case(fun3)
-	                3'b000:begin            //C.ADDI
-	                	//addi rd, rd, nzimm[5:0].
-	                    Instout = {
-	                    			{6{InstIn[12]}},
-	                    			InstIn[12],
-	                    			InstIn[6:2],
-	                    			InstIn[11:7],
-	                    			3'b000,
-	                    			InstIn[11:7],
-	                    			7'b0010011
-	                    		};
-	                end
-	                3'b001:begin         //C.JAL
-	                	//jal x1, offset[11:1].
-	                    Instout = {
-	                    			InstIn[12],
-	                    			InstIn[8],
-	                    			InstIn[10:9],
-	                    			InstIn[6],
-	                    			InstIn[7],
-	                    			InstIn[2],
-	                    			InstIn[11],
-	                    			InstIn[5:3],
-	                    			InstIn[12],
-	                    			{8{InstIn[12]}},
-	                    			5'b00001,
-	                    			7'b1101111
-	                    		};
-	                end
-	                3'b010:begin            //C.LI
-	                	//addi rd, x0, imm[5:0].
-	                    Instout = {
-	                    			{6{InstIn[12]}},
-	                    			InstIn[12],
-	                    			InstIn[6:2],
-	                    			5'b00000,3'b000,
-	                    			InstIn[11:7],
-	                    			7'b0010011
-	                    		};
-	                end
-	                3'b011:begin            //C.LUI,C.ADDI16SP
-	                    case(Brs1)
-							5'b00010: begin     //C.ADDI16SP
-								//addi x2, x2, nzimm[9:4].
-								Instout = {
-											{3{InstIn[12]}},
-											InstIn[12],
-											InstIn[4:3],
-											InstIn[5],
-											InstIn[2],
-											InstIn[6],
-											4'd0,
-											Brs1,
-											3'b000,
-											Brs1,
-											7'b0010011
-										};
-							end
-	                    default: begin      //C.LUI
-	                    //lui rd, nzuimm[17:12].
-	                        Instout = {{14{InstIn[12]}},InstIn[12],InstIn[6:2],Brs1,7'b0110111};
-	                    end
-	                    endcase
-	                end
-	                3'b100:begin         //C.SRLI, C.SRAI, C.ANDI
-	                    case(fun2)
-	                    2'b00:begin     //C.SRLI
-	                    //srli rd', rd', shamt[5:0]
-	                        Instout = {7'b0000000,InstIn[6:2],2'b01,InstIn[9:7],3'b101,2'b01,InstIn[9:7],7'b0010011};
-	                    end
-	                    2'b01:begin     //C.SRAI
-	                    //srai rd', rd', shamt[5:0],
-	                        Instout = {7'b0100000,InstIn[6:2],2'b01,InstIn[9:7],3'b101,2'b01,InstIn[9:7],7'b0010011};
-	                    end
-	                    2'b10:begin     //C.ANDI
-	                    //andi rd', rd', imm[5:0].
-	                        Instout = {
-	                        			{6{InstIn[12]}},
-	                        			InstIn[12],
-	                        			InstIn[6:2],
-	                        			2'b01,
-	                        			InstIn[9:7],
-	                        			3'b111,2'b01,
-	                        			InstIn[9:7],
-	                        			7'b0010011
-	                        		};
-	                    end
-	                    2'b11:
-	                        if(!InstIn[12])begin
-	                            case(fun)
-	                                2'b11: begin    //C.AND
-	                                //and rd', rd', rs2'.
-	                                    Instout = {
-	                                    			7'b0000000,2'b01, 
-	                                    			InstIn[4:2],
-	                                    			2'b01,
-	                                    			InstIn[9:7],
-	                                    			3'b111,2'b01,
-	                                    			InstIn[9:7],
-	                                    			7'b0110011
-	                                    			};
-	                                end
-	                                2'b10: begin    //C.OR
-	                                //or rd', rd', rs2'.
-	                                    Instout = {
-	                                    			7'b0000000,2'b01, 
-	                                    			InstIn[4:2],
-	                                    			2'b01,
-	                                    			InstIn[9:7],
-	                                    			3'b110,2'b01,
-	                                    			InstIn[9:7],
-	                                    			7'b0110011
-	                                    			};
-	                                end
-	                                2'b01: begin    //C.XOR
-	                                //xor rd', rd', rs2'.
-	                                    Instout = {
-	                                    			7'b0000000,2'b01, 
-	                                    			InstIn[4:2],
-	                                    			2'b01,
-	                                    			InstIn[9:7],
-	                                    			3'b100,2'b01,
-	                                    			InstIn[9:7],
-	                                    			7'b0110011
-	                                    			};
-	                                end
-	                                2'b00: begin    //C.SUB
-	                                //sub rd', rd', rs2'.
-	                                    Instout = {7'b0100000,2'b01, InstIn[4:2],2'b01,InstIn[9:7],3'b000,2'b01,InstIn[9:7],7'b0110011};
-	                                end
-
-	                            endcase
-	                        end
-	                    endcase
-	                end
-	                3'b101:begin         //C.J
-	                //jal x0,offset[11:1].
-	                    Instout = {
-	                    			InstIn[12],
-	                    			InstIn[8],
-	                    			InstIn[10:9],
-	                    			InstIn[6],
-	                    			InstIn[7],
-	                    			InstIn[2],
-	                    			InstIn[11],
-	                    			InstIn[5:3],
-	                    			InstIn[12],
-	                    			{8{InstIn[12]}},
-	                    			5'b00000,
-	                    			7'b1101111
-	                    		};
-	                end
-	                3'b110:begin         //C.BEQZ
-	                //beq rs1', x0, offset[8:1].
-	                    Instout = {
-	                    			InstIn[12],
-	                    			{2{InstIn[12]}},
-	                    			InstIn[12],
-	                    			InstIn[6:5],
-	                    			InstIn[2],
-	                    			5'b00000,
-	                    			2'b01,
-	                    			InstIn[9:7],
-	                    			3'b000,
-	                    			InstIn[11:10],
-	                    			InstIn[4:3],
-	                    			InstIn[12],
-	                    			7'b1100011
-	                    		};
-	                end
-
-	                3'b111:begin         //C.BNEZ
-	                //bne rs1', x0, offset[8:1].
-	                    Instout = {
-	                    			InstIn[12],
-	                    			{2{InstIn[12]}},
-	                    			InstIn[12],
-	                    			InstIn[6:5],
-	                    			InstIn[2],
-	                    			5'b00000,
-	                    			2'b01,
-	                    			InstIn[9:7],
-	                    			3'b001,
-	                    			InstIn[11:10],
-	                    			InstIn[4:3],
-	                    			InstIn[12],
-	                    			7'b1100011
-	                    		};
-	                end
-	            endcase
-	        end
-
-	        2'b10:begin                 //C2
-	            case(fun3)
-	                3'b000:begin            //C.SLLI
-	                	//slli rd, rd, shamt[5:0],.
-	                    Instout = {
-	                    			7'b0000000,
-	                    			InstIn[6:2],
-	                    			InstIn[11:7],
-	                    			3'b001,
-	                    			InstIn[11:7],
-	                    			7'b0010011
-	                    		};
-	                end
-	                3'b010:begin            //C.LWSP
-	                	//lw rd,offset[7:2](x2).
-	                    Instout = 	{
-		                    			4'd0,InstIn[3:2],
-		                    			InstIn[12],
-		                    			InstIn[6:4],
-		                    			2'b00,5'b00010,3'b010,
-		                    			InstIn[11:7],
-		                    			7'b000011
-	                    			};
-	                end
-	                3'b100:begin            //C.JR, C.JALR, C.MV, C.ADD, C.EBREAK
-	                    case(InstIn[12])
-	                        1'b0: begin
-	                            if(!Brs2) begin             //C.JR
-	                            	//jalr x0, rs1, 0.
-	                                Instout = {12'd0,Brs1,3'b000,5'b00000,7'b1100111};
-	                            end
-	                            else begin                  //C.MV
-	                            //add rd, x0, rs2.
-	                                Instout = {7'b0000000,Brs2,5'b00000,3'b000,Brs1,7'b0110011};
-	                            end
-	                        end
-	                        1'b1: begin
-	                            if(!Brs2&&!Brs1) begin      //C.EBREAK
-	                                //EBREAK
-	                                Instout = {12'd1,5'd0,3'b000,5'd0,7'b1110011};
-	                            end
-	                            else if(!Brs2) begin        //C.JALR
-	                            //jalr x1, rs1, 0.
-	                                Instout = {12'd0,Brs1,3'b000,5'b00001,7'b1100111};
-	                            end
-	                            else begin                  //C.ADD
-	                            //add rd, rd, rs2.
-	                                Instout = {7'b0000000,Brs2,Brs1,3'b000,Brs1,7'b0110011};
-	                            end
-	                        end
-	                    endcase
-	                end
-	                3'b110:begin         //C.SWSP
-	                	//sw rs2,offset[7:2](x2).
-	                    Instout = {
-	                    			4'd0,InstIn[8:7],
-	                    			InstIn[12],
-	                    			InstIn[6:2],
-	                    			5'b00010,3'b010,
-	                    			InstIn[11:9],
-	                    			2'b00,7'b0100011
-	                    		};
-	                end
-	            endcase
-	        end
-	    endcase
-	end
-endmodule
-
-// The ALU and its modules
-`ifdef	USE_ALU_HC
-`include "../rtl/ALU_HC.v"
-`else
-// Mirioring Unit for the Shifter
-module mirror (input [31:0] in, output reg [31:0] out);
-    integer i;
-    always @ *
-        for(i=0; i<32; i=i+1)
-            out[i] = in[31-i];
-endmodule
-
-// Shift Right Unit
-module shr(input [31:0] a, output [31:0] r, input [4:0] shamt, input ar);
-
-    wire [31:0] r1, r2, r3, r4;
-
-    wire fill = ar ? a[31] : 1'b0;
-    assign r1 = shamt[0] ? {{1{fill}}, a[31:1]} : a;
-    assign r2 = shamt[1] ? {{2{fill}}, r1[31:2]} : r1;
-    assign r3 = shamt[2] ? {{4{fill}}, r2[31:4]} : r2;
-    assign r4 = shamt[3] ? {{8{fill}}, r3[31:8]} : r3;
-    assign r = shamt[4] ? {{16{fill}}, r4[31:16]} : r4;
-
-endmodule
-
-// The Shifter
-module shift(
-	input wire [31:0] a,
-	input wire [4:0] shamt,
-	input wire [1:0] typ,	// type[0] sll or srl - type[1] sra
-							// 00 : srl, 10 : sra, 01 : sll
-	output wire [31:0] r
-	);
-    wire [31 : 0] ma, my, y, x, sy;
-
-    mirror m1(.in(a), .out(ma));
-    mirror m2(.in(y), .out(my));
-
-    assign x = typ[0] ? ma : a;
-    shr sh0(.a(x), .r(y), .shamt(shamt), .ar(typ[1]));
-
-    assign r = typ[0] ? my : y;
-
-endmodule
-
-// The ALU
-module ALU(
-	input   wire [31:0] a, b,
-	input   wire [4:0]  shamt,
-	output  reg  [31:0] r,
-	output  wire        cf, zf, vf, sf,
-	input   wire [3:0]  alufn
-);
-
-    wire [31:0] add, sub, op_b;
-    wire cfa, cfs;
-
-    assign op_b = (~b);
-
-    assign {cf, add} = alufn[0] ? (a + op_b + 1'b1) : (a + b);
-
-    assign zf = (add == 0);
-    assign sf = add[31];
-    assign vf = (a[31] ^ (op_b[31]) ^ add[31] ^ cf);
-
-    wire[31:0] sh;
-    shift shift0 (
-        .a(a),
-        .shamt(shamt),
-        .typ(alufn[1:0]),
-        .r(sh)
-	);
-
-    always @ * begin
-        //r = 0;
-				(* full_case *)
-				(* parallel_case *)
-        case (alufn)
-            // arithmetic
-            4'b00_00 : r = add;
-            4'b00_01 : r = add;
-            4'b00_11 : r = b;
-            // logic
-            4'b01_00:  r = a | b;
-            4'b01_01:  r = a & b;
-            4'b01_11:  r = a ^ b;
-            // shift
-            4'b10_00:  r=sh;
-            4'b10_01:  r=sh;
-            4'b10_10:  r=sh;
-            // slt & sltu
-            4'b11_01:  r = {31'b0,(sf != vf)};
-            4'b11_11:  r = {31'b0,(~cf)};
-
-			default:	r = add;
-        endcase
-    end
-endmodule
-`endif
-// Immediate Generator
-module IMMGEN (
-    input  wire [31:0]  INSTR,
-    output reg  [31:0]  IMM
-);
-
-always @(*) begin
-	case (INSTR[`IR_opcode])
-		`OPCODE_Arith_I   : 	IMM = { {21{INSTR[31]}}, INSTR[30:25], INSTR[24:21], INSTR[20] };
-		`OPCODE_Store     :   	IMM = { {21{INSTR[31]}}, INSTR[30:25], INSTR[11:8], INSTR[7] };
-		`OPCODE_LUI       :   	IMM = { INSTR[31], INSTR[30:20], INSTR[19:12], 12'b0 };
-		`OPCODE_AUIPC     :   	IMM = { INSTR[31], INSTR[30:20], INSTR[19:12], 12'b0 };
-		`OPCODE_JAL       : 	IMM = { {12{INSTR[31]}}, INSTR[19:12], INSTR[20], INSTR[30:25], INSTR[24:21], 1'b0 };
-		`OPCODE_JALR      : 	IMM = { {21{INSTR[31]}}, INSTR[30:25], INSTR[24:21], INSTR[20] };
-		`OPCODE_Branch    : 	IMM = { {20{INSTR[31]}}, INSTR[7], INSTR[30:25], INSTR[11:8], 1'b0};
-		default           : 	IMM = { {21{INSTR[31]}}, INSTR[30:25], INSTR[24:21], INSTR[20] }; 
-	endcase
-end
-
-endmodule
-
-// Instruction decoder that generates the ALU operation
-module RV32_DEC(
-    input [31:0] INSTR,
-    output	reg  [3:0]	  alu_fn,
-    output alu_op2_src
-    
-);
-    wire [2:0]  func3       =   INSTR[`IR_funct3];
-    wire [6:0]  func7       =   INSTR[`IR_funct7];
-    wire [11:0] csr         =   INSTR[`IR_csr];
-    wire [4:0]  opcode      =   INSTR[`IR_opcode];
-    wire        W32         =   1;//sz[0] & sz[1];
-    wire        I           =   W32 & (opcode == `OPCODE_Arith_I);
-	wire        R           =   W32 & (opcode == `OPCODE_Arith_R);
-	wire        IorR        =   I | R;
-	wire        instr_logic = 	((IorR==1'b1) && ((func3==`F3_XOR) || (func3==`F3_AND) || (func3==`F3_OR)));
-	wire        instr_shift = 	((IorR==1'b1) && ((func3==`F3_SLL) || (func3==`F3_SRL) ));
-
-    wire        instr_slt   = 	((IorR==1'b1) && (func3==`F3_SLT));
-	wire        instr_sltu  = 	((IorR==1'b1) && (func3==`F3_SLTU));
-	wire        instr_store = 	W32 & (opcode == `OPCODE_Store);
-	wire        instr_load  = 	W32 & (opcode == `OPCODE_Load);
-	wire        instr_add   = 	R & (func3 == `F3_ADD) & (~func7[5]);
-	wire        instr_sub   = 	R & (func3 == `F3_ADD) & (func7[5]);
-	wire        instr_addi  = 	I & (func3 == `F3_ADD);
-	wire        instr_lui   = 	W32 & (opcode == `OPCODE_LUI);
-	wire        instr_auipc = 	W32 & (opcode == `OPCODE_AUIPC);
-	wire        instr_branch= 	W32 & (opcode == `OPCODE_Branch);
-	wire        instr_jalr  = 	W32 & (INSTR[`IR_opcode] == `OPCODE_JALR);
-	wire        instr_jal   = 	W32 & (INSTR[`IR_opcode] == `OPCODE_JAL);
-	wire        instr_sll   = 	((IorR==1'b1) && (func3 == `F3_SLL) && (func7 == 7'b0));
-	wire        instr_srl   = 	((IorR==1'b1) && (func3 == `F3_SRL) && (func7 == 7'b0));
-	wire        instr_sra   = 	((IorR==1'b1) && (func3 == `F3_SRL) && (func7 != 7'b0));
-	wire        instr_and   = 	((IorR==1'b1) && (func3 == `F3_AND));
-	wire        instr_or    = 	((IorR==1'b1) && (func3 == `F3_OR));
-	wire        instr_xor   = 	((IorR==1'b1) && (func3 == `F3_XOR));
-
-    assign      alu_op2_src =   R;
-
-    always @ * begin
-            case (1'b1)
-                instr_load  :   alu_fn = `ALU_ADD;
-                instr_addi  :   alu_fn = `ALU_ADD;
-                instr_store :   alu_fn = `ALU_ADD;
-                instr_add   :   alu_fn = `ALU_ADD;
-                instr_jalr  :   alu_fn = `ALU_ADD;
-
-                instr_lui   :   alu_fn = `ALU_PASS;
-
-                instr_sll   :   alu_fn = `ALU_SLL;
-                instr_srl   :   alu_fn = `ALU_SRL;
-                instr_sra   :   alu_fn = `ALU_SRA;
-
-                instr_slt   :   alu_fn = `ALU_SLT;
-                instr_sltu  :   alu_fn = `ALU_SLTU;
-
-                instr_and   :   alu_fn = `ALU_AND;
-                instr_or    :   alu_fn = `ALU_OR;
-                instr_xor   :   alu_fn = `ALU_XOR;
-
-                default     :   alu_fn = `ALU_SUB;
-            endcase
-        end
-
-endmodule
-
-
-// Conditional Branchig Unit. It checks whether the branch is taken or not
-module BRANCH (
-		input [2:0] 	cond,
-		input [31:0] 	R1, R2,
-		output 			taken
-);
-	wire 		zf, cf, vf, sf;
-	wire [31:0] add, op_b;
-	reg 		taken;
-
-	assign op_b         = (~R2);
-    assign {cf, add}    = (R1 + op_b + 1'b1);
-    assign zf           = (add == 0);
-    assign sf           = add[31];
-    assign vf           = (R1[31] ^ (op_b[31]) ^ add[31] ^ cf);
-
-	always @ * begin
-      (* full_case *)
-      case(cond)
-          `BR_BEQ: 	taken = zf;          	// BEQ
-          `BR_BNE: 	taken = ~zf;         	// BNE
-          `BR_BLT: 	taken = (sf != vf);  	// BLT
-          `BR_BGE: 	taken = (sf == vf);  	// BGE
-          `BR_BLTU: taken = (~cf);      	// BLTU
-          `BR_BGEU: taken = (cf);       	// BGEU
-          default: 	taken = 1'b0;
-      endcase
-	end
-endmodule
-
-// Memory data (R) aligner
-module mrdata_align(
-    input wire [31:0] d,
-    output wire [31:0] ed,
-    input wire [1:0] size,
-    input wire [1:0] A,
-    input wire sign
-);
-
-    wire [31:0] s_ext, u_ext;
-    wire [7:0] _byte_;
-    wire [15:0] hword;
-
-    assign _byte_ = 	(A==2'd0) ? d[7:0] :
-                	(A==2'd1) ? d[15:8] :
-                	(A==2'd2) ? d[23:16] : d[31:24];
-
-    assign hword = 	(A[1]==0) ? d[15:0] : d[31:16];
-
-    assign u_ext =  (size==2'd0)  ? {24'd0,_byte_}  :
-                    (size==2'd1)  ? {16'd0,hword} : d;
-
-    assign s_ext =  (size==2'd0)  ? {{24{_byte_[7]}},_byte_}   :
-                    (size==2'd1)  ? {{24{hword[15]}},hword} : d;
-
-    assign ed = sign ? u_ext : s_ext;
-
-endmodule
-
-// Memory data (W) aligner
-module mwdata_align(
-    input wire [31:0] d,
-    output wire [31:0] fd,
-    input wire [1:0] size,
-    input wire [1:0] A
-  );
-
-    wire [7:0] _byte_ = d[7:0];
-    wire [15:0] hword = d[15:0];
-
-    wire [31:0] _byte__word, hw_word;
-
-    assign  _byte__word = (A==2'd0) ? d :
-                        (A==2'd1) ? {16'd0, _byte_, 8'd0} :
-                        (A==2'd2) ? {8'd0, _byte_, 16'd0} : {_byte_, 24'd0} ;
-    assign  hw_word   = (~A[1])  ? d : {hword, 16'd0};
-
-    assign fd = (size==2'd0) ? _byte__word :
-                (size==2'd1) ? hw_word : d;
-
-endmodule
-
-
-// The Instruction Fetch Unit
-module NfiVe32_FU(
-    input wire [31:0]   IDATA0,
-    input wire [31:0]   IDATA1,
-    input wire [31:0]   PC,
-    input wire          C1,
-    output wire [31:0]  INSTR,
-    output wire         IS32
-);
-
-    wire [31:0] instr32;
-    wire [31:0] instr   =   (~C1 & ~PC[1]) ? IDATA0 :                   // Aligned 32 or Lower 16
-                            (~C1 & PC[1]) ? {16'h0, IDATA0[31:16]} :    // Upper 16
-                            {IDATA0[15:0], IDATA1[31:16]} ;             // Unaligned 32
-
-    wire        is32    =   instr[0] & instr[1];
-      
-    RV32_DECOMP nfive_decomp (.IRi(instr[15:0]), .IRo(instr32));
-
-    assign INSTR    =   is32 ? instr : instr32;
-    assign IS32     =   is32;
-
-endmodule
-
-
-// Instruction Execution Unit (ALU + next PC generation)
-module NfiVe32_XU(
-    output wire [31:0]  ALUR,
-    output wire [31:0]  NPC,
-    output wire [31:0]  PC24,
-    output wire [31:0]  PCI,
-    input wire [31:0]   PC,
-    input wire [31:0]   INSTR,
-    input wire [31:0]   R1,
-    input wire [31:0]   R2, 
-    input wire          IS32
-);
-    wire        instr_branch    = 	(INSTR[`IR_opcode] == `OPCODE_Branch);
-	wire        instr_jalr      = 	(INSTR[`IR_opcode] == `OPCODE_JALR);
-	wire        instr_jal       = 	(INSTR[`IR_opcode] == `OPCODE_JAL);
-
-    wire        alu_op2_src;
-
-    wire [31:0] imm;
-    wire [31:0] pc4         = PC + 32'h4;
-    wire [31:0] pc2         = PC + 32'h2;
-    wire [31:0] pci         = PC + imm;
-    wire [31:0] alu_op2     = alu_op2_src ? R2 : imm;
-    wire [4:0]  alu_shamt 	= INSTR[`IR_shamt];
-    wire [3:0]  alu_fn;
-    wire        branch_taken;
-
-    IMMGEN      immgen      (.INSTR(INSTR), .IMM(imm));
-`ifdef	USE_ALU_HC
-	ALU_HC         
-`else
-	ALU
-`endif
-				alu         (.a(R1), .b(alu_op2),.shamt(alu_shamt),.r(ALUR),.alufn(alu_fn));
-	BRANCH      brunint     (.cond(INSTR[`IR_cond]),.R1(R1),.R2(R2),.taken(branch_taken));
-	RV32_DEC    decoder     (.INSTR(INSTR),.alu_fn(alu_fn),.alu_op2_src(alu_op2_src));
-
-    assign NPC = ((branch_taken & instr_branch) | (instr_jal)) ? pci :  (instr_jalr) ? ALUR : IS32 ? pc4 : pc2;
-
-    assign PC24 = IS32 ? pc4 : pc2;
-
-    assign PCI = pci;
-
-endmodule
-
-module NfiVe32_RF (
-	input			HCLK,							// System clock
-	input			WR,
-	input [ 4:0]	RA,
-	input [ 4:0]	RB,
-	input [ 4:0]	RW,
-	input [31:0]	DW, 
-	output [31:0]	DA, 
-	output [31:0]	DB
-);
- 	reg [31:0] RF [31:0];
-
-	assign DA = RF[RA] & {32{~(RA==5'd0)}};
-	assign DB = RF[RB] & {32{~(RB==5'd0)}};
-	
-	always @ (posedge HCLK) 
-		if(WR)
-			if(RW!=5'd0) begin 
-				RF[RW] <= DW;
-				`ifdef DBG
-				#1 $display("Write: RF[%d]=0x%X []", RW, RF[RW]);
-				`endif
-			end
-endmodule
-
-// The CPU Core
-`define 	CYC_C0		2'h0
-`define 	CYC_C1		2'h1
-`define 	CYC_C2		2'h2
-`define 	CYC_C3		2'h3
-
-
-module NfiVe32 (
-	input	HCLK,							// System clock
-	input	HRESETn,						// System Reset, active low
-
-	// AHB-LITE MASTER PORT for Instructions
-	output wire [31:0]  HADDR,				// AHB transaction address
-	output wire [ 2:0]  HSIZE,				// AHB size: _byte_, half-word or word
-	output wire [ 1:0]  HTRANS,				// AHB transfer: non-sequential only
-	output wire [31:0]  HWDATA,				// AHB write-data
-	output wire         HWRITE,				// AHB write control
-	input  wire [31:0]  HRDATA,				// AHB read-data
-	input  wire         HREADY,				// AHB stall signal
-	
-	// MISCELLANEOUS 
-  	input  wire         NMI,				// Non-maskable interrupt input
-  	input  wire         IRQ,				// Interrupt request line
-    input  wire [4:0]   IRQ_NUM,			// Interrupt number from the PIC			
-  	input  wire 	    SYSTICKCLK,			// SYSTICK clock; ON pulse width is one HCLK period
-  	output wire [31:0]	IRQ_MASK
-);
-
-    reg [1:0]   CYC, NCYC;
-    reg         RUN;
-    reg         IS32;
-    reg         INEXCEPTION;
-
-    reg [31:0]  PC;
-	reg [31:0]  PCI;
-	
-    reg [31:0]  IDATA;
-    reg [31:0]  PC24;
-    reg [31:0]  INSTR;
-
-	reg [31:0] ALU_R;
-
-    reg [31:0]  CSR_CYCLE; 
-    reg [31:0]  CSR_INSTRET;
-    reg [31:0]  CSR_TIME;
-    reg [31:0]  CSR_TIMELOAD;
-    reg [31:0]  CSR_MIE;
-    reg [31:0]  CSR_IRQMASK;
- //   reg [31:0]  CSR_MIP;
-    reg [31:0]  CSR_EPC;
-    
-
-    wire [31:0] instr;
-    wire [31:0] hrdata;
-    wire [31:0] hwdata;
-
-    wire [31:0] alur;
-    wire [31:0] npc;
-    wire [31:0] pc24, pci;
-    wire        is32;
-
-    wire        tmr_int;
-
-    wire        unaligned = PC[1] & HRDATA[16] & HRDATA[17];
-
-    wire        C0 = (CYC==2'h0), C1 = (CYC==2'h1), C2 = (CYC==2'h2), C3 = (CYC==2'h3);
-
-    wire        shamt 	    =   INSTR[`IR_shamt];
-
-    wire        instr_i     =   (INSTR[`IR_opcode] == `OPCODE_Arith_I);
-	wire        instr_r     =   (INSTR[`IR_opcode] == `OPCODE_Arith_R);
-    wire        instr_lui   = 	(INSTR[`IR_opcode] == `OPCODE_LUI);
-	wire        instr_auipc = 	(INSTR[`IR_opcode] == `OPCODE_AUIPC);
-	wire        instr_branch = 	(INSTR[`IR_opcode] == `OPCODE_Branch);
-	wire        instr_jalr  = 	(INSTR[`IR_opcode] == `OPCODE_JALR);
-	wire        instr_jal   = 	(INSTR[`IR_opcode] == `OPCODE_JAL);
-    wire        instr_store = 	(INSTR[`IR_opcode] == `OPCODE_Store);
-	wire        instr_load  = 	(INSTR[`IR_opcode] == `OPCODE_Load);
-
-    wire [11:0] csr_num     =   INSTR[`IR_csr]; 
-    wire        instr_priv  =   (INSTR[`IR_opcode] ==  5'h1C);
-    wire	    instr_rdcsr	=	instr_priv & (INSTR[`IR_funct3] == 3'd2);
-    wire        instr_wrcsr =   instr_priv & (INSTR[`IR_funct3] == 3'd1);
-    wire        instr_ecall =   instr_priv & (INSTR[`IR_funct3] == 3'b0) & (csr_num == 12'h0);
-    wire        instr_ebreak=   instr_priv & (INSTR[`IR_funct3] == 3'b0) & (csr_num == 12'h1);
-	wire        instr_mret  =   instr_priv & (INSTR[`IR_funct3] == 3'b0) & (csr_num == 12'h302);
-	wire        instr_wfi   =   instr_priv & (INSTR[`IR_funct3] == 3'b0) & (csr_num == 12'h105);
-           
-    wire        rf_wr       =   instr_load | instr_r | instr_i | instr_jal | instr_jalr | instr_lui | instr_auipc;
-
-    wire        exception   =   (CSR_MIE[0] & ((tmr_int & CSR_MIE[1]) | (IRQ & CSR_MIE[2]))) | NMI | instr_ecall;
-    wire [31:0] pc_ex       =   instr_ecall ?   32'd12              :
-								instr_ebreak?	32'd16				:
-                                NMI         ?   32'd4               :
-                                tmr_int     ?   32'd8               :
-                                IRQ         ?   (32'd64+(IRQ_NUM<<2)) :   32'd60;
-
-
-    assign IRQ_MASK = CSR_IRQMASK;
-
-    // The Register File
-	
-	wire [4:0] rs1 	    = 	INSTR[`IR_rs1];
-	wire [4:0] rs2 	    = 	INSTR[`IR_rs2];
-	wire [4:0] rd 	    = 	INSTR[`IR_rd];
-	wire [31:0] r1, r2;
-	wire [31:0] rf_dw	= 	(instr_jal | instr_jalr)    ?   PC24    : 
-                            (instr_auipc)               ?   PCI     : 
-                            (instr_load)                ?   hrdata  : 
-                            (instr_rdcsr)               ?   csr     :   alur;
-
-`ifdef USE_RF_MODULE
-`ifdef USE_HC_REGF
-	DFFRFile RF (
-		.R1(rs1), .R2(rs2), .RW(rd),
-		.DW(rf_dw),
-		.D1(r1), .D2(r2),
-		.CLK(HCLK),
-		.WE(rf_wr&C3)
-	);
-`else
-	NfiVe32_RF RF (
-		.HCLK(HCLK),
-		.WR(rf_wr & C3),
-		.RA(rs1),
-		.RB(rs2),
-		.RW(rd),
-		.DW(rf_dw),
-		.DA(r1),
-		.DB(r2)
-	);
-`endif
-`ifdef DBG
-	always @(posedge HCLK)
-		if(rd != 5'd0)
-			if(rf_wr & C3) begin
-                $display("RF[%02d]=%X (%d)", rd, rf_dw, rf_dw);
-				if(rd == 10) $display("<===");
-            end
-`endif
-`else
-	reg [31:0] RF[31:0];
-    assign r1 = RF[rs1] & {32{~(rs1==5'd0)}};
-	assign r2 = RF[rs2] & {32{~(rs2==5'd0)}};
-	always @(posedge HCLK)
-		if(rd != 5'd0)
-			if(rf_wr & C3) begin
-                RF[rd] <=   rf_dw;
-				`ifdef DBG
-                #1 $display("Write: RF[%d]=0x%X [PC=0x%X, INSTR=0x%X]", rd, RF[rd], PC, INSTR);
-				`endif
-            end
-`endif
-
-
-
-    wire [31:0] csr =   (csr_num==12'hC00) ? CSR_CYCLE      :
-                        (csr_num==12'hC01) ? CSR_TIME       :
-                        (csr_num==12'hC02) ? CSR_INSTRET    :
-                        (csr_num==12'hC03) ? CSR_TIMELOAD   :   
-                        (csr_num==12'h304) ? CSR_MIE        :   
-                        (csr_num==12'h310) ? CSR_IRQMASK    :   
-                        32'hBAAAAAAD;
-
-	
-    assign HADDR        = ~RUN ? 32'h0 : C3 ? {PC[31:2],2'b0} : C0 ? ({PC[31:2],2'b0}+32'h4) : C2 ? alur : 32'd0;
-    assign HTRANS[0]    = 1'h0;
-    assign HTRANS[1]    = ~RUN | C3 | (C0 & unaligned) | (C2 & (instr_load | instr_store));
-    assign HWRITE       = C2 & instr_store;
-    assign HSIZE        = {1'b0,INSTR[13:12]};
-    assign HWDATA       = (C3 & instr_store) ? hwdata : 32'd0;
-
-    mrdata_align mralign(
-        .d(HRDATA),
-        .ed(hrdata),
-        .size(HSIZE[1:0]),
-        //.A(alur[1:0]),
-		.A(ALU_R[1:0]),
-        .sign(INSTR[14])
-    );
-
-    mwdata_align mwalign(
-        .d(r2),
-        .fd(hwdata),
-        .size(HSIZE[1:0]),
-        .A(alur[1:0])
-    );
-    
-	NfiVe32_FU fetch_unit(
-        .IDATA0(HRDATA),
-        .IDATA1(IDATA),
-        .PC(PC),
-        .C1(C1),
-        .INSTR(instr),
-        .IS32(is32)
-    );
-
-    NfiVe32_XU exec_unit(
-        .ALUR(alur),
-        .NPC(npc),
-        .PC24(pc24),
-        .PCI(pci),
-        .PC(PC),
-        .INSTR(INSTR),
-        .R1(r1),
-        .R2(r2), 
-        .IS32(IS32)
-    );
-
-    // CPU Cycle
-    always @*
-        case (CYC)
-            `CYC_C0:   	if(HREADY) begin
-	            			if(~PC[1]) NCYC = `CYC_C2;                         // Alighed
-	                    	else if(HRDATA[16]&HRDATA[17]) NCYC = `CYC_C1;     // Not aligned and 32-bit instruction
-	                    	else NCYC = `CYC_C2;                               // Not aligned but 16-bit instruction
-                    	end 
-                    	else 
-                    		NCYC = `CYC_C0;
-            
-            `CYC_C1:   	if(HREADY) 
-            				NCYC = `CYC_C2; 
-            			else 
-            				NCYC = `CYC_C1;
-            
-            `CYC_C2:   	NCYC = `CYC_C3;
-            
-            `CYC_C3:   	if(HREADY) 
-            				NCYC = `CYC_C0; 
-            			else 
-            				NCYC = `CYC_C3; 
-            
-            default: 	NCYC = `CYC_C0;
-        
-        endcase
-
-    // The resgisters: 4 x 32 + 2 x 1 + 1 x 2 = 132 Bits
-    // Synthesized into 118 bits only:
-    //  + CYC is expanded from 2 to 4 (OHE FSM)
-    //  + IDATA lower 16 bits are not used -> removed during optimization
-    always @(posedge HCLK or negedge HRESETn)
-		if(!HRESETn) RUN <= 0;
-		else RUN <= 1;
-		/*
-	`SYNC_BEGIN(RUN, 1'h0)
-        //if(~RUN) 
-		RUN <= 1'b1;
-    `SYNC_END
-*/
-    `SYNC_BEGIN(CYC, 2'h0)
-        if(RUN) CYC <= NCYC;
-    `SYNC_END
-    
-    `SYNC_BEGIN(INEXCEPTION, 1'h0)
-        if(exception & C3 & !INEXCEPTION) INEXCEPTION <= 1'h1;
-        else if(instr_mret & C3) INEXCEPTION <= 1'h0;
-    `SYNC_END
-    
-    `SYNC_BEGIN(IDATA, 32'h0)
-        if(C0)    
-            IDATA <= HRDATA; 
-    `SYNC_END
-    /*
-	`SYNC_BEGIN(ALUR, 32'h0)
-        if(C2)    
-            ALUR <= alur; 
-    `SYNC_END
-	*/
-	always @(posedge HCLK or negedge HRESETn)
-		if(!HRESETn) ALU_R <= 0;
-		else if(C2) ALU_R <= alur;
-
-    `SYNC_BEGIN(INSTR, 32'h0)
-        if(C0 | C1)    
-            INSTR <= instr; 
-    `SYNC_END
-    
-    `SYNC_BEGIN(IS32, 1'h0)
-        if(C0 | C1) IS32 <= is32;
-    `SYNC_END
-
-    `SYNC_BEGIN(PC24, 32'h0)
-        if(C2)    
-            PC24 <= pc24; 
-    `SYNC_END
-    
-	`SYNC_BEGIN(PCI, 32'h0)
-        if(C2)    
-            PCI <= pci; 
-    `SYNC_END
-
-    `SYNC_BEGIN(PC, 32'h0)
-        if(C2 & instr_mret)
-            PC <= CSR_EPC;
-        else if(C2 & exception & !INEXCEPTION)
-            PC <= pc_ex;
-        else if(C2)    
-            PC <= npc; 
-		//#1 $display ("PC=%x", PC);
-    `SYNC_END
-
-    // Counters and Special function Registers (CSRs)
-    // Retired Instruction
-    `SYNC_BEGIN(CSR_INSTRET, 32'h0)
-        if(C3)    
-            CSR_INSTRET <= CSR_INSTRET + 32'h1;
-    `SYNC_END
-
-    // Number of CPU cycles
-    `SYNC_BEGIN(CSR_CYCLE, 32'h0)   
-            if(RUN) CSR_CYCLE <= CSR_CYCLE + 32'h1;
-    `SYNC_END
-
-    // SYSTICK Timer
-    wire    csr_time_zero   =   (CSR_TIME == 32'h0);
-    assign  tmr_int         =   csr_time_zero;
-
-    `SYNC_BEGIN(CSR_TIME, 32'hFFFF_FFFF)   
-        if(SYSTICKCLK)
-            if(csr_time_zero)
-                CSR_TIME <= CSR_TIMELOAD;
-            else 
-                CSR_TIME <= CSR_TIME - 32'h1;
-    `SYNC_END
-
-    // SYSTICK TimeLoad register
-    `SYNC_BEGIN(CSR_TIMELOAD, 32'hFFFF_FFFF)   
-        if(instr_wrcsr & (csr_num == 12'hC03))
-            CSR_TIMELOAD <= r1;
-    `SYNC_END
-
-    // Non Standard Machine Interrupt Enable CSR
-    // Bit 0: Global Int En
-    // Bit 1: Timer Int En
-    // Bit 2: External Int En
-    `SYNC_BEGIN(CSR_MIE, 32'h0)   
-        if(instr_wrcsr & (csr_num == 12'h304))
-            CSR_MIE <= r1;
-    `SYNC_END
-
-	// Non standard IRQ MASK CSR    
-    `SYNC_BEGIN(CSR_IRQMASK, 32'h0)   
-        if(instr_wrcsr & (csr_num == 12'h310))
-            CSR_IRQMASK <= r1;
-    `SYNC_END
-
-    // Exception PC CSR
-    `SYNC_BEGIN(CSR_EPC, 32'h0)   
-        if(exception & C2 & !INEXCEPTION)
-            CSR_EPC <= npc;
-    `SYNC_END
-
-endmodule
-
-// A very simple Programmable Interrupts Controller
-module NfiVe32_PIC(
-  input  wire [31:0]	IRQ,
-  output reg 			irq,
-  output wire [4:0]		IRQ_NUM,
-  input  wire [31:0]	IRQ_MASK
-);
-
-	reg  [4:0]		irq_num;
-
-	assign IRQ_NUM = irq_num;
-
-	integer i;
-	always @ * begin
-	irq = 0;
-	irq_num = 0;
-	for(i=0; i<32; i=i+1)
-	    if(IRQ_MASK[i] & IRQ[i]) begin
-	        irq = 1'b1;
-	        irq_num = i;
-	    end
-	end
-
-endmodule
-
-/* 
-	NfiVe Top Level Integration 
-	NfiVe CPU + PIC + SYSTICK 
-*/
-module NfiVe32_SYS (
-	input	HCLK,							// System clock
-	input	HRESETn,						// System Reset, active low
-
-	// AHB-LITE MASTER PORT for Instructions
-	output wire [31:0]  HADDR,				// AHB transaction address
-	output wire [ 2:0]  HSIZE,				// AHB size: _byte_, half-word or word
-	output wire [ 1:0]  HTRANS,				// AHB transfer: non-sequential only
-	output wire [31:0]  HWDATA,				// AHB write-data
-	output wire         HWRITE,				// AHB write control
-	input  wire [31:0]  HRDATA,				// AHB read-data
-	input  wire         HREADY,				// AHB stall signal
-	
-	// MISCELLANEOUS 
-  	input  wire         NMI,				// Non-maskable interrupt input
-  	input  wire [31:0] 	IRQ,				// 32 IRQ Line
-  	input  wire [7:0]	SYSTICKCLKDIV		
-);
-
-	wire irq;
-	wire [4:0] 	irq_num;
-	wire [31:0] irq_mask;
-	//wire [31:0] IRQ;
-	wire div;
-	reg  [7:0]  clkdiv;
-	reg 		systickclk;
-
-	NfiVe32 N5(
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-
-		// AHB-LITE MASTER PORT for Instructions and Data
-		.HADDR(HADDR),             
-		.HSIZE(HSIZE),             
-		.HTRANS(HTRANS),           
-		.HWDATA(HWDATA),           
-		.HWRITE(HWRITE),           
-		.HRDATA(HRDATA),           
-		.HREADY(HREADY),           
-		
-		// MISCELLANEOUS 
-	  	.NMI(NMI),               
-	  	.IRQ(irq),
-	  	.IRQ_NUM(irq_num),               
-	  	.SYSTICKCLK(systickclk),
-	  	.IRQ_MASK(irq_mask)
-	);
-
-	NfiVe32_PIC PIC(
-  		.IRQ(IRQ),
-  		.irq(irq),
-  		.IRQ_NUM(irq_num),
-  		.IRQ_MASK(irq_mask)
-	);
-
-	assign div = (clkdiv == SYSTICKCLKDIV);
-
-	`SYNC_BEGIN(clkdiv, 8'b0)
-		if(div) 
-				clkdiv <= 8'h0;
-			else
-				clkdiv <= clkdiv + 8'h1; 
-	`SYNC_END
-	
-	`SYNC_BEGIN(systickclk, 1'b0)
-		if(div) 
-				systickclk <= 1'b1;
-			else
-				systickclk <= 1'b0;	 
-	`SYNC_END
-
-endmodule
diff --git a/verilog/rtl/user_project/rtl/acc/AHB_SPM.v b/verilog/rtl/user_project/rtl/acc/AHB_SPM.v
deleted file mode 100644
index 10cafdb..0000000
--- a/verilog/rtl/user_project/rtl/acc/AHB_SPM.v
+++ /dev/null
@@ -1,267 +0,0 @@
-module TCMP(clk, rst, a, s);
-    input clk, rst;
-    input a;
-    output reg s;
-
-    reg z;
-
-    always @(posedge clk  or posedge rst) begin
-        if (rst) begin
-            //Reset logic goes here.
-            s <= 1'b0;
-            z <= 1'b0;
-        end
-        else begin
-            //Sequential logic goes here.
-            z <= a | z;
-            s <= a ^ z;
-        end
-    end
-endmodule
-
-module CSADD(clk, rst, x, y, sum);
-    input clk, rst;
-    input x, y;
-    output reg sum;
-
-    reg sc;
-
-    // Half Adders logic
-    wire hsum1, hco1;
-    assign hsum1 = y ^ sc;
-    assign hco1 = y & sc;
-
-    wire hsum2, hco2;
-    assign hsum2 = x ^ hsum1;
-    assign hco2 = x & hsum1;
-
-    always @(posedge clk or posedge rst) begin
-        if (rst) begin
-            //Reset logic goes here.
-            sum <= 1'b0;
-            sc <= 1'b0;
-        end
-        else begin
-            //Sequential logic goes here.
-            sum <= hsum2;
-            sc <= hco1 ^ hco2;
-        end
-    end
-endmodule
-
-module SPM(clk, rst, x, y, p);
-    parameter size = 32;
-    input clk, rst;
-    input y;
-    input[size-1:0] x;
-    output p;
-
-    wire[size-1:1] pp;
-    wire[size-1:0] xy;
-
-    genvar i;
-
-    CSADD csa0 (.clk(clk), .rst(rst), .x(x[0]&y), .y(pp[1]), .sum(p));
-    generate for(i=1; i<size-1; i=i+1) begin
-        CSADD csa (.clk(clk), .rst(rst), .x(x[i]&y), .y(pp[i+1]), .sum(pp[i]));
-    end endgenerate
-    TCMP tcmp (.clk(clk), .rst(rst), .a(x[size-1]&y), .s(pp[size-1]));
-
-endmodule
-
-module AHB_SPM #(parameter SIZE=32) (
-    input  wire         HCLK,      
-    input  wire         HRESETn,   
-    input  wire         HSEL,      
-    input  wire         HREADY,    
-    input  wire [1:0]   HTRANS,    
-    input  wire [2:0]   HSIZE,     
-    input  wire         HWRITE,    
-    input  wire [31:0]  HADDR,     
-    input  wire [31:0]  HWDATA,    
-    output wire         HREADYOUT, 
-    output wire [1:0]   HRESP,
-    output wire [31:0]  HRDATA
-);
-
-    localparam  X_OFF = 0, Y_OFF = 4, P1_OFF = 8, P2_OFF = 12;
-    localparam  S0=0, S1=1, S2=2, S3=3;
-
-    reg [7:0]   AHB_ADDR;    
-    wire        ahb_access   = HTRANS[1] & HSEL & HREADY;
-    wire        ahb_write    = ahb_access &  HWRITE;
-    wire        ahb_read     = ahb_access & (~HWRITE);
-    reg         AHB_WRITE;
-    reg         AHB_READ;
-
-    wire        p;
-    reg [31:0]  X, Y, P0, P1; 
-    reg [7:0]   CNT, ncnt;
-
-    reg [3:0]   STATE, nstate;
-
-    always @(posedge HCLK or negedge HRESETn)
-    if(~HRESETn) begin
-        AHB_WRITE   <=  1'b0;
-        AHB_READ    <=  1'b0;
-        AHB_ADDR    <=  8'b0;
-    end
-    else begin
-        AHB_WRITE   <=  ahb_write;
-        AHB_READ    <=  ahb_read;
-        AHB_ADDR    <=  HADDR[7:0];  
-    end
-
-    always @(posedge HCLK or negedge HRESETn)
-        if(~HRESETn)
-            X  <= 32'b0;
-        else if(AHB_WRITE && (AHB_ADDR == X_OFF))
-            X <= HWDATA;
-
-    always @(posedge HCLK or negedge HRESETn)
-        if(~HRESETn)
-            Y  <= 32'b0;
-        else if(AHB_WRITE && (AHB_ADDR == Y_OFF))
-            Y <= HWDATA;
-        else if(STATE==S1) Y <= Y >> 1;
-
-    always @(posedge HCLK or negedge HRESETn)
-        if(~HRESETn)
-            P0  <= 32'b0;
-        else if(STATE==S1)
-            P0 <= {p,P0[31:1]};
-
-    always @(posedge HCLK or negedge HRESETn)
-        if(~HRESETn)
-            STATE  <= S0;
-        else 
-            STATE <= nstate;
-
-    always @*
-        case(STATE)
-            S0: if(AHB_WRITE && (AHB_ADDR == Y_OFF)) nstate=S1; else nstate=S0;
-            S1: if(CNT==31) nstate=S0; else nstate=S1;
-        endcase
-    
-    always @(posedge HCLK or negedge HRESETn)
-        if(~HRESETn)
-            CNT  <= 8'd0;
-        else 
-            CNT <= ncnt;
-
-    always @* begin
-        ncnt = 0;
-        if(CNT==31) ncnt <= 0;
-        else if(STATE==S1) ncnt=CNT+1;
-    end
-
-    SPM spm(
-      .clk(~HCLK),
-      .rst(~HRESETn),
-      .x(X),
-      .y(Y[0]),
-      .p(p)
-    );
-
-    assign HREADYOUT = (STATE == S0);
-
-    assign HRDATA = P0;
-
-endmodule
-/*
-module SPM_EXT(clk, rst, X, Y, P, start, done);
-    parameter size = 32;
-    input clk, rst;
-    input [size-1:0] X, Y;
-    output reg [size-1:0] P;
-    output done;
-    input start;
-
-    reg [31:0] Y_reg;
-    wire p, y;
-    assign y=Y_reg[0];
-    reg [1:0] done_state, done_state_next;
-
-    assign done = done_state[1];
-    SPM spm(
-      .clk(clk),
-      .rst(rst),
-      .x(X),
-      .y(y),
-      .p(p));
-
-    reg [7:0] count;
-
-    always @(posedge clk or posedge rst)
-      if(rst) count <= 7'd0;
-      else if(start) count <= count + 1'd1;
-      else if(done) count <= 7'd0;
-
-    always@(posedge clk)
-      if(count==0 && start==1) P<= 64'b0;
-      else if(!done) P <= {p, P[31:1]};
-
-    always@(posedge clk or posedge rst)
-      if(rst) Y_reg <= 0;
-      else if(count==0 && start==1) Y_reg<= Y;
-      else if(!done) Y_reg <= (Y_reg>>1);
-
-    always @(posedge clk or posedge rst)
-      if(rst) done_state <= 2'd00;
-      else done_state <= done_state_next;
-
-    always @* begin
-        done_state_next = done_state;
-      case (done_state)
-        2'b00: if(start) done_state_next = 2'b01;
-        2'b01: if(count==8'd33) done_state_next = 2'b10;
-        2'b10: done_state_next = 2'b11;
-        2'b11: done_state_next = 2'b00;
-        default: done_state_next = done_state;
-      endcase
-    end
-      //else if(count==7'd33) done <= 1;
-      //else if(start) done <= 0;
-
-endmodule
-*/
-/*
-module spm_tb;
-reg clk, rst, start;
-wire p;
-
-
-wire done;
-
-initial begin
-  rst = 0;
-  clk = 0;
-
-  start = 0;
-  #100;
-  rst = 1;
-  #500;
-  rst = 0;
-  #1000;
-  @(posedge clk);
-  start = 1;
-  @(posedge done);
-  start = 0;
-end
-
-always #10 clk = ~clk;
-
-initial begin
-  $dumpfile("spm.vcd");
-  $dumpvars(0);
-  #100_000 ;
-  $display("Timeout -- Exiting");
-  $finish;
-end
-
-wire [31:0] P;
-
-SPM_EXT spm_dut(.clk(clk), .rst(rst), .X(-15), .Y(20), .P(P), .start(start), .done(done));
-
-endmodule
-*/
diff --git a/verilog/rtl/user_project/rtl/soc_core.v b/verilog/rtl/user_project/rtl/soc_core.v
deleted file mode 100644
index bc70016..0000000
--- a/verilog/rtl/user_project/rtl/soc_core.v
+++ /dev/null
@@ -1,224 +0,0 @@
-
-`default_nettype none
-`timescale 1ns/1ns
-
-module soc_core (
-`ifdef USE_POWER_PINS
-	input VPWR,
-	input VGND,
-`endif
-	input HCLK, 
-	input HRESETn,
-	
-	input wire 			NMI,
-	input wire [7:0]	SYSTICKCLKDIV,
-
-	input wire [3: 0] 	fdi_Sys0_S0,
-	output wire [3: 0] 	fdo_Sys0_S0,
-	output wire [0: 0] 	fdoe_Sys0_S0,
-	output wire [0: 0] 	fsclk_Sys0_S0,
-	output wire [0: 0] 	fcen_Sys0_S0,
-
-	input wire [15: 0] GPIOIN_Sys0_S2,
-	output wire [15: 0] GPIOOUT_Sys0_S2,
-	output wire [15: 0] GPIOPU_Sys0_S2,
-	output wire [15: 0] GPIOPD_Sys0_S2,
-	output wire [15: 0] GPIOOEN_Sys0_S2,
-
-	input wire [0: 0] RsRx_Sys0_SS0_S0,
-	output wire [0: 0] RsTx_Sys0_SS0_S0,
-
-	input wire [0: 0] RsRx_Sys0_SS0_S1,
-	output wire [0: 0] RsTx_Sys0_SS0_S1,
-
-	input wire [0: 0] MSI_Sys0_SS0_S2,
-	output wire [0: 0] MSO_Sys0_SS0_S2,
-	output wire [0: 0] SSn_Sys0_SS0_S2,
-	output wire [0: 0] SCLK_Sys0_SS0_S2,
-	input wire [0: 0] MSI_Sys0_SS0_S3,
-	output wire [0: 0] MSO_Sys0_SS0_S3,
-	output wire [0: 0] SSn_Sys0_SS0_S3,
-	output wire [0: 0] SCLK_Sys0_SS0_S3,
-	input wire [0: 0] scl_i_Sys0_SS0_S4,
-	output wire [0: 0] scl_o_Sys0_SS0_S4,
-	output wire [0: 0] scl_oen_o_Sys0_SS0_S4,
-	input wire [0: 0] sda_i_Sys0_SS0_S4,
-	output wire [0: 0] sda_o_Sys0_SS0_S4,
-	output wire [0: 0] sda_oen_o_Sys0_SS0_S4,
-
-	input wire [0: 0] scl_i_Sys0_SS0_S5,
-	output wire [0: 0] scl_o_Sys0_SS0_S5,
-	output wire [0: 0] scl_oen_o_Sys0_SS0_S5,
-	input wire [0: 0] sda_i_Sys0_SS0_S5,
-	output wire [0: 0] sda_o_Sys0_SS0_S5,
-	output wire [0: 0] sda_oen_o_Sys0_SS0_S5,
-
-	output wire [0: 0] pwm_Sys0_SS0_S6,
-	output wire [0: 0] pwm_Sys0_SS0_S7
-);
-
-	wire [31: 0] HADDR_Sys0;
-	wire [31: 0] HWDATA_Sys0;
-	wire HWRITE_Sys0;
-	wire [1: 0] HTRANS_Sys0;
-	wire [2:0] HSIZE_Sys0;
-
-	wire HREADY_Sys0;
-	wire [31: 0] HRDATA_Sys0;
-
-	wire [31: 0] SRAMRDATA_Sys0_S1;
-	wire [3: 0] SRAMWEN_Sys0_S1;
-	wire [31: 0] SRAMWDATA_Sys0_S1;
-	wire [0: 0] SRAMCS0_Sys0_S1;
-	wire [11: 0] SRAMADDR_Sys0_S1;
-
-	// AHB LITE Master2 Signals
-	wire [31:0] M2_HADDR;
-	wire [0:0] M2_HREADY;
-	wire [0:0] M2_HWRITE;
-	wire [1:0] M2_HTRANS;
-	wire [2:0] M2_HSIZE;
-	wire [31:0] M2_HWDATA;
-	wire [31:0] M2_HRDATA;
-	
-	wire [31: 0] M2_IRQ;
-
-	wire [3:0] M2_HPROT;
-	wire [2:0] M2_HBURST;
-	wire M2_HBUSREQ;
-	wire M2_HLOCK;
-	wire M2_HGRANT;
-
-	wire [31:0] SRAMRDATA0, SRAMRDATA1, SRAMRDATA2; 
-
-	assign M2_HREADY = HREADY_Sys0; 
-	assign M2_HRDATA = HRDATA_Sys0;
-
-	assign HADDR_Sys0 = M2_HADDR; 
-	assign HWDATA_Sys0 = M2_HWDATA; 
-	assign HWRITE_Sys0 = M2_HWRITE; 
-	assign HTRANS_Sys0 = M2_HTRANS; 
-	assign HSIZE_Sys0 = M2_HSIZE;
-	assign M2_HGRANT = 1'b1;
-	assign M2_HBUSREQ = 1'b1;
-
-
-	//AHBlite_SYS0 instantiation
-	AHBlite_sys_0 ahb_sys_0_uut(
-
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-         
-		.HADDR(HADDR_Sys0),
-		.HWDATA(HWDATA_Sys0),
-		.HWRITE(HWRITE_Sys0),
-		.HTRANS(HTRANS_Sys0),
-		.HSIZE(HSIZE_Sys0),
-    
-		.HREADY(HREADY_Sys0),
-		.HRDATA(HRDATA_Sys0),
-		
-		// QSPI Interface
-		.fdi_S0(fdi_Sys0_S0),
-		.fdo_S0(fdo_Sys0_S0),
-		.fdoe_S0(fdoe_Sys0_S0),
-		.fsclk_S0(fsclk_Sys0_S0),
-		.fcen_S0(fcen_Sys0_S0),
-
-		// SRAM Interface
-		.SRAMRDATA_S1(SRAMRDATA_Sys0_S1),
-		.SRAMWEN_S1(SRAMWEN_Sys0_S1),
-		.SRAMWDATA_S1(SRAMWDATA_Sys0_S1),
-		.SRAMCS0_S1(SRAMCS0_Sys0_S1),
-		.SRAMADDR_S1(SRAMADDR_Sys0_S1),
-
-		// GPIO Interface
-		.GPIOIN_S2(GPIOIN_Sys0_S2),
-		.GPIOOUT_S2(GPIOOUT_Sys0_S2),
-		.GPIOPU_S2(GPIOPU_Sys0_S2),
-		.GPIOPD_S2(GPIOPD_Sys0_S2),
-		.GPIOOEN_S2(GPIOOEN_Sys0_S2),
-		
-		// APB Bus
-		// UART 0
-		.RsRx_SS0_S0(RsRx_Sys0_SS0_S0),
-		.RsTx_SS0_S0(RsTx_Sys0_SS0_S0),
-		
-		// UART 1
-		.RsRx_SS0_S1(RsRx_Sys0_SS0_S1),
-		.RsTx_SS0_S1(RsTx_Sys0_SS0_S1),
-
-		// SPI 0 Interface
-		.MSI_SS0_S2(MSI_Sys0_SS0_S2),
-		.MSO_SS0_S2(MSO_Sys0_SS0_S2),
-		.SSn_SS0_S2(SSn_Sys0_SS0_S2),
-		.SCLK_SS0_S2(SCLK_Sys0_SS0_S2),
-
-		// SPI 1 Interface
-		.MSI_SS0_S3(MSI_Sys0_SS0_S3),
-		.MSO_SS0_S3(MSO_Sys0_SS0_S3),
-		.SSn_SS0_S3(SSn_Sys0_SS0_S3),
-		.SCLK_SS0_S3(SCLK_Sys0_SS0_S3),
-
-		// I2C 0 Interface
-		.scl_i_SS0_S4(scl_i_Sys0_SS0_S4),
-		.scl_o_SS0_S4(scl_o_Sys0_SS0_S4),
-		.scl_oen_o_SS0_S4(scl_oen_o_Sys0_SS0_S4),
-		.sda_i_SS0_S4(sda_i_Sys0_SS0_S4),
-		.sda_o_SS0_S4(sda_o_Sys0_SS0_S4),
-		.sda_oen_o_SS0_S4(sda_oen_o_Sys0_SS0_S4),
-
-		// I2C 1 Interface
-		.scl_i_SS0_S5(scl_i_Sys0_SS0_S5),
-		.scl_o_SS0_S5(scl_o_Sys0_SS0_S5),
-		.scl_oen_o_SS0_S5(scl_oen_o_Sys0_SS0_S5),
-		.sda_i_SS0_S5(sda_i_Sys0_SS0_S5),
-		.sda_o_SS0_S5(sda_o_Sys0_SS0_S5),
-		.sda_oen_o_SS0_S5(sda_oen_o_Sys0_SS0_S5),
-
-		// PMW 0 & 1 Interfaces
-		.pwm_SS0_S6(pwm_Sys0_SS0_S6),
-		.pwm_SS0_S7(pwm_Sys0_SS0_S7),
-
-		.IRQ(M2_IRQ)
-
-	);
-
-
-	RAM_3Kx32 RAM (
-	`ifdef USE_POWER_PINS
-		.VPWR(VPWR),
-		.VGND(VGND),
-	`endif
-		.CLK(HCLK),
-		.WE(SRAMWEN_Sys0_S1),
-		.EN(SRAMCS0_Sys0_S1),
-		.Di(SRAMWDATA_Sys0_S1),
-		.Do(SRAMRDATA_Sys0_S1),
-		.A(SRAMADDR_Sys0_S1[11:0])
-	);
-
-	// Instantiation of NfiVe32
-	NfiVe32_SYS CPU (
-		.HCLK(HCLK),
-		.HRESETn(HRESETn),
-
-		.HADDR(M2_HADDR),
-		.HREADY(M2_HREADY),
-		.HWRITE(M2_HWRITE),
-		.HTRANS(M2_HTRANS),
-		.HSIZE(M2_HSIZE),
-		.HWDATA(M2_HWDATA),
-		.HRDATA(M2_HRDATA),
-
-		//NMI
-		.NMI(NMI),
-
-		//Interrupts
-		.IRQ(M2_IRQ),
-
-		// SYSTICK Divisor
-		.SYSTICKCLKDIV(SYSTICKCLKDIV)
-	);
-  endmodule
-  
diff --git a/verilog/rtl/user_project/rtl/user_project_wrapper.v b/verilog/rtl/user_project/rtl/user_project_wrapper.v
deleted file mode 100644
index 863412a..0000000
--- a/verilog/rtl/user_project/rtl/user_project_wrapper.v
+++ /dev/null
@@ -1,183 +0,0 @@
-`default_nettype none
-/*
- *-------------------------------------------------------------
- *
- * user_project_wrapper
- *
- * This wrapper enumerates all of the pins available to the
- * user for the user project.
- *
- * An example user project is provided in this wrapper.  The
- * example should be removed and replaced with the actual
- * user project.
- *
- *-------------------------------------------------------------
- */
-
-`define MPRJ_IO_PADS 38
-
-module user_project_wrapper (
-`ifdef USE_POWER_PINS
-    inout vdda1,	// User area 1 3.3V supply
-    inout vdda2,	// User area 2 3.3V supply
-    inout vssa1,	// User area 1 analog ground
-    inout vssa2,	// User area 2 analog ground
-    inout vccd1,	// User area 1 1.8V supply
-    inout vccd2,	// User area 2 1.8v supply
-    inout vssd1,	// User area 1 digital ground
-    inout vssd2,	// User area 2 digital ground
-`endif
-
-    // Wishbone Slave ports (WB MI A)
-    input wb_clk_i,
-    input wb_rst_i,
-    input wbs_stb_i,
-    input wbs_cyc_i,
-    input wbs_we_i,
-    input [3:0] wbs_sel_i,
-    input [31:0] wbs_dat_i,
-    input [31:0] wbs_adr_i,
-    output wbs_ack_o,
-    output [31:0] wbs_dat_o,
-
-    // Logic Analyzer Signals
-    input  [127:0] la_data_in,
-    output [127:0] la_data_out,
-    input  [127:0] la_oen,
-
-    // IOs
-    input  [`MPRJ_IO_PADS-1:0] io_in,
-    output [`MPRJ_IO_PADS-1:0] io_out,
-    output [`MPRJ_IO_PADS-1:0] io_oeb,
-
-    // Analog (direct connection to GPIO pad---use with caution)
-    // Note that analog I/O is not available on the 7 lowest-numbered
-    // GPIO pads, and so the analog_io indexing is offset from the
-    // GPIO indexing by 7.
-    inout [`MPRJ_IO_PADS-8:0] analog_io,
-
-    // Independent clock (on independent integer divider)
-    input   user_clock2
-);
-
-    /*
-        Caravel IO   | N5           |  Mode  
-        
-        io[13:0]     | GPIO         | Bi-directional
-        io[17:14]    | flash        | Bi-directional
-        io[18]       | flash clk    | Output
-        io[19]       | flash enable | Output
-
-        io[20]       | UART0 RX      | Input
-        io[21]       | UART0 TX      | Output
-
-        io[22]       | UART1 RX      | Input
-        io[23]       | UART1 TX      | Output
-
-        io[24]       | SPI0 I       | Input
-        io[25]       | SPI0 O       | Output
-        io[26]       | SPI0 SSn     | Output
-        io[27]       | SPI0 CLK     | Output
-
-        io[28]       | SPI1 I       | Input
-        io[29]       | SPI1 O       | Output
-        io[30]       | SPI1 SSn     | Output
-        io[31]       | SPI1 CLK     | Output
-
-        io[32]       | I2C0 IO      | Bi-directional
-        io[33]       | I2C0 IO      | Bi-directional
-
-        io[34]       | I2C1 IO      | Bi-directional
-        io[35]       | I2C1 IO      | Bi-directional
-
-        io[36]       |  pwm0        | Output
-        io[37]       |  pwm1        | Output
-    */
-
-    assign io_oeb[18] = 1'b0; 
-    assign io_oeb[19] = 1'b0; 
-
-    assign io_oeb[20] = 1'b1; 
-    assign io_oeb[21] = 1'b0; 
-    assign io_oeb[22] = 1'b1; 
-    assign io_oeb[23] = 1'b0; 
-
-    assign io_oeb[24] = 1'b1; 
-    assign io_oeb[25] = 1'b0; 
-    assign io_oeb[26] = 1'b0; 
-    assign io_oeb[27] = 1'b0; 
-
-    assign io_oeb[28] = 1'b1; 
-    assign io_oeb[29] = 1'b0; 
-    assign io_oeb[30] = 1'b0; 
-    assign io_oeb[31] = 1'b0; 
-
-    assign io_oeb[30] = 1'b0; 
-    assign io_oeb[31] = 1'b0; 
-
-    // check csb pin -- io[3]
-    wire fdoeb;
-    
-    assign io_oeb[17:14] = {4{~fdoeb}};
-
-    soc_core core(
-    `ifdef USE_POWER_PINS
-        .VPWR(vccd1),
-        .VGND(vssd1)
-    `endif
-
-        .HCLK(wb_clk_i), 
-	    .HRESETn(~wb_rst_i),
-	    
-        .NMI(la_data_in[8]),
-	    .SYSTICKCLKDIV(la_data_in[7:0]),
-
-        .GPIOIN_Sys0_S2(io_in[13:0]),
-        .GPIOOUT_Sys0_S2(io_out[13:0]),
-	    .GPIOPU_Sys0_S2(),
-	    .GPIOPD_Sys0_S2(),
-	    .GPIOOEN_Sys0_S2(io_oeb[13:0]),
-
-	    .fdi_Sys0_S0(io_in[17:14]),
-	    .fdo_Sys0_S0(io_out[17:14]),
-		.fdoe_Sys0_S0(fdoeb),
-        .fsclk_Sys0_S0(io_out[18]),
-	    .fcen_Sys0_S0(io_out[19]),
-		
-	    .RsRx_Sys0_SS0_S0(io_in[20]),
-        .RsTx_Sys0_SS0_S0(io_out[21]),
-
-        .RsRx_Sys0_SS0_S1(io_in[22]),
-        .RsTx_Sys0_SS0_S1(io_out[23]),
-
-        .MSI_Sys0_SS0_S2(io_in[24]),
-        .MSO_Sys0_SS0_S2(io_out[25]),
-        .SSn_Sys0_SS0_S2(io_out[26]),
-        .SCLK_Sys0_SS0_S2(io_out[27]),
-
-        .MSI_Sys0_SS0_S3(io_in[28]),
-        .MSO_Sys0_SS0_S3(io_out[29]),
-        .SSn_Sys0_SS0_S3(io_out[30]),
-        .SCLK_Sys0_SS0_S3(io_out[31]),
-
-        .scl_i_Sys0_SS0_S4(io_in[32]),
-        .scl_o_Sys0_SS0_S4(io_out[32]),
-        .scl_oen_o_Sys0_SS0_S4(io_oeb[32]),
-        .sda_i_Sys0_SS0_S4(io_in[33]),
-        .sda_o_Sys0_SS0_S4(io_out[33]),
-        .sda_oen_o_Sys0_SS0_S4(io_oeb[33]),
-
-        .scl_i_Sys0_SS0_S5(io_in[34]),
-        .scl_o_Sys0_SS0_S5(io_out[34]),
-        .scl_oen_o_Sys0_SS0_S5(io_oeb[34]),
-        .sda_i_Sys0_SS0_S5(io_in[35]),
-        .sda_o_Sys0_SS0_S5(io_out[35]),
-        .sda_oen_o_Sys0_SS0_S5(io_oeb[35]),
-
-        .pwm_Sys0_SS0_S6(io_out[36]),
-        .pwm_Sys0_SS0_S7(io_out[37])
-    );
-   
-
-endmodule	// user_project_wrapper
-`default_nettype wire
diff --git a/verilog/rtl/user_project/soc_core.v b/verilog/rtl/user_project/soc_core.v
index 115fc2c..a750994 100644
--- a/verilog/rtl/user_project/soc_core.v
+++ b/verilog/rtl/user_project/soc_core.v
@@ -3,6 +3,10 @@
 `timescale 1ns/1ns
 
 module soc_core (
+`ifdef USE_POWER_PINS
+	input VPWR,
+	input VGND,
+`endif
 	input HCLK, 
 	input HRESETn,
 	
@@ -180,8 +184,11 @@
 
 	);
 
-
 	RAM_3Kx32 RAM (
+	`ifdef USE_POWER_PINS
+		.VPWR(VPWR),
+		.VGND(VGND),
+	`endif
 		.CLK(HCLK),
 		.WE(SRAMWEN_Sys0_S1),
 		.EN(SRAMCS0_Sys0_S1),