diff --git a/tools/adp_verify.py b/tools/adp_verify.py
new file mode 100644
index 0000000000000000000000000000000000000000..f2122bae70d9187cba8be3ad501657860cc2e868
--- /dev/null
+++ b/tools/adp_verify.py
@@ -0,0 +1,95 @@
+#-----------------------------------------------------------------------------
+# ADP Command File Verification Script
+# 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)
+#-----------------------------------------------------------------------------
+
+class address_region():
+    def __init__(self, base, size):
+        self.base = base
+        self.size = size
+        self.end = base + size - 4
+
+class read_word():
+    def __init__(self, index, region, address, read_data = 0,exp_data = 0):
+        self.index = index
+        self.region = region
+        self.address = int(str(address), 16)
+        self.read_data = int(str(read_data), 16)
+        self.exp_data = int(str(exp_data), 16)
+    
+    def validate(self):
+        if (self.address >= self.region.base and self.address <= self.region.end):
+            return True
+        else:
+            return False
+    
+    def check_address(self, address):
+        # print(f"self: {hex(self.address)} test: {address}")
+        if (self.address == int(str(address), 16)):
+            return True
+        else:
+            return False
+    
+    def set_read_data(self, read_data):
+        self.read_data = int(read_data, 16)
+
+    def set_exp_data(self, exp_data):
+        self.exp_data = int(exp_data, 16)
+    
+    def verify(self):
+        assert (self.read_data == self.exp_data)
+
+def adp_verify(adp_input, adp_output, out_log):
+    # Create Input Region for Accelerator
+    accel_input_port  = address_region(base = 0x6001_0000, size = 0x0000_0800)
+    accel_output_port = address_region(base = 0x6001_0800, size = 0x0000_0800)
+
+    word_list = []
+    temp_address_buf = 0x0
+
+    # Read in adp input
+    adp_input_lines = open(adp_input, "r").readlines()
+    idx = 0
+    for line in adp_input_lines:
+        line_split = str(line).split()
+        if len(line_split) > 1:
+            if line_split[0].lower() == "a":
+                # Capture Address
+                temp_address_buf = line_split[1]
+            if line_split[0].lower() == "r":
+                temp_read_word = read_word(idx, accel_output_port, temp_address_buf, exp_data = line_split[1])
+                if temp_read_word.validate():
+                    word_list.append(temp_read_word)
+                    idx += 1
+
+    # Read in adp output
+    adp_output_lines = open(adp_output, "r").readlines()
+    idx = 0
+    temp_address_buf = 0x0
+    for line in adp_output_lines:
+        line_split = str(line).split()
+        if len(line_split) > 1:
+            if line_split[0] == "]A":
+                # Capture Address
+                temp_address_buf = line_split[1]
+            if line_split[0] == "]R":
+                if word_list[idx].check_address(temp_address_buf):
+                    word_list[idx].set_read_data(line_split[1])
+                    idx += 1
+
+    # Perform Verification
+    for word in word_list:
+        word.verify()
+    print(f"Tests Passed on {len(word_list)} reads")
+
+if __name__ == "__main__":
+    adp_input = "ft1248_ip.log"
+    adp_output = "ft1248_op.log"
+    output_log = "verify.log"
+    adp_verify(adp_input,adp_output,output_log)