xref: /XiangShan/src/main/scala/utils/PipeWithFlush.scala (revision c5b130866fe98e1a2bcd0621ccc898bd736481e5)
13a76b099SXuan Hupackage utils
23a76b099SXuan Hu
33a76b099SXuan Huimport chisel3._
43a76b099SXuan Huimport chisel3.util._
53a76b099SXuan Huimport xiangshan._
63a76b099SXuan Hu
73a76b099SXuan Hu/** Pipeline module generator parameterized by data type and latency.
83a76b099SXuan Hu  *
93a76b099SXuan Hu  * @param gen a Chisel type, used as data in pipe
103a76b099SXuan Hu  * @param flushGen a Chisel type, used as flush signal
113a76b099SXuan Hu  * @param latency the number of pipeline stages
123a76b099SXuan Hu  * @param flushFunc used to generate flush signal
133a76b099SXuan Hu  * @tparam T Type of [[io.enq.bits]] and [[io.deq.bits]]
143a76b099SXuan Hu  * @tparam TFlush Type of [[io.flush]]
153a76b099SXuan Hu  */
163a76b099SXuan Huclass PipeWithFlush[T <: Data, TFlush <: Data] (
17493a9370SHaojin Tang  gen: T,
18493a9370SHaojin Tang  flushGen: TFlush,
19493a9370SHaojin Tang  latency: Int,
20*c5b13086SHaojin Tang  flushFunc: (T, TFlush, Int) => Bool,
21*c5b13086SHaojin Tang  modificationFunc: T => T = { x: T => x }
223a76b099SXuan Hu) extends Module {
233a76b099SXuan Hu  require(latency >= 0, "Pipe latency must be greater than or equal to zero!")
243a76b099SXuan Hu
253a76b099SXuan Hu  class PipeIO extends Bundle {
26493a9370SHaojin Tang    val flush = Input(flushGen)
273a76b099SXuan Hu    val enq = Input(Valid(gen))
283a76b099SXuan Hu    val deq = Output(Valid(gen))
293a76b099SXuan Hu  }
303a76b099SXuan Hu
313a76b099SXuan Hu  val io = IO(new PipeIO)
323a76b099SXuan Hu
333a76b099SXuan Hu  val valids: Seq[Bool] = io.enq.valid +: Seq.fill(latency)(RegInit(false.B))
343a76b099SXuan Hu  val bits: Seq[T] = io.enq.bits +: Seq.fill(latency)(Reg(gen))
35*c5b13086SHaojin Tang  val modifiedBits: Seq[T] = bits.map(modificationFunc)
363a76b099SXuan Hu
373a76b099SXuan Hu  for (i <- 0 until latency) {
38493a9370SHaojin Tang    valids(i + 1) := valids(i) && !flushFunc(bits(i), io.flush, i)
393a76b099SXuan Hu    when (valids(i)) {
40*c5b13086SHaojin Tang      bits(i + 1) := modifiedBits(i)
413a76b099SXuan Hu    }
423a76b099SXuan Hu  }
433a76b099SXuan Hu  io.deq.valid := valids.last
443a76b099SXuan Hu  io.deq.bits := bits.last
453a76b099SXuan Hu}
46