aboutsummaryrefslogtreecommitdiff
path: root/VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala
diff options
context:
space:
mode:
authorFriedrich Beckmann <friedrich.beckmann@hs-augsburg.de>2022-07-25 17:55:39 +0200
committerFriedrich Beckmann <friedrich.beckmann@hs-augsburg.de>2022-07-25 17:55:39 +0200
commit3fff6023602822531efdae30bc8ebf862967f1ef (patch)
tree16028102b8d850f8ab3115d28a8539ca6bc5f51d /VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala
Initial Commit
Diffstat (limited to 'VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala')
-rw-r--r--VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala24
1 files changed, 24 insertions, 0 deletions
diff --git a/VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala b/VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala
new file mode 100644
index 0000000..5a8f4d3
--- /dev/null
+++ b/VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala
@@ -0,0 +1,24 @@
+package vexriscv.plugin
+
+import vexriscv._
+import spinal.core._
+import spinal.lib._
+
+
+class HazardPessimisticPlugin() extends Plugin[VexRiscv] {
+ import Riscv._
+
+ override def setup(pipeline: VexRiscv): Unit = {
+ import pipeline.config._
+ val decoderService = pipeline.service(classOf[DecoderService])
+ decoderService.addDefault(HAS_SIDE_EFFECT, False)
+ }
+
+ override def build(pipeline: VexRiscv): Unit = {
+ import pipeline._
+ import pipeline.config._
+
+ val writesInPipeline = stages.dropWhile(_ != execute).map(s => s.arbitration.isValid && s.input(REGFILE_WRITE_VALID)) :+ RegNext(stages.last.arbitration.isValid && stages.last.input(REGFILE_WRITE_VALID))
+ decode.arbitration.haltByOther.setWhen(decode.arbitration.isValid && writesInPipeline.orR)
+ }
+}