diff --git a/flist/corstone101_ip_ASIC.flist b/flist/corstone101_ip_ASIC.flist
new file mode 100644
index 0000000000000000000000000000000000000000..f23121f2b7f19e0f0300de8a193eef41ca5e2ece
--- /dev/null
+++ b/flist/corstone101_ip_ASIC.flist
@@ -0,0 +1,86 @@
+//-----------------------------------------------------------------------------
+// NanoSoC Corstone-101 Filelist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for Arm Corstone-101
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    Corstone-101 search path    =============
++incdir+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog
++incdir+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog
++incdir+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/
+
+// CMSDK APB Timer IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_timer/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_timer/verilog/cmsdk_apb_timer.v
+
+// CMSDK Dual Timers IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers_frc.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_dualtimers/verilog/cmsdk_apb_dualtimers.v
+
+// CMSDK APB UART IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_uart/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_uart/verilog/cmsdk_apb_uart.v
+
+// CMSDK APB Watchdog IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog_frc.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_watchdog/verilog/cmsdk_apb_watchdog.v
+
+// CMSDK APB Slave Mux IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_slave_mux/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_slave_mux/verilog/cmsdk_apb_slave_mux.v
+
+// CMSDK APB Subystem Top IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_subsystem/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_subsystem/verilog/cmsdk_apb_subsystem.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_subsystem/verilog/cmsdk_apb_test_slave.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_apb_subsystem/verilog/cmsdk_irq_sync.v
+
+// CMSDK AHB Slave Mux IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_slave_mux/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_slave_mux/verilog/cmsdk_ahb_slave_mux.v
+
+// CMSDK AHB Default Slave IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_default_slave/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_default_slave/verilog/cmsdk_ahb_default_slave.v
+
+// CMSDK AHB GPIO IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_gpio/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_gpio/verilog/cmsdk_ahb_gpio.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_gpio/verilog/cmsdk_ahb_to_iop.v
+
+// CMSDK AHB to APB Bridge IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_apb/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_apb/verilog/cmsdk_ahb_to_apb.v
+
+// CMSDK IOP to GPIO IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_iop_gpio/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_iop_gpio/verilog/cmsdk_iop_gpio.v
+
+// CMSDK Clockgate Models
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/clkgate
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/clkgate/cmsdk_clock_gate.v
+
+// CMSDK Memory Models
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_ram_beh.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_ram.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_ahb_rom.v
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/models/memories/cmsdk_fpga_rom.v
+
+
+// CMSDK AHB to SRAM bridge IP
+//-y $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_sram/verilog
+$(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical/cmsdk_ahb_to_sram/verilog/cmsdk_ahb_to_sram.v
\ No newline at end of file
diff --git a/flist/nanosoc_ASIC.flist b/flist/nanosoc_ASIC.flist
new file mode 100644
index 0000000000000000000000000000000000000000..0ca625025ed71576576522b1456668282866038f
--- /dev/null
+++ b/flist/nanosoc_ASIC.flist
@@ -0,0 +1,33 @@
+//-----------------------------------------------------------------------------
+// NanoSoC Top-level Filelist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for NanoSoC IP
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    NanoSoC IP search path    =============
+
+// Include NanoSoC IP
+-f $(SOCLABS_NANOSOC_TECH_DIR)/flist/nanosoc_ip.flist
+
+// Include Corstone IP
+-f $(SOCLABS_NANOSOC_TECH_DIR)/flist/corstone101_ip_ASIC.flist
+
+// SLCore Files
+-f $(SOCLABS_SLCOREM0_TECH_DIR)/flist/slcorem0.flist
+
+// Debug IP
+-f $(SOCLABS_SOCDEBUG_TECH_DIR)/flist/socdebug.flist
+
+// DMAC IP
+-f $(SOCLABS_SLDMA230_TECH_DIR)/flist/sldma230_ip.flist
diff --git a/fpga/targets/arm_mps3/fpga_pinmap.xdc b/fpga/targets/arm_mps3/fpga_pinmap.xdc
index 5fbe61eb28f3d716824d54418909d555a4f29ad4..88bb6d2abeba7c8fd16de7716393cca1d03f5d20 100644
--- a/fpga/targets/arm_mps3/fpga_pinmap.xdc
+++ b/fpga/targets/arm_mps3/fpga_pinmap.xdc
@@ -1,3 +1,4 @@
+set_property PACKAGE_PIN AD28 [get_ports {UART_TX_F[2]}]
 # -----------------------------------------------------------------------------
 # Purpose : Main timing constraints and pin list for MPS3
 # -----------------------------------------------------------------------------
@@ -6,7 +7,118 @@
 # Pin Assigment
 ####################################################################################
 
-set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_* ETH_* USB_* CLCD_* USER_nLED* USER_SW* USER_nPB* HDMI_* CS_* SH_ADC* UART_*}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_ADDR[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[15]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[14]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[13]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[12]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[11]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[10]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[9]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[8]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {SMBF_DATA[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports SMBF_FIFOSEL]
+set_property IOSTANDARD LVCMOS18 [get_ports SMBF_nOE]
+set_property IOSTANDARD LVCMOS18 [get_ports SMBF_nRST]
+set_property IOSTANDARD LVCMOS18 [get_ports SMBF_nWE]
+set_property IOSTANDARD LVCMOS18 [get_ports ETH_INT]
+set_property IOSTANDARD LVCMOS18 [get_ports ETH_nCS]
+set_property IOSTANDARD LVCMOS18 [get_ports ETH_nOE]
+set_property IOSTANDARD LVCMOS18 [get_ports USB_DACK]
+set_property IOSTANDARD LVCMOS18 [get_ports USB_DREQ]
+set_property IOSTANDARD LVCMOS18 [get_ports USB_INT]
+set_property IOSTANDARD LVCMOS18 [get_ports USB_nCS]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[17]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[16]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[15]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[14]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[13]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[12]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[11]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CLCD_PD[10]}]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_BL]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_CS]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_RD]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_RS]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_RST]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_TINT]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_TNC]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_TSCL]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_TSDA]
+set_property IOSTANDARD LVCMOS18 [get_ports CLCD_WR_SCL]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[9]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[8]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nLED[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_SW[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nPB[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {USER_nPB[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports HDMI_CSCL]
+set_property IOSTANDARD LVCMOS18 [get_ports HDMI_CSDA]
+set_property IOSTANDARD LVCMOS18 [get_ports HDMI_INT]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[15]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[14]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[13]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[12]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[11]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[10]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[9]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[8]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {CS_T_D[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_TCK]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_TDI]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_TDO]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_TMS]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_T_CLK]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_T_CTL]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_nDET]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_nSRST]
+set_property IOSTANDARD LVCMOS18 [get_ports CS_nTRST]
+set_property IOSTANDARD LVCMOS18 [get_ports SH_ADC_CK]
+set_property IOSTANDARD LVCMOS18 [get_ports SH_ADC_CS]
+set_property IOSTANDARD LVCMOS18 [get_ports SH_ADC_DI]
+set_property IOSTANDARD LVCMOS18 [get_ports SH_ADC_DO]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_RX_F[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_RX_F[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_RX_F[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_RX_F[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_TX_F[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_TX_F[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_TX_F[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {UART_TX_F[0]}]
 
 set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[5]}]
 set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[4]}]
@@ -629,7 +741,6 @@ set_property PACKAGE_PIN AE28 [get_ports {UART_RX_F[2]}]
 set_property PACKAGE_PIN AD30 [get_ports {UART_RX_F[3]}]
 set_property PACKAGE_PIN AF27 [get_ports {UART_TX_F[0]}]
 set_property PACKAGE_PIN AE30 [get_ports {UART_TX_F[1]}]
-set_property PACKAGE_PIN AD28 [get_ports {UART_TX_F[2]}]
 set_property PACKAGE_PIN AD29 [get_ports {UART_TX_F[3]}]
 set_property PACKAGE_PIN AN26 [get_ports USB_DACK]
 set_property PACKAGE_PIN AN24 [get_ports USB_DREQ]
@@ -872,44 +983,4 @@ set_property BITSTREAM.STARTUP.MATCH_CYCLE Auto [current_design]
 set_property BITSTREAM.GENERAL.COMPRESS True [current_design]
 set_property CONFIG_MODE S_SELECTMAP [current_design]
 
-set_property PACKAGE_PIN AR26 [get_ports NRST]
-set_property PACKAGE_PIN AR27 [get_ports {P0[0]}]
-set_property PACKAGE_PIN AW29 [get_ports {P0[10]}]
-set_property PACKAGE_PIN BA25 [get_ports {P0[11]}]
-set_property PACKAGE_PIN BB25 [get_ports {P0[12]}]
-set_property PACKAGE_PIN AY28 [get_ports {P0[13]}]
-set_property PACKAGE_PIN BA28 [get_ports {P0[14]}]
-set_property PACKAGE_PIN AY26 [get_ports {P0[15]}]
-set_property PACKAGE_PIN AR28 [get_ports {P0[1]}]
-set_property PACKAGE_PIN AT28 [get_ports {P0[2]}]
-set_property PACKAGE_PIN AU25 [get_ports {P0[3]}]
-set_property PACKAGE_PIN AU26 [get_ports {P0[4]}]
-set_property PACKAGE_PIN AU27 [get_ports {P0[5]}]
-set_property PACKAGE_PIN AV28 [get_ports {P0[6]}]
-set_property PACKAGE_PIN BB26 [get_ports {P0[7]}]
-set_property PACKAGE_PIN BB27 [get_ports {P0[8]}]
-set_property PACKAGE_PIN AW28 [get_ports {P0[9]}]
-set_property PACKAGE_PIN AW26 [get_ports {P1[0]}]
-set_property PACKAGE_PIN AY21 [get_ports {P1[10]}]
-set_property PACKAGE_PIN AY22 [get_ports {P1[11]}]
-set_property PACKAGE_PIN BA22 [get_ports {P1[12]}]
-set_property PACKAGE_PIN AT22 [get_ports {P1[13]}]
-set_property PACKAGE_PIN AT23 [get_ports {P1[14]}]
-set_property PACKAGE_PIN AR25 [get_ports {P1[15]}]
-set_property PACKAGE_PIN AY27 [get_ports {P1[1]}]
-set_property PACKAGE_PIN AW23 [get_ports {P1[2]}]
-set_property PACKAGE_PIN AY23 [get_ports {P1[3]}]
-set_property PACKAGE_PIN AW25 [get_ports {P1[4]}]
-set_property PACKAGE_PIN BB21 [get_ports {P1[5]}]
-set_property PACKAGE_PIN BB22 [get_ports {P1[6]}]
-set_property PACKAGE_PIN BA23 [get_ports {P1[7]}]
-set_property PACKAGE_PIN BA24 [get_ports {P1[8]}]
-set_property PACKAGE_PIN AW21 [get_ports {P1[9]}]
-set_property PACKAGE_PIN AW24 [get_ports SWCLKTCK]
-set_property PACKAGE_PIN AU22 [get_ports SWDIOTMS]
-set_property PACKAGE_PIN AV23 [get_ports VDD]
-set_property PACKAGE_PIN AT24 [get_ports VDDIO]
-set_property PACKAGE_PIN AT25 [get_ports VSS]
-set_property PACKAGE_PIN AV21 [get_ports VSSIO]
-set_property PACKAGE_PIN AY25 [get_ports XTAL1]
-set_property PACKAGE_PIN AV22 [get_ports XTAL2]
+
diff --git a/fpga/targets/arm_mps3/fpga_timing.xdc b/fpga/targets/arm_mps3/fpga_timing.xdc
index 78ac5e66193d3180e0df08f400cc924f8f74e8be..23677a726e5026e2ad86b27165879129dad79b4a 100644
--- a/fpga/targets/arm_mps3/fpga_timing.xdc
+++ b/fpga/targets/arm_mps3/fpga_timing.xdc
@@ -4,96 +4,19 @@
 ##                                                                              ##
 ##################################################################################
 
-create_clock -name CLK -period 30 [get_ports XTAL1]
-create_clock -name VCLK -period 30 -waveform {5 20}
-
-create_clock -name SWCLK -period 60 [get_ports SWCLKTCK]
-create_clock -name VSWCLK -period 60 -waveform {5 35}
-
-set_clock_groups -name async_clk_swclock -asynchronous \
--group [get_clocks -include_generated_clocks CLK] \
--group [get_clocks -include_generated_clocks SWCLK]
-
-set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports {USER_SW[*]}]
-set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_SW[*]}]
-set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports {USER_nPB[*]}]
-set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_nPB[*]}]
-set_input_delay -clock [get_clocks oscclk_0] -min -add_delay 2.800 [get_ports CB_nPOR]
-set_input_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports CB_nPOR]
-set_output_delay -clock [get_clocks oscclk_0] -min -add_delay -1.200 [get_ports {USER_nLED[*]}]
-set_output_delay -clock [get_clocks oscclk_0] -max -add_delay 5.800 [get_ports {USER_nLED[*]}]
-
-#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports {dip_switch_4bits_tri_i[*]}]
-#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports {dip_switch_4bits_tri_i[*]}]
-#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_2]
-#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_2]
-#set_input_delay -clock [get_clocks clk_pl_0] -min -add_delay 20.000 [get_ports PMOD0_3]
-#set_input_delay -clock [get_clocks clk_pl_0] -max -add_delay 25.000 [get_ports PMOD0_3]
-#set_output_delay -clock [get_clocks clk_pl_0] -min -add_delay 5.000 [get_ports {led_4bits_tri_o[*]}]
-#set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {led_4bits_tri_o[*]}]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[0]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[0]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[1]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[1]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[2]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[2]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[3]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[3]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[4]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[4]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[5]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[5]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[6]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[6]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[7]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[7]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[8]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[8]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[9]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[9]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[10]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[10]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P011]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[11]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[12]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[12]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P013]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[13]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P0[14]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[14]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P015]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P0[15]} ]
-
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[0]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[0]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[1]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[1]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[2]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[2]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[3]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[3]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[4]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[4]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[5]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[5]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[6]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[6]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[7]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[7]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[8]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[8]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[9]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[9]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[10]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[10]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P111]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[11]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[12]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[12]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P113]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[13]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P1[14]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[14]} ]
-set_output_delay -clock [get_clocks CLK] -min -add_delay 5.000 [get_ports {P115]} ]
-set_output_delay -clock [get_clocks CLK] -max -add_delay 25.000 [get_ports {P1[15]} ]
-
+create_clock -period 100.000 -name CS_TCK -waveform {0.000 50.000} [get_ports CS_TCK]
+create_clock -period 20.000 -name {OSCCLK[1]} -waveform {0.000 10.000} [get_ports {OSCCLK[1]}]
+set_input_delay -clock [get_clocks {OSCCLK[1]}] -min -add_delay 11.000 [get_ports {UART_RX_F[*]}]
+set_input_delay -clock [get_clocks {OSCCLK[1]}] -max -add_delay 15.000 [get_ports {UART_RX_F[*]}]
+set_input_delay -clock [get_clocks {OSCCLK[1]}] -min -add_delay 11.000 [get_ports CB_nRST]
+set_input_delay -clock [get_clocks {OSCCLK[1]}] -max -add_delay 15.000 [get_ports CB_nRST]
+set_input_delay -clock [get_clocks CS_TCK] -min -add_delay 5.000 [get_ports CS_TMS]
+set_input_delay -clock [get_clocks CS_TCK] -max -add_delay 9.000 [get_ports CS_TMS]
+set_input_delay -clock [get_clocks {OSCCLK[1]}] -min -add_delay 11.000 [get_ports CS_nSRST]
+set_input_delay -clock [get_clocks {OSCCLK[1]}] -max -add_delay 15.000 [get_ports CS_nSRST]
+set_output_delay -clock [get_clocks {OSCCLK[1]}] -min -add_delay -5.000 [get_ports {SH0_IO[*]}]
+set_output_delay -clock [get_clocks {OSCCLK[1]}] -max -add_delay 15.000 [get_ports {SH0_IO[*]}]
+set_output_delay -clock [get_clocks {OSCCLK[1]}] -min -add_delay 0.000 [get_ports {UART_TX_F[*]}]
+set_output_delay -clock [get_clocks {OSCCLK[1]}] -max -add_delay 6.000 [get_ports {UART_TX_F[*]}]
+set_output_delay -clock [get_clocks CS_TCK] -min -add_delay -1.000 [get_ports CS_TMS]
+set_output_delay -clock [get_clocks CS_TCK] -max -add_delay 5.000 [get_ports CS_TMS]
diff --git a/fpga/targets/arm_mps3/nanosoc_design_wrapper.v b/fpga/targets/arm_mps3/nanosoc_design_wrapper.v
index 2509954dbaedf58d59c2aa0a0b457fac45119dde..ed3d2223346fd4c06df33f9c092bd99bf7cbda5f 100644
--- a/fpga/targets/arm_mps3/nanosoc_design_wrapper.v
+++ b/fpga/targets/arm_mps3/nanosoc_design_wrapper.v
@@ -352,8 +352,9 @@ BUFG uBUFG_SMBM        (.I(SMBM_CLK),     .O(iSMBMCLK));    //Micro SMB
   assign SMBM_nWAIT    = 1'b1;
   assign CFG_DATAOUT   = 1'b0;
   wire nRST;
-  reg  rst_sync0, rst_sync1;
+  reg  rst_sync0, rst_sync1, rst_sync2;
   assign nRST_in = CB_nRST || CS_nSRST;
+  assign nRST = rst_sync2;
 
   always @(posedge ACLK)
     if (~nRST_in) begin
@@ -362,11 +363,9 @@ BUFG uBUFG_SMBM        (.I(SMBM_CLK),     .O(iSMBMCLK));    //Micro SMB
     end else begin
       rst_sync0 <= 1'b1;
       rst_sync1 <= rst_sync0;
+      rst_sync2 <= rst_sync1;
     end
 
-  assign nRST = rst_sync1;
-
-  
   nanosoc_design nanosoc_design_i
        (.UART_RX(UART_RX_F[2]),
        .UART_TX(UART_TX_F[2]),
diff --git a/fpga/targets/arm_mps3/vivado_script/2021_1/nanosoc_design.tcl b/fpga/targets/arm_mps3/vivado_script/2021_1/nanosoc_design.tcl
index 2608b77948f9da2c4f54265f53d5daf7a813b4ca..105a5b2f0a55914ccc05706439a8bf4a82caf29c 100644
--- a/fpga/targets/arm_mps3/vivado_script/2021_1/nanosoc_design.tcl
+++ b/fpga/targets/arm_mps3/vivado_script/2021_1/nanosoc_design.tcl
@@ -7,6 +7,7 @@
 # IP Integrator Tcl commands easier.
 ################################################################
 
+
 namespace eval _tcl {
 proc get_script_folder {} {
    set script_path [file normalize [info script]]
@@ -35,7 +36,7 @@ if { [string first $scripts_vivado_version $current_vivado_version] == -1 } {
 ################################################################
 
 # To test this script, run the following commands from Vivado Tcl console:
-# source nanosoc_design_script.tcl
+# source design_1_script.tcl
 
 # If there is no project opened, this script will create a
 # project, but make sure you do not have an existing project
@@ -49,7 +50,7 @@ if { $list_projs eq "" } {
 
 # CHANGE DESIGN NAME HERE
 variable design_name
-set design_name nanosoc_design
+set design_name design_1
 
 # If you do not already have an existing IP Integrator design open,
 # you can create a design using the following command:
@@ -408,8 +409,8 @@ proc create_hier_cell_cmsdk_socket { parentCell nameHier } {
    CONFIG.NUM_SI {1} \
  ] $smartconnect_0
 
-  # Create instance: uart_axi_master_0, and set properties
-  set uart_axi_master_0 [ create_bd_cell -type ip -vlnv user.org:user:uart_axi_master:1.0 uart_axi_master_0 ]
+  # Create instance: uart_to_AXI_master_0, and set properties
+  set uart_to_AXI_master_0 [ create_bd_cell -type ip -vlnv ultraembedded:user:uart_axi_master:1.0 uart_to_AXI_master_0 ]
   set_property -dict [ list \
    CONFIG.CLK_SPEED {50000000} \
    CONFIG.C_M00_AXI_ARUSER_WIDTH {4} \
@@ -418,7 +419,7 @@ proc create_hier_cell_cmsdk_socket { parentCell nameHier } {
    CONFIG.C_M00_AXI_ID_WIDTH {4} \
    CONFIG.C_M00_AXI_RUSER_WIDTH {4} \
    CONFIG.C_M00_AXI_WUSER_WIDTH {4} \
- ] $uart_axi_master_0
+ ] $uart_to_AXI_master_0
 
   # Create instance: xlconstant_0, and set properties
   set xlconstant_0 [ create_bd_cell -type ip -vlnv xilinx.com:ip:xlconstant:1.1 xlconstant_0 ]
@@ -453,12 +454,12 @@ proc create_hier_cell_cmsdk_socket { parentCell nameHier } {
   connect_bd_intf_net -intf_net smartconnect_0_M05_AXI [get_bd_intf_pins axi_stream_io_1/S_AXI] [get_bd_intf_pins smartconnect_0/M05_AXI]
   connect_bd_intf_net -intf_net smartconnect_0_M06_AXI [get_bd_intf_pins axi_stream_io_2/S_AXI] [get_bd_intf_pins smartconnect_0/M06_AXI]
   connect_bd_intf_net -intf_net smartconnect_0_M07_AXI [get_bd_intf_pins axi_stream_io_3/S_AXI] [get_bd_intf_pins smartconnect_0/M07_AXI]
-  connect_bd_intf_net -intf_net uart_axi_master_0_M00_AXI [get_bd_intf_pins smartconnect_0/S00_AXI] [get_bd_intf_pins uart_axi_master_0/M00_AXI]
+  connect_bd_intf_net -intf_net uart_to_AXI_master_0_M00_AXI [get_bd_intf_pins smartconnect_0/S00_AXI] [get_bd_intf_pins uart_to_AXI_master_0/M00_AXI]
 
   # Create port connections
   connect_bd_net -net ADPcontrol_0_gpo8 [get_bd_pins ADPcontrol_0/gpi8] [get_bd_pins ADPcontrol_0/gpo8]
   connect_bd_net -net UART2_TXD [get_bd_pins axi_uartlite_0/rx] [get_bd_pins p1_o_bit5/Dout]
-  connect_bd_net -net UART_RX_1 [get_bd_pins UART_RX] [get_bd_pins uart_axi_master_0/UART_RX]
+  connect_bd_net -net UART_RX_1 [get_bd_pins UART_RX] [get_bd_pins uart_to_AXI_master_0/UART_RX]
   connect_bd_net -net ahblite_axi_bridge_0_s_ahb_hready_out [get_bd_pins ADPcontrol_0/ahb_hready] [get_bd_pins ahblite_axi_bridge_0/s_ahb_hready_in] [get_bd_pins ahblite_axi_bridge_0/s_ahb_hready_out]
   connect_bd_net -net axi_bram_ctrl_0_bram_addr_a [get_bd_pins axi_bram_ctrl_0/bram_addr_a] [get_bd_pins blk_mem_gen_0/addra]
   connect_bd_net -net axi_bram_ctrl_0_bram_clk_a [get_bd_pins axi_bram_ctrl_0/bram_clk_a] [get_bd_pins blk_mem_gen_0/clka]
@@ -492,12 +493,12 @@ proc create_hier_cell_cmsdk_socket { parentCell nameHier } {
   connect_bd_net -net pmoda_i_bit4_Dout [get_bd_pins swdio_tri_i] [get_bd_pins pmoda_i_bit4/Dout]
   connect_bd_net -net pmoda_i_bit7_Dout [get_bd_pins swdclk_i] [get_bd_pins pmoda_i_bit7/Dout]
   connect_bd_net -net pmoda_o_concat9_dout [get_bd_pins pmoda_tri_z] [get_bd_pins pmoda_z_concat8/dout]
-  connect_bd_net -net proc_sys_reset_0_interconnect_aresetn [get_bd_pins ext_reset_in] [get_bd_pins ADPcontrol_0/ahb_hresetn] [get_bd_pins ahblite_axi_bridge_0/s_ahb_hresetn] [get_bd_pins axi_bram_ctrl_0/s_axi_aresetn] [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins axi_gpio_1/s_axi_aresetn] [get_bd_pins axi_stream_io_0/S_AXI_ARESETN] [get_bd_pins axi_stream_io_1/S_AXI_ARESETN] [get_bd_pins axi_stream_io_2/S_AXI_ARESETN] [get_bd_pins axi_stream_io_3/S_AXI_ARESETN] [get_bd_pins axi_uartlite_0/s_axi_aresetn] [get_bd_pins axi_uartlite_1/s_axi_aresetn] [get_bd_pins axis_data_fifo_0/s_axis_aresetn] [get_bd_pins axis_data_fifo_1/s_axis_aresetn] [get_bd_pins axis_data_fifo_2/s_axis_aresetn] [get_bd_pins axis_data_fifo_3/s_axis_aresetn] [get_bd_pins axis_data_fifo_4/s_axis_aresetn] [get_bd_pins ft1248x1_to_axi_stream_0/aresetn] [get_bd_pins smartconnect_0/aresetn] [get_bd_pins uart_axi_master_0/m00_axi_aresetn]
+  connect_bd_net -net proc_sys_reset_0_interconnect_aresetn [get_bd_pins ext_reset_in] [get_bd_pins ADPcontrol_0/ahb_hresetn] [get_bd_pins ahblite_axi_bridge_0/s_ahb_hresetn] [get_bd_pins axi_bram_ctrl_0/s_axi_aresetn] [get_bd_pins axi_gpio_0/s_axi_aresetn] [get_bd_pins axi_gpio_1/s_axi_aresetn] [get_bd_pins axi_stream_io_0/S_AXI_ARESETN] [get_bd_pins axi_stream_io_1/S_AXI_ARESETN] [get_bd_pins axi_stream_io_2/S_AXI_ARESETN] [get_bd_pins axi_stream_io_3/S_AXI_ARESETN] [get_bd_pins axi_uartlite_0/s_axi_aresetn] [get_bd_pins axi_uartlite_1/s_axi_aresetn] [get_bd_pins axis_data_fifo_0/s_axis_aresetn] [get_bd_pins axis_data_fifo_1/s_axis_aresetn] [get_bd_pins axis_data_fifo_2/s_axis_aresetn] [get_bd_pins axis_data_fifo_3/s_axis_aresetn] [get_bd_pins axis_data_fifo_4/s_axis_aresetn] [get_bd_pins ft1248x1_to_axi_stream_0/aresetn] [get_bd_pins smartconnect_0/aresetn] [get_bd_pins uart_to_AXI_master_0/m00_axi_aresetn]
   connect_bd_net -net swdio_o_1 [get_bd_pins swdio_tri_o] [get_bd_pins pmoda_o_concat8/In4]
   connect_bd_net -net swdio_z_1 [get_bd_pins swdio_tri_z] [get_bd_pins pmoda_z_concat8/In4]
-  connect_bd_net -net uart_axi_master_0_UART_TX [get_bd_pins UART_TX] [get_bd_pins uart_axi_master_0/UART_TX]
+  connect_bd_net -net uart_to_AXI_master_0_UART_TX [get_bd_pins UART_TX] [get_bd_pins uart_to_AXI_master_0/UART_TX]
   connect_bd_net -net xlconcat_0_dout [get_bd_pins pmoda_tri_o] [get_bd_pins pmoda_o_concat8/dout]
-  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins aclk] [get_bd_pins ADPcontrol_0/ahb_hclk] [get_bd_pins ahblite_axi_bridge_0/s_ahb_hclk] [get_bd_pins axi_bram_ctrl_0/s_axi_aclk] [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins axi_gpio_1/s_axi_aclk] [get_bd_pins axi_stream_io_0/S_AXI_ACLK] [get_bd_pins axi_stream_io_1/S_AXI_ACLK] [get_bd_pins axi_stream_io_2/S_AXI_ACLK] [get_bd_pins axi_stream_io_3/S_AXI_ACLK] [get_bd_pins axi_uartlite_0/s_axi_aclk] [get_bd_pins axi_uartlite_1/s_axi_aclk] [get_bd_pins axis_data_fifo_0/s_axis_aclk] [get_bd_pins axis_data_fifo_1/s_axis_aclk] [get_bd_pins axis_data_fifo_2/s_axis_aclk] [get_bd_pins axis_data_fifo_3/s_axis_aclk] [get_bd_pins axis_data_fifo_4/s_axis_aclk] [get_bd_pins ft1248x1_to_axi_stream_0/aclk] [get_bd_pins smartconnect_0/aclk] [get_bd_pins uart_axi_master_0/m00_axi_aclk]
+  connect_bd_net -net zynq_ultra_ps_e_0_pl_clk0 [get_bd_pins aclk] [get_bd_pins ADPcontrol_0/ahb_hclk] [get_bd_pins ahblite_axi_bridge_0/s_ahb_hclk] [get_bd_pins axi_bram_ctrl_0/s_axi_aclk] [get_bd_pins axi_gpio_0/s_axi_aclk] [get_bd_pins axi_gpio_1/s_axi_aclk] [get_bd_pins axi_stream_io_0/S_AXI_ACLK] [get_bd_pins axi_stream_io_1/S_AXI_ACLK] [get_bd_pins axi_stream_io_2/S_AXI_ACLK] [get_bd_pins axi_stream_io_3/S_AXI_ACLK] [get_bd_pins axi_uartlite_0/s_axi_aclk] [get_bd_pins axi_uartlite_1/s_axi_aclk] [get_bd_pins axis_data_fifo_0/s_axis_aclk] [get_bd_pins axis_data_fifo_1/s_axis_aclk] [get_bd_pins axis_data_fifo_2/s_axis_aclk] [get_bd_pins axis_data_fifo_3/s_axis_aclk] [get_bd_pins axis_data_fifo_4/s_axis_aclk] [get_bd_pins ft1248x1_to_axi_stream_0/aclk] [get_bd_pins smartconnect_0/aclk] [get_bd_pins uart_to_AXI_master_0/m00_axi_aclk]
 
   # Restore current instance
   current_bd_instance $oldCurInst
@@ -540,10 +541,10 @@ proc create_root_design { parentCell } {
 
   # Create ports
   set EXT_CLK [ create_bd_port -dir I -type clk -freq_hz 50000000 EXT_CLK ]
- # set_property -dict [ list \
- #  CONFIG.ASSOCIATED_ASYNC_RESET {nRST_CPU} \
- #  CONFIG.ASSOCIATED_RESET {nRST_CPU} \
- #] $EXT_CLK
+  set_property -dict [ list \
+   CONFIG.ASSOCIATED_ASYNC_RESET {nRST_CPU} \
+   CONFIG.ASSOCIATED_RESET {nRST_CPU} \
+ ] $EXT_CLK
   set UART_RX [ create_bd_port -dir I UART_RX ]
   set UART_TX [ create_bd_port -dir O UART_TX ]
   set nRST_CPU [ create_bd_port -dir I -type rst nRST_CPU ]
@@ -578,14 +579,14 @@ proc create_root_design { parentCell } {
 
   # Create address segments
   assign_bd_address -offset 0xC0000000 -range 0x00002000 -target_address_space [get_bd_addr_spaces cmsdk_socket/ADPcontrol_0/ahb] [get_bd_addr_segs cmsdk_socket/axi_bram_ctrl_0/S_AXI/Mem0] -force
-  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_gpio_0/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80010000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_gpio_1/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80020000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_0/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80030000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_1/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80040000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_2/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80050000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_3/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80060000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_uartlite_0/S_AXI/Reg] -force
-  assign_bd_address -offset 0x80070000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_axi_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_uartlite_1/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_gpio_0/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80010000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_gpio_1/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80020000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_0/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80030000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_1/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80040000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_2/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80050000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_stream_io_3/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80060000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_uartlite_0/S_AXI/Reg] -force
+  assign_bd_address -offset 0x80070000 -range 0x00010000 -target_address_space [get_bd_addr_spaces cmsdk_socket/uart_to_AXI_master_0/M00_AXI] [get_bd_addr_segs cmsdk_socket/axi_uartlite_1/S_AXI/Reg] -force
 
 
   # Restore current instance
@@ -597,10 +598,22 @@ proc create_root_design { parentCell } {
 # End of create_root_design()
 
 
-##################################################################
-# MAIN FLOW
-##################################################################
-
-#create_root_design ""
 
+proc available_tcl_procs { } {
+   puts "##################################################################"
+   puts "# Available Tcl procedures to recreate hierarchical blocks:"
+   puts "#"
+   puts "#    create_hier_cell_cmsdk_socket parentCell nameHier"
+   puts "#    create_root_design"
+   puts "#"
+   puts "#"
+   puts "# The following procedures will create hiearchical blocks with addressing "
+   puts "# for IPs within those blocks and their sub-hierarchical blocks. Addressing "
+   puts "# will not be handled outside those blocks:"
+   puts "#"
+   puts "#    create_root_design"
+   puts "#"
+   puts "##################################################################"
+}
 
+available_tcl_procs
\ No newline at end of file
diff --git a/software/common/validation/dma_bandwidth_test.c b/software/common/validation/dma_bandwidth_test.c
new file mode 100644
index 0000000000000000000000000000000000000000..77d726a2bfd90cb21841eb3507adc807520d0dad
--- /dev/null
+++ b/software/common/validation/dma_bandwidth_test.c
@@ -0,0 +1,643 @@
+/*
+ *-----------------------------------------------------------------------------
+ * The confidential and proprietary information contained in this file may
+ * only be used by a person authorised under and to the extent permitted
+ * by a subsisting licensing agreement from Arm Limited or its affiliates.
+ *
+ *            (C) COPYRIGHT 2010-2013 Arm Limited or its affiliates.
+ *                ALL RIGHTS RESERVED
+ *
+ * This entire notice must be reproduced on all copies of this file
+ * and copies of this file may only be made by a person if such person is
+ * permitted to do so under the terms of a subsisting license agreement
+ * from Arm Limited or its affiliates.
+ *
+ *      SVN Information
+ *
+ *      Checked In          : $Date: 2017-10-10 15:55:38 +0100 (Tue, 10 Oct 2017) $
+ *
+ *      Revision            : $Revision: 371321 $
+ *
+ *      Release Information : Cortex-M System Design Kit-r1p1-00rel0
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+  A simple test to check the connectivity of the DMA-230 including
+  interrupt and done signals
+*/
+
+#ifdef CORTEX_M0
+#include "CMSDK_CM0.h"
+#endif
+
+#ifdef CORTEX_M0PLUS
+#include "CMSDK_CM0plus.h"
+#endif
+
+#ifdef CORTEX_M3
+#include "CMSDK_CM3.h"
+#endif
+
+#ifdef CORTEX_M4
+#include "CMSDK_CM4.h"
+#endif
+
+#include <stdio.h>
+#include "uart_stdout.h"
+
+#include "config_id.h"
+
+#define HW32_REG(ADDRESS)  (*((volatile unsigned long  *)(ADDRESS)))
+volatile int dma_done_irq_occurred;
+volatile int dma_done_irq_expected;
+volatile int dma_error_irq_occurred;
+volatile int dma_error_irq_expected;
+
+int  pl230_dma_detect(void);
+int  ID_Check(const unsigned int id_array[], unsigned int offset);
+void dma_memory_copy (unsigned int src, unsigned int dest, unsigned int size, unsigned int num);
+void dma_data_struct_init(void);
+void dma_pl230_init(void);
+int  dma_simple_test(void);
+int  dma_interrupt_test(void);
+int  dma_event_test(void);
+void delay(void);
+
+                              /* Maximum to 32 DMA channel */
+#define MAX_NUM_OF_DMA_CHANNELS   32
+                              /* SRAM in example system is 64K bytes */
+//#define RAM_ADDRESS_MAX       0x3000FFFF
+#define RAM_ADDRESS_MAX       0x80000FFF
+
+typedef struct /* 4 words */
+{
+  volatile unsigned long SrcEndPointer;
+  volatile unsigned long DestEndPointer;
+  volatile unsigned long Control;
+  volatile unsigned long unused;
+} pl230_dma_channel_data;
+
+
+typedef struct /* 8 words per channel */
+{ /* only one channel in the example uDMA setup */
+  volatile pl230_dma_channel_data Primary[MAX_NUM_OF_DMA_CHANNELS];
+  volatile pl230_dma_channel_data Alternate[MAX_NUM_OF_DMA_CHANNELS];
+} pl230_dma_data_structure;
+
+pl230_dma_data_structure *dma_data;
+
+volatile unsigned int source_data_array[4];  /* Data array for memory DMA test */
+volatile unsigned int dest_data_array[4];    /* Data array for memory DMA test */
+
+#if defined ( __CC_ARM   )
+__asm unsigned int  address_test_read(unsigned int addr);
+#else
+      unsigned int  address_test_read(unsigned int addr);
+#endif
+
+void                HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value);
+
+/* Global variables */
+volatile int hardfault_occurred;
+volatile int hardfault_expected;
+volatile int temp_data;
+int main (void)
+{
+  int result=0;
+  temp_data=0;
+  hardfault_occurred = 0;
+  hardfault_expected = 0;
+
+  // UART init
+  UartStdOutInit();
+
+  // Test banner message and revision number
+  puts("\nCortex Microcontroller System Design Kit - DMA Bandwidth Test - revision $Revision: 371321 $\n");
+
+
+  if (pl230_dma_detect()!=0) {
+    return 0; /* Quit test if DMA is not present */
+  }
+
+  dma_done_irq_expected = 0;
+  dma_done_irq_occurred = 0;
+  dma_error_irq_expected = 0;
+  dma_error_irq_occurred = 0;
+  dma_data_struct_init();
+  dma_pl230_init();
+  result += dma_simple_test();
+  result += dma_interrupt_test();
+  if (result==0) {
+    printf ("\n** TEST PASSED **\n");
+  } else {
+    printf ("\n** TEST FAILED **, Error code = (0x%x)\n", result);
+  }
+  UartEndSimulation();
+  return 0;
+}
+
+/* --------------------------------------------------------------- */
+/*  Detect if DMA controller is present or not                     */
+/* --------------------------------------------------------------- */
+
+int pl230_dma_detect(void)
+{
+  int result;
+  int volatile rdata; /* dummy variable for read data in bus fault testing */
+  unsigned const int pl230_id[12] = {
+                                 0x30, 0xB2, 0x0B, 0x00,
+                                 0x0D, 0xF0, 0x05, 0xB1};
+  puts("Detect if DMA controller is present...");
+  hardfault_occurred = 0;
+  hardfault_expected = 1;
+  rdata = address_test_read(CMSDK_PL230_BASE+ 0xFE0);
+  hardfault_expected = 0;
+  result = hardfault_occurred ? 1 : ID_Check(&pl230_id[0], CMSDK_PL230_BASE);
+  hardfault_occurred = 0;
+  if (result!=0) {
+    puts("** TEST SKIPPED ** DMA controller is not present.\n");
+    UartEndSimulation();
+  }
+  return(result);
+}
+
+int ID_Check(const unsigned int id_array[], unsigned int offset)
+{
+int i;
+unsigned long expected_val, actual_val;
+unsigned long compare_mask;
+int           mismatch = 0;
+unsigned long test_addr;
+
+  /* Check the peripheral ID and component ID */
+  for (i=0;i<8;i++) {
+    test_addr = offset + 4*i + 0xFE0;
+    expected_val = id_array[i];
+    actual_val   = HW32_REG(test_addr);
+
+    /* create mask to ignore version numbers */
+    if (i==2) { compare_mask = 0xF0;}  // mask out version field
+    else      { compare_mask = 0x00;}  // compare whole value
+
+    if ((expected_val & (~compare_mask)) != (actual_val & (~compare_mask))) {
+      printf ("Difference found: %x, expected %x, actual %x\n", test_addr, expected_val, actual_val);
+      mismatch++;
+      }
+
+    } // end_for
+return (mismatch);
+}
+
+/* --------------------------------------------------------------- */
+/*  Initialize DMA data structure                                  */
+/* --------------------------------------------------------------- */
+void dma_data_struct_init(void)
+{
+  int          i;   /* loop counter */
+  unsigned int ptr;
+
+  int          ch_num;         /* number of channels */
+  unsigned int blksize;        /* Size of DMA data structure in bytes */
+  unsigned int blkmask;        /* address mask */
+
+
+  ch_num  = (((CMSDK_DMA->DMA_STATUS) >> 16) & 0x1F)+1;
+  blksize = ch_num * 32;
+  if      (ch_num > 16) blkmask = 0x3FF; /* 17 to 32 */
+  else if (ch_num > 8)  blkmask = 0x1FF; /*  9 to 16 */
+  else if (ch_num > 4)  blkmask = 0x0FF; /*  5 to 8 */
+  else if (ch_num > 2)  blkmask = 0x07F; /*  3 to 4 */
+  else if (ch_num > 1)  blkmask = 0x07F; /*       2 */
+  else                  blkmask = 0x03F; /*       1 */
+
+  /* Create DMA data structure in RAM after stack
+  In the linker script, a 1KB memory stack above stack is reserved
+  so we can use this space for putting the DMA data structure.
+  */
+
+//  ptr     = HW32_REG(0);                     /* Read Top of Stack */
+  ptr     = 0x80000000;              /* DMA memory bank */
+
+  /* the DMA data structure must be aligned to the size of the data structure */
+  if ((ptr & blkmask) != 0x0)
+    ptr     = (ptr + blksize) & ~blkmask;
+
+  if ((ptr + blksize) > (RAM_ADDRESS_MAX + 1)) {
+    puts ("ERROR : Not enough RAM space for DMA data structure.");
+    UartEndSimulation();
+    }
+
+  /* Set pointer to the reserved space */
+  dma_data = (pl230_dma_data_structure *) ptr;
+  ptr = (unsigned int) &dma_data->Primary->SrcEndPointer;
+
+  printf ("dma structure block address = %x\n", ptr);
+
+  for (i=0; i<1; i++) {
+    dma_data->Primary->SrcEndPointer  = 0;
+    dma_data->Primary->DestEndPointer = 0;
+    dma_data->Primary->Control        = 0;
+    dma_data->Alternate->SrcEndPointer  = 0;
+    dma_data->Alternate->DestEndPointer = 0;
+    dma_data->Alternate->Control        = 0;
+    }
+
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  Initialize DMA PL230                                           */
+/* --------------------------------------------------------------- */
+void dma_pl230_init(void)
+{
+  unsigned int current_state;
+  puts ("Initialize PL230");
+  current_state = CMSDK_DMA->DMA_STATUS;
+  printf ("- # of channels allowed : %d\n",(((current_state) >> 16) & 0x1F)+1);
+  /* Debugging printfs: */
+  /*printf ("- Current status        : %x\n",(((current_state) >> 4)  & 0xF));*/
+  /*printf ("- Current master enable : %x\n",(((current_state) >> 0)  & 0x1));*/
+
+  /* Wait until current DMA complete */
+  current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  if (!((current_state==0) || (current_state==0x8) || (current_state==0x9))) {
+    puts ("- wait for DMA IDLE/STALLED/DONE");
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+    printf ("- Current status        : %x\n",(((current_state) >> 4)  & 0xF));
+
+    }
+  while (!((current_state==0) || (current_state==0x8) || (current_state==0x9))){
+    /* Wait if not IDLE/STALLED/DONE */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+    printf ("- Current status        : %x\n",(((current_state) >> 4)  & 0xF));
+    }
+  CMSDK_DMA->DMA_CFG = 0; /* Disable DMA controller for initialization */
+  CMSDK_DMA->CTRL_BASE_PTR = (unsigned int) &dma_data->Primary->SrcEndPointer;
+                           /* Set DMA data structure address */
+  CMSDK_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF; /* Disable all channels */
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+  CMSDK_DMA->DMA_CFG = 1;              /* Enable DMA controller */
+
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  DMA memory copy                                                */
+/* --------------------------------------------------------------- */
+void dma_memory_copy (unsigned int src, unsigned int dest, unsigned int size, unsigned int num)
+{
+  unsigned long src_end_pointer =  src + ((1<<size)*(num-1));
+  unsigned long dst_end_pointer = dest + ((1<<size)*(num-1));
+  unsigned long control         = (size << 30) |  /* dst_inc */
+                                  (size << 28) |  /* dst_size */
+                                  (size << 26) |  /* src_inc */
+                                  (size << 24) |  /* src_size */
+                                  (size << 21) |  /* dst_prot_ctrl - HPROT[3:1] */
+                                  (size << 18) |  /* src_prot_ctrl - HPROT[3:1] */
+                                  (0    << 14) |  /* R_power */
+                                  ((num-1)<< 4) | /* n_minus_1 */
+                                  (0    <<  3) |  /* next_useburst */
+                                  (2    <<  0) ;  /* cycle_ctrl - auto */
+
+  /* By default the PL230 is little-endian; if the processor is configured
+   * big-endian then the configuration data that is written to memory must be
+   * byte-swapped before being written.  This is also true if the processor is
+   * little-endian and the PL230 is big-endian.
+   * Remove the __REV usage if the processor and PL230 are configured with the
+   * same endianness
+   * */
+  dma_data->Primary->SrcEndPointer  = (EXPECTED_BE) ? __REV(src_end_pointer) : (src_end_pointer);
+  dma_data->Primary->DestEndPointer = (EXPECTED_BE) ? __REV(dst_end_pointer) : (dst_end_pointer);
+  dma_data->Primary->Control        = (EXPECTED_BE) ? __REV(control        ) : (control        );
+  /* Debugging printfs: */
+  /*printf ("SrcEndPointer  = %x\n", dma_data->Primary->SrcEndPointer);*/
+  /*printf ("DestEndPointer = %x\n", dma_data->Primary->DestEndPointer);*/
+
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+  CMSDK_DMA->CHNL_SW_REQUEST = (1<<0); /* request channel 0 DMA */
+
+  return;
+}
+
+/* --------------------------------------------------------------- */
+/*  Simple software DMA test                                       */
+/* --------------------------------------------------------------- */
+int dma_simple_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  unsigned int current_state;
+
+
+  puts("uDMA simple test");
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<1024;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  /* Start timer */
+  CMSDK_TIMER0->
+
+  dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4);
+  do { /* Wait until PL230 DMA controller return to idle state */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  } while (current_state!=0);
+
+  for (i=0;i<4;i++) {
+    /* Debugging printf: */
+    /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/
+    if (dest_data_array[i]!= i){
+      printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]);
+      err_code |= (1<<i);
+    }
+  }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : simple DMA failed (0x%x)\n", err_code);
+    return_val=1;
+  } else {
+    puts ("-Passed");
+  }
+
+  return(return_val);
+}
+/* --------------------------------------------------------------- */
+/*  Simple DMA interrupt test                                      */
+/* --------------------------------------------------------------- */
+int dma_interrupt_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  unsigned int current_state;
+
+
+  puts("DMA interrupt test");
+  puts("- DMA done");
+
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_done_irq_expected = 1;
+  dma_done_irq_occurred = 0;
+  NVIC_ClearPendingIRQ(DMA_IRQn);
+  NVIC_EnableIRQ(DMA_IRQn);
+
+  dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4);
+  delay();
+  /* Can't guarantee that there is sleep support, so use a polling loop */
+  do { /* Wait until PL230 DMA controller return to idle state */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  } while (current_state!=0);
+
+  for (i=0;i<4;i++) {
+    /* Debugging printf: */
+    /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/
+    if (dest_data_array[i]!= i){
+      printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]);
+      err_code |= (1<<i);
+    }
+  }
+
+  if (dma_done_irq_occurred==0){
+    puts ("ERROR: DMA done IRQ missing");
+    err_code |= (1<<4);
+  }
+
+  puts("- DMA err");
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_error_irq_expected = 1;
+  dma_error_irq_occurred = 0;
+  NVIC_ClearPendingIRQ(DMA_IRQn);
+  NVIC_EnableIRQ(DMA_IRQn);
+
+  /* Generate DMA transfer to invalid memory location */
+  dma_memory_copy ((unsigned int) &source_data_array[0],0xEF000000, 2, 4);
+  delay();
+  /* Can't guarantee that there is sleep support, so use a polling loop */
+  do { /* Wait until PL230 DMA controller return to idle state */
+    current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  } while (current_state!=0);
+
+  if (dma_error_irq_occurred==0){
+    puts ("ERROR: DMA err IRQ missing");
+    err_code |= (1<<5);
+  }
+
+
+  /* Clear up */
+  dma_done_irq_expected = 0;
+  dma_done_irq_occurred = 0;
+  dma_error_irq_expected = 0;
+  dma_error_irq_occurred = 0;
+  NVIC_DisableIRQ(DMA_IRQn);
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : DMA done interrupt failed (0x%x)\n", err_code);
+    return_val=1;
+  } else {
+    puts ("-Passed");
+  }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  DMA event test                                                 */
+/* --------------------------------------------------------------- */
+int dma_event_test(void)
+{
+  int return_val=0;
+  int err_code=0;
+  int i;
+  unsigned int current_state;
+
+
+  puts("DMA event test");
+  puts("- DMA done event to RXEV");
+
+  CMSDK_DMA->CHNL_ENABLE_SET = (1<<0); /* Enable channel 0 */
+
+  /* setup data for DMA */
+  for (i=0;i<4;i++) {
+    source_data_array[i] = i;
+    dest_data_array[i]   = 0;
+  }
+
+  dma_done_irq_expected = 1;
+  dma_done_irq_occurred = 0;
+  NVIC_ClearPendingIRQ(DMA_IRQn);
+  NVIC_DisableIRQ(DMA_IRQn);
+
+  /* Clear event register - by setting event with SEV and then clear it with WFE */
+  __SEV();
+  __WFE(); /* First WFE will not enter sleep because of previous event */
+
+  dma_memory_copy ((unsigned int) &source_data_array[0],(unsigned int) &dest_data_array[0], 2, 4);
+  __WFE(); /* This will cause the processor to enter sleep */
+
+  /* Processor woken up */
+  current_state = (CMSDK_DMA->DMA_STATUS >> 4)  & 0xF;
+  if (current_state!=0) {
+    puts ("ERROR: DMA status should be IDLE after wake up");
+    err_code |= (1<<5);
+  }
+
+  for (i=0;i<4;i++) {
+    /*printf (" - dest[i] = %x\n", dest_data_array[i]);*/
+    if (dest_data_array[i]!= i){
+      printf ("ERROR:dest_data_array[%d], expected %x, actual %x\n", i, i, dest_data_array[i]);
+      err_code |= (1<<i);
+    }
+  }
+
+  /* Generate return value */
+  if (err_code != 0) {
+    printf ("ERROR : DMA event failed (0x%x)\n", err_code);
+    return_val=1;
+  } else {
+    puts ("-Passed");
+  }
+
+  return(return_val);
+}
+
+/* --------------------------------------------------------------- */
+/*  DMA interrupt handlers                                         */
+/* --------------------------------------------------------------- */
+
+void DMA_Handler(void)
+{
+if ((CMSDK_DMA->ERR_CLR & 1) != 0)  {
+  /* DMA interrupt is caused by DMA error */
+  dma_error_irq_occurred ++;
+  CMSDK_DMA->ERR_CLR = 1; /* Clear dma_err */
+  if (dma_error_irq_expected==0) {
+    puts ("ERROR : Unexpected DMA error interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  }
+else {
+  // DMA interrupt is caused by DMA done
+  dma_done_irq_occurred ++;
+  if (dma_done_irq_expected==0) {
+    puts ("ERROR : Unexpected DMA done interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  }
+}
+
+/* Test function for read */
+#if defined ( __CC_ARM   )
+/* Test function for read - for ARM / Keil */
+__asm unsigned int address_test_read(unsigned int addr)
+{
+  LDR    R1,[R0]
+  DSB    ; Ensure bus fault occurred before leaving this subroutine
+  MOVS   R0, R1
+  BX     LR
+}
+#else
+/* Test function for read - for gcc */
+unsigned int  address_test_read(unsigned int addr) __attribute__((naked));
+unsigned int  address_test_read(unsigned int addr)
+{
+  __asm("  ldr   r1,[r0]\n"
+        "  dsb          \n"
+        "  movs  r0, r1 \n"
+        "  bx    lr     \n"
+  );
+}
+#endif
+
+#if defined ( __CC_ARM   )
+/* ARM or Keil toolchain */
+__asm void HardFault_Handler(void)
+{
+  MOVS   r0, #4
+  MOV    r1, LR
+  TST    r0, r1
+  BEQ    stacking_used_MSP
+  MRS    R0, PSP ; // first parameter - stacking was using PSP
+  B      get_LR_and_branch
+stacking_used_MSP
+  MRS    R0, MSP ; // first parameter - stacking was using MSP
+get_LR_and_branch
+  MOV    R1, LR  ; // second parameter is LR current value
+  LDR    R2,=__cpp(HardFault_Handler_c)
+  BX     R2
+  ALIGN
+}
+#else
+/* gcc toolchain */
+void HardFault_Handler(void) __attribute__((naked));
+void HardFault_Handler(void)
+{
+  __asm("  movs   r0,#4\n"
+        "  mov    r1,lr\n"
+        "  tst    r0,r1\n"
+        "  beq    stacking_used_MSP\n"
+        "  mrs    r0,psp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        "stacking_used_MSP:\n"
+        "  mrs    r0,msp\n" /*  first parameter - stacking was using PSP */
+        "  ldr    r1,=HardFault_Handler_c  \n"
+        "  bx     r1\n"
+        ".pool\n" );
+}
+
+#endif
+/* C part of the fault handler - common between ARM / Keil /gcc */
+void HardFault_Handler_c(unsigned int * hardfault_args, unsigned lr_value)
+{
+  unsigned int stacked_pc;
+  unsigned int stacked_r0;
+  hardfault_occurred++;
+  puts ("[Hard Fault Handler]");
+  if (hardfault_expected==0) {
+    puts ("ERROR : Unexpected HardFault interrupt occurred.\n");
+    UartEndSimulation();
+    while (1);
+    }
+  stacked_r0  = ((unsigned long) hardfault_args[0]);
+  stacked_pc  = ((unsigned long) hardfault_args[6]);
+  printf(" - Stacked R0 : 0x%x\n", stacked_r0);
+  printf(" - Stacked PC : 0x%x\n", stacked_pc);
+  /* Modify R0 to a valid address */
+  hardfault_args[0] = (unsigned long) &temp_data;
+
+  return;
+}
+
+
+void delay(void)
+{
+  int i;
+  for (i=0;i<5;i++){
+    __ISB();
+    }
+  return;
+}
+
diff --git a/synthesis/genus.tcl b/synthesis/genus.tcl
index d4e8ca14b4d095a6841f4fefd16c4bac5d66b90a..0c07cc3866e69bf4f93ceaf95556edac93fd21c1 100644
--- a/synthesis/genus.tcl
+++ b/synthesis/genus.tcl
@@ -1,9 +1,12 @@
-set_db init_lib_search_path $::env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/lib/
-set_db library sc9_cln65lp_base_rvt_tt_typical_max_1p20v_25c.lib
+set_db init_lib_search_path ./
+set BASE_LIB $::env(PHYS_IP)/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/lib/sc9_cln65lp_base_rvt_tt_typical_max_1p20v_25c.lib
+set RF_LIB ../../../cadence_flow/memory/rf/rf_sp_hdf_tt_1p20v_1p20v_25c.lib
+set_db / .library "$BASE_LIB $RF_LIB"
 
 source $::env(SOCLABS_PROJECT_DIR)/imp/fpga/nanosoc/flist/genus_flist.tcl
 
 elaborate nanosoc_chip_pads
+set_db syn_generic_effort high
 
 syn_generic
 
diff --git a/synthesis/synopsys.tcl b/synthesis/synopsys.tcl
new file mode 100644
index 0000000000000000000000000000000000000000..71c951721745dbf9f79caf93850b4b438b3a1952
--- /dev/null
+++ b/synthesis/synopsys.tcl
@@ -0,0 +1,36 @@
+create_design nanosoc_ASIC
+
+#####
+# Set search_path
+#
+# List locations where your standard cell libraries may be located
+#
+#####
+set search_path [list . $search_path /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/sdb/ /home/dwn1c21/SoC-Labs/phys_ip/arm/tsmc/cln65lp/sc9_base_rvt/r0p0/db/ /home/dwn1c21/SoC-Labs/accelerator-project/memories/rf]
+
+######
+# Set Target Library
+#
+# Set a default target library for Design Compiler to target when compiling a design
+#
+######
+set target_library "sc9_cln65lp_base_rvt_tt_typical_max_1p20v_25c.db RF_LIB_tt_1p20v_1p20v_25c.db"
+
+######
+# Set Link Library
+#
+# Set a default link library for Design Compiler to target when compiling a design
+#
+######
+set link_library sc9_cln65lp_base_rvt.sdb
+
+source $::env(SOCLABS_PROJECT_DIR)/imp/fpga/nanosoc/flist/synopsys_flist.tcl
+ 
+current_design nanosoc_chip_pads
+
+compile
+
+write -hierarchy -format verilog -output ./nanosoc_chip_pads.vm
+
+
+exit
\ No newline at end of file