diff --git a/src/main/scala/uk/ac/soton/ecs/can/config/CanCoreConfiguration.scala b/src/main/scala/uk/ac/soton/ecs/can/config/CanCoreConfiguration.scala
index e17b7319c99fe62d59c5ae6523c869449ed9081c..c6acc2b6bcdd19f3a27f2bccdf56923396dc9eee 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/config/CanCoreConfiguration.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/config/CanCoreConfiguration.scala
@@ -10,5 +10,6 @@ case class CanCoreConfiguration(
     syncReadMemory: Boolean,
     regAfterBlockInitializer: Boolean,
     regBetweenRounds: Boolean,
-    regAfterAdder: Boolean
+    regAfterAdder: Boolean,
+    quarterRoundType: Int
 )
diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/BaseRound.scala b/src/main/scala/uk/ac/soton/ecs/can/core/BaseRound.scala
index e05e6ed3aa3f8d5023bde73c703b704f552ed9fb..f92a53ad364647ae4f8db999111f7e3c6cc3b37f 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/BaseRound.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/BaseRound.scala
@@ -4,8 +4,10 @@
 package uk.ac.soton.ecs.can.core
 
 import chisel3._
+import uk.ac.soton.ecs.can.config.CanCoreConfiguration
 
-abstract class BaseRound extends MultiIOModule {
+abstract class BaseRound(implicit cfg: CanCoreConfiguration)
+    extends MultiIOModule {
   val in = IO(Input(UInt(512.W)))
   val out = IO(Output(UInt(512.W)))
 
@@ -15,7 +17,13 @@ abstract class BaseRound extends MultiIOModule {
 
   protected def wire(wireBox: Seq[Seq[Int]]): Unit = wireBox.foreach {
     wireSeq =>
-      val quarterRound = Module(new CombinationalQuarterRound)
+      val quarterRound = cfg.quarterRoundType match {
+        case 1 => Module(new CombinationalQuarterRound)
+        case 2 => Module(new TwoStageQuarterRound)
+        case 8 => Module(new EightStageQuarterRound)
+        case _ =>
+          throw new Exception("quarterRoundType should be either 1, 2, or 8")
+      }
       quarterRound.in.zip(quarterRound.out).zip(wireSeq).foreach {
         case ((i, o), w) =>
           i := _in(w)
diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/ColumnarRound.scala b/src/main/scala/uk/ac/soton/ecs/can/core/ColumnarRound.scala
index d44203d2aed9d4a02176ff52934360942f95e2b8..7b4e05a2478c03f2c45c1ff1582d680d4b59a1a5 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/ColumnarRound.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/ColumnarRound.scala
@@ -3,7 +3,9 @@
 
 package uk.ac.soton.ecs.can.core
 
-class ColumnarRound extends BaseRound {
+import uk.ac.soton.ecs.can.config.CanCoreConfiguration
+
+class ColumnarRound(implicit cfg: CanCoreConfiguration) extends BaseRound {
   wire(
     Seq(
       Seq(0, 4, 8, 12),
diff --git a/src/main/scala/uk/ac/soton/ecs/can/core/DiagonalRound.scala b/src/main/scala/uk/ac/soton/ecs/can/core/DiagonalRound.scala
index a95747372f0ee087dc44837bc9568253b05e3608..f6da699abd2717af475c93c660fe99e8270dbac0 100644
--- a/src/main/scala/uk/ac/soton/ecs/can/core/DiagonalRound.scala
+++ b/src/main/scala/uk/ac/soton/ecs/can/core/DiagonalRound.scala
@@ -3,7 +3,9 @@
 
 package uk.ac.soton.ecs.can.core
 
-class DiagonalRound extends BaseRound {
+import uk.ac.soton.ecs.can.config.CanCoreConfiguration
+
+class DiagonalRound(implicit cfg: CanCoreConfiguration) extends BaseRound {
   wire(
     Seq(
       Seq(0, 5, 10, 15),