xref: /XiangShan/src/main/scala/utils/PipeWithFlush.scala (revision 493a9370f60904d83af4f1555d40709cba1f5ef1)
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] (
17*493a9370SHaojin Tang  gen: T,
18*493a9370SHaojin Tang  flushGen: TFlush,
19*493a9370SHaojin Tang  latency: Int,
20*493a9370SHaojin Tang  flushFunc: (T, TFlush, Int) => Bool
213a76b099SXuan Hu) extends Module {
223a76b099SXuan Hu  require(latency >= 0, "Pipe latency must be greater than or equal to zero!")
233a76b099SXuan Hu
243a76b099SXuan Hu  class PipeIO extends Bundle {
25*493a9370SHaojin Tang    val flush = Input(flushGen)
263a76b099SXuan Hu    val enq = Input(Valid(gen))
273a76b099SXuan Hu    val deq = Output(Valid(gen))
283a76b099SXuan Hu  }
293a76b099SXuan Hu
303a76b099SXuan Hu  val io = IO(new PipeIO)
313a76b099SXuan Hu
323a76b099SXuan Hu  val valids: Seq[Bool] = io.enq.valid +: Seq.fill(latency)(RegInit(false.B))
333a76b099SXuan Hu  val bits: Seq[T] = io.enq.bits +: Seq.fill(latency)(Reg(gen))
343a76b099SXuan Hu
353a76b099SXuan Hu  for (i <- 0 until latency) {
36*493a9370SHaojin Tang    valids(i + 1) := valids(i) && !flushFunc(bits(i), io.flush, i)
373a76b099SXuan Hu    when (valids(i)) {
383a76b099SXuan Hu      bits(i + 1) := bits(i)
393a76b099SXuan Hu    }
403a76b099SXuan Hu  }
413a76b099SXuan Hu  io.deq.valid := valids.last
423a76b099SXuan Hu  io.deq.bits := bits.last
433a76b099SXuan Hu}
44