diff --git a/testbench/CanCore.tb.v b/testbench/CanCore.tb.v
new file mode 100644
index 0000000000000000000000000000000000000000..6174d5f20f466c28c9c908816dd3e2c978126806
--- /dev/null
+++ b/testbench/CanCore.tb.v
@@ -0,0 +1,50 @@
+// Testbench for core.CanCore
+// SPDX-FileCopyrightText: 2021 Minyong Li <ml10g20@soton.ac.uk>
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+`timescale 100ps/1ps
+
+module CanCoreTest;
+
+reg          clock;
+reg          reset;
+reg          io_take;
+wire         io_halted;
+reg  [6:0]   io_programMemory_read_addr;
+wire [19:0]  io_programMemory_read_data;
+reg          io_programMemory_write_en;
+reg  [6:0]   io_programMemory_write_addr;
+reg  [19:0]  io_programMemory_write_data;
+reg  [3:0]   io_dataMemory_read_addr;
+wire [511:0] io_dataMemory_read_data;
+reg          io_dataMemory_write_en;
+reg  [3:0]   io_dataMemory_write_addr;
+reg  [511:0] io_dataMemory_write_data;
+
+CanCore canCore (.*);
+
+always #1 clock = ~clock;
+
+initial begin
+  clock <= 0;
+  reset <= 1;
+  io_take <= 0;
+  io_programMemory_read_addr <= 0;
+  io_programMemory_write_addr <= 0;
+  io_programMemory_write_en <= 0;
+  io_programMemory_write_addr <= 0;
+  io_programMemory_write_data <= 0;
+  io_dataMemory_read_addr <= 0;
+  io_dataMemory_write_en <= 0;
+  io_dataMemory_write_addr <= 0;
+  io_dataMemory_write_data <= 0;
+
+  // Quartus Prime starts the simulator under
+  // fpga/<board>/simulation/<simulator>/ ; change the path if needed.
+  $readmemh("../../../../firmware/test/test.prog.hex", canCore.programMemory.mem);
+  $readmemh("../../../../firmware/test/test.data.hex", canCore.dataMemory.mem);
+
+  $stop;
+end
+
+endmodule