xref: /XiangShan/src/main/scala/utils/PipeWithFlush.scala (revision ec49b127142e4bf028fe7f0b3d48fdb5f520f81c)
13a76b099SXuan Hupackage utils
23a76b099SXuan Hu
33a76b099SXuan Huimport chisel3._
43a76b099SXuan Huimport chisel3.util._
53a76b099SXuan Huimport xiangshan._
62aaa83c0Sxiaofeibao-xjtuimport xiangshan.backend.Bundles.ExuInput
73a76b099SXuan Hu
83a76b099SXuan Hu/** Pipeline module generator parameterized by data type and latency.
93a76b099SXuan Hu  *
103a76b099SXuan Hu  * @param gen a Chisel type, used as data in pipe
113a76b099SXuan Hu  * @param flushGen a Chisel type, used as flush signal
123a76b099SXuan Hu  * @param latency the number of pipeline stages
133a76b099SXuan Hu  * @param flushFunc used to generate flush signal
143a76b099SXuan Hu  * @tparam T Type of [[io.enq.bits]] and [[io.deq.bits]]
153a76b099SXuan Hu  * @tparam TFlush Type of [[io.flush]]
163a76b099SXuan Hu  */
173a76b099SXuan Huclass PipeWithFlush[T <: Data, TFlush <: Data] (
182aaa83c0Sxiaofeibao-xjtu  gen: ExuInput,
19493a9370SHaojin Tang  flushGen: TFlush,
20493a9370SHaojin Tang  latency: Int,
212aaa83c0Sxiaofeibao-xjtu  flushFunc: (ExuInput, TFlush, Int) => Bool,
222aaa83c0Sxiaofeibao-xjtu  modificationFunc: ExuInput => ExuInput = { x: ExuInput => x }
233a76b099SXuan Hu) extends Module {
243a76b099SXuan Hu  require(latency >= 0, "Pipe latency must be greater than or equal to zero!")
253a76b099SXuan Hu
263a76b099SXuan Hu  class PipeIO extends Bundle {
27493a9370SHaojin Tang    val flush = Input(flushGen)
283a76b099SXuan Hu    val enq = Input(Valid(gen))
29ec1fea84SzhanglyGit    val deq = Output(Valid(gen))
303a76b099SXuan Hu  }
313a76b099SXuan Hu
323a76b099SXuan Hu  val io = IO(new PipeIO)
333a76b099SXuan Hu
343a76b099SXuan Hu  val valids: Seq[Bool] = io.enq.valid +: Seq.fill(latency)(RegInit(false.B))
352aaa83c0Sxiaofeibao-xjtu  val bits: Seq[ExuInput] = io.enq.bits +: Seq.fill(latency)(Reg(gen))
362aaa83c0Sxiaofeibao-xjtu  val modifiedBits: Seq[ExuInput] = bits.map(modificationFunc)
373a76b099SXuan Hu
383a76b099SXuan Hu  for (i <- 0 until latency) {
395f4ac341Sxiaofeibao-xjtu    valids(i + 1) := (if (i==0) valids(i) else valids(i) && !flushFunc(bits(i), io.flush, i))
403a76b099SXuan Hu    when(valids(i)) {
41*ec49b127Ssinsanction      bits(i + 1) := (if (i==0) bits(i) else modifiedBits(i))
423a76b099SXuan Hu    }
433a76b099SXuan Hu  }
443a76b099SXuan Hu  io.deq.valid := valids.last
453a76b099SXuan Hu  io.deq.bits := bits.last
463a76b099SXuan Hu}
47