diff --git a/.gitignore b/.gitignore
index c33874293d489c5bf605a963425764cd52ff54f2..6404f20b813fe94136cb12348681622b669d05c7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,4 +1,6 @@
 .socinit
 .metadata
 CheckResults.log
-CoherencyCheckConfiguration.config
\ No newline at end of file
+CoherencyCheckConfiguration.config
+simulate/
+imp/
\ No newline at end of file
diff --git a/env/dependency_env.sh b/env/dependency_env.sh
index 7ec5183d02dee867e7b1cf806063fc3ed0f67fb3..e34fbf8a900a1e1832f3c7b57d08992d31b0f4b4 100644
--- a/env/dependency_env.sh
+++ b/env/dependency_env.sh
@@ -15,7 +15,7 @@
 #-----------------------------------------------------------------------------
 
 # MilliSoC Tech
-export SOCLABS_MEGASOC_TECH_DIR="$SOCLABS_PROJECT_DIR/millisoc_tech"
+export SOCLABS_MEGASOC_TECH_DIR="$SOCLABS_PROJECT_DIR/megasoc_tech"
 
 # MilliSoC Expansion Tech
 export SOCLABS_MEGASOC_EXP_TECH_DIR="$SOCLABS_PROJECT_DIR/expansion_subsystem_tech"
@@ -26,3 +26,5 @@ export SOCLABS_MEGASOC_EXP_TECH_DIR="$SOCLABS_PROJECT_DIR/expansion_subsystem_te
 
 # SoCTools - Toolkit of scripts related to SoCLabs projects
 export SOCLABS_SOCTOOLS_FLOW_DIR="$SOCLABS_PROJECT_DIR/soctools_flow"
+
+export SOCLABS_AHB_QSPI_DIR="$SOCLABS_MEGASOC_TECH_DIR/logical/sl_ahb_qspi"
diff --git a/flist/project/megasoc_tb.flist b/flist/project/megasoc_tb.flist
new file mode 100644
index 0000000000000000000000000000000000000000..8bc51684d7529ecb09c4e33b982a098062efb5ea
--- /dev/null
+++ b/flist/project/megasoc_tb.flist
@@ -0,0 +1,27 @@
+//-----------------------------------------------------------------------------
+// NanoSoC Testbench Filelist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+//
+// Copyright � 2021-4, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for NanoSoC Testbench
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    MegaSoC Testbench search path    =============
+
+// - Top-level testbench
+$(SOCLABS_PROJECT_DIR)/verif/testbench/logical/megasoc_tb.sv
+$(SOCLABS_PROJECT_DIR)/verif/trace/megasoc_uart_capture.v
+$(SOCLABS_PROJECT_DIR)/verif/control/logical/megasoc_clkreset.v
+
+// $(SOCLABS_MEGASOC_TECH_DIR)/logical/MS_QSPI_XIP_CACHE/verify/vip/sst26wf080b.v
+
diff --git a/flist/megasoc_project.flist b/flist/project/system.flist
similarity index 100%
rename from flist/megasoc_project.flist
rename to flist/project/system.flist
diff --git a/make.cfg b/flist/project/top_ASIC.flist
similarity index 100%
rename from make.cfg
rename to flist/project/top_ASIC.flist
diff --git a/flist/project/top_BEHAV.flist b/flist/project/top_BEHAV.flist
new file mode 100644
index 0000000000000000000000000000000000000000..6e5bb4e167ba5e728bb04782bd4d19bf04edf055
--- /dev/null
+++ b/flist/project/top_BEHAV.flist
@@ -0,0 +1,39 @@
+//-----------------------------------------------------------------------------
+// Project Top-level Filelist System 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 Top-level Accelerator System
+//-----------------------------------------------------------------------------
+
+// DESIGN_TOP nanosoc_chip
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+
+// =============    System Filelist      =========================
+// - Defines RTL
++incdir+$(SOCLABS_PROJECT_DIR)/system/src/defines
+
+-f $(SOCLABS_PROJECT_DIR)/flist/project/system.flist
+
+// MegaSoC Testbench
+-f $(SOCLABS_PROJECT_DIR)/flist/project/megasoc_tb.flist
+
+// =============    Arm-IP Specific Filelists      =========================
+// - MegaSoC Chip IP
+-f $(SOCLABS_MEGASOC_TECH_DIR)/flist/megasoc_tech_BEHAV.flist
+
+$(SOCLABS_PROJECT_DIR)/megasoc_chip/chip/logical/megasoc_chip.v
+$(SOCLABS_PROJECT_DIR)/megasoc_chip/pads/glib/logical/megasoc_chip_pads.v
+
+$(SOCLABS_PROJECT_DIR)/megasoc_system/logical/megasoc_system.v
+
+
diff --git a/flows/makefile.asic b/flows/makefile.asic
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/flows/makefile.fpga b/flows/makefile.fpga
new file mode 100644
index 0000000000000000000000000000000000000000..cdb86c1d8d62ee253e692a379e0266fe1f2c11da
--- /dev/null
+++ b/flows/makefile.fpga
@@ -0,0 +1,74 @@
+#-----------------------------------------------------------------------------
+# megaSoC FPGA Flow Makefile 
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# David Mapstone (d.a.mapstone@soton.ac.uk)
+# Daniel Newbrook (d.newbrook@soton.ac.uk)
+#
+# Copyright (C) 2021-4, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+# Get properties for FPGA Boards
+include $(SOCLABS_PROJECT_DIR)/fpga/makefile.targets
+
+# Vivado Options
+VIVIADO_VERSION  ?= 2021_1
+
+# MegaSoC Synthesis Properties
+MEGASOC_VENDOR   ?= soclabs.org
+MEGASOC_CORE_REV ?= 1
+
+# Top-level of RTL design to Implement
+COMPONENT_TOP    ?= megasoc_chip
+
+# Name of Implemented Chip Design (Including Socket IP)
+DESIGN_NAME      ?= megasoc_design
+
+# Location to build FPGA files
+IMPLEMENTATION_DIR   ?= $(SOCLABS_PROJECT_DIR)/imp/fpga
+RUN_DIR              := $(IMPLEMENTATION_DIR)/run
+IMP_MEGASOC_DIR      := $(IMPLEMENTATION_DIR)/megasoc
+IMP_SOCKET_DIR       := $(IMPLEMENTATION_DIR)/socket
+PROJECT_DIR          := $(IMPLEMENTATION_DIR)/targets/$(BOARD_NAME)
+
+# Name of generated filelist by python script
+TCL_FLIST_DIR        := $(IMP_MEGASOC_DIR)/flist
+TCL_OUTPUT_FILELIST  := $(TCL_FLIST_DIR)/gen_flist.tcl
+
+
+# MegaSoC Tech Flow Dependencies
+MEGASOC_FPGA_FLOW_DIR := $(SOCLABS_PROJECT_DIR)/fpga
+
+# Directory to look for FPGA specific implementation files
+TARGET_DIR            ?= $(MEGASOC_FPGA_FLOW_DIR)/targets/$(BOARD_NAME)
+TARGET_TCL_DIR        := $(TARGET_DIR)/vivado_script/$(VIVIADO_VERSION)
+PINMAP_FILE           ?= $(TARGET_DIR)/fpga_pinmap.xdc
+
+
+# Generate TCL filelist from flists
+flist_tcl_megasoc: 
+	@mkdir -p $(TCL_FLIST_DIR)
+	@(cd $(TCL_FLIST_DIR); \
+	$(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/filelist_compile.py -t -f $(DESIGN_VC) -o $(TCL_OUTPUT_FILELIST) -i $(FLIST_INCLUDES) -r $(IMP_MEGASOC_DIR)/src ;)
+
+
+# Environment Variables for Packaging NanoSoC
+package_megasoc: export FPGA_COMPONENT_FILELIST = $(TCL_OUTPUT_FILELIST)
+package_megasoc: export FPGA_COMPONENT_LIB      = $(IMP_MEGASOC_DIR)
+package_megasoc: export FPGA_ACCELERATOR        = $(ACCELERATOR_SUBSYSTEM)
+package_megasoc: export FPGA_COMPONENT_TOP      = $(COMPONENT_TOP)
+package_megasoc: export FPGA_VENDOR             = $(MEGASOC_VENDOR)
+package_megasoc: export FPGA_CORE_REV           = $(MEGASOC_CORE_REV)
+
+# Package MegaSoC IP
+package_megasoc: code flist_tcl_megasoc
+	@echo Packaging MegaSoC
+	@mkdir -p $(RUN_DIR)
+	@cd $(RUN_DIR); vivado -mode batch -source $(SOCLABS_SOCTOOLS_FLOW_DIR)/resources/fpga/package_component.tcl
+	@mkdir -p $(IMP_MEGASOC_DIR)/logs
+	@cp $(RUN_DIR)/vivado.log $(IMP_MEGASOC_DIR)/logs
+	@echo MegaSoC Packaged
+
+
diff --git a/flows/makefile.lint b/flows/makefile.lint
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/flows/makefile.regression b/flows/makefile.regression
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/flows/makefile.simulate b/flows/makefile.simulate
new file mode 100644
index 0000000000000000000000000000000000000000..fd5979368bbf217acc5027ec16c6229134e96152
--- /dev/null
+++ b/flows/makefile.simulate
@@ -0,0 +1,169 @@
+#-----------------------------------------------------------------------------
+# MegaSoC Simulation Makefile 
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# David Mapstone (d.a.mapstone@soton.ac.uk)
+# Daniel Newbrook (d.newbrook@soton.ac.uk)
+#
+# Copyright (C) 2021-4, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+# MTI options
+MTI_VC_OPTIONS    = +acc
+MTI_VC_OPTIONS    += -suppress 2892
+MTI_VC_OPTIONS    += -f $(TBENCH_VC) 
+MTI_VC_OPTIONS    += -sv_lib $(SOCLABS_MEGASOC_TECH_DIR)/logical/CortexA53_1/logical/ca53univent/build_x86_64/lib/ca53_tarmac_dpi
+MTI_RUN_OPTIONS   = -voptargs=+acc
+MTI_RUN_OPTIONS   += -sv_lib $(SOCLABS_MEGASOC_TECH_DIR)/logical/CortexA53_1/logical/ca53univent/build_x86_64/lib/ca53_tarmac_dpi
+
+# VCS options
+VCS_OPTIONS    =  +vcs+lic+wait +v2k -sverilog -override_timescale=1ns/1ps +lint=all,noTMR,noVCDE -debug -debug_access+all 
+VCS_SIM_OPTION = +vcs+lic+wait +vcs+flush+log -assert nopostproc
+VCS_VC_OPTIONS = -f $(TBENCH_VC) 
+VCS_OPTIONS   += -sverilog $(SOCLABS_MEGASOC_TECH_DIR)/logical/CortexA53_1/logical/ca53univent/build_x86_64/lib/ca53_tarmac_dpi.so
+CA53_TARMAC_EXECUTABLE = $(SOCLABS_MEGASOC_TECH_DIR)/logical/CortexA53_1/logical/ca53univent/build_x86_32/bin/ca53_tarmac_decode --plain 
+export CA53_TARMAC_EXECUTABLE
+
+# XM verilog options
+XMSIM_OPTIONS  = -unbuffered -64bit -status -LICQUEUE -f xmsim.args -cdslib cds.lib -hdlvar hdl.var -NBASYNC
+XM_VC_OPTIONS  = -f $(TBENCH_VC)  
+
+# ------- Cocotb Variables -----------
+# Convert Simulator Name for Cocotb
+COCOTB_SIMULATOR ?= questa
+
+ifeq ($(SIMULATOR),mti)
+	COCOTB_SIMULATOR := questa
+else ifeq ($(SIMULATOR),xm)
+	COCOTB_SIMULATOR := xcelium
+else ifeq ($(SIMULATOR),vcs)
+	COCOTB_SIMULATOR := vcs
+endif
+
+# Cocotb GUI Variable
+GUI ?= 0
+
+# Cocotb Test Location
+COCOTB_TEST_DIR := $(SOCLABS_PROJECT_DIR)/verif/cocotb
+
+# Cocotb Scratch Directory
+COCOTB_DIR := $(SIM_TOP_DIR)/cocotb
+COCOTB_SCRATCH_DIR := $(COCOTB_DIR)/scratch
+
+# Filelist for Cocotb 
+MAKEFILE_FILELIST     := $(COCOTB_DIR)/makefile.flist
+
+MODULE ?= test_adp
+
+# Create a List of PHONY Targets
+.PHONY: compile_$(SIMULATOR) run_$(SIMULATOR) sim_$(SIMULATOR)
+
+# ------- Simulator redirect -----------
+
+compile: compile_$(SIMULATOR)
+
+run: run_$(SIMULATOR)
+
+sim: sim_$(SIMULATOR)
+
+# Preload IMEM in Simulation
+compile_mti: MEGASOC_DEFINES += IMEM_0_RAM_PRELOAD
+compile_vcs: MEGASOC_DEFINES += IMEM_0_RAM_PRELOAD
+compile_xm:  MEGASOC_DEFINES += IMEM_0_RAM_PRELOAD
+
+
+# Generate verilog .vc filelist from flists
+flist_vfiles_megasoc: gen_defs
+	@if [ ! -d $(SIM_DIR) ] ; then \
+	  mkdir -p $(SIM_DIR); \
+	fi
+	@if [ ! -d $(SIM_DIR)/logs ] ; then \
+	  mkdir -p $(SIM_DIR)/logs; \
+	fi
+	@cd $(SIM_DIR); python $(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/filelist_compile.py -f $(TBENCH_VC) -a -i $(FLIST_INCLUDES) -v -o tbench.vc
+
+
+# ------- VCS -----------
+
+# Compile RTL
+compile_vcs : gen_defs flist_vfiles_megasoc
+	cd $(SIM_DIR); vcs $(VCS_OPTIONS) -f tbench.vc  -kdb $(DEFINES_VC)  | tee compile_vcs.log
+
+
+# Run simulation in batch mode
+run_vcs : code compile_vcs
+	@echo quit > $(SIM_DIR)/quit.do
+	cd $(SIM_DIR); ./simv $(VCS_SIM_OPTION) +ca53_tarmac_enable -define ADP_FILE=adp.cmd < quit.do | tee logs/run_$(TESTNAME).log ;
+
+# Run simulation in interactive mode
+sim_vcs : code compile_vcs
+	cd $(SIM_DIR); ./simv -gui +vcs+lic+wait +vcs+flush+log +ca53_tarmac_enable &
+
+# ------- XM -----------
+
+# Compile RTL
+compile_xm : bootrom gen_defs flist_vfiles_megasoc
+	cd $(SIM_DIR); xmprep  +overwrite $(XM_VC_OPTIONS) $(DEFINES_VC) +debug -timescale 1ns/1ps -top $(TB_TOP) | tee compile_xm.log
+	cd $(SIM_DIR); xmvlog  -work worklib -f xmvlog_ver.args | tee -a compile_xm.log
+	cd $(SIM_DIR); xmelab  -mess -f xmelab.args -access +r | tee -a compile_xm.log
+	
+# Note : If coverage is required, you can add -coverage all to xmelab
+
+# Run simulation in batch mode
+run_xm : code compile_xm
+	@echo run  >  $(SIM_DIR)/run.tcl.tmp
+	@echo exit >> $(SIM_DIR)/run.tcl.tmp
+	@mv  $(SIM_DIR)/run.tcl.tmp $(SIM_DIR)/run.tcl
+	cd $(SIM_DIR); xmsim $(XMSIM_OPTIONS) -input run.tcl  | tee logs/run_$(TESTNAME).log ;
+
+# Run simulation in interactive mode
+sim_xm : code compile_xm
+	cd $(SIM_DIR); xmsim -gui $(XMSIM_OPTIONS)
+
+# ------- MTI -----------
+
+# Compile RTL
+compile_mti :  gen_defs flist_vfiles_megasoc lib_mti
+	cd $(SIM_DIR); vlog -incr -lint +v2k -f tbench.vc +ca53_tarmac_enable $(DEFINES_VC) | tee compile_mti.log
+
+# Run simulation in batch mode
+run_mti : code compile_mti
+	@echo "run -all" > $(SIM_DIR)/run.tcl.tmp
+	@echo "quit -f" >> $(SIM_DIR)/run.tcl.tmp
+	@mv  $(SIM_DIR)/run.tcl.tmp $(SIM_DIR)/run.tcl
+	cd $(SIM_DIR); vsim $(MTI_RUN_OPTIONS) +ca53_tarmac_enable -c $(TB_TOP) -do run.tcl | tee $(SIM_DIR)/logs/run_$(TESTNAME).log ;
+
+run_mti_to:
+	timeout 2s $(MAKE) run_mti >> /dev/null 2>&1 
+	
+run_mti_wrap:
+	$(MAKE) run_mti_to
+	
+# Run simulation in interactive mode
+sim_mti : code compile_mti
+	cd $(SIM_DIR); vsim $(MTI_RUN_OPTIONS) +ca53_tarmac_enable -gui $(TB_TOP) &
+
+# Create work directory
+lib_mti :
+	@if [ -d $(SIM_DIR)/work ] ; then \
+          true ; \
+	else \
+	  vlib  $(SIM_DIR)/work; \
+	fi
+
+# Generate Make filelist from flists
+flist_makefile_megasoc: gen_defs
+	@mkdir -p $(COCOTB_DIR)
+	@(cd $(COCOTB_DIR); \
+	$(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/filelist_compile.py -m -f $(DESIGN_VC) -o $(MAKEFILE_FILELIST);)
+
+run_cocotb: DEFINES_VC += COCOTB_SIM
+run_cocotb: flist_makefile_megasoc
+	@mkdir -p $(SIM_DIR)
+	@cd $(SIM_DIR); $(MAKE) -C $(SOCLABS_PROJECT_DIR)/verif/cocotb clean SIM_BUILD=$(COCOTB_SCRATCH_DIR)
+	@cd $(SIM_DIR); $(MAKE) -C $(SOCLABS_PROJECT_DIR)/verif/cocotb sim MODULE=$(MODULE) SIM=$(COCOTB_SIMULATOR) TESTCASE=$(TESTNAME) GUI=$(GUI) SIM_BUILD=$(COCOTB_SCRATCH_DIR) ACCELERATOR=$(ACCELERATOR)
+
+sim_cocotb: GUI=1
+sim_cocotb: run_cocotb
diff --git a/flows/makefile.software b/flows/makefile.software
new file mode 100644
index 0000000000000000000000000000000000000000..14599b68ce5252d0c4d99ea71a404ad634b52cd6
--- /dev/null
+++ b/flows/makefile.software
@@ -0,0 +1,189 @@
+#-----------------------------------------------------------------------------
+# MegaSoC Software Compilation Makefile 
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# David Mapstone (d.a.mapstone@soton.ac.uk)
+# Daniel Newbrook (d.newbrook@soton.ac.uk)
+#
+# Copyright (C) 2021-4, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+# Software Directory
+MEGASOC_SW_DIR     ?= $(SOCLABS_MEGASOC_TECH_DIR)/software
+
+# Default to DS-6 tool-chain
+TOOL_CHAIN = ds6
+
+# Software make options
+# - Pass onto the software makefile to define targetted CPU type
+# You can append additional make options for testcode here
+SW_MAKE_OPTIONS = CPU_PRODUCT=CORTEX_M0 TOOL_CHAIN=$(TOOL_CHAIN)
+
+# Bootrom Parameters:
+# Boot Loader image
+BOOTLOADER        ?= bootloader
+BOOTROM_ADDRW     ?= 8
+BOOTROM_HEX       ?= $(SOCLABS_MEGASOC_TECH_DIR)/software/src/bootloader/$(BOOTLOADER).hex
+BOOTROM_BUILD_DIR ?= $(SOCLABS_PROJECT_DIR)/system/src/bootrom
+
+# Debug Tester image
+DEBUGTESTER  = debugtester
+
+# code target is used by other simulation targets (e.g. run_mti, sim_mti)
+# Before simulation, bootrom and testcode need to be compiled.
+code : testcode bootrom 
+
+# Compile bootloader
+# Note : The use of ls after compile allows the computing server to sync up
+bootrom:
+	@cd $(TESTCODES_DIR)/$(BOOTLOADER) ;\
+	echo CD $(TESTCODES_DIR)/$(BOOTLOADER) ;\
+	$(MAKE) boot_build $(SW_MAKE_OPTIONS) ;\
+	echo Bootrom Compile done ;\
+	ls > /dev/null ;\
+	echo Copy $(BOOTLOADER).hex ;\
+	while [ ! -e $(TESTCODES_DIR)/../build/$(BOOTLOADER)/bootloader.hex ] ; do \
+		echo Wait for hex file ...; \
+		ls > /dev/null; \
+		sleep 5; \
+		done; \
+	if [ ! -e  $(TESTCODES_DIR)/../build/$(BOOTLOADER)/bootloader.hex ] ; then \
+		echo Problem reading hex file ;\
+		exit 1; \
+	else \
+		cp $(TESTCODES_DIR)/../build/$(BOOTLOADER)/bootloader.hex $(SIM_DIR)/bootloader.hex ;\
+	fi ;\
+
+# Compile test code
+# Note : The use of ls after compile allows the computing server to sync up
+testcode:
+ifeq ($(TESTNAME),)
+	$(error Please specify TESTNAME on the make command line)
+endif
+	@(if [ -d "$(TESTCODES_DIR)/$(TESTNAME)" ] ; then \
+	  cd $(TESTCODES_DIR)/$(TESTNAME) ;\
+	  $(MAKE) all $(SW_MAKE_OPTIONS) ; \
+	  echo Compile done ;\
+	  echo cd $(TESTCODES_DIR)/  $(TESTNAME) ;\
+	  ls > /dev/null ;\
+	  echo Copy $(TESTCODES_DIR)/../build/$(TESTNAME)/host0/app_flash.v8-a.hex/EXEC_ROM ;\
+	  if [ -e  $(TESTCODES_DIR)/../build/$(TESTNAME)/host0/app_flash.v8-a.hex/EXEC_ROM ] ; then \
+	    mkdir -p $(SIM_DIR) ; \
+	    cp $(TESTCODES_DIR)/../build/$(TESTNAME)/host0/app_flash.v8-a.hex/EXEC_ROM $(SIM_DIR)/app_flash.v8-a.hex ; \
+		cp $(TESTCODES_DIR)/../build/$(TESTNAME)/host0/app_ram.v8-a.hex $(SIM_DIR)/app_ram.v8-a.hex ; \
+	  else \
+	    while [ ! -e $(TESTNAME).hex ] ; do \
+	      echo Wait for $(TESTNAME).hex file ...; \
+	      ls > /dev/null ; \
+	      sleep 5 ; \
+	    done; \
+	    if [ -e  $(TESTNAME).hex ] ; then \
+		  mkdir -p $(SIM_DIR) ; \
+	      cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
+	      cp $(TESTNAME).hex ../../image.hex ; \
+	    else \
+	      echo Problem reading hex file ;\
+	      exit 1; \
+	    fi ;\
+	  fi ;\
+	  cd $(SIM_DIR) ;\
+	elif [ -d "$(PROJ_SW_DIR)/$(TESTNAME)" ] ; then \
+	  cd $(PROJ_SW_DIR)/$(TESTNAME) ;\
+	  echo cd $(PROJ_SW_DIR)/$(TESTNAME) ;\
+	  $(MAKE) all $(SW_MAKE_OPTIONS) ; \
+	  echo Compile done ;\
+	  ls > /dev/null ;\
+	  echo Copy $(TESTNAME).hex ;\
+	  if [ -e  $(TESTNAME).hex ] ; then \
+	    mkdir -p $(SIM_DIR) ; \
+	    cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
+	    cp adp.cmd $(SIM_DIR)/adp.cmd ; \
+	  else \
+	    while [ ! -e $(TESTNAME).hex ] ; do \
+	      echo Wait for $(TESTNAME).hex file ...; \
+	      ls > /dev/null ; \
+	      sleep 5 ; \
+	    done; \
+	    if [ -e  $(TESTNAME).hex ] ; then \
+		  mkdir -p $(SIM_DIR) ; \
+	      cp $(TESTNAME).hex $(SIM_DIR)/image.hex ; \
+	    else \
+	      echo Problem reading hex file ;\
+	      exit 1; \
+	    fi ;\
+	  fi ;\
+	  cd $(SIM_DIR) ;\
+	else \
+	  echo "ERROR: invalid TESTNAME value ( $(TESTNAME) )" ;\
+	  exit 1 ;\
+	fi ;\
+	)
+
+
+# Compile debugtester
+# Note : The use of ls after compile allows the computing server to sync up
+debugtester:
+	@(cd $(MEGASOC_SW_DIR;)/debug_tester ;\
+	$(MAKE) all $(SW_MAKE_OPTIONS) ;\
+	echo Compile done ;\
+	ls > /dev/null ;\
+	echo Copy $(DEBUGTESTER)_le.hex ;\
+	if [ -e  $(DEBUGTESTER)_le.hex ] ; then \
+	  cp $(DEBUGTESTER)_le.hex  $(SIM_DIR)/$(DEBUGTESTER)_le.hex ;\
+	else \
+	  while [ ! -e $(DEBUGTESTER)_le.hex ] ; do \
+	    echo Wait for hex file ...; \
+	    ls > /dev/null ; \
+	    sleep 5 ; \
+	  done; \
+	  if [ -e  $(DEBUGTESTER)_le.hex ] ; then \
+	  	mkdir -p $(SIM_DIR) ;\
+	    cp $(DEBUGTESTER)_le.hex  $(SIM_DIR)/$(DEBUGTESTER)_le.hex ;\
+	  fi ;\
+	fi ;\
+	echo Copy $(DEBUGTESTER)_be.hex ;\
+	if [ -e  $(DEBUGTESTER)_be.hex ] ; then \
+	  	mkdir -p $(SIM_DIR) ;\
+	  cp $(DEBUGTESTER)_be.hex  $(SIM_DIR)/$(DEBUGTESTER)_be.hex ;\
+	else \
+	  while [ ! -e $(DEBUGTESTER)_be.hex ] ; do \
+	    echo Wait for hex file ...;\
+	    ls > /dev/null ;\
+	    sleep 5 ; \
+	  done; \
+	  if [ -e  $(DEBUGTESTER)_be.hex ] ; then \
+	    cp $(DEBUGTESTER)_be.hex  $(SIM_DIR)/$(DEBUGTESTER)_be.hex ;\
+	  fi ;\
+	fi ;\
+	if [ ! -e $(DEBUGTESTER)_le.hex ] && [ ! -e $(DEBUGTESTER)_be.hex ] ; then \
+	    echo Problem reading hex file ;\
+	    exit 1 ;\
+	fi ;\
+	cd $(SIM_DIR) )
+
+# Compile all software including boot ROM
+compile_all_code: bootrom debugtester
+	for thistest in $(TEST_LIST) ; do \
+	  echo Compiling $$thistest   ; \
+	  echo Removing old image.hex ;\
+	  rm -f image.hex  ;\
+	  $(MAKE) testcode TESTNAME=$$thistest;\
+	  if [ -e $(SIM_TOP_DIR)/$$thistest/image.hex ] ; then \
+            echo OK    - image.hex     created for test $$thistest ;\
+	  else \
+	    echo ERROR - image.hex NOT created for test $$thistest ;\
+	    exit 1; \
+	  fi ; \
+	done
+
+# Remove all software compilation results
+clean_all_code:
+	@rm -rf $(BOOTROM_BUILD_DIR)
+	@rm -rf $(TESTCODES_DIR)/../build
+
+# Remove only bootloader and default selected test
+clean_code:
+	@(cd $(TESTCODES_DIR)/$(BOOTLOADER) ; $(MAKE) clean; cd $(SIM_DIR); )
+	@(cd $(TESTCODES_DIR)/$(TESTNAME)   ; $(MAKE) clean; cd $(SIM_DIR); )
\ No newline at end of file
diff --git a/fpga/makefile.targets b/fpga/makefile.targets
new file mode 100644
index 0000000000000000000000000000000000000000..99d49becaf7995e4ddf3c5320bf3af62ee914ab0
--- /dev/null
+++ b/fpga/makefile.targets
@@ -0,0 +1,25 @@
+#-----------------------------------------------------------------------------
+# NanoSoC FPGA Targets Declaration Makefile 
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# David Mapstone (d.a.mapstone@soton.ac.uk)
+#
+# Copyright (C) 2021-3, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+# FPGA Specific Options - More can be added later
+ifeq ($(FPGA),mps3)
+	XILINX_PART  := xcku115-flvb1760-1-c
+	BOARD_NAME   := arm_mps3
+	PLATFORM     := bare
+else ifeq ($(FPGA),zcu104)
+	XILINX_PART  := xczu7ev-ffvc1156-2-e
+	BOARD_NAME   := pynq_zcu104
+	PLATFORM     := pynq
+else # Default to MPS3
+	XILINX_PART  := xcku115-flvb1760-1-c
+	BOARD_NAME   := arm_mps3
+	PLATFORM     := bare
+endif
diff --git a/fpga/targets/arm_mps3/fpga_pinmap.xdc b/fpga/targets/arm_mps3/fpga_pinmap.xdc
new file mode 100644
index 0000000000000000000000000000000000000000..88bb6d2abeba7c8fd16de7716393cca1d03f5d20
--- /dev/null
+++ b/fpga/targets/arm_mps3/fpga_pinmap.xdc
@@ -0,0 +1,986 @@
+set_property PACKAGE_PIN AD28 [get_ports {UART_TX_F[2]}]
+# -----------------------------------------------------------------------------
+# Purpose : Main timing constraints and pin list for MPS3
+# -----------------------------------------------------------------------------
+
+####################################################################################
+# Pin Assigment
+####################################################################################
+
+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]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {OSCCLK[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[23]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[22]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[21]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[20]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[19]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[18]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[17]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[16]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[15]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[14]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[13]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[12]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[11]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[10]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[9]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[8]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_DATA[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {MMB_SD[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_DE]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_HS]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_IDCLK]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_SCK]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_VS]
+set_property IOSTANDARD LVCMOS18 [get_ports MMB_WS]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[6]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[5]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[4]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[3]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[2]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[1]}]
+set_property IOSTANDARD LVCMOS18 [get_ports {EMMC_DAT[0]}]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_CLK]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_CMD]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_DS]
+set_property IOSTANDARD LVCMOS18 [get_ports EMMC_nRST]
+# not used
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_P[3]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_N[3]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_P[2]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_BIDIR_N[2]}]
+
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_LRCK]
+set_property PACKAGE_PIN Y30 [get_ports AUD_LRCK]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_MCLK]
+set_property PACKAGE_PIN AB29 [get_ports AUD_MCLK]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_nRST]
+set_property PACKAGE_PIN AA27 [get_ports AUD_nRST]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SCL]
+set_property PACKAGE_PIN AA28 [get_ports AUD_SCL]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SCLK]
+set_property PACKAGE_PIN AB30 [get_ports AUD_SCLK]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDA]
+set_property PACKAGE_PIN AA29 [get_ports AUD_SDA]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDIN]
+set_property PACKAGE_PIN AA30 [get_ports AUD_SDIN]
+set_property IOSTANDARD LVCMOS18 [get_ports AUD_SDOUT]
+set_property PACKAGE_PIN Y27 [get_ports AUD_SDOUT]
+set_property IOSTANDARD LVCMOS33 [get_ports CB_nPOR]
+set_property PACKAGE_PIN AU22 [get_ports CB_nPOR]
+set_property IOSTANDARD LVCMOS33 [get_ports CB_nRST]
+set_property PACKAGE_PIN AV23 [get_ports CB_nRST]
+set_property IOSTANDARD LVCMOS33 [get_ports CB_RUN]
+set_property PACKAGE_PIN AR25 [get_ports CB_RUN]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_CLK]
+set_property PACKAGE_PIN AT20 [get_ports CFG_CLK]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_DATAIN]
+set_property PACKAGE_PIN AT19 [get_ports CFG_DATAIN]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_DATAOUT]
+set_property PACKAGE_PIN AV18 [get_ports CFG_DATAOUT]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_LOAD]
+set_property PACKAGE_PIN AW18 [get_ports CFG_LOAD]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_nRST]
+set_property PACKAGE_PIN AR20 [get_ports CFG_nRST]
+set_property IOSTANDARD LVCMOS33 [get_ports CFG_WnR]
+set_property PACKAGE_PIN AT18 [get_ports CFG_WnR]
+set_property PACKAGE_PIN AJ16 [get_ports CLCD_BL]
+set_property PACKAGE_PIN AP15 [get_ports CLCD_CS]
+set_property PACKAGE_PIN AN17 [get_ports {CLCD_PD[10]}]
+set_property PACKAGE_PIN AP16 [get_ports {CLCD_PD[11]}]
+set_property PACKAGE_PIN AP18 [get_ports {CLCD_PD[12]}]
+set_property PACKAGE_PIN AR18 [get_ports {CLCD_PD[13]}]
+set_property PACKAGE_PIN AM16 [get_ports {CLCD_PD[14]}]
+set_property PACKAGE_PIN AN16 [get_ports {CLCD_PD[15]}]
+set_property PACKAGE_PIN AR17 [get_ports {CLCD_PD[16]}]
+set_property PACKAGE_PIN AR16 [get_ports {CLCD_PD[17]}]
+set_property PACKAGE_PIN AM15 [get_ports CLCD_RD]
+set_property PACKAGE_PIN AN14 [get_ports CLCD_RS]
+set_property PACKAGE_PIN AK18 [get_ports CLCD_RST]
+#set_property PACKAGE_PIN AN18 [get_ports CLCD_SDI]
+#set_property PACKAGE_PIN AH16 [get_ports CLCD_SDO]
+set_property PACKAGE_PIN AJ14 [get_ports CLCD_TINT]
+set_property PACKAGE_PIN AL17 [get_ports CLCD_TNC]
+set_property PACKAGE_PIN AL18 [get_ports CLCD_TSCL]
+set_property PACKAGE_PIN AJ15 [get_ports CLCD_TSDA]
+set_property PACKAGE_PIN AP14 [get_ports CLCD_WR_SCL]
+# not used
+# set_property PACKAGE_PIN N28 [get_ports {CLK_BIDIR_P[2]}]
+# set_property PACKAGE_PIN N29 [get_ports {CLK_BIDIR_N[2]}]
+# set_property PACKAGE_PIN E32 [get_ports {CLK_BIDIR_P[3]}]
+# set_property PACKAGE_PIN D33 [get_ports {CLK_BIDIR_N[3]}]
+# set_property PACKAGE_PIN G31 [get_ports {CLK_M2C_P[0]}]
+# set_property PACKAGE_PIN F32 [get_ports {CLK_M2C_N[0]}]
+# set_property PACKAGE_PIN E31 [get_ports {CLK_M2C_P[1]}]
+# set_property PACKAGE_PIN D31 [get_ports {CLK_M2C_N[1]}]
+set_property PACKAGE_PIN BB39 [get_ports CS_nDET]
+set_property PACKAGE_PIN BB36 [get_ports CS_nSRST]
+set_property PACKAGE_PIN BB37 [get_ports CS_nTRST]
+set_property PACKAGE_PIN AW33 [get_ports CS_T_CLK]
+set_property PACKAGE_PIN AY35 [get_ports CS_T_CTL]
+set_property PACKAGE_PIN AW34 [get_ports {CS_T_D[0]}]
+set_property PACKAGE_PIN AT34 [get_ports {CS_T_D[1]}]
+set_property PACKAGE_PIN AU34 [get_ports {CS_T_D[2]}]
+set_property PACKAGE_PIN AV36 [get_ports {CS_T_D[3]}]
+set_property PACKAGE_PIN AW36 [get_ports {CS_T_D[4]}]
+set_property PACKAGE_PIN AT35 [get_ports {CS_T_D[5]}]
+set_property PACKAGE_PIN AU35 [get_ports {CS_T_D[6]}]
+set_property PACKAGE_PIN AU36 [get_ports {CS_T_D[7]}]
+set_property PACKAGE_PIN AV37 [get_ports {CS_T_D[8]}]
+set_property PACKAGE_PIN AW35 [get_ports {CS_T_D[9]}]
+set_property PACKAGE_PIN AY36 [get_ports {CS_T_D[10]}]
+set_property PACKAGE_PIN AY37 [get_ports {CS_T_D[11]}]
+set_property PACKAGE_PIN BB34 [get_ports {CS_T_D[12]}]
+set_property PACKAGE_PIN BB35 [get_ports {CS_T_D[13]}]
+set_property PACKAGE_PIN BA37 [get_ports {CS_T_D[14]}]
+set_property PACKAGE_PIN BA38 [get_ports {CS_T_D[15]}]
+set_property PACKAGE_PIN AV33 [get_ports CS_TCK]
+set_property PACKAGE_PIN BA35 [get_ports CS_TDI]
+set_property PACKAGE_PIN AW38 [get_ports CS_TDO]
+set_property PACKAGE_PIN AY38 [get_ports CS_TMS]
+# not used
+#set_property IOSTANDARD POD12_DCI [get_ports {DDR_CHIPID[0]}]
+#set_property PACKAGE_PIN J19 [get_ports {DDR_CHIPID[0]}]
+#set_property IOSTANDARD POD12_DCI [get_ports {DDR_CHIPID[1]}]
+#set_property PACKAGE_PIN G20 [get_ports {DDR_CHIPID[1]}]
+#set_property IOSTANDARD POD12_DCI [get_ports DDR_nALERT]
+#set_property PACKAGE_PIN P15 [get_ports DDR_nALERT]
+#set_property IOSTANDARD POD12_DCI [get_ports DDR_nEVENT]
+#set_property PACKAGE_PIN C17 [get_ports DDR_nEVENT]
+# set_property IOSTANDARD POD12_DCI [get_ports DDR_PARITY]
+# set_property PACKAGE_PIN D18 [get_ports DDR_PARITY]
+# set_property IOSTANDARD POD12_DCI [get_ports DDR_SCL]
+# set_property PACKAGE_PIN N21 [get_ports DDR_SCL]
+# set_property IOSTANDARD POD12_DCI [get_ports DDR_SDA]
+# set_property PACKAGE_PIN P21 [get_ports DDR_SDA]
+# set_property PACKAGE_PIN AC42 [get_ports {DP_M2C_N[0]}]
+# set_property PACKAGE_PIN AJ42 [get_ports {DP_M2C_N[1]}]
+# set_property PACKAGE_PIN AE42 [get_ports {DP_M2C_N[2]}]
+# set_property PACKAGE_PIN W42 [get_ports {DP_M2C_N[3]}]
+# set_property PACKAGE_PIN R42 [get_ports {DP_M2C_N[4]}]
+# set_property PACKAGE_PIN L42 [get_ports {DP_M2C_N[5]}]
+# set_property PACKAGE_PIN N42 [get_ports {DP_M2C_N[6]}]
+# set_property PACKAGE_PIN U42 [get_ports {DP_M2C_N[7]}]
+# set_property PACKAGE_PIN AA42 [get_ports {DP_M2C_N[8]}]
+# set_property PACKAGE_PIN AG42 [get_ports {DP_M2C_N[9]}]
+# set_property PACKAGE_PIN AC41 [get_ports {DP_M2C_P[0]}]
+# set_property PACKAGE_PIN AJ41 [get_ports {DP_M2C_P[1]}]
+# set_property PACKAGE_PIN AE41 [get_ports {DP_M2C_P[2]}]
+# set_property PACKAGE_PIN W41 [get_ports {DP_M2C_P[3]}]
+# set_property PACKAGE_PIN R41 [get_ports {DP_M2C_P[4]}]
+# set_property PACKAGE_PIN L41 [get_ports {DP_M2C_P[5]}]
+# set_property PACKAGE_PIN N41 [get_ports {DP_M2C_P[6]}]
+# set_property PACKAGE_PIN U41 [get_ports {DP_M2C_P[7]}]
+# set_property PACKAGE_PIN AA41 [get_ports {DP_M2C_P[8]}]
+# set_property PACKAGE_PIN AG41 [get_ports {DP_M2C_P[9]}]
+set_property PACKAGE_PIN AG34 [get_ports HDMI_CSCL]
+set_property PACKAGE_PIN AE33 [get_ports HDMI_CSDA]
+set_property PACKAGE_PIN AF33 [get_ports HDMI_INT]
+set_property PACKAGE_PIN W29 [get_ports EMMC_CLK]
+set_property PACKAGE_PIN AC34 [get_ports EMMC_CMD]
+set_property PACKAGE_PIN Y32 [get_ports {EMMC_DAT[0]}]
+set_property PACKAGE_PIN Y33 [get_ports {EMMC_DAT[1]}]
+set_property PACKAGE_PIN W33 [get_ports {EMMC_DAT[2]}]
+set_property PACKAGE_PIN W34 [get_ports {EMMC_DAT[3]}]
+set_property PACKAGE_PIN AA34 [get_ports {EMMC_DAT[4]}]
+set_property PACKAGE_PIN AB34 [get_ports {EMMC_DAT[5]}]
+set_property PACKAGE_PIN W31 [get_ports {EMMC_DAT[6]}]
+set_property PACKAGE_PIN Y31 [get_ports {EMMC_DAT[7]}]
+set_property PACKAGE_PIN AE32 [get_ports EMMC_DS]
+set_property PACKAGE_PIN W30 [get_ports EMMC_nRST]
+set_property PACKAGE_PIN AK23 [get_ports ETH_INT]
+set_property PACKAGE_PIN AL24 [get_ports ETH_nCS]
+set_property PACKAGE_PIN AJ23 [get_ports ETH_nOE]
+# not used
+# set_property PACKAGE_PIN AV38 [get_ports FMC_CLK_DIR]
+# set_property PACKAGE_PIN AL42 [get_ports FMC_nPRSNT]
+# set_property PACKAGE_PIN BB40 [get_ports {HA_N[2]}]
+# set_property PACKAGE_PIN BA41 [get_ports {HA_N[3]}]
+# set_property PACKAGE_PIN AY40 [get_ports {HA_N[4]}]
+# set_property PACKAGE_PIN AU42 [get_ports {HA_N[5]}]
+# set_property PACKAGE_PIN AY42 [get_ports {HA_N[6]}]
+# set_property PACKAGE_PIN AW41 [get_ports {HA_N[7]}]
+# set_property PACKAGE_PIN AU37 [get_ports {HA_N[8]}]
+# set_property PACKAGE_PIN AT42 [get_ports {HA_N[9]}]
+# set_property PACKAGE_PIN AT38 [get_ports {HA_N[10]}]
+# set_property PACKAGE_PIN AV42 [get_ports {HA_N[11]}]
+# set_property PACKAGE_PIN AR37 [get_ports {HA_N[12]}]
+# set_property PACKAGE_PIN AN42 [get_ports {HA_N[13]}]
+# set_property PACKAGE_PIN AP38 [get_ports {HA_N[14]}]
+# set_property PACKAGE_PIN AN37 [get_ports {HA_N[15]}]
+# set_property PACKAGE_PIN AM42 [get_ports {HA_N[16]}]
+# set_property PACKAGE_PIN AR41 [get_ports {HA_N[18]}]
+# set_property PACKAGE_PIN AM39 [get_ports {HA_N[19]}]
+# set_property PACKAGE_PIN AR40 [get_ports {HA_N[20]}]
+# set_property PACKAGE_PIN AM40 [get_ports {HA_N[21]}]
+# set_property PACKAGE_PIN AK38 [get_ports {HA_N[22]}]
+# set_property PACKAGE_PIN AL38 [get_ports {HA_N[23]}]
+# set_property PACKAGE_PIN AT39 [get_ports {HA_P[0]}]
+# set_property PACKAGE_PIN AT40 [get_ports {HA_N[0]}]
+# set_property PACKAGE_PIN AU39 [get_ports {HA_P[1]}]
+# set_property PACKAGE_PIN AU40 [get_ports {HA_N[1]}]
+# set_property PACKAGE_PIN BA39 [get_ports {HA_P[2]}]
+# set_property PACKAGE_PIN BA40 [get_ports {HA_P[3]}]
+# set_property PACKAGE_PIN AW39 [get_ports {HA_P[4]}]
+# set_property PACKAGE_PIN AU41 [get_ports {HA_P[5]}]
+# set_property PACKAGE_PIN AY41 [get_ports {HA_P[6]}]
+# set_property PACKAGE_PIN AW40 [get_ports {HA_P[7]}]
+# set_property PACKAGE_PIN AT37 [get_ports {HA_P[8]}]
+# set_property PACKAGE_PIN AR42 [get_ports {HA_P[9]}]
+# set_property PACKAGE_PIN AR38 [get_ports {HA_P[10]}]
+# set_property PACKAGE_PIN AV41 [get_ports {HA_P[11]}]
+# set_property PACKAGE_PIN AR36 [get_ports {HA_P[12]}]
+# set_property PACKAGE_PIN AN41 [get_ports {HA_P[13]}]
+# set_property PACKAGE_PIN AN38 [get_ports {HA_P[14]}]
+# set_property PACKAGE_PIN AM37 [get_ports {HA_P[15]}]
+# set_property PACKAGE_PIN AM41 [get_ports {HA_P[16]}]
+# set_property PACKAGE_PIN AN39 [get_ports {HA_P[17]}]
+# set_property PACKAGE_PIN AP39 [get_ports {HA_N[17]}]
+# set_property PACKAGE_PIN AP41 [get_ports {HA_P[18]}]
+# set_property PACKAGE_PIN AL39 [get_ports {HA_P[19]}]
+# set_property PACKAGE_PIN AP40 [get_ports {HA_P[20]}]
+# set_property PACKAGE_PIN AL40 [get_ports {HA_P[21]}]
+# set_property PACKAGE_PIN AK37 [get_ports {HA_P[22]}]
+# set_property PACKAGE_PIN AL37 [get_ports {HA_P[23]}]
+# set_property PACKAGE_PIN T32 [get_ports {HB_N[1]}]
+# set_property PACKAGE_PIN V33 [get_ports {HB_N[2]}]
+# set_property PACKAGE_PIN V29 [get_ports {HB_N[3]}]
+# set_property PACKAGE_PIN T30 [get_ports {HB_N[4]}]
+# set_property PACKAGE_PIN T34 [get_ports {HB_N[5]}]
+# set_property PACKAGE_PIN R32 [get_ports {HB_N[7]}]
+# set_property PACKAGE_PIN P29 [get_ports {HB_N[8]}]
+# set_property PACKAGE_PIN P30 [get_ports {HB_N[9]}]
+# set_property PACKAGE_PIN K28 [get_ports {HB_N[10]}]
+# set_property PACKAGE_PIN L29 [get_ports {HB_N[11]}]
+# set_property PACKAGE_PIN K31 [get_ports {HB_N[12]}]
+# set_property PACKAGE_PIN L33 [get_ports {HB_N[13]}]
+# set_property PACKAGE_PIN U31 [get_ports {HB_N[14]}]
+# set_property PACKAGE_PIN N33 [get_ports {HB_N[15]}]
+# set_property PACKAGE_PIN L34 [get_ports {HB_N[16]}]
+# set_property PACKAGE_PIN R28 [get_ports {HB_N[18]}]
+# set_property PACKAGE_PIN N27 [get_ports {HB_N[19]}]
+# set_property PACKAGE_PIN U34 [get_ports {HB_N[20]}]
+# set_property PACKAGE_PIN N34 [get_ports {HB_N[21]}]
+# set_property PACKAGE_PIN N31 [get_ports {HB_P[0]}]
+# set_property PACKAGE_PIN M31 [get_ports {HB_N[0]}]
+# set_property PACKAGE_PIN U32 [get_ports {HB_P[1]}]
+# set_property PACKAGE_PIN V32 [get_ports {HB_P[2]}]
+# set_property PACKAGE_PIN V28 [get_ports {HB_P[3]}]
+# set_property PACKAGE_PIN U30 [get_ports {HB_P[4]}]
+# set_property PACKAGE_PIN T33 [get_ports {HB_P[5]}]
+# set_property PACKAGE_PIN M30 [get_ports {HB_P[6]}]
+# set_property PACKAGE_PIN L30 [get_ports {HB_N[6]}]
+# set_property PACKAGE_PIN R31 [get_ports {HB_P[7]}]
+# set_property PACKAGE_PIN P28 [get_ports {HB_P[8]}]
+# set_property PACKAGE_PIN R30 [get_ports {HB_P[9]}]
+# set_property PACKAGE_PIN L28 [get_ports {HB_P[10]}]
+# set_property PACKAGE_PIN M29 [get_ports {HB_P[11]}]
+# set_property PACKAGE_PIN K30 [get_ports {HB_P[12]}]
+# set_property PACKAGE_PIN L32 [get_ports {HB_P[13]}]
+# set_property PACKAGE_PIN V31 [get_ports {HB_P[14]}]
+# set_property PACKAGE_PIN P33 [get_ports {HB_P[15]}]
+# set_property PACKAGE_PIN M34 [get_ports {HB_P[16]}]
+# set_property PACKAGE_PIN N32 [get_ports {HB_P[17]}]
+# set_property PACKAGE_PIN M32 [get_ports {HB_N[17]}]
+# set_property PACKAGE_PIN T28 [get_ports {HB_P[18]}]
+# set_property PACKAGE_PIN N26 [get_ports {HB_P[19]}]
+# set_property PACKAGE_PIN V34 [get_ports {HB_P[20]}]
+# set_property PACKAGE_PIN P34 [get_ports {HB_P[21]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {CLK_CFG}]
+# set_property PACKAGE_PIN AT27 [get_ports {CLK_CFG}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_CSIB}]
+# set_property PACKAGE_PIN BA27 [get_ports {IOFPGA_CSIB}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[4]}]
+# set_property PACKAGE_PIN AV26 [get_ports {IOFPGA_D[4]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[5]}]
+# set_property PACKAGE_PIN AV27 [get_ports {IOFPGA_D[5]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[6]}]
+# set_property PACKAGE_PIN AU29 [get_ports {IOFPGA_D[6]}]
+# set_property IOSTANDARD LVCMOS33 [get_ports {IOFPGA_D[7]}]
+# set_property PACKAGE_PIN AV29 [get_ports {IOFPGA_D[7]}]
+set_property IOSTANDARD LVCMOS18 [get_ports IOFPGA_NRST]
+set_property PACKAGE_PIN AV31 [get_ports IOFPGA_NRST]
+set_property IOSTANDARD LVCMOS18 [get_ports IOFPGA_NSPIR]
+set_property PACKAGE_PIN AV32 [get_ports IOFPGA_NSPIR]
+set_property IOSTANDARD LVCMOS33 [get_ports IOFPGA_SYSWDT]
+set_property PACKAGE_PIN AU20 [get_ports IOFPGA_SYSWDT]
+# not used
+# set_property PACKAGE_PIN AN27 [get_ports {LA_N[2]}]
+# set_property PACKAGE_PIN AP30 [get_ports {LA_N[3]}]
+# set_property PACKAGE_PIN AN29 [get_ports {LA_N[4]}]
+# set_property PACKAGE_PIN AR35 [get_ports {LA_N[5]}]
+# set_property PACKAGE_PIN AR33 [get_ports {LA_N[6]}]
+# set_property PACKAGE_PIN AN32 [get_ports {LA_N[7]}]
+# set_property PACKAGE_PIN AP31 [get_ports {LA_N[8]}]
+# set_property PACKAGE_PIN AN34 [get_ports {LA_N[9]}]
+# set_property PACKAGE_PIN AL35 [get_ports {LA_N[10]}]
+# set_property PACKAGE_PIN AM36 [get_ports {LA_N[11]}]
+# set_property PACKAGE_PIN AP34 [get_ports {LA_N[12]}]
+# set_property PACKAGE_PIN AL32 [get_ports {LA_N[13]}]
+# set_property PACKAGE_PIN AK36 [get_ports {LA_N[14]}]
+# set_property PACKAGE_PIN AJ34 [get_ports {LA_N[15]}]
+# set_property PACKAGE_PIN AL33 [get_ports {LA_N[16]}]
+# set_property PACKAGE_PIN AJ29 [get_ports {LA_N[19]}]
+# set_property PACKAGE_PIN AJ33 [get_ports {LA_N[20]}]
+# set_property PACKAGE_PIN AH29 [get_ports {LA_N[21]}]
+# set_property PACKAGE_PIN AH31 [get_ports {LA_N[22]}]
+# set_property PACKAGE_PIN AG30 [get_ports {LA_N[23]}]
+# set_property PACKAGE_PIN G32 [get_ports {LA_N[24]}]
+# set_property PACKAGE_PIN H34 [get_ports {LA_N[25]}]
+# set_property PACKAGE_PIN H31 [get_ports {LA_N[26]}]
+# set_property PACKAGE_PIN K33 [get_ports {LA_N[27]}]
+# set_property PACKAGE_PIN H29 [get_ports {LA_N[28]}]
+# set_property PACKAGE_PIN H33 [get_ports {LA_N[29]}]
+# set_property PACKAGE_PIN F34 [get_ports {LA_N[30]}]
+# set_property PACKAGE_PIN E33 [get_ports {LA_N[31]}]
+# set_property PACKAGE_PIN C34 [get_ports {LA_N[32]}]
+# set_property PACKAGE_PIN G30 [get_ports {LA_N[33]}]
+# set_property PACKAGE_PIN AM29 [get_ports {LA_P[0]}]
+# set_property PACKAGE_PIN AM30 [get_ports {LA_N[0]}]
+# set_property PACKAGE_PIN AL29 [get_ports {LA_P[1]}]
+# set_property PACKAGE_PIN AL30 [get_ports {LA_N[1]}]
+# set_property PACKAGE_PIN AM27 [get_ports {LA_P[2]}]
+# set_property PACKAGE_PIN AP29 [get_ports {LA_P[3]}]
+# set_property PACKAGE_PIN AN28 [get_ports {LA_P[4]}]
+# set_property PACKAGE_PIN AP35 [get_ports {LA_P[5]}]
+# set_property PACKAGE_PIN AP33 [get_ports {LA_P[6]}]
+# set_property PACKAGE_PIN AM32 [get_ports {LA_P[7]}]
+# set_property PACKAGE_PIN AN31 [get_ports {LA_P[8]}]
+# set_property PACKAGE_PIN AM34 [get_ports {LA_P[9]}]
+# set_property PACKAGE_PIN AL34 [get_ports {LA_P[10]}]
+# set_property PACKAGE_PIN AM35 [get_ports {LA_P[11]}]
+# set_property PACKAGE_PIN AN33 [get_ports {LA_P[12]}]
+# set_property PACKAGE_PIN AK32 [get_ports {LA_P[13]}]
+# set_property PACKAGE_PIN AK35 [get_ports {LA_P[14]}]
+# set_property PACKAGE_PIN AH34 [get_ports {LA_P[15]}]
+# set_property PACKAGE_PIN AK33 [get_ports {LA_P[16]}]
+# set_property PACKAGE_PIN AK30 [get_ports {LA_P[17]}]
+# set_property PACKAGE_PIN AK31 [get_ports {LA_N[17]}]
+# set_property PACKAGE_PIN AJ30 [get_ports {LA_P[18]}]
+# set_property PACKAGE_PIN AJ31 [get_ports {LA_N[18]}]
+# set_property PACKAGE_PIN AJ28 [get_ports {LA_P[19]}]
+# set_property PACKAGE_PIN AH33 [get_ports {LA_P[20]}]
+# set_property PACKAGE_PIN AH28 [get_ports {LA_P[21]}]
+# set_property PACKAGE_PIN AG31 [get_ports {LA_P[22]}]
+# set_property PACKAGE_PIN AG29 [get_ports {LA_P[23]}]
+# set_property PACKAGE_PIN H32 [get_ports {LA_P[24]}]
+# set_property PACKAGE_PIN J34 [get_ports {LA_P[25]}]
+# set_property PACKAGE_PIN J30 [get_ports {LA_P[26]}]
+# set_property PACKAGE_PIN K32 [get_ports {LA_P[27]}]
+# set_property PACKAGE_PIN J29 [get_ports {LA_P[28]}]
+# set_property PACKAGE_PIN J33 [get_ports {LA_P[29]}]
+# set_property PACKAGE_PIN G34 [get_ports {LA_P[30]}]
+# set_property PACKAGE_PIN F33 [get_ports {LA_P[31]}]
+# set_property PACKAGE_PIN D34 [get_ports {LA_P[32]}]
+# set_property PACKAGE_PIN G29 [get_ports {LA_P[33]}]
+set_property PACKAGE_PIN AM17 [get_ports {MMB_DATA[0]}]
+set_property PACKAGE_PIN AL14 [get_ports {MMB_DATA[1]}]
+set_property PACKAGE_PIN AK15 [get_ports {MMB_DATA[2]}]
+set_property PACKAGE_PIN AK17 [get_ports {MMB_DATA[3]}]
+set_property PACKAGE_PIN AM14 [get_ports {MMB_DATA[4]}]
+set_property PACKAGE_PIN AN13 [get_ports {MMB_DATA[5]}]
+set_property PACKAGE_PIN AM11 [get_ports {MMB_DATA[6]}]
+set_property PACKAGE_PIN AN11 [get_ports {MMB_DATA[7]}]
+set_property PACKAGE_PIN AR13 [get_ports {MMB_DATA[8]}]
+set_property PACKAGE_PIN AR12 [get_ports {MMB_DATA[9]}]
+set_property PACKAGE_PIN AL10 [get_ports {MMB_DATA[10]}]
+set_property PACKAGE_PIN AM10 [get_ports {MMB_DATA[11]}]
+set_property PACKAGE_PIN AM12 [get_ports {MMB_DATA[12]}]
+set_property PACKAGE_PIN AN12 [get_ports {MMB_DATA[13]}]
+set_property PACKAGE_PIN AP13 [get_ports {MMB_DATA[14]}]
+set_property PACKAGE_PIN AK13 [get_ports {MMB_DATA[15]}]
+set_property PACKAGE_PIN AK12 [get_ports {MMB_DATA[16]}]
+set_property PACKAGE_PIN AK11 [get_ports {MMB_DATA[17]}]
+set_property PACKAGE_PIN AK10 [get_ports {MMB_DATA[18]}]
+set_property PACKAGE_PIN AH13 [get_ports {MMB_DATA[19]}]
+set_property PACKAGE_PIN AJ13 [get_ports {MMB_DATA[20]}]
+set_property PACKAGE_PIN AJ11 [get_ports {MMB_DATA[21]}]
+set_property PACKAGE_PIN AJ10 [get_ports {MMB_DATA[22]}]
+set_property PACKAGE_PIN AH12 [get_ports {MMB_DATA[23]}]
+set_property PACKAGE_PIN AH11 [get_ports MMB_DE]
+set_property PACKAGE_PIN AG12 [get_ports MMB_HS]
+set_property PACKAGE_PIN AH14 [get_ports MMB_IDCLK]
+set_property PACKAGE_PIN AF29 [get_ports MMB_SCK]
+set_property PACKAGE_PIN AC28 [get_ports {MMB_SD[0]}]
+set_property PACKAGE_PIN AC29 [get_ports {MMB_SD[1]}]
+set_property PACKAGE_PIN AE27 [get_ports {MMB_SD[2]}]
+set_property PACKAGE_PIN AF34 [get_ports {MMB_SD[3]}]
+set_property PACKAGE_PIN AG11 [get_ports MMB_VS]
+set_property PACKAGE_PIN AF30 [get_ports MMB_WS]
+set_property PACKAGE_PIN AL15 [get_ports {OSCCLK[0]}]
+set_property PACKAGE_PIN AK16 [get_ports {OSCCLK[1]}]
+set_property PACKAGE_PIN AY32 [get_ports {OSCCLK[2]}]
+set_property PACKAGE_PIN AY30 [get_ports {OSCCLK[3]}]
+set_property PACKAGE_PIN AC31 [get_ports {OSCCLK[4]}]
+set_property PACKAGE_PIN AC32 [get_ports {OSCCLK[5]}]
+set_property PACKAGE_PIN AT29 [get_ports PB_IRQ]
+
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D0]
+set_property PACKAGE_PIN AU24 [get_ports QSPI_D0]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D1]
+set_property PACKAGE_PIN AV24 [get_ports QSPI_D1]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D2]
+set_property PACKAGE_PIN AV21 [get_ports QSPI_D2]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_D3]
+set_property PACKAGE_PIN AV22 [get_ports QSPI_D3]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_nCS]
+set_property PACKAGE_PIN AT24 [get_ports QSPI_nCS]
+set_property IOSTANDARD LVCMOS33 [get_ports QSPI_SCLK]
+set_property PACKAGE_PIN AT25 [get_ports QSPI_SCLK]
+# not used
+# set_property PACKAGE_PIN AL13 [get_ports SATA_CLK_P]
+# set_property PACKAGE_PIN AL12 [get_ports SATA_CLK_N]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[0]}]
+set_property PACKAGE_PIN AW14 [get_ports {SH0_IO[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[1]}]
+set_property PACKAGE_PIN AW13 [get_ports {SH0_IO[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[2]}]
+set_property PACKAGE_PIN AW15 [get_ports {SH0_IO[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[3]}]
+set_property PACKAGE_PIN AY15 [get_ports {SH0_IO[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[4]}]
+set_property PACKAGE_PIN AY13 [get_ports {SH0_IO[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[5]}]
+set_property PACKAGE_PIN AY12 [get_ports {SH0_IO[5]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[6]}]
+set_property PACKAGE_PIN BA15 [get_ports {SH0_IO[6]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[7]}]
+set_property PACKAGE_PIN BB14 [get_ports {SH0_IO[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[8]}]
+set_property PACKAGE_PIN BA12 [get_ports {SH0_IO[8]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[9]}]
+set_property PACKAGE_PIN BB12 [get_ports {SH0_IO[9]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[10]}]
+set_property PACKAGE_PIN BA14 [get_ports {SH0_IO[10]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[11]}]
+set_property PACKAGE_PIN BA13 [get_ports {SH0_IO[11]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[12]}]
+set_property PACKAGE_PIN BB15 [get_ports {SH0_IO[12]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[13]}]
+set_property PACKAGE_PIN AU12 [get_ports {SH0_IO[13]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[14]}]
+set_property PACKAGE_PIN AV12 [get_ports {SH0_IO[14]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[15]}]
+set_property PACKAGE_PIN AV17 [get_ports {SH0_IO[15]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[16]}]
+set_property PACKAGE_PIN AV16 [get_ports {SH0_IO[16]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH0_IO[17]}]
+set_property PACKAGE_PIN AT14 [get_ports {SH0_IO[17]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[0]}]
+set_property PACKAGE_PIN AT17 [get_ports {SH1_IO[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[1]}]
+set_property PACKAGE_PIN AU17 [get_ports {SH1_IO[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[2]}]
+set_property PACKAGE_PIN AV19 [get_ports {SH1_IO[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[3]}]
+set_property PACKAGE_PIN AW19 [get_ports {SH1_IO[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[4]}]
+set_property PACKAGE_PIN AW20 [get_ports {SH1_IO[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[5]}]
+set_property PACKAGE_PIN BA19 [get_ports {SH1_IO[5]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[6]}]
+set_property PACKAGE_PIN BA18 [get_ports {SH1_IO[6]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[7]}]
+set_property PACKAGE_PIN AY20 [get_ports {SH1_IO[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[8]}]
+set_property PACKAGE_PIN BA20 [get_ports {SH1_IO[8]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[9]}]
+set_property PACKAGE_PIN BA17 [get_ports {SH1_IO[9]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[10]}]
+set_property PACKAGE_PIN BB17 [get_ports {SH1_IO[10]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[11]}]
+set_property PACKAGE_PIN BB20 [get_ports {SH1_IO[11]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[12]}]
+set_property PACKAGE_PIN BB19 [get_ports {SH1_IO[12]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[13]}]
+set_property PACKAGE_PIN AW16 [get_ports {SH1_IO[13]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[14]}]
+set_property PACKAGE_PIN AY16 [get_ports {SH1_IO[14]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[15]}]
+set_property PACKAGE_PIN AY18 [get_ports {SH1_IO[15]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[16]}]
+set_property PACKAGE_PIN AY17 [get_ports {SH1_IO[16]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SH1_IO[17]}]
+set_property PACKAGE_PIN BB16 [get_ports {SH1_IO[17]}]
+set_property PACKAGE_PIN AL25 [get_ports SH_ADC_CK]
+set_property PACKAGE_PIN AM25 [get_ports SH_ADC_CS]
+set_property PACKAGE_PIN AP25 [get_ports SH_ADC_DI]
+set_property PACKAGE_PIN AP26 [get_ports SH_ADC_DO]
+set_property IOSTANDARD LVCMOS33 [get_ports SH_nRST]
+set_property PACKAGE_PIN AU14 [get_ports SH_nRST]
+set_property PACKAGE_PIN AK20 [get_ports {SMBF_ADDR[0]}]
+set_property PACKAGE_PIN AK21 [get_ports {SMBF_ADDR[1]}]
+set_property PACKAGE_PIN AJ18 [get_ports {SMBF_ADDR[2]}]
+set_property PACKAGE_PIN AJ19 [get_ports {SMBF_ADDR[3]}]
+set_property PACKAGE_PIN AH21 [get_ports {SMBF_ADDR[4]}]
+set_property PACKAGE_PIN AJ21 [get_ports {SMBF_ADDR[5]}]
+set_property PACKAGE_PIN AH19 [get_ports {SMBF_ADDR[6]}]
+set_property PACKAGE_PIN AK22 [get_ports {SMBF_DATA[0]}]
+set_property PACKAGE_PIN AL22 [get_ports {SMBF_DATA[1]}]
+set_property PACKAGE_PIN AL19 [get_ports {SMBF_DATA[2]}]
+set_property PACKAGE_PIN AL20 [get_ports {SMBF_DATA[3]}]
+set_property PACKAGE_PIN AH18 [get_ports {SMBF_DATA[4]}]
+set_property PACKAGE_PIN AM19 [get_ports {SMBF_DATA[5]}]
+set_property PACKAGE_PIN AN19 [get_ports {SMBF_DATA[6]}]
+set_property PACKAGE_PIN AP19 [get_ports {SMBF_DATA[7]}]
+set_property PACKAGE_PIN AP20 [get_ports {SMBF_DATA[8]}]
+set_property PACKAGE_PIN AM20 [get_ports {SMBF_DATA[9]}]
+set_property PACKAGE_PIN AN21 [get_ports {SMBF_DATA[10]}]
+set_property PACKAGE_PIN AP21 [get_ports {SMBF_DATA[11]}]
+set_property PACKAGE_PIN AR22 [get_ports {SMBF_DATA[12]}]
+set_property PACKAGE_PIN AM21 [get_ports {SMBF_DATA[13]}]
+set_property PACKAGE_PIN AM22 [get_ports {SMBF_DATA[14]}]
+set_property PACKAGE_PIN AN22 [get_ports {SMBF_DATA[15]}]
+set_property PACKAGE_PIN AJ20 [get_ports SMBF_FIFOSEL]
+set_property PACKAGE_PIN AN23 [get_ports SMBF_nOE]
+set_property PACKAGE_PIN AL23 [get_ports SMBF_nRST]
+set_property PACKAGE_PIN AP23 [get_ports SMBF_nWE]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[16]}]
+set_property PACKAGE_PIN AR26 [get_ports {SMBM_A[16]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[17]}]
+set_property PACKAGE_PIN AT22 [get_ports {SMBM_A[17]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[18]}]
+set_property PACKAGE_PIN AT23 [get_ports {SMBM_A[18]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[19]}]
+set_property PACKAGE_PIN AU21 [get_ports {SMBM_A[19]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[20]}]
+set_property PACKAGE_PIN AY22 [get_ports {SMBM_A[20]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[21]}]
+set_property PACKAGE_PIN BA22 [get_ports {SMBM_A[21]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[22]}]
+set_property PACKAGE_PIN AW21 [get_ports {SMBM_A[22]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[23]}]
+set_property PACKAGE_PIN AY21 [get_ports {SMBM_A[23]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[24]}]
+set_property PACKAGE_PIN BA23 [get_ports {SMBM_A[24]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_A[25]}]
+set_property PACKAGE_PIN BA24 [get_ports {SMBM_A[25]}]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_CLK]
+set_property PACKAGE_PIN AY25 [get_ports SMBM_CLK]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[0]}]
+set_property PACKAGE_PIN BB21 [get_ports {SMBM_D[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[1]}]
+set_property PACKAGE_PIN BB22 [get_ports {SMBM_D[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[2]}]
+set_property PACKAGE_PIN AW24 [get_ports {SMBM_D[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[3]}]
+set_property PACKAGE_PIN AW25 [get_ports {SMBM_D[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[4]}]
+set_property PACKAGE_PIN AW23 [get_ports {SMBM_D[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[5]}]
+set_property PACKAGE_PIN AY23 [get_ports {SMBM_D[5]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[6]}]
+set_property PACKAGE_PIN BB24 [get_ports {SMBM_D[6]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[7]}]
+set_property PACKAGE_PIN AY27 [get_ports {SMBM_D[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[8]}]
+set_property PACKAGE_PIN AY26 [get_ports {SMBM_D[8]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[9]}]
+set_property PACKAGE_PIN AY28 [get_ports {SMBM_D[9]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[10]}]
+set_property PACKAGE_PIN BA28 [get_ports {SMBM_D[10]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[11]}]
+set_property PACKAGE_PIN BA25 [get_ports {SMBM_D[11]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[12]}]
+set_property PACKAGE_PIN BB25 [get_ports {SMBM_D[12]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[13]}]
+set_property PACKAGE_PIN AW28 [get_ports {SMBM_D[13]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[14]}]
+set_property PACKAGE_PIN AW29 [get_ports {SMBM_D[14]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_D[15]}]
+set_property PACKAGE_PIN BB26 [get_ports {SMBM_D[15]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nBL[0]}]
+set_property PACKAGE_PIN AU26 [get_ports {SMBM_nBL[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nBL[1]}]
+set_property PACKAGE_PIN AR28 [get_ports {SMBM_nBL[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[1]}]
+set_property PACKAGE_PIN BB27 [get_ports {SMBM_nE[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[2]}]
+set_property PACKAGE_PIN AU27 [get_ports {SMBM_nE[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[3]}]
+set_property PACKAGE_PIN AV28 [get_ports {SMBM_nE[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {SMBM_nE[4]}]
+set_property PACKAGE_PIN AU25 [get_ports {SMBM_nE[4]}]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nOE]
+set_property PACKAGE_PIN AT28 [get_ports SMBM_nOE]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nWAIT]
+set_property PACKAGE_PIN AP28 [get_ports SMBM_nWAIT]
+set_property IOSTANDARD LVCMOS33 [get_ports SMBM_nWE]
+set_property PACKAGE_PIN AR27 [get_ports SMBM_nWE]
+set_property PACKAGE_PIN AF28 [get_ports {UART_RX_F[0]}]
+set_property PACKAGE_PIN AE31 [get_ports {UART_RX_F[1]}]
+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 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]
+set_property PACKAGE_PIN AP24 [get_ports USB_INT]
+set_property PACKAGE_PIN AM26 [get_ports USB_nCS]
+set_property IOSTANDARD LVCMOS33 [get_ports USD_CLK]
+set_property PACKAGE_PIN AU15 [get_ports USD_CLK]
+set_property IOSTANDARD LVCMOS33 [get_ports USD_CMD]
+set_property PACKAGE_PIN AU16 [get_ports USD_CMD]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[0]}]
+set_property PACKAGE_PIN AV14 [get_ports {USD_DAT[0]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[1]}]
+set_property PACKAGE_PIN AV13 [get_ports {USD_DAT[1]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[2]}]
+set_property PACKAGE_PIN AT13 [get_ports {USD_DAT[2]}]
+set_property IOSTANDARD LVCMOS33 [get_ports {USD_DAT[3]}]
+set_property PACKAGE_PIN AT12 [get_ports {USD_DAT[3]}]
+set_property IOSTANDARD LVCMOS33 [get_ports USD_NCD]
+set_property PACKAGE_PIN AT15 [get_ports USD_NCD]
+set_property PACKAGE_PIN AU32 [get_ports {USER_nLED[0]}]
+set_property PACKAGE_PIN AU30 [get_ports {USER_nLED[1]}]
+set_property PACKAGE_PIN AU31 [get_ports {USER_nLED[2]}]
+set_property PACKAGE_PIN AR32 [get_ports {USER_nLED[3]}]
+set_property PACKAGE_PIN AT33 [get_ports {USER_nLED[4]}]
+set_property PACKAGE_PIN AW30 [get_ports {USER_nLED[5]}]
+set_property PACKAGE_PIN AW31 [get_ports {USER_nLED[6]}]
+set_property PACKAGE_PIN AR30 [get_ports {USER_nLED[7]}]
+set_property PACKAGE_PIN BB31 [get_ports {USER_nLED[8]}]
+set_property PACKAGE_PIN BB32 [get_ports {USER_nLED[9]}]
+set_property PACKAGE_PIN AT30 [get_ports {USER_nPB[0]}]
+set_property PACKAGE_PIN AT32 [get_ports {USER_nPB[1]}]
+set_property PACKAGE_PIN BA29 [get_ports {USER_SW[0]}]
+set_property PACKAGE_PIN BB29 [get_ports {USER_SW[1]}]
+set_property PACKAGE_PIN BA32 [get_ports {USER_SW[2]}]
+set_property PACKAGE_PIN BA33 [get_ports {USER_SW[3]}]
+set_property PACKAGE_PIN BA30 [get_ports {USER_SW[4]}]
+set_property PACKAGE_PIN BB30 [get_ports {USER_SW[5]}]
+set_property PACKAGE_PIN AY33 [get_ports {USER_SW[6]}]
+set_property PACKAGE_PIN AY31 [get_ports {USER_SW[7]}]
+set_property IOSTANDARD LVCMOS33 [get_ports WDOG_RREQ]
+set_property PACKAGE_PIN AU19 [get_ports WDOG_RREQ]
+
+# native DDR pin names
+
+# set_property PACKAGE_PIN A17 [get_ports {c0_ddr4_dq[37]}]
+# set_property PACKAGE_PIN F24 [get_ports {c0_ddr4_dq[54]}]
+# set_property PACKAGE_PIN F23 [get_ports {c0_ddr4_dq[55]}]
+# set_property PACKAGE_PIN B15 [get_ports {c0_ddr4_dq[28]}]
+# set_property PACKAGE_PIN D23 [get_ports {c0_ddr4_dq[52]}]
+# set_property PACKAGE_PIN D24 [get_ports {c0_ddr4_dq[53]}]
+# set_property PACKAGE_PIN C24 [get_ports {c0_ddr4_dm_dbi_n[5]}]
+# set_property PACKAGE_PIN A22 [get_ports {c0_ddr4_dq[46]}]
+# set_property PACKAGE_PIN A23 [get_ports {c0_ddr4_dq[47]}]
+# set_property PACKAGE_PIN C13 [get_ports {c0_ddr4_dq[29]}]
+# set_property PACKAGE_PIN A14 [get_ports {c0_ddr4_dq[27]}]
+# set_property PACKAGE_PIN E22 [get_ports {c0_ddr4_dqs_t[6]}]
+# set_property PACKAGE_PIN E21 [get_ports {c0_ddr4_dqs_c[6]}]
+# set_property PACKAGE_PIN G22 [get_ports {c0_ddr4_dq[50]}]
+# set_property PACKAGE_PIN G21 [get_ports {c0_ddr4_dq[51]}]
+# set_property PACKAGE_PIN H24 [get_ports {c0_ddr4_dm_dbi_n[6]}]
+# set_property PACKAGE_PIN A24 [get_ports {c0_ddr4_dq[42]}]
+# set_property PACKAGE_PIN B22 [get_ports {c0_ddr4_dqs_t[5]}]
+# set_property PACKAGE_PIN B21 [get_ports {c0_ddr4_dqs_c[5]}]
+# set_property PACKAGE_PIN B17 [get_ports {c0_ddr4_dqs_t[4]}]
+# set_property PACKAGE_PIN B16 [get_ports {c0_ddr4_dqs_c[4]}]
+# set_property PACKAGE_PIN A18 [get_ports {c0_ddr4_dq[38]}]
+# set_property PACKAGE_PIN A12 [get_ports {c0_ddr4_dq[31]}]
+# set_property PACKAGE_PIN D25 [get_ports {c0_ddr4_dq[48]}]
+# set_property PACKAGE_PIN E23 [get_ports {c0_ddr4_dq[49]}]
+# set_property PACKAGE_PIN C23 [get_ports {c0_ddr4_dq[40]}]
+# set_property PACKAGE_PIN A25 [get_ports {c0_ddr4_dq[43]}]
+# set_property PACKAGE_PIN C22 [get_ports {c0_ddr4_dq[44]}]
+# set_property PACKAGE_PIN B14 [get_ports {c0_ddr4_dq[24]}]
+# set_property PACKAGE_PIN K18 [get_ports {c0_ddr4_adr[4]}]
+# set_property PACKAGE_PIN C21 [get_ports {c0_ddr4_dq[41]}]
+# set_property PACKAGE_PIN D21 [get_ports {c0_ddr4_dq[45]}]
+# set_property PACKAGE_PIN C16 [get_ports {c0_ddr4_dq[32]}]
+# set_property PACKAGE_PIN E12 [get_ports {c0_ddr4_dq[16]}]
+# set_property PACKAGE_PIN D13 [get_ports {c0_ddr4_dq[25]}]
+# set_property PACKAGE_PIN C12 [get_ports {c0_ddr4_dqs_t[3]}]
+# set_property PACKAGE_PIN B12 [get_ports {c0_ddr4_dqs_c[3]}]
+# set_property PACKAGE_PIN E15 [get_ports {c0_ddr4_dq[18]}]
+# #set_property PACKAGE_PIN P18 [get_ports {c0_ddr4_ck_t[1]}]
+# #set_property PACKAGE_PIN N18 [get_ports {c0_ddr4_ck_c[1]}]
+# set_property PACKAGE_PIN L19 [get_ports {c0_ddr4_adr[0]}]
+# set_property PACKAGE_PIN J18 [get_ports {c0_ddr4_adr[5]}]
+# #set_property PACKAGE_PIN E20 [get_ports {c0_ddr4_cke[0]}]
+# set_property PACKAGE_PIN E20 [get_ports {c0_ddr4_cke}]
+# set_property PACKAGE_PIN D19 [get_ports c0_ddr4_act_n]
+# set_property PACKAGE_PIN F12 [get_ports {c0_ddr4_dq[17]}]
+# set_property PACKAGE_PIN F15 [get_ports {c0_ddr4_dq[19]}]
+# set_property PACKAGE_PIN L18 [get_ports {c0_ddr4_adr[2]}]
+# set_property PACKAGE_PIN K16 [get_ports {c0_ddr4_adr[3]}]
+# set_property PACKAGE_PIN J16 [get_ports {c0_ddr4_adr[1]}]
+# #set_property PACKAGE_PIN E17 [get_ports {c0_ddr4_cke[1]}]
+# set_property PACKAGE_PIN E18 [get_ports c0_ddr4_reset_n]
+# set_property PACKAGE_PIN F14 [get_ports {c0_ddr4_dqs_t[2]}]
+# set_property PACKAGE_PIN F13 [get_ports {c0_ddr4_dqs_c[2]}]
+# #set_property PACKAGE_PIN P16 [get_ports {c0_ddr4_ck_t[0]}]
+# set_property PACKAGE_PIN P16 [get_ports {c0_ddr4_ck_t}]
+# #set_property PACKAGE_PIN N16 [get_ports {c0_ddr4_ck_c[0]}]
+# set_property PACKAGE_PIN N16 [get_ports {c0_ddr4_ck_c}]
+# set_property PACKAGE_PIN F19 [get_ports {c0_ddr4_bg[0]}]
+# #set_property PACKAGE_PIN F18 [get_ports {c0_ddr4_bg[1]}]
+# #set_property PACKAGE_PIN E16 [get_ports {c0_ddr4_odt[0]}]
+# set_property PACKAGE_PIN E16 [get_ports {c0_ddr4_odt}]
+# #set_property PACKAGE_PIN F17 [get_ports {c0_ddr4_cs_n[0]}]
+# set_property PACKAGE_PIN F17 [get_ports {c0_ddr4_cs_n}]
+# #set_property PACKAGE_PIN F20 [get_ports {c0_ddr4_cs_n[1]}]
+# #set_property PACKAGE_PIN D20 [get_ports {c0_ddr4_odt[1]}]
+# set_property PACKAGE_PIN K13 [get_ports {c0_ddr4_dq[10]}]
+# set_property PACKAGE_PIN J14 [get_ports {c0_ddr4_dq[11]}]
+# set_property PACKAGE_PIN H17 [get_ports {c0_ddr4_adr[16]}]
+# set_property PACKAGE_PIN G17 [get_ports {c0_ddr4_ba[0]}]
+# set_property PACKAGE_PIN H16 [get_ports {c0_ddr4_adr[14]}]
+# set_property PACKAGE_PIN G19 [get_ports {c0_ddr4_ba[1]}]
+# set_property PACKAGE_PIN N11 [get_ports {c0_ddr4_dqs_t[0]}]
+# set_property PACKAGE_PIN M11 [get_ports {c0_ddr4_dqs_c[0]}]
+# set_property PACKAGE_PIN J15 [get_ports {c0_ddr4_dq[8]}]
+# set_property PACKAGE_PIN K15 [get_ports {c0_ddr4_dq[9]}]
+# set_property PACKAGE_PIN G16 [get_ports {c0_ddr4_adr[15]}]
+# set_property PACKAGE_PIN M10 [get_ports {c0_ddr4_dq[6]}]
+# set_property PACKAGE_PIN L10 [get_ports {c0_ddr4_dq[7]}]
+# set_property PACKAGE_PIN J11 [get_ports {c0_ddr4_dqs_t[1]}]
+# set_property PACKAGE_PIN J10 [get_ports {c0_ddr4_dqs_c[1]}]
+# set_property PACKAGE_PIN L17 [get_ports {c0_ddr4_adr[6]}]
+# set_property PACKAGE_PIN K17 [get_ports {c0_ddr4_adr[8]}]
+# set_property PACKAGE_PIN M17 [get_ports {c0_ddr4_adr[9]}]
+# set_property PACKAGE_PIN M16 [get_ports {c0_ddr4_adr[7]}]
+# set_property PACKAGE_PIN M19 [get_ports {c0_ddr4_adr[10]}]
+# set_property PACKAGE_PIN M15 [get_ports {c0_ddr4_adr[11]}]
+# set_property PACKAGE_PIN N17 [get_ports {c0_ddr4_adr[12]}]
+# set_property PACKAGE_PIN N19 [get_ports {c0_ddr4_adr[13]}]
+# set_property PACKAGE_PIN L22 [get_ports {c0_ddr4_dm_dbi_n[7]}]
+# set_property PACKAGE_PIN P11 [get_ports {c0_ddr4_dq[0]}]
+# set_property PACKAGE_PIN P10 [get_ports {c0_ddr4_dq[1]}]
+# set_property PACKAGE_PIN L12 [get_ports {c0_ddr4_dq[2]}]
+# set_property PACKAGE_PIN M12 [get_ports {c0_ddr4_dq[3]}]
+# set_property PACKAGE_PIN N13 [get_ports {c0_ddr4_dq[4]}]
+# set_property PACKAGE_PIN N12 [get_ports {c0_ddr4_dq[5]}]
+# set_property PACKAGE_PIN K11 [get_ports {c0_ddr4_dq[12]}]
+# set_property PACKAGE_PIN K10 [get_ports {c0_ddr4_dq[13]}]
+# set_property PACKAGE_PIN J13 [get_ports {c0_ddr4_dq[14]}]
+# set_property PACKAGE_PIN K12 [get_ports {c0_ddr4_dq[15]}]
+# set_property PACKAGE_PIN H12 [get_ports {c0_ddr4_dq[20]}]
+# set_property PACKAGE_PIN G12 [get_ports {c0_ddr4_dq[21]}]
+# set_property PACKAGE_PIN G15 [get_ports {c0_ddr4_dq[22]}]
+# set_property PACKAGE_PIN G14 [get_ports {c0_ddr4_dq[23]}]
+# set_property PACKAGE_PIN A13 [get_ports {c0_ddr4_dq[26]}]
+# set_property PACKAGE_PIN A15 [get_ports {c0_ddr4_dq[30]}]
+# set_property PACKAGE_PIN C19 [get_ports {c0_ddr4_dq[33]}]
+# set_property PACKAGE_PIN B19 [get_ports {c0_ddr4_dq[34]}]
+# set_property PACKAGE_PIN A20 [get_ports {c0_ddr4_dq[35]}]
+# set_property PACKAGE_PIN D16 [get_ports {c0_ddr4_dq[36]}]
+# set_property PACKAGE_PIN A19 [get_ports {c0_ddr4_dq[39]}]
+# set_property PACKAGE_PIN H22 [get_ports {c0_ddr4_dq[56]}]
+# set_property PACKAGE_PIN J23 [get_ports {c0_ddr4_dq[57]}]
+# set_property PACKAGE_PIN K20 [get_ports {c0_ddr4_dq[58]}]
+# set_property PACKAGE_PIN L20 [get_ports {c0_ddr4_dq[59]}]
+# set_property PACKAGE_PIN H21 [get_ports {c0_ddr4_dq[60]}]
+# set_property PACKAGE_PIN H23 [get_ports {c0_ddr4_dq[61]}]
+# set_property PACKAGE_PIN K23 [get_ports {c0_ddr4_dq[62]}]
+# set_property PACKAGE_PIN J21 [get_ports {c0_ddr4_dq[63]}]
+# set_property PACKAGE_PIN N14 [get_ports {c0_ddr4_dm_dbi_n[0]}]
+# set_property PACKAGE_PIN L14 [get_ports {c0_ddr4_dm_dbi_n[1]}]
+# set_property PACKAGE_PIN H14 [get_ports {c0_ddr4_dm_dbi_n[2]}]
+# set_property PACKAGE_PIN D14 [get_ports {c0_ddr4_dm_dbi_n[3]}]
+# set_property PACKAGE_PIN C18 [get_ports {c0_ddr4_dm_dbi_n[4]}]
+# set_property PACKAGE_PIN K21 [get_ports {c0_ddr4_dqs_t[7]}]
+
+#set_property CFGBVS GND [current_design]
+#set_property CONFIG_VOLTAGE 1.8 [current_design]
+
+# set_property PACKAGE_PIN H19 [get_ports c0_sys_clk_p]
+# set_property PACKAGE_PIN H18 [get_ports c0_sys_clk_n]
+
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports SATA_CLK_N]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports SATA_CLK_P]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports GTX_CLK_N]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports GTX_CLK_P]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_M2C_P[1]}]
+# set_property IOSTANDARD DIFF_HSTL_I_18 [get_ports {CLK_M2C_P[0]}]
+
+# set_property PACKAGE_PIN AB31 [get_ports GTX_CLK_P]
+# set_property PACKAGE_PIN AB32 [get_ports GTX_CLK_N]
+
+# set_property PACKAGE_PIN AH39 [get_ports {DP_C2M_N[0]}]
+# set_property PACKAGE_PIN AF39 [get_ports {DP_C2M_N[1]}]
+# set_property PACKAGE_PIN AD39 [get_ports {DP_C2M_N[2]}]
+# set_property PACKAGE_PIN AB39 [get_ports {DP_C2M_N[3]}]
+# set_property PACKAGE_PIN Y39 [get_ports {DP_C2M_N[4]}]
+# set_property PACKAGE_PIN V39 [get_ports {DP_C2M_N[5]}]
+# set_property PACKAGE_PIN K39 [get_ports {DP_C2M_N[6]}]
+# set_property PACKAGE_PIN M39 [get_ports {DP_C2M_N[7]}]
+# set_property PACKAGE_PIN P39 [get_ports {DP_C2M_N[8]}]
+# set_property PACKAGE_PIN T39 [get_ports {DP_C2M_N[9]}]
+# set_property PACKAGE_PIN AH38 [get_ports {DP_C2M_P[0]}]
+# set_property PACKAGE_PIN AF38 [get_ports {DP_C2M_P[1]}]
+# set_property PACKAGE_PIN AD38 [get_ports {DP_C2M_P[2]}]
+# set_property PACKAGE_PIN AB38 [get_ports {DP_C2M_P[3]}]
+# set_property PACKAGE_PIN Y38 [get_ports {DP_C2M_P[4]}]
+# set_property PACKAGE_PIN V38 [get_ports {DP_C2M_P[5]}]
+# set_property PACKAGE_PIN K38 [get_ports {DP_C2M_P[6]}]
+# set_property PACKAGE_PIN M38 [get_ports {DP_C2M_P[7]}]
+# set_property PACKAGE_PIN P38 [get_ports {DP_C2M_P[8]}]
+# set_property PACKAGE_PIN T38 [get_ports {DP_C2M_P[9]}]
+# set_property PACKAGE_PIN AE36 [get_ports {GBTCLK_M2C_P[0]}]
+# set_property PACKAGE_PIN AE37 [get_ports {GBTCLK_M2C_N[0]}]
+# set_property PACKAGE_PIN AA36 [get_ports {GBTCLK_M2C_P[1]}]
+# set_property PACKAGE_PIN AA37 [get_ports {GBTCLK_M2C_N[1]}]
+
+# create_clock -period 15.515 -name clk_mgtrefclk0_x0y4_p [get_ports {GBTCLK_M2C_P[0]}]
+# create_clock -period 15.515 -name clk_mgtrefclk0_x0y7_p [get_ports {GBTCLK_M2C_P[1]}]
+
+# # False path constraints
+# # ----------------------------------------------------------------------------------------------------------------------
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *bit_synchronizer*inst/i_in_meta_reg}]
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *reset_synchronizer*inst/rst_in_*_reg}]
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *gtwiz_userclk_tx_inst/*gtwiz_userclk_tx_active_*_reg}]
+# set_false_path -to [get_cells -hierarchical -filter {NAME =~ *gtwiz_userclk_rx_inst/*gtwiz_userclk_rx_active_*_reg}]
+
+#set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iACLK]
+#set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets CFG_CLK_IBUF_inst/O]
+# set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iGPUCLK]
+# set_property CLOCK_DEDICATED_ROUTE BACKBONE [get_nets iMCLK]
+
+set_property PULLUP true [get_ports QSPI_D0]
+set_property PULLUP true [get_ports QSPI_D1]
+set_property PULLUP true [get_ports QSPI_D2]
+set_property PULLUP true [get_ports QSPI_D3]
+
+# set_property IOSTANDARD SSTL12_DCI [get_ports "c0_ddr4_bg[0]"]
+# set_property OUTPUT_IMPEDANCE RDRV_40_40 [get_ports "c0_ddr4_bg[0]"]
+
+set_property CONFIG_VOLTAGE 3.3 [current_design]
+set_property CFGBVS VCCO [current_design]
+set_property BITSTREAM.CONFIG.UNUSEDPIN Pullnone [current_design]
+set_property BITSTREAM.CONFIG.PERSIST Yes [current_design]
+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]
+
+
diff --git a/fpga/targets/arm_mps3/fpga_timing.xdc b/fpga/targets/arm_mps3/fpga_timing.xdc
new file mode 100644
index 0000000000000000000000000000000000000000..23677a726e5026e2ad86b27165879129dad79b4a
--- /dev/null
+++ b/fpga/targets/arm_mps3/fpga_timing.xdc
@@ -0,0 +1,22 @@
+##################################################################################
+##                                                                              ##
+## Arm MPS3 Rev-C timing XDC                                                    ##
+##                                                                              ##
+##################################################################################
+
+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/megasoc_design_wrapper.v b/fpga/targets/arm_mps3/megasoc_design_wrapper.v
new file mode 100644
index 0000000000000000000000000000000000000000..dbcafe44666ca2bfba4a111c729dd3bfcef8f207
--- /dev/null
+++ b/fpga/targets/arm_mps3/megasoc_design_wrapper.v
@@ -0,0 +1,318 @@
+`timescale 1 ps / 1 ps
+
+module megasoc_design_wrapper(
+//------------------------------------------------------
+// Port declarations
+//------------------------------------------------------
+
+// DDR
+    // output wire         c0_ddr4_act_n,
+    // output wire [16:0]  c0_ddr4_adr,
+    // output wire [1:0]   c0_ddr4_ba,
+    // output wire [0:0]   c0_ddr4_bg,
+    // output wire [0:0]   c0_ddr4_cke,
+    // output wire [0:0]   c0_ddr4_odt,
+    // output wire [0:0]   c0_ddr4_cs_n,
+    // output wire [0:0]   c0_ddr4_ck_t,
+    // output wire [0:0]   c0_ddr4_ck_c,
+    // output wire         c0_ddr4_reset_n,
+    // inout  wire [7:0]   c0_ddr4_dm_dbi_n,
+    // inout  wire [63:0]  c0_ddr4_dq,
+    // inout  wire [7:0]   c0_ddr4_dqs_t,
+    // inout  wire [7:0]   c0_ddr4_dqs_c,
+    // input  wire         c0_sys_clk_p,
+    // input  wire         c0_sys_clk_n,
+    // input  wire         DDR_nALERT,
+    // output wire         DDR_PARITY,
+    // input               DDR_nEVENT,
+    // output  wire        DDR_SCL,
+    // inout   wire        DDR_SDA,
+	
+// SMB
+//-----------
+    output wire [6:0]   SMBF_ADDR,
+    output wire         SMBF_FIFOSEL,
+    inout  wire [15:0]  SMBF_DATA,
+    output wire         SMBF_nOE,
+    output wire         SMBF_nWE,
+    output wire         SMBF_nRST,
+
+    output wire         ETH_nCS,
+    output wire         ETH_nOE,
+    input  wire         ETH_INT,
+
+    output wire         USB_nCS,
+    output wire         USB_DACK,
+    input  wire         USB_DREQ,
+    input  wire         USB_INT,
+
+// HDMI
+//-----------
+    output wire [23:0]  MMB_DATA,
+    output wire         MMB_DE,
+    output wire         MMB_HS,
+    output wire         MMB_VS,
+    output wire         MMB_IDCLK,
+    output wire         MMB_SCK,
+    output wire         MMB_WS,
+    output wire [3:0]   MMB_SD,
+
+    output wire         HDMI_CSCL,
+    inout  wire         HDMI_CSDA,
+    input  wire         HDMI_INT,
+
+// Audio
+//-----------
+    output wire         AUD_MCLK,
+    output wire         AUD_SCLK,
+    output wire         AUD_LRCK,
+    output wire         AUD_SDIN,
+    input  wire         AUD_SDOUT,
+
+    output wire         AUD_nRST,
+    output wire         AUD_SCL,
+    inout  wire         AUD_SDA,
+
+// EMMC
+//-----------
+    inout  wire [7:0]   EMMC_DAT,
+    inout  wire         EMMC_CMD,
+    output wire         EMMC_CLK,
+    output wire         EMMC_nRST,
+    input  wire         EMMC_DS,
+
+// CLCD
+//-----------
+    inout  wire [17:10] CLCD_PD,
+    output wire         CLCD_RD,
+    output wire         CLCD_RS,
+    output wire         CLCD_CS,
+    output wire         CLCD_WR_SCL,
+    output wire         CLCD_BL,
+    output wire         CLCD_RST,
+
+    output wire         CLCD_TSCL,
+    inout  wire         CLCD_TSDA,
+    input  wire         CLCD_TINT,
+    output wire         CLCD_TNC,
+
+// UART
+//-----------
+    output wire [3:0]   UART_TX_F,
+
+    input  wire [3:0]   UART_RX_F,
+
+// DEBUG
+//-----------
+    input  wire         CS_TDI,
+    output wire         CS_TDO,        // SWV     / JTAG TDO
+    inout  wire         CS_TMS,        // SWD I/O / JTAG TMS
+    input  wire         CS_TCK,        // SWD Clk / JTAG TCK
+    input  wire         CS_nSRST,
+    input  wire         CS_nTRST,
+    input  wire         CS_nDET,
+
+    output wire [15:0]  CS_T_D,        // Trace data
+    output wire         CS_T_CLK,      // Trace clock
+    output wire         CS_T_CTL,      // Trace control
+
+// LED SW
+//-----------
+    output wire [9:0]   USER_nLED,
+    input  wire [7:0]   USER_SW,
+    input  wire [1:0]   USER_nPB,
+
+// OSCCLK
+//-----------
+    input  wire [5:0]   OSCCLK,
+
+// FMC
+//-----------
+    // input  wire [1:0]   CLK_M2C_P,
+    // input  wire [1:0]   CLK_M2C_N,
+
+    // input  wire         FMC_CLK_DIR,
+
+    // inout  wire [3:2]   CLK_BIDIR_P,
+    // inout  wire [3:2]   CLK_BIDIR_N,
+
+    // inout  wire [23:0]  HA_P, // HA CLK=0,1,17
+    // inout  wire [23:0]  HA_N,
+
+    // inout  wire [21:0]  HB_P, // HB CLK=0,6,17
+    // inout  wire [21:0]  HB_N,
+
+    // inout  wire [33:0]  LA_P, // LA CLK=0,1,17,18
+    // inout  wire [33:0]  LA_N,
+
+    // input  wire [1:0]   GBTCLK_M2C_P,
+    // input  wire [1:0]   GBTCLK_M2C_N,
+// `ifdef GTH
+    // input  wire [9:0]   DP_M2C_P,
+    // input  wire [9:0]   DP_M2C_N,
+
+    // output wire [9:0]   DP_C2M_P,
+    // output wire [9:0]   DP_C2M_N,
+// `endif
+    // input  wire         FMC_nPRSNT,
+
+    // input  wire         GTX_CLK_N,
+    // input  wire         GTX_CLK_P,
+
+    // input  wire         SATA_CLK_N,
+    // input  wire         SATA_CLK_P,
+
+// Quad SPI
+//-----------	
+	inout wire      	QSPI_D0,
+	inout wire      	QSPI_D1,
+	inout wire      	QSPI_D2,
+	inout wire      	QSPI_D3,
+	output wire     	QSPI_SCLK,
+	output wire     	QSPI_nCS,
+
+// USER SD
+//-----------
+    inout  wire [3:0]   USD_DAT,
+    inout  wire         USD_CMD,
+    output wire         USD_CLK,
+    input  wire         USD_NCD,
+
+// RESET
+//-----------
+    input  wire         CB_nPOR,
+    input  wire         CB_nRST,
+    input  wire         CB_RUN,
+
+    input  wire         IOFPGA_NRST,
+    input  wire         IOFPGA_NSPIR,
+
+    output wire         IOFPGA_SYSWDT,
+    input  wire         PB_IRQ,
+    output wire         WDOG_RREQ,
+
+// SCC
+//-----------
+    output wire         CFG_DATAOUT,
+    input  wire         CFG_LOAD,
+    input  wire         CFG_nRST,
+    input  wire         CFG_CLK,
+    input  wire         CFG_DATAIN,
+    input  wire         CFG_WnR,
+
+// MCC SMB
+//-----------
+    input  wire [25:16] SMBM_A,
+    inout  wire [15:0]  SMBM_D,
+    input  wire [4:1]   SMBM_nE,
+    input  wire         SMBM_CLK,
+    input  wire [1:0]   SMBM_nBL,
+    input  wire         SMBM_nOE,
+    input  wire         SMBM_nWE,
+    output wire         SMBM_nWAIT,
+
+// SHIELD
+//-----------
+    inout  wire [17:0]  SH0_IO,
+    inout  wire [17:0]  SH1_IO,
+    output wire         SH_nRST,
+
+    output wire         SH_ADC_CS,
+    output wire         SH_ADC_CK,
+    output wire         SH_ADC_DI,
+    input  wire         SH_ADC_DO
+//   (PMOD0_0,
+//    PMOD0_1,
+//    PMOD0_2,
+//    PMOD0_3,
+//    PMOD0_4,
+//    PMOD0_5,
+//    PMOD0_6,
+//    PMOD0_7
+    );
+//    PMOD1_0,
+//    PMOD1_1,
+//    PMOD1_2,
+//    PMOD1_3,
+//    PMOD1_4,
+//    PMOD1_5,
+//    PMOD1_6,
+//    PMOD1_7,
+//    dip_switch_4bits_tri_i,
+//    led_4bits_tri_o);
+
+
+
+//REFCLK24MHZ                 24        MHz
+//******************************************************************************
+BUFG uBUFG_REFCLK24MHZ    (.I(OSCCLK[0]), .O(REFCLK24MHZ));
+
+//ACLK  Big CPU        50        MHz
+//******************************************************************************
+BUFG uBUFG_iACLK        (.I(OSCCLK[1]), .O(ACLK));        //Big CPU        50        MHz
+BUFG uBUFG_iBCLK        (.I(OSCCLK[2]), .O(BCLK)); 
+//******************************************************************************
+// SMBMCLK     Micro SMB            25    MHz
+//******************************************************************************
+BUFG uBUFG_SMBM        (.I(SMBM_CLK),     .O(iSMBMCLK));    //Micro SMB
+
+//******************************************************************************
+// Main body of code
+// =================
+//******************************************************************************
+  assign SMBF_FIFOSEL  = 1'b0;
+  assign SMBF_ADDR	   = {7{1'b0}};
+  assign CLCD_BL       = 1'b0;                     // Extinguish LCD back light
+  // Minimum design tie-offs
+  assign MMB_IDCLK     = 1'b0;
+  assign EMMC_CLK      = 1'b0;
+  assign QSPI_nCS      = 1'b1;
+  assign QSPI_SCLK     = 1'b0;
+  assign IOFPGA_SYSWDT = 1'b0;
+  assign WDOG_RREQ     = 1'b0;
+  assign SMBM_nWAIT    = 1'b1;
+  assign CFG_DATAOUT   = 1'b0;
+  wire nRST;
+  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
+      rst_sync0 <= 1'b0;
+      rst_sync1 <= 1'b0;
+    end else begin
+      rst_sync0 <= 1'b1;
+      rst_sync1 <= rst_sync0;
+      rst_sync2 <= rst_sync1;
+    end
+
+    wire SWDITMS_0;
+    wire SWDOEN_0;
+    wire SWDO_0;
+
+    assign CS_TMS = (SWDOEN_0==1'b1) ? SWDO_0 : 1'bz;
+    assign SWDITMS_0 = CS_TMS;
+
+  megasoc_design megasoc_design_i
+       (.CLK_IN_0(ACLK),
+        .nRESET_0(nRST),
+
+        .QSPI_IO_e_0(),
+        .QSPI_IO_i_0(),
+        .QSPI_IO_o_0(),
+        .QSPI_SCLK_0(),
+        .QSPI_nCS_0(),
+
+        .UARTRXD_0(1'b0),
+        .UARTTXD_0(UART_TX_F[1]),
+
+        .SWCLKTCK_0(CS_TCK),
+        .SWDITMS_0(SWDITMS_0),
+        .SWDOEN_0(SWDOEN_0),
+        .SWDO_0(SWDO_0),
+        .TDI_0(),
+        .TDO_0(),
+        .nTDOEN_0(),
+        .nTRST_0(CS_nTRST));
+endmodule
diff --git a/makefile b/makefile
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e4bbcf0be4dac86a2742ad5e836b829e48e6f5a1 100644
--- a/makefile
+++ b/makefile
@@ -0,0 +1,122 @@
+#-----------------------------------------------------------------------------
+# MegaSoC Top-Level Makefile 
+# - Includes other Makefiles in flow directory
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Contributors
+#
+# Daniel Newbrook (d.newbrook@soton.ac.uk)
+#
+# Copyright (C) 2021-4, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+include $(SOCLABS_PROJECT_DIR)/megasoc.config
+
+#-------------------------------------
+# - Commonly Overloaded Variables
+#-------------------------------------
+# Name of test directory - Default Test is Hello World
+TESTNAME   ?= hello_world
+
+# Simulator type (mti/vcs/xm)
+SIMULATOR   = vcs
+
+# IS this for an ASIC Flow?
+ASIC ?= no
+
+# Are simulations to be run in fast mode? (i.e. RAMs preloaded)
+FAST_SIM ?= yes
+
+# Include the expansion subsystem?
+INC_EXP ?= no
+
+COMPILE_GCC ?= 0
+AARCH64 	?= 1
+export COMPILE_GCC
+export AARCH64
+#-------------------------------------
+# - Directory Setups
+#-------------------------------------
+# Directory of Testcodes
+TESTCODES_DIR    := $(SOCLABS_MEGASOC_TECH_DIR)/software/src
+TESTCODES_BUILD_DIR := $(SOCLABS_MEGASOC_TECH_DIR)/software/build
+export TESTCODES_BUILD_DIR
+
+# Project System Directory
+FPGA_IMP_DIR     := $(SOCLABS_PROJECT_DIR)/imp/fpga
+
+# Directory to put simulation files
+SIM_TOP_DIR ?= $(SOCLABS_PROJECT_DIR)/simulate/sim
+SIM_DIR      = $(SIM_TOP_DIR)/$(TESTNAME)
+
+#-------------------------------------
+# - Test List Variables
+#-------------------------------------
+# List of all tests (this is used when running 'make all/clean')
+TEST_LIST_FILE   ?= $(TESTCODES_DIR)/software_list.txt
+TEST_LIST         = $(shell cat $(TEST_LIST_FILE) | while read line || [ -n "$$line" ]; do echo $$line; done)
+
+#-------------------------------------
+# - Verilog Defines and Filelists
+#-------------------------------------
+# Simulator/Lint Defines
+DEFINES_VC  += +define+CORTEX_A53 +define+USE_TARMAC 
+
+# Set Variables depending on whether Expansion subsystem is included
+ifeq ($(INC_EXP),yes)
+	DEFINES_VC += +define+INC_EXP
+	MEGASOC_DEFINES += INC_EXP
+endif
+
+ifeq ($(ASIC),yes)
+	DESIGN_VC            ?= $(SOCLABS_PROJECT_DIR)/flist/project/top_ASIC.flist
+	MEGASOC_DEFINES      += ASIC_TEST_PORTS POWER_PINS
+else
+	DESIGN_VC            ?= $(SOCLABS_PROJECT_DIR)/flist/project/top_BEHAV.flist
+	TBENCH_VC            ?= $(SOCLABS_PROJECT_DIR)/flist/project/top_BEHAV.flist
+	TB_TOP               ?= megasoc_tb
+endif
+
+FPGA_DESIGN_VC ?= $(SOCLABS_PROJECT_DIR)/flist/project/top_FPGA.flist
+
+# Make variables visible to target shells
+export ARM_CORTEX_M0_DIR
+export ARM_CORSTONE_101_DIR
+export FLIST_INCLUDES
+export AMS
+# Location of Defines File
+DEFINES_DIR   := $(SOCLABS_PROJECT_DIR)/system/src/defines/
+DEFINES_FILE  := $(DEFINES_DIR)/gen_defines.v
+
+#------------------------------------------
+# - Include Makefiles for Specific Flows
+#------------------------------------------
+# Include Software Compilation Makefile
+include $(SOCLABS_PROJECT_DIR)/flows/makefile.software
+
+# Include Linting Makefile
+include $(SOCLABS_PROJECT_DIR)/flows/makefile.lint
+
+# Include Simulation Makefile
+include $(SOCLABS_PROJECT_DIR)/flows/makefile.simulate
+
+# Include Regression Simulation Makefile
+include $(SOCLABS_PROJECT_DIR)/flows/makefile.regression
+
+# Include FPGA Makefile
+include $(SOCLABS_PROJECT_DIR)/flows/makefile.fpga
+
+# Include Synthesis Makefile
+include $(SOCLABS_PROJECT_DIR)/flows/makefile.asic
+
+#------------------------------------------
+# - Common Targets Across Flows
+#------------------------------------------
+# Generate Defines File for MegaSoC
+gen_defs:
+	@mkdir -p $(DEFINES_DIR)
+	@$(SOCLABS_SOCTOOLS_FLOW_DIR)/bin/defines_compile.py -d $(MEGASOC_DEFINES) -o $(DEFINES_FILE)
+	
+clean_sim:
+	@rm -rf ./simulate
+
+clean: clean_sim clean_all_code
\ No newline at end of file
diff --git a/megasoc.config b/megasoc.config
new file mode 100644
index 0000000000000000000000000000000000000000..9e4e773beea50916a14d27039bc76e45d0e0df13
--- /dev/null
+++ b/megasoc.config
@@ -0,0 +1,12 @@
+#-----------------------------------------------------------------------------
+# MegaSoC Configuration file
+# A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+#
+# Copyright (C) 2021-4, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+#### IP Configuration 
+# !!EDIT this to point to the relevant logical directories of IP
+ARM_CORSTONE_101_DIR ?= $(ARM_IP_LIBRARY_PATH)/latest/Corstone-101/logical
+ARM_CORTEX_M0_DIR    ?= $(ARM_IP_LIBRARY_PATH)/latest/Cortex-M0/logical
+
diff --git a/megasoc_chip/chip/logical/megasoc_chip.v b/megasoc_chip/chip/logical/megasoc_chip.v
new file mode 100644
index 0000000000000000000000000000000000000000..b6233e14d980d11f4d24318f079cfacc9a8d48e7
--- /dev/null
+++ b/megasoc_chip/chip/logical/megasoc_chip.v
@@ -0,0 +1,63 @@
+//-----------------------------------------------------------------------------
+// MegaSoC Chip
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+// 
+// Copyright � 2021-4, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+// Modules instantiated:
+//  megasoc_system
+
+module megasoc_chip(
+    input wire CLK_IN,
+    input wire nRESET,
+
+    // QSPI signals
+    output wire         QSPI_SCLK,
+    output wire         QSPI_nCS,
+    output wire [3:0]   QSPI_IO_o,
+    input  wire [3:0]   QSPI_IO_i,
+    output wire [3:0]   QSPI_IO_e,
+
+    // UART signals
+    input  wire         UARTRXD,
+    output wire         UARTTXD,
+    output wire         UARTTXEN,
+
+    // DAP-lite Signals
+    input  wire         nTRST,
+    input  wire         SWCLKTCK,
+    input  wire         SWDITMS,
+    input  wire         TDI,
+    output wire         TDO,
+    output wire         nTDOEN,
+    output wire         SWDO,
+    output wire         SWDOEN
+
+);
+
+megasoc_system u_megasoc_system(
+    .CLK_IN(CLK_IN),
+    .nRESET(nRESET),
+    .QSPI_SCLK(QSPI_SCLK),
+    .QSPI_nCS(QSPI_nCS),
+    .QSPI_IO_o(QSPI_IO_o),
+    .QSPI_IO_i(QSPI_IO_i),
+    .QSPI_IO_e(QSPI_IO_e),
+    .UARTRXD(UARTRXD),
+    .UARTTXD(UARTTXD),
+    .UARTTXEN(UARTTXEN),
+    .nTRST(nTRST),
+    .SWCLKTCK(SWCLKTCK),
+    .SWDITMS(SWDITMS),
+    .TDI(TDI),
+    .TDO(TDO),
+    .nTDOEN(nTDOEN),
+    .SWDO(SWDO),
+    .SWDOEN(SWDOEN)
+);
+
+endmodule
\ No newline at end of file
diff --git a/megasoc_chip/chip/logical/millisoc_chip.v b/megasoc_chip/chip/logical/millisoc_chip.v
deleted file mode 100644
index 7073420d85278f1a6d5cedbffa203470b2c31f64..0000000000000000000000000000000000000000
--- a/megasoc_chip/chip/logical/millisoc_chip.v
+++ /dev/null
@@ -1,20 +0,0 @@
-//-----------------------------------------------------------------------------
-// MegaSoC Chip
-// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
-//
-// Contributors
-//
-// Daniel Newbrook (d.newbrook@soton.ac.uk)
-// 
-// Copyright � 2021-4, SoC Labs (www.soclabs.org)
-//-----------------------------------------------------------------------------
-// Modules instantiated:
-//  megasoc_system
-
-module megasoc_chip(
-
-);
-
-
-
-endmodule
\ No newline at end of file
diff --git a/megasoc_chip/pads/glib/logical/megasoc_chip_pads.v b/megasoc_chip/pads/glib/logical/megasoc_chip_pads.v
index 4048dc442a0f7bfef7e08fd3ebd417533ee5aa14..ccd5c1986245980a316ff050fbef7d2efb6d8f3f 100644
--- a/megasoc_chip/pads/glib/logical/megasoc_chip_pads.v
+++ b/megasoc_chip/pads/glib/logical/megasoc_chip_pads.v
@@ -12,12 +12,73 @@
 //  megasoc_chip
 
 module megasoc_chip_pads(
+`ifdef POWER_PINS
+    inout wire      VDD,
+    inout wire      VSS,
+    inout wire      AVDD,
+    inout wire      AVSS,
+    inout wire      VDDACC,
+`endif 
+    // Clocks and Reset
+    input  wire         REF_CLK_XTAL1,
+    output wire         REF_CLK_XTAL2,
+    input  wire         PORESTn,
+    input  wire         nSRST,
+
+    // GPIO
+    inout  wire [15:0]  GPIO_P0,
+    inout  wire [15:0]  GPIO_P1,
+
+    // SWD/JTAG TRACE - for Mictor 38
+    output wire         TDO_SWO, 
+    input  wire         RTCK,
+    input  wire         TDI,
+    input  wire         TCK_SWCLK, 
+    inout  wire         TMS_SWDIO, 
+    input  wire         nTRST,
+    output wire [15:0]  TRACEDATA,
+    input  wire         TRACECLK,
+    input  wire         TRACECTL,
+    input  wire         DBGRQ,
+    output wire         DBGACK,
+
+    // QSPI Interface
+    output wire         QSPI_SCLK,
+    inout  wire [3:0]   QSPI_IO,
+    output wire         QSPI_nCS
+
+    // Ethernet
+
+    // DDR
+
+    // USB
+
 
 );
 
+wire [3:0]   QSPI_IO_o;
+wire [3:0]   QSPI_IO_i;
+wire [3:0]   QSPI_IO_e;
 
-megasoc_chip u_megasoc_chip(
+assign QSPI_IO[0] = QSPI_IO_e[0] ? QSPI_IO_o[0] : 1'bz;
+assign QSPI_IO[1] = QSPI_IO_e[1] ? QSPI_IO_o[1] : 1'bz;
+assign QSPI_IO[2] = QSPI_IO_e[2] ? QSPI_IO_o[2] : 1'bz;
+assign QSPI_IO[3] = QSPI_IO_e[3] ? QSPI_IO_o[3] : 1'bz;
+
+assign QSPI_IO_i[0] = QSPI_IO[0];
+assign QSPI_IO_i[1] = QSPI_IO[1];
+assign QSPI_IO_i[2] = QSPI_IO[2];
+assign QSPI_IO_i[3] = QSPI_IO[3];
 
+
+megasoc_chip u_megasoc_chip(
+    .CLK_IN(REF_CLK_XTAL1),
+    .nRESET(PORESTn),
+    .QSPI_SCLK(QSPI_SCLK),
+    .QSPI_nCS(QSPI_nCS),
+    .QSPI_IO_o(QSPI_IO_o),
+    .QSPI_IO_i(QSPI_IO_i),
+    .QSPI_IO_e(QSPI_IO_e)
 );
 
 
diff --git a/megasoc_system/logical/megasoc_system.v b/megasoc_system/logical/megasoc_system.v
index 87c0dba565c93e8d5fe1e6b5fdce5849daf7d002..31bc96365ca48e7e81c81d28048bf468a3e205a8 100644
--- a/megasoc_system/logical/megasoc_system.v
+++ b/megasoc_system/logical/megasoc_system.v
@@ -12,18 +12,302 @@
 //  megasoc_tech_wrapper
 //  expansion_subsystem_wrapper
 
+`include "gen_defines.v"
 module megasoc_system(
+    input wire          CLK_IN,
+    input wire          nRESET,
+
+    // QSPI Signals
+    output wire         QSPI_SCLK,
+    output wire         QSPI_nCS,
+    output wire [3:0]   QSPI_IO_o,
+    input  wire [3:0]   QSPI_IO_i,
+    output wire [3:0]   QSPI_IO_e,
+
+    // UART signals
+    input  wire         UARTRXD,
+    output wire         UARTTXD,
+    output wire         UARTTXEN,
+
+    // DAP-LITE external signals
+    input  wire         nTRST,
+    input  wire         SWCLKTCK,
+    input  wire         SWDITMS,
+    input  wire         TDI,
+    output wire         TDO,
+    output wire         nTDOEN,
+    output wire         SWDO,
+    output wire         SWDOEN
+
 
 );
 
+wire [1:0]      AXI_SYS_EXP_awid;
+wire [31:0]     AXI_SYS_EXP_awaddr;
+wire [7:0]      AXI_SYS_EXP_awlen;
+wire [2:0]      AXI_SYS_EXP_awsize;
+wire [1:0]      AXI_SYS_EXP_awburst;
+wire            AXI_SYS_EXP_awlock;
+wire [3:0]      AXI_SYS_EXP_awcache;
+wire [2:0]      AXI_SYS_EXP_awprot;
+wire            AXI_SYS_EXP_awvalid;
+wire            AXI_SYS_EXP_awready;
+wire [63:0]     AXI_SYS_EXP_wdata;
+wire [7:0]      AXI_SYS_EXP_wstrb;
+wire            AXI_SYS_EXP_wlast;
+wire            AXI_SYS_EXP_wvalid;
+wire            AXI_SYS_EXP_wready;
+wire  [1:0]     AXI_SYS_EXP_bid;
+wire  [1:0]     AXI_SYS_EXP_bresp;
+wire            AXI_SYS_EXP_bvalid;
+wire            AXI_SYS_EXP_bready;
+wire [1:0]      AXI_SYS_EXP_arid;
+wire [31:0]     AXI_SYS_EXP_araddr;
+wire [7:0]      AXI_SYS_EXP_arlen;
+wire [2:0]      AXI_SYS_EXP_arsize;
+wire [1:0]      AXI_SYS_EXP_arburst;
+wire            AXI_SYS_EXP_arlock;
+wire [3:0]      AXI_SYS_EXP_arcache;
+wire [2:0]      AXI_SYS_EXP_arprot;
+wire            AXI_SYS_EXP_arvalid;
+wire            AXI_SYS_EXP_arready;
+wire  [1:0]     AXI_SYS_EXP_rid;
+wire  [63:0]    AXI_SYS_EXP_rdata;
+wire  [1:0]     AXI_SYS_EXP_rresp;
+wire            AXI_SYS_EXP_rlast;
+wire            AXI_SYS_EXP_rvalid;
+wire            AXI_SYS_EXP_rready;
 
+wire            AXI_EXP_SYS_awid;
+wire  [31:0]    AXI_EXP_SYS_awaddr;
+wire  [7:0]     AXI_EXP_SYS_awlen;
+wire  [2:0]     AXI_EXP_SYS_awsize;
+wire  [1:0]     AXI_EXP_SYS_awburst;
+wire            AXI_EXP_SYS_awlock;
+wire  [3:0]     AXI_EXP_SYS_awcache;
+wire  [2:0]     AXI_EXP_SYS_awprot;
+wire            AXI_EXP_SYS_awvalid;
+wire            AXI_EXP_SYS_awready;
+wire  [63:0]    AXI_EXP_SYS_wdata;
+wire  [7:0]     AXI_EXP_SYS_wstrb;
+wire            AXI_EXP_SYS_wlast;
+wire            AXI_EXP_SYS_wvalid;
+wire            AXI_EXP_SYS_wready;
+wire            AXI_EXP_SYS_bid;
+wire [1:0]      AXI_EXP_SYS_bresp;
+wire            AXI_EXP_SYS_bvalid;
+wire            AXI_EXP_SYS_bready;
+wire            AXI_EXP_SYS_arid;
+wire  [31:0]    AXI_EXP_SYS_araddr;
+wire  [7:0]     AXI_EXP_SYS_arlen;
+wire  [2:0]     AXI_EXP_SYS_arsize;
+wire  [1:0]     AXI_EXP_SYS_arburst;
+wire            AXI_EXP_SYS_arlock;
+wire  [3:0]     AXI_EXP_SYS_arcache;
+wire  [2:0]     AXI_EXP_SYS_arprot;
+wire            AXI_EXP_SYS_arvalid;
+wire            AXI_EXP_SYS_arready;
+wire            AXI_EXP_SYS_rid;
+wire [63:0]     AXI_EXP_SYS_rdata;
+wire [1:0]      AXI_EXP_SYS_rresp;
+wire            AXI_EXP_SYS_rlast;
+wire            AXI_EXP_SYS_rvalid;
+wire            AXI_EXP_SYS_rready;
 
 megasoc_tech_wrapper u_megasoc_tech_wrapper(
+    .SYS_CLK(CLK_IN),
+    .SYS_CLKEN(1'b1),
+    .SYS_RESETn(nRESET),
+
+    // Millisoc system AXI Manager
+    .AXI_SYS_EXP_awid(AXI_SYS_EXP_awid),
+    .AXI_SYS_EXP_awaddr(AXI_SYS_EXP_awaddr),
+    .AXI_SYS_EXP_awlen(AXI_SYS_EXP_awlen),
+    .AXI_SYS_EXP_awsize(AXI_SYS_EXP_awsize),
+    .AXI_SYS_EXP_awburst(AXI_SYS_EXP_awburst),
+    .AXI_SYS_EXP_awlock(AXI_SYS_EXP_awlock),
+    .AXI_SYS_EXP_awcache(AXI_SYS_EXP_awcache),
+    .AXI_SYS_EXP_awprot(AXI_SYS_EXP_awprot),
+    .AXI_SYS_EXP_awvalid(AXI_SYS_EXP_awvalid),
+    .AXI_SYS_EXP_awready(AXI_SYS_EXP_awready),
+    .AXI_SYS_EXP_wdata(AXI_SYS_EXP_wdata),
+    .AXI_SYS_EXP_wstrb(AXI_SYS_EXP_wstrb),
+    .AXI_SYS_EXP_wlast(AXI_SYS_EXP_wlast),
+    .AXI_SYS_EXP_wvalid(AXI_SYS_EXP_wvalid),
+    .AXI_SYS_EXP_wready(AXI_SYS_EXP_wready),
+    .AXI_SYS_EXP_bid(AXI_SYS_EXP_bid),
+    .AXI_SYS_EXP_bresp(AXI_SYS_EXP_bresp),
+    .AXI_SYS_EXP_bvalid(AXI_SYS_EXP_bvalid),
+    .AXI_SYS_EXP_bready(AXI_SYS_EXP_bready),
+    .AXI_SYS_EXP_arid(AXI_SYS_EXP_arid),
+    .AXI_SYS_EXP_araddr(AXI_SYS_EXP_araddr),
+    .AXI_SYS_EXP_arlen(AXI_SYS_EXP_arlen),
+    .AXI_SYS_EXP_arsize(AXI_SYS_EXP_arsize),
+    .AXI_SYS_EXP_arburst(AXI_SYS_EXP_arburst),
+    .AXI_SYS_EXP_arlock(AXI_SYS_EXP_arlock),
+    .AXI_SYS_EXP_arcache(AXI_SYS_EXP_arcache),
+    .AXI_SYS_EXP_arprot(AXI_SYS_EXP_arprot),
+    .AXI_SYS_EXP_arvalid(AXI_SYS_EXP_arvalid),
+    .AXI_SYS_EXP_arready(AXI_SYS_EXP_arready),
+    .AXI_SYS_EXP_rid(AXI_SYS_EXP_rid),
+    .AXI_SYS_EXP_rdata(AXI_SYS_EXP_rdata),
+    .AXI_SYS_EXP_rresp(AXI_SYS_EXP_rresp),
+    .AXI_SYS_EXP_rlast(AXI_SYS_EXP_rlast),
+    .AXI_SYS_EXP_rvalid(AXI_SYS_EXP_rvalid),
+    .AXI_SYS_EXP_rready(AXI_SYS_EXP_rready),
+    
 
+    // Millisoc system AXI Subordinate
+    .AXI_EXP_SYS_awid(AXI_EXP_SYS_awid),
+    .AXI_EXP_SYS_awaddr(AXI_EXP_SYS_awaddr),
+    .AXI_EXP_SYS_awlen(AXI_EXP_SYS_awlen),
+    .AXI_EXP_SYS_awsize(AXI_EXP_SYS_awsize),
+    .AXI_EXP_SYS_awburst(AXI_EXP_SYS_awburst),
+    .AXI_EXP_SYS_awlock(AXI_EXP_SYS_awlock),
+    .AXI_EXP_SYS_awcache(AXI_EXP_SYS_awcache),
+    .AXI_EXP_SYS_awprot(AXI_EXP_SYS_awprot),
+    .AXI_EXP_SYS_awvalid(AXI_EXP_SYS_awvalid),
+    .AXI_EXP_SYS_awready(AXI_EXP_SYS_awready),
+    .AXI_EXP_SYS_wdata(AXI_EXP_SYS_wdata),
+    .AXI_EXP_SYS_wstrb(AXI_EXP_SYS_wstrb),
+    .AXI_EXP_SYS_wlast(AXI_EXP_SYS_wlast),
+    .AXI_EXP_SYS_wvalid(AXI_EXP_SYS_wvalid),
+    .AXI_EXP_SYS_wready(AXI_EXP_SYS_wready),
+    .AXI_EXP_SYS_bid(AXI_EXP_SYS_bid),
+    .AXI_EXP_SYS_bresp(AXI_EXP_SYS_bresp),
+    .AXI_EXP_SYS_bvalid(AXI_EXP_SYS_bvalid),
+    .AXI_EXP_SYS_bready(AXI_EXP_SYS_bready),
+    .AXI_EXP_SYS_arid(AXI_EXP_SYS_arid),
+    .AXI_EXP_SYS_araddr(AXI_EXP_SYS_araddr),
+    .AXI_EXP_SYS_arlen(AXI_EXP_SYS_arlen),
+    .AXI_EXP_SYS_arsize(AXI_EXP_SYS_arsize),
+    .AXI_EXP_SYS_arburst(AXI_EXP_SYS_arburst),
+    .AXI_EXP_SYS_arlock(AXI_EXP_SYS_arlock),
+    .AXI_EXP_SYS_arcache(AXI_EXP_SYS_arcache),
+    .AXI_EXP_SYS_arprot(AXI_EXP_SYS_arprot),
+    .AXI_EXP_SYS_arvalid(AXI_EXP_SYS_arvalid),
+    .AXI_EXP_SYS_arready(AXI_EXP_SYS_arready),
+    .AXI_EXP_SYS_rid(AXI_EXP_SYS_rid),
+    .AXI_EXP_SYS_rdata(AXI_EXP_SYS_rdata),
+    .AXI_EXP_SYS_rresp(AXI_EXP_SYS_rresp),
+    .AXI_EXP_SYS_rlast(AXI_EXP_SYS_rlast),
+    .AXI_EXP_SYS_rvalid(AXI_EXP_SYS_rvalid),
+    .AXI_EXP_SYS_rready(AXI_EXP_SYS_rready),
+    .QSPI_SCLK(QSPI_SCLK),
+    .QSPI_nCS(QSPI_nCS),
+    .QSPI_IO_o(QSPI_IO_o),
+    .QSPI_IO_i(QSPI_IO_i),
+    .QSPI_IO_e(QSPI_IO_e),
+    .UARTRXD(UARTRXD),
+    .UARTTXD(UARTTXD),
+    .UARTTXEN(UARTTXEN),
+    .nTRST(nTRST),
+    .SWCLKTCK(SWCLKTCK),
+    .SWDITMS(SWDITMS),
+    .TDI(TDI),
+    .TDO(TDO),
+    .nTDOEN(nTDOEN),
+    .SWDO(SWDO),
+    .SWDOEN(SWDOEN)
 );
 
+`ifdef INC_EXP
 expansion_subsystem_wrapper u_megasoc_expansion_wrapper(
+    .sys_clk(),
+    .resetn(),
+    .exp_clk(),
+    .exp_clken(),
+    .expresetn(),
 
-);
+    // System Clock domain control
+    .CSYSREQ_CD_sys(),
+    .CSYSACK_CD_sys(),
+    .CACTIVE_CD_sys(),
+
+    // Expansion Clock domain control
+    .CSYSREQ_CD_exp(),
+    .CSYSACK_CD_exp(),
+    .CACTIVE_CD_exp(),
+
+    // AXI Expansion input port 
+    .AXI_EXP_SS_awid(AXI_SYS_EXP_awid),
+    .AXI_EXP_SS_awaddr(AXI_SYS_EXP_awaddr),
+    .AXI_EXP_SS_awlen(AXI_SYS_EXP_awlen),
+    .AXI_EXP_SS_awsize(AXI_SYS_EXP_awsize),
+    .AXI_EXP_SS_awburst(AXI_SYS_EXP_awburst),
+    .AXI_EXP_SS_awlock(AXI_SYS_EXP_awlock),
+    .AXI_EXP_SS_awcache(AXI_SYS_EXP_awcache),
+    .AXI_EXP_SS_awprot(AXI_SYS_EXP_awprot),
+    .AXI_EXP_SS_awvalid(AXI_SYS_EXP_awvalid),
+    .AXI_EXP_SS_awready(AXI_SYS_EXP_awready),
+    .AXI_EXP_SS_wdata(AXI_SYS_EXP_wdata),
+    .AXI_EXP_SS_wstrb(AXI_SYS_EXP_wstrb),
+    .AXI_EXP_SS_wlast(AXI_SYS_EXP_wlast),
+    .AXI_EXP_SS_wvalid(AXI_SYS_EXP_wvalid),
+    .AXI_EXP_SS_wready(AXI_SYS_EXP_wready),
+    .AXI_EXP_SS_bid(AXI_SYS_EXP_bid),
+    .AXI_EXP_SS_bresp(AXI_SYS_EXP_bresp),
+    .AXI_EXP_SS_bvalid(AXI_SYS_EXP_bvalid),
+    .AXI_EXP_SS_bready(AXI_SYS_EXP_bready),
+    .AXI_EXP_SS_arid(AXI_SYS_EXP_arid),
+    .AXI_EXP_SS_araddr(AXI_SYS_EXP_araddr),
+    .AXI_EXP_SS_arlen(AXI_SYS_EXP_arlen),
+    .AXI_EXP_SS_arsize(AXI_SYS_EXP_arsize),
+    .AXI_EXP_SS_arburst(AXI_SYS_EXP_arburst),
+    .AXI_EXP_SS_arlock(AXI_SYS_EXP_arlock),
+    .AXI_EXP_SS_arcache(AXI_SYS_EXP_arcache),
+    .AXI_EXP_SS_arprot(AXI_SYS_EXP_arprot),
+    .AXI_EXP_SS_arvalid(AXI_SYS_EXP_arvalid),
+    .AXI_EXP_SS_arready(AXI_SYS_EXP_arready),
+    .AXI_EXP_SS_rid(AXI_SYS_EXP_rid),
+    .AXI_EXP_SS_rdata(AXI_SYS_EXP_rdata),
+    .AXI_EXP_SS_rresp(AXI_SYS_EXP_rresp),
+    .AXI_EXP_SS_rlast(AXI_SYS_EXP_rlast),
+    .AXI_EXP_SS_rvalid(AXI_SYS_EXP_rvalid),
+    .AXI_EXP_SS_rready(AXI_SYS_EXP_rready),
 
+    // AXI System output port
+    .AXI_SYS_awid(AXI_EXP_SYS_awid),
+    .AXI_SYS_awaddr(AXI_EXP_SYS_awaddr),
+    .AXI_SYS_awlen(AXI_EXP_SYS_awlen),
+    .AXI_SYS_awsize(AXI_EXP_SYS_awsize),
+    .AXI_SYS_awburst(AXI_EXP_SYS_awburst),
+    .AXI_SYS_awlock(AXI_EXP_SYS_awlock),
+    .AXI_SYS_awcache(AXI_EXP_SYS_awcache),
+    .AXI_SYS_awprot(AXI_EXP_SYS_awprot),
+    .AXI_SYS_awvalid(AXI_EXP_SYS_awvalid),
+    .AXI_SYS_awready(AXI_EXP_SYS_awready),
+    .AXI_SYS_wdata(AXI_EXP_SYS_wdata),
+    .AXI_SYS_wstrb(AXI_EXP_SYS_wstrb),
+    .AXI_SYS_wlast(AXI_EXP_SYS_wlast),
+    .AXI_SYS_wvalid(AXI_EXP_SYS_wvalid),
+    .AXI_SYS_wready(AXI_EXP_SYS_wready),
+    .AXI_SYS_bid(AXI_EXP_SYS_bid),
+    .AXI_SYS_bresp(AXI_EXP_SYS_bresp),
+    .AXI_SYS_bvalid(AXI_EXP_SYS_bvalid),
+    .AXI_SYS_bready(AXI_EXP_SYS_bready),
+    .AXI_SYS_arid(AXI_EXP_SYS_arid),
+    .AXI_SYS_araddr(AXI_EXP_SYS_araddr),
+    .AXI_SYS_arlen(AXI_EXP_SYS_arlen),
+    .AXI_SYS_arsize(AXI_EXP_SYS_arsize),
+    .AXI_SYS_arburst(AXI_EXP_SYS_arburst),
+    .AXI_SYS_arlock(AXI_EXP_SYS_arlock),
+    .AXI_SYS_arcache(AXI_EXP_SYS_arcache),
+    .AXI_SYS_arprot(AXI_EXP_SYS_arprot),
+    .AXI_SYS_arvalid(AXI_EXP_SYS_arvalid),
+    .AXI_SYS_arready(AXI_EXP_SYS_arready),
+    .AXI_SYS_rid(AXI_EXP_SYS_rid),
+    .AXI_SYS_rdata(AXI_EXP_SYS_rdata),
+    .AXI_SYS_rresp(AXI_EXP_SYS_rresp),
+    .AXI_SYS_rlast(AXI_EXP_SYS_rlast),
+    .AXI_SYS_rvalid(AXI_EXP_SYS_rvalid),
+    .AXI_SYS_rready(AXI_EXP_SYS_rready),
+
+    // Interrupts
+    .irq_dma_channel(),
+    .irq_dma_comb_nonsec()
+);
+`else 
+    assign AXI_EXP_SYS_rready=1'b0;
+`endif
 endmodule
diff --git a/megasoc_tech b/megasoc_tech
index 8f3b1ab2d812186541a6ce85be26cd2d900bd044..1d407a5f8ab1a828ab9933ae004e0e1bd7a04d58 160000
--- a/megasoc_tech
+++ b/megasoc_tech
@@ -1 +1 @@
-Subproject commit 8f3b1ab2d812186541a6ce85be26cd2d900bd044
+Subproject commit 1d407a5f8ab1a828ab9933ae004e0e1bd7a04d58
diff --git a/verif/control/logical/megasoc_clkreset.v b/verif/control/logical/megasoc_clkreset.v
new file mode 100644
index 0000000000000000000000000000000000000000..a26ac6258e5b512fc685a2e7f2fa55c08ba458b8
--- /dev/null
+++ b/verif/control/logical/megasoc_clkreset.v
@@ -0,0 +1,75 @@
+//-----------------------------------------------------------------------------
+// MegaSoC clock and power on generator adapted from Arm CMSDK Simple clock and power on reset generator
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// 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
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Simple clock and power on reset generator
+//-----------------------------------------------------------------------------
+`timescale 1ns/1ps
+
+module megasoc_clkreset(
+  output wire CLK,
+  output wire NRST,
+  output wire NRST_early,
+  output wire NRST_late,
+  output wire NRST_ext
+  );
+
+  reg clock_q;
+
+  reg [15:0] shifter;
+  
+  initial
+    begin
+      clock_q   <= 1'b0;
+      shifter   <= 16'h0000;
+      #40 clock_q <= 1'b1;
+    end
+
+  always @(clock_q)
+      #5 clock_q <= !clock_q;  // 10ns period, 100MHz
+
+  assign CLK = clock_q;
+
+  always @(posedge clock_q)
+    if (! (&shifter)) // until full...
+      shifter   <= {shifter[14:0], 1'b1}; // shift left, fill with 1's
+
+  assign NRST_early =  shifter[ 7];
+  assign NRST       =  shifter[ 8];
+  assign NRST_late  =  shifter[9] ;
+  assign NRST_ext   =  shifter[15];
+
+endmodule
+
+
+
diff --git a/verif/testbench/logical/megasoc_project_tb.v b/verif/testbench/logical/megasoc_project_tb.v
deleted file mode 100644
index 649f56d41a8636bb4373fc5d4c4b27d80abb973c..0000000000000000000000000000000000000000
--- a/verif/testbench/logical/megasoc_project_tb.v
+++ /dev/null
@@ -1,25 +0,0 @@
-//-----------------------------------------------------------------------------
-// MegaSoC Chip testbench
-// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
-//
-// Contributors
-//
-// Daniel Newbrook (d.newbrook@soton.ac.uk)
-// 
-// Copyright � 2021-4, SoC Labs (www.soclabs.org)
-//-----------------------------------------------------------------------------
-// Modules instantiated:
-//  megasoc_chip_pads
-`timescale 1ns/1ps
-
-module megasoc_chip_tb
-
-
-
-
-megasoc_chip_pads u_megasoc_chip_pads(
-
-)
-
-
-endmodule
diff --git a/verif/testbench/logical/megasoc_tb.sv b/verif/testbench/logical/megasoc_tb.sv
new file mode 100644
index 0000000000000000000000000000000000000000..813c0d9f52abf54dd3d26b0b0962d0769262dc09
--- /dev/null
+++ b/verif/testbench/logical/megasoc_tb.sv
@@ -0,0 +1,120 @@
+//-----------------------------------------------------------------------------
+// MegaSoC Chip testbench
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+// 
+// Copyright � 2021-4, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+// Modules instantiated:
+//  megasoc_chip_pads
+`timescale 1ns/1ps
+
+module megasoc_tb();
+
+`define CORTEXA53_UNIVENT_DPI_CAPTURE
+`define CORTEXA53_UNIVENT 
+
+wire EXT_CLK;
+wire nRESET;
+
+wire         QSPI_SCLK;
+wire [3:0]   QSPI_IO;
+wire         QSPI_nCS;
+
+megasoc_clkreset u_megasoc_clkreset(
+    .CLK(EXT_CLK),
+    .NRST(nRESET)
+);
+
+`define MEGASOC_TECH_WRAPPER u_megasoc_chip_pads.u_megasoc_chip.u_megasoc_system.u_megasoc_tech_wrapper
+`define MEGASOC_ROM `MEGASOC_TECH_WRAPPER.u_ROM_wrapper.u_ROM
+`define MEGASOC_SRAM `MEGASOC_TECH_WRAPPER.u_SRAM_wrapper.u_SRAM
+
+initial begin 
+    $readmemh("bootloader.hex", `MEGASOC_ROM.mem, 32'h0000_0000);
+    $readmemh("app_ram.v8-a.hex", `MEGASOC_SRAM.mem, 32'h0000_0000);
+    //#1 $readmemh("app_flash.v8-a.hex", FLASH.I0.memory);
+
+end
+
+megasoc_chip_pads u_megasoc_chip_pads(
+    .REF_CLK_XTAL1(EXT_CLK),
+    .REF_CLK_XTAL2(),
+    .PORESTn(nRESET),
+    .nSRST(nRESET),
+    .GPIO_P0(),
+    .GPIO_P1(),
+    .TDO_SWO(), 
+    .RTCK(),
+    .TDI(),
+    .TCK_SWCLK(), 
+    .TMS_SWDIO(), 
+    .nTRST(),
+    .TRACEDATA(),
+    .TRACECLK(),
+    .TRACECTL(),
+    .DBGRQ(),
+    .DBGACK(),
+    .QSPI_SCLK(QSPI_SCLK),
+    .QSPI_IO(QSPI_IO),
+    .QSPI_nCS(QSPI_nCS)
+);
+
+// sst26vf064b FLASH(
+//     .SCK(QSPI_SCLK),
+//     .SIO(QSPI_IO),
+//     .CEb(QSPI_nCS)
+// );
+
+`define MEGASOC_PERIPHERALS u_megasoc_chip_pads.u_megasoc_chip.u_megasoc_system.u_megasoc_tech_wrapper.u_megasoc_peripheral_subsystem
+`define MEGASOC_UART `MEGASOC_PERIPHERALS.u_apb_uart_0
+
+// Clock 100 MHz
+// Baudrate 115200
+wire BAUDx16;
+assign BAUDx16 = `MEGASOC_UART.BAUDTICK;
+
+
+wire UARTXD =  `MEGASOC_UART.TXD;
+reg  UARTXD_del;
+always @(negedge nRESET or posedge BAUDx16) begin
+    if (!nRESET)
+        UARTXD_del <= 1'b0;
+    else
+        UARTXD_del <= UARTXD; // delay one BAUD_TICK-time
+end
+
+wire UARTXD_edge = UARTXD_del ^ UARTXD; // edge detect
+
+
+reg [3:0] pllq;
+always @(negedge nRESET or posedge BAUDx16) begin 
+    if(~nRESET) 
+        pllq <= 4'h0;
+    else begin 
+        if (UARTXD_edge)
+            pllq[3:0] <= 4'b0110;
+        else 
+            pllq[3:0] <= pllq[3:0] -1'b1;
+    end
+end
+
+wire baud_clk = pllq[3];
+
+wire uart_clk;
+
+megasoc_uart_capture #(.LOGFILENAME("logs/uart.log"), .VERBOSE(1)) u_uart_capture(
+    .RESETn(nRESET),
+    .CLK(baud_clk),
+    .RXD(UARTXD),
+    .DEBUG_TESTER_ENABLE  (),
+    .SIMULATIONEND        (),      // This signal set to 1 at the end of simulation.
+    .AUXCTRL              ()
+);
+
+
+
+endmodule
diff --git a/verif/trace/megasoc_uart_capture.v b/verif/trace/megasoc_uart_capture.v
new file mode 100644
index 0000000000000000000000000000000000000000..3e50fe4ff84cfef676820fc9fe742c0498c217cd
--- /dev/null
+++ b/verif/trace/megasoc_uart_capture.v
@@ -0,0 +1,251 @@
+//-----------------------------------------------------------------------------
+// NanoSoC UART RXD capture with file logging adapted from Arm CMSDK Uart Capture
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Flynn (d.w.flynn@soton.ac.uk)
+//
+// Copyright � 2021, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+// 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
+//
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : A device to capture serial data
+//-----------------------------------------------------------------------------
+// This module assume CLK is same frequency as baud rate.
+// In the example UART a test mode is used to enable data output as maximum
+// speed (PCLK).  In such case we can connect CLK signal directly to PCLK.
+// Otherwise, if the UART baud rate is reduced, the CLK rate has to be reduced
+// accordingly as well.
+//
+// This module stop the simulation when character 0x04 is received.
+// An output called SIMULATION_END is set for 1 cycle before simulation is
+// terminated to allow other testbench component like profiler (if any)
+// to output reports before the simulation stop.
+//
+// This model also support ESCAPE (0x1B, decimal 27) code sequence
+// ESC - 0x10 - XY    Capture XY to AUXCTRL output
+// ESC - 0x11         Set DEBUG_TESTER_ENABLE to 1
+// ESC - 0x12         Clear DEBUG_TESTER_ENABLE to 0
+
+
+module megasoc_uart_capture
+  #(parameter LOGFILENAME = "uart.log",
+    parameter VERBOSE = 0)
+  (
+  input  wire       RESETn,              // Power on reset
+  input  wire       CLK,                 // Clock (baud rate)
+  input  wire       RXD,                 // Received data
+  output wire       SIMULATIONEND,       // Simulation end indicator
+  output wire       DEBUG_TESTER_ENABLE, // Enable debug tester
+  output wire [7:0] AUXCTRL);            // Auxiliary control
+
+  reg [8:0]        rx_shift_reg;
+  wire [8:0]       nxt_rx_shift;
+  reg [6:0]        string_length;
+  reg [7:0]        tube_string [127:0];
+  reg [7:0]        text_char;
+  integer          i;
+  reg              nxt_end_simulation;
+  reg              reg_end_simulation;
+  wire             char_received;
+  reg              reg_esc_code_mode;  // Escape code mode
+  reg              reg_aux_ctrl_mode;  // Auxiliary control capture mode
+  reg [7:0]        reg_aux_ctrl;       // Registered Auxiliary control
+  reg              reg_dbgtester_enable;
+
+   integer        mcd;       // channel descriptor for log file output
+   reg [40*8-1:0] log_file;  // File name can't be > *40* characters
+
+`define UartSTDOUT 32'h00000001
+   initial
+     begin
+       $timeformat(-9, 0, " ns", 14);
+       log_file = LOGFILENAME;
+       mcd = $fopen(log_file);
+       mcd = mcd | `UartSTDOUT; // always echo to console
+       if(mcd == 0) begin
+         $fwrite(mcd,"tarmac: Error, zero returned in response to $fopen\n");
+         $finish(2);
+       end
+       $fwrite(mcd,"uartcapture: Generating output file %0s using MCD %x @ %m\n",
+              log_file, mcd);
+     end
+
+  // Receive shift register
+  assign nxt_rx_shift  = {RXD,rx_shift_reg[8:1]};
+  assign char_received = (rx_shift_reg[0]==1'b0);
+
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      rx_shift_reg <= {9{1'b1}};
+    else
+      if (rx_shift_reg[0]==1'b0) // Start bit reach bit[0]
+        rx_shift_reg <= {9{1'b1}};
+      else
+        rx_shift_reg <= nxt_rx_shift;
+  end
+
+  // Escape code mode register
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_esc_code_mode <= 1'b0;
+    else // Set to escape mode if ESC code is detected
+      if (char_received & (reg_esc_code_mode==1'b0) & (rx_shift_reg[8:1]==8'h1B))
+        reg_esc_code_mode <= 1'b1;
+      else if (char_received)
+        reg_esc_code_mode <= 1'b0;
+  end
+
+  // Aux Ctrl capture mode register
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_aux_ctrl_mode <= 1'b0;
+    else // Set to Aux control capture mode if ESC-0x10 sequence is detected
+      if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h10))
+        reg_aux_ctrl_mode <= 1'b1;
+      else if (char_received)
+        reg_aux_ctrl_mode <= 1'b0;
+  end
+
+  // Aux Ctrl capture data register
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_aux_ctrl <= {8{1'b0}};
+    else // Capture received data to Aux control output if reg_aux_ctrl_mode is set
+      if (char_received & (reg_aux_ctrl_mode==1'b1))
+        reg_aux_ctrl <= rx_shift_reg[8:1];
+  end
+
+  assign AUXCTRL = reg_aux_ctrl;
+
+  // Debug tester enable
+  always @(posedge CLK or negedge RESETn)
+  begin
+    if (~RESETn)
+      reg_dbgtester_enable <= 1'b0;
+    else // Enable debug tester if ESC-0x11 sequence is detected
+      if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h11))
+        reg_dbgtester_enable <= 1'b1;
+      else if (char_received & (reg_esc_code_mode==1'b1) & (rx_shift_reg[8:1]==8'h12))
+        // Disable debug tester if ESC-0x12 sequence is detected
+        reg_dbgtester_enable <= 1'b0;
+  end
+
+  assign DEBUG_TESTER_ENABLE = reg_dbgtester_enable;
+
+  // Message display
+  always @ (posedge CLK or negedge RESETn)
+  begin: p_tube
+  if (~RESETn)
+    begin
+    string_length = 7'b0;
+    nxt_end_simulation <= 1'b0;
+    for (i=0; i<= 127; i=i+1) begin
+       tube_string [i] = 8'h00;
+    end
+    end
+  else
+    if (char_received)
+        begin
+        if ((rx_shift_reg[8:1]==8'h1B) | reg_esc_code_mode | reg_aux_ctrl_mode )
+          begin
+          // Escape code, or in escape code mode
+          // Data receive can be command, aux ctrl data
+          // Ignore this data
+          end
+        else if  (rx_shift_reg[8:1]==8'h04) // Stop simulation if 0x04 is received
+          nxt_end_simulation <= 1'b1;
+        else if ((rx_shift_reg[8:1]==8'h0d)|(rx_shift_reg[8:1]==8'h0A))
+          // New line
+          begin
+          tube_string[string_length] = 8'h00;
+          if (VERBOSE != 0)
+            $fwrite(mcd,"%t UART<%m>: ",$time);
+
+          for (i=0; i<= string_length; i=i+1)
+            begin
+            text_char = tube_string[i];
+            $fwrite(mcd,"%s",text_char);
+            end
+
+          $fwrite(mcd,"\n");
+          string_length = 7'b0;
+          end
+        else
+          begin
+          tube_string[string_length] = rx_shift_reg[8:1];
+          string_length = string_length + 1;
+          if (string_length >79) // line too long, display and clear buffer
+            begin
+            tube_string[string_length] = 8'h00;
+            if (VERBOSE != 0)
+              $fwrite(mcd,"%t UART<%m>: ",$time);
+
+            for (i=0; i<= string_length; i=i+1)
+              begin
+              text_char = tube_string[i];
+              $fwrite(mcd,"%s",text_char);
+              end
+
+            $fwrite(mcd,"\n");
+            string_length = 7'b0;
+
+            end
+
+          end
+
+        end
+
+  end // p_TUBE
+
+  // Delay for simulation end
+  always @ (posedge CLK or negedge RESETn)
+  begin: p_sim_end
+  if (~RESETn)
+    begin
+    reg_end_simulation <= 1'b0;
+    end
+  else
+    begin
+    reg_end_simulation  <= nxt_end_simulation;
+    if (reg_end_simulation==1'b1)
+      begin
+        if (VERBOSE != 0)
+          $fwrite(mcd,"%t UART<%m>: Test Ended\n",$time);
+        else
+          $fwrite(mcd,"Test Ended\n");
+      $stop;
+      end
+    end
+  end
+
+  assign SIMULATIONEND = nxt_end_simulation & (~reg_end_simulation);
+
+endmodule