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