diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..a70a9ae377981f74351af0db162efa9e1782d7c1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+# Configured DMA IP files
+/src/*
\ No newline at end of file
diff --git a/config/cfg_dma_ahb.yaml b/config/cfg_dma_ahb.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..99b33376d8e17321cad475c6b0d56c7330fca7e3
--- /dev/null
+++ b/config/cfg_dma_ahb.yaml
@@ -0,0 +1,166 @@
+#----------------------------------------------------------------------------
+# 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 2021-2022 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.
+#----------------------------------------------------------------------------
+#
+# Release Information : DMA350-r0p0-00rel0
+#
+# -----------------------------------------------------------------------------
+#  Abstract : User Configuration file for ADA DMA
+# -----------------------------------------------------------------------------
+
+#
+# CONFIG_NAME: Name of the configuration.
+#     Each unifiqued element and top is suffixed with
+#     _${CONFIG_NAME}
+#
+CONFIG_NAME: sldma350
+
+#
+# ADDR_WIDTH: Address Bus width
+#
+#     Valid values:
+#         32-64
+ADDR_WIDTH: 32
+
+#
+# DATA_WIDTH: Data Bus width
+#
+#     Valid values:
+#         [32,64,128]
+DATA_WIDTH: 32
+
+#
+# CHID_WIDTH: Width of the configurable channel ID user signal.
+#     When set to 0, then the archid and awchid ports are not present on the module.
+#
+#     Valid values:
+#         0-16
+CHID_WIDTH: 0
+
+#
+# GPO_WIDTH: Width of GPO output for every channel. When multiple channels have GPOs
+#     then the width must be set to the maximum number of GPOs a channel can have,
+#     and unused GPO ports need to be left unconnected. When all bits of CH_GPO_MASK
+#     is 0, this parameter is not relevant.
+#
+#     Valid values:
+#         1-32
+GPO_WIDTH: 1
+
+#
+# CH_GPO_MASK: A bitmask for enabling the GPO port for each channel. The width of the
+#     bitmask is NUM_CHANNELS-1. When bit n is set to 1 then the GPO is enabled for
+#     channel n and the gpo_ch_n[GPO_WIDTH-1:0] port appears on the module.
+#
+#     Valid values:
+#         0-(2^NUM_CHANNELS-1)
+CH_GPO_MASK: 0x0
+
+#
+# CH_STREAM_MASK: A bitmask for enabling the stream interfaces for each channel.
+#     The width of the bitmask is NUM_CHANNELS-1. When bit n is set to 1 then
+#     the stream interfaces are enabled for channel n and the relevant ports
+#     appears on the module. NOTE: When streaming interface is enabled the actual
+#     FIFO size of the channel will be the double of CH_<N>_FIFO_DEPTH
+#
+#     Valid values:
+#         0-(2^NUM_CHANNELS-1)
+CH_STREAM_MASK: 0x3
+
+#
+# CH_<N>_FIFO_DEPTH: Sets the FIFO depth for channel <N> that defines the number of
+#     DATA_WIDTH size entries a channel can hold for a transfer. N goes from 0 to
+#     NUM_CHANNELS-1. In combination with the TRANSIZE setting of the command, the
+#     FIFO depth defines the maximum burst size a channel can support. This setting
+#     needs to be aligned with the bandwidth requirements of the channel but it
+#     highly affects the area of the design.
+#
+#     Valid values:
+#         [1,2,4,8,16,32,64]
+CH_0_FIFO_DEPTH: 2
+CH_1_FIFO_DEPTH: 2
+
+#
+# CH_EXT_FEAT_MASK: A bitmask for enabling the extended feature set for each channel.
+#     The extension contains 2D, WRAP, TMPLT features. Default value enables it for
+#     the number of channels.
+#
+#     Valid values:
+#         0-(2^NUM_CHANNELS-1)
+CH_EXT_FEAT_MASK: 0x3
+
+#
+# NUM_CHANNELS: Number of configurable DMA channels.
+#
+#     Valid values:
+#         1-8
+NUM_CHANNELS: 2
+
+#
+# NUM_TRIGGER_IN: Number of trigger input ports.
+#
+#     Valid values:
+#         0-32
+NUM_TRIGGER_IN: 2
+
+#
+# NUM_TRIGGER_OUT: Number of trigger output ports.
+#
+#     Valid values:
+#         0-32
+NUM_TRIGGER_OUT: 2
+
+#
+# TRIG_IN_SYNC_EN_MASK: A bitmask for enabling the synchronizers on the trigger in
+#     interfaces for each trigger port. The width of the bitmask is NUM_TRIGGER_IN-1.
+#     When bit n is set to 1 then the trigger in interface is considered asynchronous
+#     and the synchronizer logic is placed on the selected input ports.
+#
+#     Valid values:
+#         0-(2^NUM_TRIGGER_IN-1)
+TRIG_IN_SYNC_EN_MASK: 0x0
+
+#
+# TRIG_OUT_SYNC_EN_MASK: A bitmask for enabling the synchronizers on the trigger out
+#     interfaces for each trigger port. The width of the bitmask is NUM_TRIGGER_OUT-1.
+#     When bit n is set to 1 then the trigger out interface is considered asynchronous
+#     and the synchronizer logic is placed on the selected input ports.
+#
+#     Valid values:
+#         0-(2^NUM_TRIGGER_OUT-1)
+TRIG_OUT_SYNC_EN_MASK: 0x0
+
+#
+# AXI5_M1_PRESENT: Enables an additional master port. When set the m1 master port is
+#     present on the top level port list and additional include file can be used with
+#     a System Verilog function that defines which address ranges are mapped to the m1
+#     interface.
+#
+#     Valid values:
+#         [0,1]
+AXI5_M1_PRESENT: 0
+
+#
+# SECEXT_PRESENT: Enables TrustZone security support.
+#
+#     Valid values:
+#         [0,1]
+SECEXT_PRESENT: 0
+
+
+#
+# AXI5_M1_ADDR_MAP: Select AXI M1 master.
+#
+#     Valid values:
+#         relative path to logical
+AXI5_M1_ADDR_MAP: models/modules/generic/address_map_m1_example1.sv
diff --git a/config/cfg_dma_axi.yaml b/config/cfg_dma_axi.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..1522fc392a753ebfe434cd31b111f7f92e82b47a
--- /dev/null
+++ b/config/cfg_dma_axi.yaml
@@ -0,0 +1,166 @@
+#----------------------------------------------------------------------------
+# 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 2021-2022 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.
+#----------------------------------------------------------------------------
+#
+# Release Information : DMA350-r0p0-00rel0
+#
+# -----------------------------------------------------------------------------
+#  Abstract : User Configuration file for ADA DMA
+# -----------------------------------------------------------------------------
+
+#
+# CONFIG_NAME: Name of the configuration.
+#     Each unifiqued element and top is suffixed with
+#     _${CONFIG_NAME}
+#
+CONFIG_NAME: sldma350
+
+#
+# ADDR_WIDTH: Address Bus width
+#
+#     Valid values:
+#         32-64
+ADDR_WIDTH: 32
+
+#
+# DATA_WIDTH: Data Bus width
+#
+#     Valid values:
+#         [32,64,128]
+DATA_WIDTH: 128
+
+#
+# CHID_WIDTH: Width of the configurable channel ID user signal.
+#     When set to 0, then the archid and awchid ports are not present on the module.
+#
+#     Valid values:
+#         0-16
+CHID_WIDTH: 0
+
+#
+# GPO_WIDTH: Width of GPO output for every channel. When multiple channels have GPOs
+#     then the width must be set to the maximum number of GPOs a channel can have,
+#     and unused GPO ports need to be left unconnected. When all bits of CH_GPO_MASK
+#     is 0, this parameter is not relevant.
+#
+#     Valid values:
+#         1-32
+GPO_WIDTH: 1
+
+#
+# CH_GPO_MASK: A bitmask for enabling the GPO port for each channel. The width of the
+#     bitmask is NUM_CHANNELS-1. When bit n is set to 1 then the GPO is enabled for
+#     channel n and the gpo_ch_n[GPO_WIDTH-1:0] port appears on the module.
+#
+#     Valid values:
+#         0-(2^NUM_CHANNELS-1)
+CH_GPO_MASK: 0x0
+
+#
+# CH_STREAM_MASK: A bitmask for enabling the stream interfaces for each channel.
+#     The width of the bitmask is NUM_CHANNELS-1. When bit n is set to 1 then
+#     the stream interfaces are enabled for channel n and the relevant ports
+#     appears on the module. NOTE: When streaming interface is enabled the actual
+#     FIFO size of the channel will be the double of CH_<N>_FIFO_DEPTH
+#
+#     Valid values:
+#         0-(2^NUM_CHANNELS-1)
+CH_STREAM_MASK: 0x3
+
+#
+# CH_<N>_FIFO_DEPTH: Sets the FIFO depth for channel <N> that defines the number of
+#     DATA_WIDTH size entries a channel can hold for a transfer. N goes from 0 to
+#     NUM_CHANNELS-1. In combination with the TRANSIZE setting of the command, the
+#     FIFO depth defines the maximum burst size a channel can support. This setting
+#     needs to be aligned with the bandwidth requirements of the channel but it
+#     highly affects the area of the design.
+#
+#     Valid values:
+#         [1,2,4,8,16,32,64]
+CH_0_FIFO_DEPTH: 2
+CH_1_FIFO_DEPTH: 2
+
+#
+# CH_EXT_FEAT_MASK: A bitmask for enabling the extended feature set for each channel.
+#     The extension contains 2D, WRAP, TMPLT features. Default value enables it for
+#     the number of channels.
+#
+#     Valid values:
+#         0-(2^NUM_CHANNELS-1)
+CH_EXT_FEAT_MASK: 0x3
+
+#
+# NUM_CHANNELS: Number of configurable DMA channels.
+#
+#     Valid values:
+#         1-8
+NUM_CHANNELS: 2
+
+#
+# NUM_TRIGGER_IN: Number of trigger input ports.
+#
+#     Valid values:
+#         0-32
+NUM_TRIGGER_IN: 2
+
+#
+# NUM_TRIGGER_OUT: Number of trigger output ports.
+#
+#     Valid values:
+#         0-32
+NUM_TRIGGER_OUT: 2
+
+#
+# TRIG_IN_SYNC_EN_MASK: A bitmask for enabling the synchronizers on the trigger in
+#     interfaces for each trigger port. The width of the bitmask is NUM_TRIGGER_IN-1.
+#     When bit n is set to 1 then the trigger in interface is considered asynchronous
+#     and the synchronizer logic is placed on the selected input ports.
+#
+#     Valid values:
+#         0-(2^NUM_TRIGGER_IN-1)
+TRIG_IN_SYNC_EN_MASK: 0x0
+
+#
+# TRIG_OUT_SYNC_EN_MASK: A bitmask for enabling the synchronizers on the trigger out
+#     interfaces for each trigger port. The width of the bitmask is NUM_TRIGGER_OUT-1.
+#     When bit n is set to 1 then the trigger out interface is considered asynchronous
+#     and the synchronizer logic is placed on the selected input ports.
+#
+#     Valid values:
+#         0-(2^NUM_TRIGGER_OUT-1)
+TRIG_OUT_SYNC_EN_MASK: 0x0
+
+#
+# AXI5_M1_PRESENT: Enables an additional master port. When set the m1 master port is
+#     present on the top level port list and additional include file can be used with
+#     a System Verilog function that defines which address ranges are mapped to the m1
+#     interface.
+#
+#     Valid values:
+#         [0,1]
+AXI5_M1_PRESENT: 0
+
+#
+# SECEXT_PRESENT: Enables TrustZone security support.
+#
+#     Valid values:
+#         [0,1]
+SECEXT_PRESENT: 0
+
+
+#
+# AXI5_M1_ADDR_MAP: Select AXI M1 master.
+#
+#     Valid values:
+#         relative path to logical
+AXI5_M1_ADDR_MAP: models/modules/generic/address_map_m1_example1.sv
diff --git a/flist/dma350_ip.flist b/flist/dma350_ip.flist
new file mode 100644
index 0000000000000000000000000000000000000000..c94e2fa14096c287942de199b8f53664b2b680ae
--- /dev/null
+++ b/flist/dma350_ip.flist
@@ -0,0 +1,126 @@
+//-----------------------------------------------------------------------------
+// MegaSoC DMA-350 Filelist
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access license.
+//
+// Contributors
+//
+// David Mapstone (d.a.mapstone@soton.ac.uk)
+//
+// Copyright � 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+//-----------------------------------------------------------------------------
+// Abstract : Verilog Command File for Arm DMA-350
+//-----------------------------------------------------------------------------
+
+// ============= Verilog library extensions ===========
++libext+.v+.vlib
+
+// =============    DMA-350 search path    =============
++incdir+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_read_switch_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_read_switch_wrapper_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_write_switch_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_write_switch_wrapper_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_arbiter_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_qv_cmp_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_lrg_arb_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_grant_queue_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_full_f2s_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_biu_sldma350/verilog/ada_biu_reverse_s2f_sldma350.sv
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_gen_regif_dmach_0_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_gen_regif_dmach_0_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_gen_regmap_dmach_0_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_gen_fields_coreif_dmach_0_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_gen_coreif_res_dmach_0_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_1d_wr_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_2d_wr_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_1d_rd_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_2d_rd_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_fifo_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_cmdlink_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_axi_rd_if_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_axi_wr_if_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_axi_stop_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_reg_bank_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_inc_gen_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_stream_wrapper_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_stream_slave_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_stream_master_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_stream_bypass_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_trig_in_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_0_sldma350/verilog/ada_channel_0_trig_out_sldma350.sv
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_gen_regif_dmach_1_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_gen_regif_dmach_1_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_gen_regmap_dmach_1_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_gen_fields_coreif_dmach_1_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_gen_coreif_res_dmach_1_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_1d_wr_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_2d_wr_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_1d_rd_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_2d_rd_ctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_fifo_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_cmdlink_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_axi_rd_if_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_axi_wr_if_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_axi_stop_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_reg_bank_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_inc_gen_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_stream_wrapper_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_stream_slave_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_stream_master_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_stream_bypass_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_trig_in_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_channel_1_sldma350/verilog/ada_channel_1_trig_out_sldma350.sv
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_regif_dmainfo_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_regmap_dmainfo_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_fields_coreif_dmainfo_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_addrmap_dmainfo_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_coreif_dmansecctrl_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_regif_dmansecctrl_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_regif_dmansecctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_regmap_dmansecctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_fields_coreif_dmansecctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_gen_addrmap_dmansecctrl_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_apb_slave_mux_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_dmainfo_reg_bank_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_dmansecctrl_reg_bank_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_trigmask_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_trigin_used_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_trigout_used_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_ctrl_sldma350/verilog/ada_ctrl_sldma350.sv
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_qctrl_sldma350/verilog/ada_qctrl_sldma350.sv
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_gen_regmap_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_apb_regmap_conv_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_reg_field_ro_ro_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_reg_field_rw_ro_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_reg_field_rw_w1c_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_reg_field_rw_w1s_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_reg_field_rw_rw_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_gen_coreif_dmach_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_gen_addrmap_dmach_sldma350.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_interface_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_flop_en/verilog/ada_flop_en.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_or_tree/verilog/ada_or_tree.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_gen_regif_dmainfo_sldma350_pkg.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/models/cells/generic/ada_arm_flop.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/models/cells/generic/ada_arm_sync.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/models/cells/generic/ada_arm_mux2.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/models/cells/generic/ada_arm_or.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/models/cells/generic/ada_arm_idbit_v1.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/shared/verilog/ada_ecorevnum.sv
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_top_sldma350/verilog/ada_top_sldma350.sv
+
+$(SOCLABS_SLDMA350_TECH_DIR)/src/logical/ada_trigmtx_sldma350/verilog/ada_trigmtx_sldma350.sv
diff --git a/makefile b/makefile
new file mode 100644
index 0000000000000000000000000000000000000000..1096f37e655951c78637377df88a4aba0173cfc5
--- /dev/null
+++ b/makefile
@@ -0,0 +1,46 @@
+#-----------------------------------------------------------------------------
+# 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
+#
+# David Flynn (d.w.flynn@soton.ac.uk)
+# Daniel Newbrook (d.newbrook@soton.ac.uk)
+# Copyright (C) 2021-3, SoC Labs (www.soclabs.org)
+#-----------------------------------------------------------------------------
+
+#-------------------------------------
+# - Commonly Overloaded Variables
+#-------------------------------------
+# Name of test directory - Default Test is Hello World
+TESTNAME   ?= hello
+
+# Simulator type (mti/vcs/xm)
+SIMULATOR   = mti
+
+# Is an accelerator subsystem present in the design?
+ACCELERATOR ?= yes
+
+#-------------------------------------
+# - Directory Setups
+#-------------------------------------
+# Directory of Testcodes
+TESTCODES_DIR    := $(SOCLABS_MEGASOC_TECH_DIR)/testcodes
+
+# Project System Directory
+FPGA_IMP_DIR     := $(SOCLABS_PROJECT_DIR)/imp/fpga
+PROJ_SYS_DIR     := $(SOCLABS_PROJECT_DIR)/system
+PROJ_SW_DIR      ?= $(PROJ_SYS_DIR)/testcodes
+
+# Directory to put simulation files
+SIM_TOP_DIR ?= $(SOCLABS_PROJECT_DIR)/simulate/sim
+SIM_DIR      = $(SIM_TOP_DIR)/$(TESTNAME)
+
+config_dma_axi:
+	@$(ARM_IP_LIBRARY_PATH)/DMA-350/CG096-r0p0-00rel0/CG096-BU-50000-r0p0-00rel0/dma350/logical/generate --config ./config/cfg_dma_axi.yaml --output ./src/
+config_dma_ahb:
+	@$(ARM_IP_LIBRARY_PATH)/DMA-350/CG096-r0p0-00rel0/CG096-BU-50000-r0p0-00rel0/dma350/logical/generate --config ./config/cfg_dma_ahb.yaml --output ./src/
+
+clean_ip:
+	@rm -rf ./src/*
\ No newline at end of file
diff --git a/wrapper/logical/sldma350_ahb.v b/wrapper/logical/sldma350_ahb.v
new file mode 100644
index 0000000000000000000000000000000000000000..90317a37bc50ed789c22a4ed8d955f838971d917
--- /dev/null
+++ b/wrapper/logical/sldma350_ahb.v
@@ -0,0 +1,423 @@
+//-----------------------------------------------------------------------------
+// DMA350 wrapper - Contains DMA Controllers with AHB interface
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access l
+//
+// Contributors
+//
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+//
+// Copyright 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+
+module sldma350_ahb #(
+    parameter    SYS_ADDR_W  = 32,
+    parameter    SYS_DATA_W  = 32,
+    parameter    CFG_ADDR_W  = 12,  // Configuration Port Address Width
+    parameter    CHANNEL_NUM = 2    // Number of DMA Channels
+
+    )(
+    // AHB Clocks and Resets 
+    input wire                     HCLK,
+    input wire                     HRESETn,
+
+    // AHB Lite Port
+    output wire   [SYS_ADDR_W-1:0] HADDR,       // Address bus
+    output wire              [1:0] HTRANS,      // Transfer type
+    output wire                    HWRITE,      // Transfer direction
+    output wire              [2:0] HSIZE,       // Transfer size
+    output wire              [2:0] HBURST,      // Burst type
+    output wire              [3:0] HPROT,       // Protection control
+    output wire   [SYS_DATA_W-1:0] HWDATA,      // Write data
+    output wire                    HMASTLOCK,   // Locked Sequence
+    input  wire   [SYS_DATA_W-1:0] HRDATA,      // Read data bus
+    input  wire                    HREADY,      // HREADY feedback
+    input  wire                    HRESP,       // Transfer response
+    
+    // APB Configurtation Port
+    input  wire                    PCLKEN,      // APB clock enable
+    input  wire                    PSEL,        // APB peripheral select
+    input  wire                    PEN,         // APB transfer enable
+    input  wire                    PWRITE,      // APB transfer direction
+    input  wire   [CFG_ADDR_W-1:0] PADDR,       // APB address
+    input  wire   [SYS_DATA_W-1:0] PWDATA,      // APB write data
+    output wire   [SYS_DATA_W-1:0] PRDATA,      // APB read data
+    
+    // DMA Request and Status Port
+    input  wire  [CHANNEL_NUM-1:0] DMA_REQ,     // DMA transfer request
+    output wire  [CHANNEL_NUM-1:0] DMA_DONE,    // DMA transfer done
+    output wire                    DMA_ERR      // DMA slave response not OK
+);
+
+
+wire                    SYS_HRESETn,
+wire                    DMAC_PCLKen,
+wire                    DMAC_ACLKen,
+
+// Q Channel Signals
+wire                    DMAC_CLK_QREQN,
+wire                    DMAC_CLK_QACCEPTN,
+wire                    DMAC_CLK_QDENY,
+wire                    DMAC_CLK_QACTIVE,
+
+// P Channel Signals
+wire                     DMAC_PREQ,
+wire  [3:0]              DMAC_PSTATE,
+wire                     DMAC_PACCEPT,
+wire                     DMAC_PDENY,
+wire [9:0]               DMAC_PACTIVE,
+wire                     DMAC_PWAKEUP,
+wire                     DMAC_PDEBUG,
+wire                     DMAC_PSEL,
+wire                     DMAC_PENABLE,
+wire  [2:0]              DMAC_PPROT,
+wire                     DMAC_PWRITE,
+wire  [12:0]             DMAC_PADDR,
+wire  [31:0]             DMAC_PWDATA,
+wire  [3:0]              DMAC_PSTRB,
+wire                     DMAC_PREADY,
+wire                     DMAC_PSLVERR,
+wire [31:0]              DMAC_PRDATA,
+//  DMAC AXI Port
+wire                     DMAC_AWAKEUP,
+wire                     DMAC_AWVALID,
+wire [SYS_ADDR_W-1:0]    DMAC_AWADDR,
+wire [1:0]               DMAC_AWBURST,
+wire [7:0]               DMAC_AWLEN,
+wire [2:0]               DMAC_AWSIZE,
+wire [3:0]               DMAC_AWQOS,
+wire [2:0]               DMAC_AWPROT,
+wire                     DMAC_AWREADY,
+wire [3:0]               DMAC_AWCACHE,
+wire [3:0]               DMAC_AWINNER,
+wire [1:0]               DMAC_AWDOMAIN,
+
+wire                     DMAC_ARVALID,
+wire [SYS_ADDR_W-1:0]    DMAC_ARADDR,
+wire [1:0]               DMAC_ARBURST,
+wire [7:0]               DMAC_ARLEN,
+wire [2:0]               DMAC_ARSIZE,
+wire [3:0]               DMAC_ARQOS,
+wire [2:0]               DMAC_ARPROT,
+wire                     DMAC_ARREADY,
+wire [3:0]               DMAC_ARCACHE,
+wire [3:0]               DMAC_ARINNER,
+wire [1:0]               DMAC_ARDOMAIN,
+wire                     DMAC_ARCMDLINK,
+
+wire                     DMAC_WVALID,
+wire                     DMAC_WLAST,
+wire [16-1:0]            DMAC_WSTRB,
+wire [SYS_DATA_W-1:0]    DMAC_WDATA,
+wire                     DMAC_WREADY,
+wire                     DMAC_RVALID,
+wire                     DMAC_RLAST,
+wire  [SYS_DATA_W-1:0]   DMAC_RDATA,
+wire  [2-1:0]            DMAC_RPOISON,
+wire  [1:0]              DMAC_RRESP,
+wire                     DMAC_RREADY,
+
+wire                     DMAC_BVALID,
+wire  [1:0]              DMAC_BRESP,
+wire                     DMAC_BREADY,
+
+// Trigger 0 in
+wire                     DMAC_TRIG_IN_0_REQ,
+wire  [1:0]              DMAC_TRIG_IN_0_REQ_TYPE,
+wire                     DMAC_TRIG_IN_0_ACK,
+wire [1:0]               DMAC_TRIG_IN_0_ACK_TYPE,
+wire                     DMAC_TRIG_IN_1_REQ,
+wire  [1:0]              DMAC_TRIG_IN_1_REQ_TYPE,
+wire                     DMAC_TRIG_IN_1_ACK,
+wire [1:0]               DMAC_TRIG_IN_1_ACK_TYPE,
+wire                     DMAC_TRIG_OUT_0_REQ,
+wire                     DMAC_TRIG_OUT_0_ACK,
+wire                     DMAC_TRIG_OUT_1_REQ,
+wire                     DMAC_TRIG_OUT_1_ACK,
+wire [2-1:0]             DMAC_IRQ_CHANNEL,
+wire                     DMAC_IRQ_COMB_NONSEC,
+
+//  DMAC Channel 0 AXI stream out
+wire                     DMAC_STR_OUT_0_TVALID,
+wire                     DMAC_STR_OUT_0_TREADY,
+wire [SYS_DATA_W-1:0]    DMAC_STR_OUT_0_TDATA,
+wire [16-1:0]            DMAC_STR_OUT_0_TSTRB,
+wire                     DMAC_STR_OUT_0_TLAST,
+
+//  DMAC Channel 0 AXI Stream in
+wire                     DMAC_STR_IN_0_TVALID,
+wire                     DMAC_STR_IN_0_TREADY,
+wire [SYS_DATA_W-1:0]    DMAC_STR_IN_0_TDATA,
+wire [16-1:0]            DMAC_STR_IN_0_TSTRB,
+wire                     DMAC_STR_IN_0_TLAST,
+wire                     DMAC_STR_IN_0_FLUSH,
+
+//  DMAC Channel 1 AXI Stream out
+wire                     DMAC_STR_OUT_1_TVALID,
+wire                     DMAC_STR_OUT_1_TREADY,
+wire [SYS_DATA_W-1:0]    DMAC_STR_OUT_1_TDATA,
+wire [16-1:0]            DMAC_STR_OUT_1_TSTRB,
+wire                     DMAC_STR_OUT_1_TLAST,
+
+//  DMAC Channel 1 AXI Stream out
+wire                     DMAC_STR_IN_1_TVALID,
+wire                     DMAC_STR_IN_1_TREADY,
+wire [SYS_DATA_W-1:0]    DMAC_STR_IN_1_TDATA,
+wire [16-1:0]            DMAC_STR_IN_1_TSTRB,
+wire                     DMAC_STR_IN_1_TLAST,
+wire                     DMAC_STR_IN_1_FLUSH,
+wire                     DMAC_ALLCH_STOP_REQ_NONSEC,
+wire                     DMAC_ALLCH_STOP_ACK_NONSEC,
+wire                     DMAC_ALLCH_PAUSE_REQ_NONSEC,
+wire                     DMAC_ALLCH_PAUSE_ACK_NONSEC,
+wire [2-1:0]             DMAC_CH_ENABLED,
+wire [2-1:0]             DMAC_CH_ERR,
+wire [2-1:0]             DMAC_CH_STOPPED,
+wire [2-1:0]             DMAC_CH_PAUSED,
+wire [2-1:0]             DMAC_CH_PRIV,
+
+wire                     DMAC_HALT_REQ,
+wire                     DMAC_RESTART_REQ,
+wire                     DMAC_HALTED,
+wire                     DMAC_BOOT_EN,
+wire  [32-1:2]           DMAC_BOOT_ADDR,
+wire  [ 7:0]             DMAC_BOOT_MEMATTR,
+wire  [ 1:0]             DMAC_BOOT_SHAREATTR
+
+// -------------------------------
+// DMA Controller Instantiation
+// -------------------------------
+ada_top_sldma350 u_dmac_0(
+    // Clock and Reset signals
+    .clk(HCLK),
+    .resetn(HRESETn),
+    .aclken_m0(DMAC_ACLKen),
+    .pclken(PCLKEN),
+    // Q Channel signals
+    .clk_qreqn(DMAC_CLK_QREQN),
+    .clk_qacceptn(DMAC_CLK_QACCEPTN),
+    .clk_qdeny(DMAC_CLK_QDENY),
+    .clk_qactive(DMAC_CLK_QACTIVE),
+    // P Channel Signals
+    .preq(DMAC_PREQ),
+    .pstate(DMAC_PSTATE),
+    .paccept(DMAC_PACCEPT),
+    .pdeny(DMAC_PDENY),
+    .pactive(DMAC_PACTIVE),
+
+    .pwakeup(DMAC_PWAKEUP),
+    .pdebug(DMAC_PDEBUG),
+    .psel(PSEL),
+    .penable(PEN),
+    .pprot(DMAC_PPROT),
+    .pwrite(PWRITE),
+    .paddr(PADDR),
+    .pwdata(PWDATA),
+    .pstrb(DMAC_PSTRB),
+    .pready(DMAC_PREADY),
+    .pslverr(DMAC_PSLVERR),
+    .prdata(PRDATA),
+    // AXI Write Channel Signals
+    .awakeup_m0(DMAC_AWAKEUP),
+    .awvalid_m0(DMAC_AWVALID),
+    .awaddr_m0(DMAC_AWADDR),
+    .awburst_m0(DMAC_AWBURST),
+    .awid_m0(),
+    .awlen_m0(DMAC_AWLEN),
+    .awsize_m0(DMAC_AWSIZE),
+    .awqos_m0(DMAC_AWQOS),
+    .awprot_m0(DMAC_AWPROT),
+    .awready_m0(DMAC_AWREADY),
+    .awcache_m0(DMAC_AWCACHE),
+    .awinner_m0(DMAC_AWINNER),
+    .awdomain_m0(DMAC_AWDOMAIN),
+    // AXI Read Channel Signals
+    .arvalid_m0(DMAC_ARVALID),
+    .araddr_m0(DMAC_ARADDR),
+    .arburst_m0(DMAC_ARBURST),
+    .arid_m0(),
+    .arlen_m0(DMAC_ARLEN),
+    .arsize_m0(DMAC_ARSIZE),
+    .arqos_m0(DMAC_ARQOS),
+    .arprot_m0(DMAC_ARPROT),
+    .arready_m0(DMAC_ARREADY),
+    .arcache_m0(DMAC_ARCACHE),
+    .arinner_m0(DMAC_ARINNER),
+    .ardomain_m0(DMAC_ARDOMAIN),
+    .arcmdlink_m0(DMAC_ARCMDLINK),
+    // AXI Write Data Signals
+    .wvalid_m0(DMAC_WVALID),
+    .wlast_m0(DMAC_WLAST),
+    .wstrb_m0(DMAC_WSTRB),
+    .wdata_m0(DMAC_WDATA),
+    .wready_m0(DMAC_WREADY),
+    // AXI Read Data Signals
+    .rvalid_m0(DMAC_RVALID),
+    .rid_m0(),
+    .rlast_m0(DMAC_RLAST),
+    .rdata_m0(DMAC_RDATA),
+    .rpoison_m0(DMAC_RPOISON),
+    .rresp_m0(DMAC_RRESP),
+    .rready_m0(DMAC_RREADY),
+    // AXI Write response signals
+    .bvalid_m0(DMAC_BVALID),
+    .bid_m0(),
+    .bresp_m0(DMAC_BRESP),
+    .bready_m0(DMAC_BREADY),
+    // Trigger 0 in
+    .trig_in_0_req(DMAC_TRIG_IN_0_REQ),
+    .trig_in_0_req_type(DMAC_TRIG_IN_0_REQ_TYPE),
+    .trig_in_0_ack(DMAC_TRIG_IN_0_ACK),
+    .trig_in_0_ack_type(DMAC_TRIG_IN_0_ACK_TYPE),
+    // Trigger 1 in
+    .trig_in_1_req(DMAC_TRIG_IN_1_REQ),
+    .trig_in_1_req_type(DMAC_TRIG_IN_1_REQ_TYPE),
+    .trig_in_1_ack(DMAC_TRIG_IN_1_ACK),
+    .trig_in_1_ack_type(DMAC_TRIG_IN_1_ACK_TYPE),
+    // Trigger 0 out
+    .trig_out_0_req(DMAC_TRIG_OUT_0_REQ),
+    .trig_out_0_ack(DMAC_TRIG_OUT_0_ACK),
+    // Trigger 1 out
+    .trig_out_1_req(DMAC_TRIG_OUT_1_REQ),
+    .trig_out_1_ack(DMAC_TRIG_OUT_1_ACK),
+    // Interrupt Signals
+    .irq_channel(DMAC_IRQ_CHANNEL),
+    .irq_comb_nonsec(DMAC_IRQ_COMB_NONSEC),
+    // AXI Stream 0 out
+    .str_out_0_tvalid(DMAC_STR_OUT_0_TVALID),
+    .str_out_0_tready(DMAC_STR_OUT_0_TREADY),
+    .str_out_0_tdata(DMAC_STR_OUT_0_TDATA),
+    .str_out_0_tstrb(DMAC_STR_OUT_0_TSTRB),
+    .str_out_0_tlast(DMAC_STR_OUT_0_TLAST),
+    // AXI Stream 0 In
+    .str_in_0_tvalid(DMAC_STR_IN_0_TVALID),
+    .str_in_0_tready(DMAC_STR_IN_0_TREADY),
+    .str_in_0_tdata(DMAC_STR_IN_0_TDATA),
+    .str_in_0_tstrb(DMAC_STR_IN_0_TSTRB),
+    .str_in_0_tlast(DMAC_STR_IN_0_TLAST),
+    .str_in_0_flush(DMAC_STR_IN_0_FLUSH),
+    // AXI Stream 1 out
+    .str_out_1_tvalid(DMAC_STR_OUT_1_TVALID),
+    .str_out_1_tready(DMAC_STR_OUT_1_TREADY),
+    .str_out_1_tdata(DMAC_STR_OUT_1_TDATA),
+    .str_out_1_tstrb(DMAC_STR_OUT_1_TSTRB),
+    .str_out_1_tlast(DMAC_STR_OUT_1_TLAST),
+    // AXI Stream 1 in
+    .str_in_1_tvalid(DMAC_STR_IN_1_TVALID),
+    .str_in_1_tready(DMAC_STR_IN_1_TREADY),
+    .str_in_1_tdata(DMAC_STR_IN_1_TDATA),
+    .str_in_1_tstrb(DMAC_STR_IN_1_TSTRB),
+    .str_in_1_tlast(DMAC_STR_IN_1_TLAST),
+    .str_in_1_flush(DMAC_STR_IN_1_FLUSH),
+
+    .allch_stop_req_nonsec(DMAC_ALLCH_STOP_REQ_NONSEC),
+    .allch_stop_ack_nonsec(DMAC_ALLCH_STOP_ACK_NONSEC),
+    .allch_pause_req_nonsec(DMAC_ALLCH_PAUSE_REQ_NONSEC),
+    .allch_pause_ack_nonsec(DMAC_ALLCH_PAUSE_ACK_NONSEC),
+    .ch_enabled(DMAC_CH_ENABLED),
+    .ch_err(DMAC_CH_ERR),
+    .ch_stopped(DMAC_CH_STOPPED),
+    .ch_paused(DMAC_CH_PAUSED),
+    .ch_priv(DMAC_CH_PRIV),
+    .halt_req(DMAC_HALT_REQ),
+    .restart_req(DMAC_RESTART_REQ),
+    .halted(DMAC_HALTED),
+    .boot_en(DMAC_BOOT_EN),
+    .boot_addr(DMAC_BOOT_ADDR),
+    .boot_memattr(DMAC_BOOT_MEMATTR),
+    .boot_shareattr(DMAC_BOOT_SHAREATTR)
+);
+
+xhb400 #(.DATA_WIDTH(SYS_DATA_W))
+(
+    //-----------------------------------------------------------------------------
+    // Clock and Reset
+    //-----------------------------------------------------------------------------
+
+    .CLK(HCLK),
+    .nSYSRESET(HRESETn),
+    //-----------------------------------------------------------------------------
+    // AXI Master Interface
+    //-----------------------------------------------------------------------------
+
+    // Write Address Channel signals
+    .AWADDR(DMAC_AWADDR),
+    .AWBURST(DMAC_AWBURST),
+    .AWID(),
+    .AWLEN(DMAC_AWLEN),
+    .AWSIZE(DMAC_AWSIZE),
+    .AWLOCK(),
+    .AWPROT(DMAC_AWPROT),
+    .AWCACHE(DMAC_AWCACHE),
+    .AWUSER(),
+    .AWSPARSE(),
+    .AWVALID(DMAC_AWVALID),
+    .AWREADY(DMAC_AWREADY),
+  
+// Read Address Channel signals  
+    .ARADDR(DMAC_ARADDR),
+    .ARBURST(DMAC_ARBURST),
+    .ARID(),
+    .ARLEN(DMAC_ARLEN),
+    .ARSIZE(DMAC_ARSIZE),
+    .ARLOCK(), 
+    .ARPROT(DMAC_ARPROT),
+    .ARCACHE(DMAC_ARCACHE),
+    .ARUSER(),
+    .ARVALID(DMAC_ARVALID),
+    .ARREADY(DMAC_ARREADY),
+  
+// Write Data Channel signals   
+    .WLAST(DMAC_WLAST),
+    .WSTRB(DMAC_WSTRB),
+    .WDATA(DMAC_WDATA),
+    .WUSER(),
+    .WVALID(DMAC_WVALID),
+    .WREADY(DMAC_WREADY),
+  
+// Read Data Channel signals 
+    .RREADY(DMAC_RREADY),   
+    .RVALID(DMAC_RVALID),
+    .RID(),
+    .RLAST(DMAC_RLAST),
+    .RDATA(DMAC_RDATA),
+    .RUSER(),
+    .RRESP(DMAC_RRESP),
+  
+// Write Response Channel signals 
+    .BREADY(DMAC_BREADY),   
+    .BVALID(DMAC_BVALID),
+    .BID(),
+    .BRESP(DMAC_BRESP),
+  
+  
+//-----------------------------------------------------------------------------
+// AHB-Lite Slave Interface
+//-----------------------------------------------------------------------------
+
+// AHB-Lite Master signals
+    .HTRANS(HTRANS),
+    .HBURST(HBURST),
+    .HADDR(HADDR),
+    .HWRITE(HWRITE),
+    .HSIZE(HSIZE),
+    .HWDATA(HWDATA),
+    .HPROT(HPROT),
+    .HMASTLOCK(HMASTLOCK),
+  
+// AHB-Lite Slave Response signals  
+    .HREADY(HREADY),
+    .HRDATA(HRDATA),
+    .HRESP(HRESP),
+  
+// Non-standard Exclusive Access signals   
+    .EXREQ,
+    .EXRESP,
+
+// Sideband AHB USER signals
+    .HAUSER,
+    .HWUSER,
+    .HRUSER
+);
+
+endmodule
diff --git a/wrapper/logical/sldma350_axi.v b/wrapper/logical/sldma350_axi.v
new file mode 100644
index 0000000000000000000000000000000000000000..b384777096713491d086d6468cfcb54cda7e26a1
--- /dev/null
+++ b/wrapper/logical/sldma350_axi.v
@@ -0,0 +1,301 @@
+//-----------------------------------------------------------------------------
+// DMA350 wrapper - Contains DMA Controllers with AXI interface
+// A joint work commissioned on behalf of SoC Labs, under Arm Academic Access l
+//
+// Contributors
+//
+// Daniel Newbrook (d.newbrook@soton.ac.uk)
+//
+// Copyright 2021-3, SoC Labs (www.soclabs.org)
+//-----------------------------------------------------------------------------
+
+module sldma350_axi #(
+    parameter   SYS_ADDR_W = 32,
+    parameter   SYS_DATA_W = 128
+)(
+    input   wire                    SYS_HCLK,
+    input   wire                    SYS_HRESETn,
+    input   wire                    DMAC_PCLKen,
+    input   wire                    DMAC_ACLKen,
+
+    // Q Channel Signals
+    input   wire                    DMAC_CLK_QREQN,
+    output  wire                    DMAC_CLK_QACCEPTN,
+    output  wire                    DMAC_CLK_QDENY,
+    output  wire                    DMAC_CLK_QACTIVE,
+
+    // P Channel Signals
+    input  wire                     DMAC_PREQ,
+    input  wire  [3:0]              DMAC_PSTATE,
+    output wire                     DMAC_PACCEPT,
+    output wire                     DMAC_PDENY,
+    output wire [9:0]               DMAC_PACTIVE,
+    input  wire                     DMAC_PWAKEUP,
+    input  wire                     DMAC_PDEBUG,
+    input  wire                     DMAC_PSEL,
+    input  wire                     DMAC_PENABLE,
+    input  wire  [2:0]              DMAC_PPROT,
+    input  wire                     DMAC_PWRITE,
+    input  wire  [12:0]             DMAC_PADDR,
+    input  wire  [31:0]             DMAC_PWDATA,
+    input  wire  [3:0]              DMAC_PSTRB,
+    output wire                     DMAC_PREADY,
+    output wire                     DMAC_PSLVERR,
+    output wire [31:0]              DMAC_PRDATA,
+    //  DMAC AXI Port
+    output wire                     DMAC_AWAKEUP,
+    output wire                     DMAC_AWVALID,
+    output wire [SYS_ADDR_W-1:0]    DMAC_AWADDR,
+    output wire [1:0]               DMAC_AWBURST,
+    output wire [7:0]               DMAC_AWLEN,
+    output wire [2:0]               DMAC_AWSIZE,
+    output wire [3:0]               DMAC_AWQOS,
+    output wire [2:0]               DMAC_AWPROT,
+    input  wire                     DMAC_AWREADY,
+    output wire [3:0]               DMAC_AWCACHE,
+    output wire [3:0]               DMAC_AWINNER,
+    output wire [1:0]               DMAC_AWDOMAIN,
+
+    output wire                     DMAC_ARVALID,
+    output wire [SYS_ADDR_W-1:0]    DMAC_ARADDR,
+    output wire [1:0]               DMAC_ARBURST,
+    output wire [7:0]               DMAC_ARLEN,
+    output wire [2:0]               DMAC_ARSIZE,
+    output wire [3:0]               DMAC_ARQOS,
+    output wire [2:0]               DMAC_ARPROT,
+    input  wire                     DMAC_ARREADY,
+    output wire [3:0]               DMAC_ARCACHE,
+    output wire [3:0]               DMAC_ARINNER,
+    output wire [1:0]               DMAC_ARDOMAIN,
+    output wire                     DMAC_ARCMDLINK,
+
+    output wire                     DMAC_WVALID,
+    output wire                     DMAC_WLAST,
+    output wire [16-1:0]            DMAC_WSTRB,
+    output wire [SYS_DATA_W-1:0]    DMAC_WDATA,
+    input  wire                     DMAC_WREADY,
+
+    input  wire                     DMAC_RVALID,
+    input  wire                     DMAC_RLAST,
+    input  wire  [SYS_DATA_W-1:0]   DMAC_RDATA,
+    input  wire  [2-1:0]            DMAC_RPOISON,
+    input  wire  [1:0]              DMAC_RRESP,
+    output wire                     DMAC_RREADY,
+
+    input  wire                     DMAC_BVALID,
+    input  wire  [1:0]              DMAC_BRESP,
+    output wire                     DMAC_BREADY,
+
+    // Trigger 0 in
+    input  wire                     DMAC_TRIG_IN_0_REQ,
+    input  wire  [1:0]              DMAC_TRIG_IN_0_REQ_TYPE,
+    output wire                     DMAC_TRIG_IN_0_ACK,
+    output wire [1:0]               DMAC_TRIG_IN_0_ACK_TYPE,
+    input  wire                     DMAC_TRIG_IN_1_REQ,
+    input  wire  [1:0]              DMAC_TRIG_IN_1_REQ_TYPE,
+    output wire                     DMAC_TRIG_IN_1_ACK,
+    output wire [1:0]               DMAC_TRIG_IN_1_ACK_TYPE,
+    output wire                     DMAC_TRIG_OUT_0_REQ,
+    input  wire                     DMAC_TRIG_OUT_0_ACK,
+    output wire                     DMAC_TRIG_OUT_1_REQ,
+    input  wire                     DMAC_TRIG_OUT_1_ACK,
+    output wire [2-1:0]             DMAC_IRQ_CHANNEL,
+    output wire                     DMAC_IRQ_COMB_NONSEC,
+
+    //  DMAC Channel 0 AXI stream out
+    output wire                     DMAC_STR_OUT_0_TVALID,
+    input  wire                     DMAC_STR_OUT_0_TREADY,
+    output wire [SYS_DATA_W-1:0]    DMAC_STR_OUT_0_TDATA,
+    output wire [16-1:0]            DMAC_STR_OUT_0_TSTRB,
+    output wire                     DMAC_STR_OUT_0_TLAST,
+
+    //  DMAC Channel 0 AXI Stream in
+    input  wire                     DMAC_STR_IN_0_TVALID,
+    output wire                     DMAC_STR_IN_0_TREADY,
+    input  wire [SYS_DATA_W-1:0]    DMAC_STR_IN_0_TDATA,
+    input  wire [16-1:0]            DMAC_STR_IN_0_TSTRB,
+    input  wire                     DMAC_STR_IN_0_TLAST,
+    output wire                     DMAC_STR_IN_0_FLUSH,
+
+    //  DMAC Channel 1 AXI Stream out
+    output wire                     DMAC_STR_OUT_1_TVALID,
+    input  wire                     DMAC_STR_OUT_1_TREADY,
+    output wire [SYS_DATA_W-1:0]    DMAC_STR_OUT_1_TDATA,
+    output wire [16-1:0]            DMAC_STR_OUT_1_TSTRB,
+    output wire                     DMAC_STR_OUT_1_TLAST,
+
+    //  DMAC Channel 1 AXI Stream out
+    input  wire                     DMAC_STR_IN_1_TVALID,
+    output wire                     DMAC_STR_IN_1_TREADY,
+    input  wire [SYS_DATA_W-1:0]    DMAC_STR_IN_1_TDATA,
+    input  wire [16-1:0]            DMAC_STR_IN_1_TSTRB,
+    input  wire                     DMAC_STR_IN_1_TLAST,
+    output wire                     DMAC_STR_IN_1_FLUSH,
+
+    input  wire                     DMAC_ALLCH_STOP_REQ_NONSEC,
+    output wire                     DMAC_ALLCH_STOP_ACK_NONSEC,
+    input  wire                     DMAC_ALLCH_PAUSE_REQ_NONSEC,
+    output wire                     DMAC_ALLCH_PAUSE_ACK_NONSEC,
+    output wire [2-1:0]             DMAC_CH_ENABLED,
+    output wire [2-1:0]             DMAC_CH_ERR,
+    output wire [2-1:0]             DMAC_CH_STOPPED,
+    output wire [2-1:0]             DMAC_CH_PAUSED,
+    output wire [2-1:0]             DMAC_CH_PRIV,
+
+    input  wire                     DMAC_HALT_REQ,
+    input  wire                     DMAC_RESTART_REQ,
+    output wire                     DMAC_HALTED,
+
+    input  wire                     DMAC_BOOT_EN,
+    input  wire  [32-1:2]           DMAC_BOOT_ADDR,
+    input  wire  [ 7:0]             DMAC_BOOT_MEMATTR,
+    input  wire  [ 1:0]             DMAC_BOOT_SHAREATTR
+);
+
+// -------------------------------
+// DMA Controller Instantiation
+// -------------------------------
+ada_top_sldma350 u_dmac_0(
+    // Clock and Reset signals
+    .clk(SYS_HCLK),
+    .resetn(SYS_HRESETn),
+    .aclken_m0(DMAC_ACLKen),
+    .pclken(DMAC_PCLKen),
+    // Q Channel signals
+    .clk_qreqn(DMAC_CLK_QREQN),
+    .clk_qacceptn(DMAC_CLK_QACCEPTN),
+    .clk_qdeny(DMAC_CLK_QDENY),
+    .clk_qactive(DMAC_CLK_QACTIVE),
+    // P Channel Signals
+    .preq(DMAC_PREQ),
+    .pstate(DMAC_PSTATE),
+    .paccept(DMAC_PACCEPT),
+    .pdeny(DMAC_PDENY),
+    .pactive(DMAC_PACTIVE),
+
+    .pwakeup(DMAC_PWAKEUP),
+    .pdebug(DMAC_PDEBUG),
+    .psel(DMAC_PSEL),
+    .penable(DMAC_PENABLE),
+    .pprot(DMAC_PPROT),
+    .pwrite(DMAC_PWRITE),
+    .paddr(DMAC_PADDR),
+    .pwdata(DMAC_PWDATA),
+    .pstrb(DMAC_PSTRB),
+    .pready(DMAC_PREADY),
+    .pslverr(DMAC_PSLVERR),
+    .prdata(DMAC_PRDATA),
+    // AXI Write Channel Signals
+    .awakeup_m0(DMAC_AWAKEUP),
+    .awvalid_m0(DMAC_AWVALID),
+    .awaddr_m0(DMAC_AWADDR),
+    .awburst_m0(DMAC_AWBURST),
+    .awid_m0(),
+    .awlen_m0(DMAC_AWLEN),
+    .awsize_m0(DMAC_AWSIZE),
+    .awqos_m0(DMAC_AWQOS),
+    .awprot_m0(DMAC_AWPROT),
+    .awready_m0(DMAC_AWREADY),
+    .awcache_m0(DMAC_AWCACHE),
+    .awinner_m0(DMAC_AWINNER),
+    .awdomain_m0(DMAC_AWDOMAIN),
+    // AXI Read Channel Signals
+    .arvalid_m0(DMAC_ARVALID),
+    .araddr_m0(DMAC_ARADDR),
+    .arburst_m0(DMAC_ARBURST),
+    .arid_m0(),
+    .arlen_m0(DMAC_ARLEN),
+    .arsize_m0(DMAC_ARSIZE),
+    .arqos_m0(DMAC_ARQOS),
+    .arprot_m0(DMAC_ARPROT),
+    .arready_m0(DMAC_ARREADY),
+    .arcache_m0(DMAC_ARCACHE),
+    .arinner_m0(DMAC_ARINNER),
+    .ardomain_m0(DMAC_ARDOMAIN),
+    .arcmdlink_m0(DMAC_ARCMDLINK),
+    // AXI Write Data Signals
+    .wvalid_m0(DMAC_WVALID),
+    .wlast_m0(DMAC_WLAST),
+    .wstrb_m0(DMAC_WSTRB),
+    .wdata_m0(DMAC_WDATA),
+    .wready_m0(DMAC_WREADY),
+    // AXI Read Data Signals
+    .rvalid_m0(DMAC_RVALID),
+    .rid_m0(),
+    .rlast_m0(DMAC_RLAST),
+    .rdata_m0(DMAC_RDATA),
+    .rpoison_m0(DMAC_RPOISON),
+    .rresp_m0(DMAC_RRESP),
+    .rready_m0(DMAC_RREADY),
+    // AXI Write response signals
+    .bvalid_m0(DMAC_BVALID),
+    .bid_m0(),
+    .bresp_m0(DMAC_BRESP),
+    .bready_m0(DMAC_BREADY),
+    // Trigger 0 in
+    .trig_in_0_req(DMAC_TRIG_IN_0_REQ),
+    .trig_in_0_req_type(DMAC_TRIG_IN_0_REQ_TYPE),
+    .trig_in_0_ack(DMAC_TRIG_IN_0_ACK),
+    .trig_in_0_ack_type(DMAC_TRIG_IN_0_ACK_TYPE),
+    // Trigger 1 in
+    .trig_in_1_req(DMAC_TRIG_IN_1_REQ),
+    .trig_in_1_req_type(DMAC_TRIG_IN_1_REQ_TYPE),
+    .trig_in_1_ack(DMAC_TRIG_IN_1_ACK),
+    .trig_in_1_ack_type(DMAC_TRIG_IN_1_ACK_TYPE),
+    // Trigger 0 out
+    .trig_out_0_req(DMAC_TRIG_OUT_0_REQ),
+    .trig_out_0_ack(DMAC_TRIG_OUT_0_ACK),
+    // Trigger 1 out
+    .trig_out_1_req(DMAC_TRIG_OUT_1_REQ),
+    .trig_out_1_ack(DMAC_TRIG_OUT_1_ACK),
+    // Interrupt Signals
+    .irq_channel(DMAC_IRQ_CHANNEL),
+    .irq_comb_nonsec(DMAC_IRQ_COMB_NONSEC),
+    // AXI Stream 0 out
+    .str_out_0_tvalid(DMAC_STR_OUT_0_TVALID),
+    .str_out_0_tready(DMAC_STR_OUT_0_TREADY),
+    .str_out_0_tdata(DMAC_STR_OUT_0_TDATA),
+    .str_out_0_tstrb(DMAC_STR_OUT_0_TSTRB),
+    .str_out_0_tlast(DMAC_STR_OUT_0_TLAST),
+    // AXI Stream 0 In
+    .str_in_0_tvalid(DMAC_STR_IN_0_TVALID),
+    .str_in_0_tready(DMAC_STR_IN_0_TREADY),
+    .str_in_0_tdata(DMAC_STR_IN_0_TDATA),
+    .str_in_0_tstrb(DMAC_STR_IN_0_TSTRB),
+    .str_in_0_tlast(DMAC_STR_IN_0_TLAST),
+    .str_in_0_flush(DMAC_STR_IN_0_FLUSH),
+    // AXI Stream 1 out
+    .str_out_1_tvalid(DMAC_STR_OUT_1_TVALID),
+    .str_out_1_tready(DMAC_STR_OUT_1_TREADY),
+    .str_out_1_tdata(DMAC_STR_OUT_1_TDATA),
+    .str_out_1_tstrb(DMAC_STR_OUT_1_TSTRB),
+    .str_out_1_tlast(DMAC_STR_OUT_1_TLAST),
+    // AXI Stream 1 in
+    .str_in_1_tvalid(DMAC_STR_IN_1_TVALID),
+    .str_in_1_tready(DMAC_STR_IN_1_TREADY),
+    .str_in_1_tdata(DMAC_STR_IN_1_TDATA),
+    .str_in_1_tstrb(DMAC_STR_IN_1_TSTRB),
+    .str_in_1_tlast(DMAC_STR_IN_1_TLAST),
+    .str_in_1_flush(DMAC_STR_IN_1_FLUSH),
+
+    .allch_stop_req_nonsec(DMAC_ALLCH_STOP_REQ_NONSEC),
+    .allch_stop_ack_nonsec(DMAC_ALLCH_STOP_ACK_NONSEC),
+    .allch_pause_req_nonsec(DMAC_ALLCH_PAUSE_REQ_NONSEC),
+    .allch_pause_ack_nonsec(DMAC_ALLCH_PAUSE_ACK_NONSEC),
+    .ch_enabled(DMAC_CH_ENABLED),
+    .ch_err(DMAC_CH_ERR),
+    .ch_stopped(DMAC_CH_STOPPED),
+    .ch_paused(DMAC_CH_PAUSED),
+    .ch_priv(DMAC_CH_PRIV),
+    .halt_req(DMAC_HALT_REQ),
+    .restart_req(DMAC_RESTART_REQ),
+    .halted(DMAC_HALTED),
+    .boot_en(DMAC_BOOT_EN),
+    .boot_addr(DMAC_BOOT_ADDR),
+    .boot_memattr(DMAC_BOOT_MEMATTR),
+    .boot_shareattr(DMAC_BOOT_SHAREATTR)
+);
+
+
+
+endmodule
\ No newline at end of file