xref: /XiangShan/src/main/scala/utils/PipeWithFlush.scala (revision 493a9370f60904d83af4f1555d40709cba1f5ef1)
1package utils
2
3import chisel3._
4import chisel3.util._
5import xiangshan._
6
7/** Pipeline module generator parameterized by data type and latency.
8  *
9  * @param gen a Chisel type, used as data in pipe
10  * @param flushGen a Chisel type, used as flush signal
11  * @param latency the number of pipeline stages
12  * @param flushFunc used to generate flush signal
13  * @tparam T Type of [[io.enq.bits]] and [[io.deq.bits]]
14  * @tparam TFlush Type of [[io.flush]]
15  */
16class PipeWithFlush[T <: Data, TFlush <: Data] (
17  gen: T,
18  flushGen: TFlush,
19  latency: Int,
20  flushFunc: (T, TFlush, Int) => Bool
21) extends Module {
22  require(latency >= 0, "Pipe latency must be greater than or equal to zero!")
23
24  class PipeIO extends Bundle {
25    val flush = Input(flushGen)
26    val enq = Input(Valid(gen))
27    val deq = Output(Valid(gen))
28  }
29
30  val io = IO(new PipeIO)
31
32  val valids: Seq[Bool] = io.enq.valid +: Seq.fill(latency)(RegInit(false.B))
33  val bits: Seq[T] = io.enq.bits +: Seq.fill(latency)(Reg(gen))
34
35  for (i <- 0 until latency) {
36    valids(i + 1) := valids(i) && !flushFunc(bits(i), io.flush, i)
37    when (valids(i)) {
38      bits(i + 1) := bits(i)
39    }
40  }
41  io.deq.valid := valids.last
42  io.deq.bits := bits.last
43}
44