diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/DataMemory.scala b/src/main/scala/uk/ac/soton/ecs/can/core/DataMemory.scala
index 0dfeb68a94f886a38b091fccac84578e0e5595fc..074a29ab08c92bf95606305349793a8e94976630 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/DataMemory.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/DataMemory.scala
@@ -5,21 +5,14 @@ package uk.ac.soton.ecs.can.core
 
 import chisel3._
 import chisel3.util.log2Ceil
+import uk.ac.soton.ecs.can.types._
 import uk.ac.soton.ecs.can.config.CanCoreConfiguration
 
 class DataMemory(implicit cfg: CanCoreConfiguration) extends MultiIOModule {
   private val addrWidth = log2Ceil(cfg.dataMemoryWords)
 
-  val read = IO(new Bundle {
-    val en = Input(Bool())
-    val addr = Input(UInt(addrWidth.W))
-    val data = Output(UInt(512.W))
-  })
-  val write = IO(new Bundle {
-    val en = Input(Bool())
-    val addr = Input(UInt(addrWidth.W))
-    val data = Input(UInt(512.W))
-  })
+  val read = IO(new MemoryReadIO(addrWidth, 512))
+  val write = IO(new MemoryWriteIO(addrWidth, 512))
 
   private val mem =
     if (cfg.syncReadMemory)
diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala b/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala
index a65cd41757baa91085f8f7de8df68d5438536fc2..ca27c9680a1c040edcecf2501c3195cd80e22b66 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/ProgramMemory.scala
@@ -5,7 +5,7 @@ package uk.ac.soton.ecs.can.core
 
 import chisel3._
 import chisel3.util.log2Ceil
-import uk.ac.soton.ecs.can.types.CanCoreControlWord
+import uk.ac.soton.ecs.can.types._
 import uk.ac.soton.ecs.can.config.CanCoreConfiguration
 
 class ProgramMemory(implicit cfg: CanCoreConfiguration) extends MultiIOModule {
@@ -19,16 +19,8 @@ class ProgramMemory(implicit cfg: CanCoreConfiguration) extends MultiIOModule {
   })
   val cw = IO(Output(UInt(cwWidth.W)))
 
-  val read = IO(new Bundle {
-    val en = Input(Bool())
-    val addr = Input(UInt(addrWidth.W))
-    val data = Output(UInt(cwWidth.W))
-  })
-  val write = IO(new Bundle {
-    val en = Input(Bool())
-    val addr = Input(UInt(addrWidth.W))
-    val data = Input(UInt(cwWidth.W))
-  })
+  val read = IO(new MemoryReadIO(addrWidth, cwWidth))
+  val write = IO(new MemoryWriteIO(addrWidth, cwWidth))
 
   private val mem =
     if (cfg.syncReadMemory)
diff --git a/src/main/scala/uk/ac/soton/ecs/can/types/MemoryReadIO.scala b/src/main/scala/uk/ac/soton/ecs/can/types/MemoryReadIO.scala
new file mode 100644
index 0000000000000000000000000000000000000000..b0d6f81bc850a73f9cc2ec2b6306376f5e8abfdc
--- /dev/null
+++ b/src/main/scala/uk/ac/soton/ecs/can/types/MemoryReadIO.scala
@@ -0,0 +1,12 @@
+// SPDX-FileCopyrightText: 2021 Minyong Li <ml10g20@soton.ac.uk>
+// SPDX-License-Identifier: CERN-OHL-W-2.0
+
+package uk.ac.soton.ecs.can.types
+
+import chisel3._
+
+class MemoryReadIO(addrWidth: Int, dataWidth: Int) extends Bundle {
+  val en = Input(Bool())
+  val addr = Input(UInt(addrWidth.W))
+  val data = Output(UInt(dataWidth.W))
+}
diff --git a/src/main/scala/uk/ac/soton/ecs/can/types/MemoryWriteIO.scala b/src/main/scala/uk/ac/soton/ecs/can/types/MemoryWriteIO.scala
new file mode 100644
index 0000000000000000000000000000000000000000..438ccb1817d1a2eb031c72a163ab2051b989d4d0
--- /dev/null
+++ b/src/main/scala/uk/ac/soton/ecs/can/types/MemoryWriteIO.scala
@@ -0,0 +1,12 @@
+// SPDX-FileCopyrightText: 2021 Minyong Li <ml10g20@soton.ac.uk>
+// SPDX-License-Identifier: CERN-OHL-W-2.0
+
+package uk.ac.soton.ecs.can.types
+
+import chisel3._
+
+class MemoryWriteIO(addrWidth: Int, dataWidth: Int) extends Bundle {
+  val en = Input(Bool())
+  val addr = Input(UInt(addrWidth.W))
+  val data = Input(UInt(dataWidth.W))
+}