13a76b099SXuan Hupackage utils 23a76b099SXuan Hu 33a76b099SXuan Huimport chisel3._ 43a76b099SXuan Huimport chisel3.util._ 53a76b099SXuan Huimport xiangshan._ 62aaa83c0Sxiaofeibao-xjtuimport xiangshan.backend.Bundles.ExuInput 73a76b099SXuan Hu 83a76b099SXuan Hu/** Pipeline module generator parameterized by data type and latency. 93a76b099SXuan Hu * 103a76b099SXuan Hu * @param gen a Chisel type, used as data in pipe 113a76b099SXuan Hu * @param flushGen a Chisel type, used as flush signal 123a76b099SXuan Hu * @param latency the number of pipeline stages 133a76b099SXuan Hu * @param flushFunc used to generate flush signal 143a76b099SXuan Hu * @tparam T Type of [[io.enq.bits]] and [[io.deq.bits]] 153a76b099SXuan Hu * @tparam TFlush Type of [[io.flush]] 163a76b099SXuan Hu */ 173a76b099SXuan Huclass PipeWithFlush[T <: Data, TFlush <: Data] ( 182aaa83c0Sxiaofeibao-xjtu gen: ExuInput, 19493a9370SHaojin Tang flushGen: TFlush, 20493a9370SHaojin Tang latency: Int, 212aaa83c0Sxiaofeibao-xjtu flushFunc: (ExuInput, TFlush, Int) => Bool, 222aaa83c0Sxiaofeibao-xjtu modificationFunc: ExuInput => ExuInput = { x: ExuInput => x } 233a76b099SXuan Hu) extends Module { 243a76b099SXuan Hu require(latency >= 0, "Pipe latency must be greater than or equal to zero!") 253a76b099SXuan Hu 263a76b099SXuan Hu class PipeIO extends Bundle { 27493a9370SHaojin Tang val flush = Input(flushGen) 283a76b099SXuan Hu val enq = Input(Valid(gen)) 29ec1fea84SzhanglyGit val deq = Output(Valid(gen)) 303a76b099SXuan Hu } 313a76b099SXuan Hu 323a76b099SXuan Hu val io = IO(new PipeIO) 333a76b099SXuan Hu 343a76b099SXuan Hu val valids: Seq[Bool] = io.enq.valid +: Seq.fill(latency)(RegInit(false.B)) 352aaa83c0Sxiaofeibao-xjtu val bits: Seq[ExuInput] = io.enq.bits +: Seq.fill(latency)(Reg(gen)) 362aaa83c0Sxiaofeibao-xjtu val modifiedBits: Seq[ExuInput] = bits.map(modificationFunc) 373a76b099SXuan Hu 383a76b099SXuan Hu for (i <- 0 until latency) { 395f4ac341Sxiaofeibao-xjtu valids(i + 1) := (if (i==0) valids(i) else valids(i) && !flushFunc(bits(i), io.flush, i)) 403a76b099SXuan Hu when(valids(i)) { 41*ec49b127Ssinsanction bits(i + 1) := (if (i==0) bits(i) else modifiedBits(i)) 423a76b099SXuan Hu } 433a76b099SXuan Hu } 443a76b099SXuan Hu io.deq.valid := valids.last 453a76b099SXuan Hu io.deq.bits := bits.last 463a76b099SXuan Hu} 47