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