aboutsummaryrefslogtreecommitdiff
path: root/VexRiscv/src/main/scala/vexriscv/plugin/HazardPessimisticPlugin.scala
blob: 5a8f4d3c611f3c8d57f631995c7c3276db614956 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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)
  }
}