aboutsummaryrefslogtreecommitdiff
path: root/VexRiscv/src/main/scala/vexriscv/plugin/DivPlugin.scala
diff options
context:
space:
mode:
Diffstat (limited to 'VexRiscv/src/main/scala/vexriscv/plugin/DivPlugin.scala')
-rw-r--r--VexRiscv/src/main/scala/vexriscv/plugin/DivPlugin.scala75
1 files changed, 75 insertions, 0 deletions
diff --git a/VexRiscv/src/main/scala/vexriscv/plugin/DivPlugin.scala b/VexRiscv/src/main/scala/vexriscv/plugin/DivPlugin.scala
new file mode 100644
index 0000000..c20dcb3
--- /dev/null
+++ b/VexRiscv/src/main/scala/vexriscv/plugin/DivPlugin.scala
@@ -0,0 +1,75 @@
+package vexriscv.plugin
+
+import vexriscv.{VexRiscv, _}
+import spinal.core._
+
+// DivPlugin was by the past a standalone plugin, but now it use the MulDivIterativePlugin implementation
+class DivPlugin extends MulDivIterativePlugin(genMul = false, genDiv = true, mulUnrollFactor = 1, divUnrollFactor = 1)
+
+//import spinal.lib.math.MixedDivider
+//
+//class DivPlugin extends Plugin[VexRiscv]{
+// object IS_DIV extends Stageable(Bool)
+//
+// override def setup(pipeline: VexRiscv): Unit = {
+// import Riscv._
+// import pipeline.config._
+//
+// val actions = List[(Stageable[_ <: BaseType],Any)](
+// SRC1_CTRL -> Src1CtrlEnum.RS,
+// SRC2_CTRL -> Src2CtrlEnum.RS,
+// REGFILE_WRITE_VALID -> True,
+// BYPASSABLE_EXECUTE_STAGE -> False,
+// BYPASSABLE_MEMORY_STAGE -> True,
+// RS1_USE -> True,
+// RS2_USE -> True,
+// IS_DIV -> True
+// )
+//
+// val decoderService = pipeline.service(classOf[DecoderService])
+// decoderService.addDefault(IS_DIV, False)
+// decoderService.add(List(
+// DIVX -> actions
+// ))
+//
+// }
+//
+// override def build(pipeline: VexRiscv): Unit = {
+// import pipeline._
+// import pipeline.config._
+//
+// val divider = new MixedDivider(32, 32, true) //cmd >-> rsp
+//
+// //Send request to the divider component
+// execute plug new Area {
+// import execute._
+//
+// divider.io.cmd.valid := False
+// divider.io.cmd.numerator := input(SRC1)
+// divider.io.cmd.denominator := input(SRC2)
+// divider.io.cmd.signed := !input(INSTRUCTION)(12)
+//
+// when(arbitration.isValid && input(IS_DIV)) {
+// divider.io.cmd.valid := !arbitration.isStuckByOthers && !arbitration.removeIt
+// arbitration.haltItself := memory.arbitration.isValid && memory.input(IS_DIV)
+// }
+// }
+//
+// //Collect response from the divider component, REGFILE_WRITE_DATA overriding
+// memory plug new Area{
+// import memory._
+//
+// divider.io.flush := memory.arbitration.removeIt
+// divider.io.rsp.ready := !arbitration.isStuckByOthers
+//
+// when(arbitration.isValid && input(IS_DIV)) {
+// arbitration.haltItself := !divider.io.rsp.valid
+//
+// output(REGFILE_WRITE_DATA) := Mux(input(INSTRUCTION)(13), divider.io.rsp.remainder, divider.io.rsp.quotient).asBits
+// }
+//
+//
+// divider.io.rsp.payload.error.allowPruning
+// }
+// }
+// }