1*de93b508SzhanglyGitpackage xiangshan.backend.issue 2*de93b508SzhanglyGit 3*de93b508SzhanglyGitimport chipsalliance.rocketchip.config.Parameters 4*de93b508SzhanglyGitimport chisel3._ 5*de93b508SzhanglyGitimport chisel3.util._ 6*de93b508SzhanglyGitimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 7*de93b508SzhanglyGitimport utility.HasCircularQueuePtrHelper 8*de93b508SzhanglyGitimport xiangshan._ 9*de93b508SzhanglyGitimport xiangshan.backend.fu.{FuConfig, FuType} 10*de93b508SzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr} 11*de93b508SzhanglyGitimport xiangshan.backend.Bundles.{DynInst, IssueQueueIssueBundle, IssueQueueWakeUpBundle} 12*de93b508SzhanglyGitimport xiangshan.backend.datapath.DataConfig._ 13*de93b508SzhanglyGitimport xiangshan.backend.exu.ExeUnitParams 14*de93b508SzhanglyGit 15*de93b508SzhanglyGitclass FuBusyTableWrite(val idx: Int) (implicit p: Parameters, iqParams: IssueBlockParams) extends XSModule { 16*de93b508SzhanglyGit val io = IO(new FuBusyTableWriteIO(idx)) 17*de93b508SzhanglyGit 18*de93b508SzhanglyGit val fuLatencyMap: Option[Seq[(Int, Int)]] = iqParams.exuBlockParams(idx).fuLatencyMap 19*de93b508SzhanglyGit val latencyValMax: Option[Int] = iqParams.exuBlockParams(idx).latencyValMax 20*de93b508SzhanglyGit 21*de93b508SzhanglyGit val deqResp = io.in.deqResp 22*de93b508SzhanglyGit val og0Resp = io.in.og0Resp 23*de93b508SzhanglyGit val og1Resp = io.in.og1Resp 24*de93b508SzhanglyGit val fuTypeRegVec = io.in.fuTypeRegVec 25*de93b508SzhanglyGit 26*de93b508SzhanglyGit val fuBusyTable = Reg(UInt(latencyValMax.get.W)) //instance of FuBusyTable insists only when latencyValMax > 0 27*de93b508SzhanglyGit 28*de93b508SzhanglyGit // fuBusyTable write 29*de93b508SzhanglyGit val isLatencyNumVecDeq = Mux(deqResp(idx).valid && deqResp(idx).bits.respType === RSFeedbackType.issueSuccess, 30*de93b508SzhanglyGit Cat((0 until latencyValMax.get).map { case num => 31*de93b508SzhanglyGit val latencyNumFuType = fuLatencyMap.get.filter(_._2 == num + 1).map(_._1) // futype with latency equal to num+1 32*de93b508SzhanglyGit val isLatencyNum = Cat(latencyNumFuType.map(futype => fuTypeRegVec(OHToUInt(deqResp(idx).bits.addrOH)) === futype.U)).asUInt.orR // The latency of the deq inst is Num 33*de93b508SzhanglyGit isLatencyNum 34*de93b508SzhanglyGit }), 35*de93b508SzhanglyGit 0.U 36*de93b508SzhanglyGit ) // | when N cycle is 2 latency, N+1 cycle could not 1 latency 37*de93b508SzhanglyGit val isLatencyNumVecOg0 = WireInit(~(0.U.asTypeOf(isLatencyNumVecDeq))) 38*de93b508SzhanglyGit isLatencyNumVecOg0 := Mux(og0Resp(idx).valid && (og0Resp(idx).bits.respType === RSFeedbackType.rfArbitFail || og0Resp(idx).bits.respType === RSFeedbackType.fuBusy), 39*de93b508SzhanglyGit ~(Cat(Cat((0 until latencyValMax.get).map { case num => 40*de93b508SzhanglyGit val latencyNumFuType = fuLatencyMap.get.filter(_._2 == num + 1).map(_._1) // futype with latency equal to num+1 41*de93b508SzhanglyGit val isLatencyNum = Cat(latencyNumFuType.map(futype => fuTypeRegVec(OHToUInt(og0Resp(idx).bits.addrOH)) === futype.U)).asUInt.orR // The latency of the deq inst is Num 42*de93b508SzhanglyGit isLatencyNum 43*de93b508SzhanglyGit }), 0.U(1.W))), 44*de93b508SzhanglyGit ~(0.U.asTypeOf(isLatencyNumVecDeq)) 45*de93b508SzhanglyGit ) 46*de93b508SzhanglyGit val isLatencyNumVecOg1 = WireInit(~(0.U.asTypeOf(isLatencyNumVecDeq))) 47*de93b508SzhanglyGit isLatencyNumVecOg1 := Mux(og1Resp(idx).valid && og1Resp(idx).bits.respType === RSFeedbackType.fuBusy, 48*de93b508SzhanglyGit ~(Cat(Cat((0 until latencyValMax.get).map { case num => 49*de93b508SzhanglyGit val latencyNumFuType = fuLatencyMap.get.filter(_._2 == num + 1).map(_._1) // futype with latency equal to num+1 50*de93b508SzhanglyGit val isLatencyNum = Cat(latencyNumFuType.map(futype => fuTypeRegVec(OHToUInt(og1Resp(idx).bits.addrOH)) === futype.U)).asUInt.orR // The latency of the deq inst is Num 51*de93b508SzhanglyGit isLatencyNum 52*de93b508SzhanglyGit }), 0.U(2.W))), 53*de93b508SzhanglyGit ~(0.U.asTypeOf(isLatencyNumVecDeq)) 54*de93b508SzhanglyGit ) 55*de93b508SzhanglyGit 56*de93b508SzhanglyGit fuBusyTable := ((fuBusyTable << 1.U).asUInt & isLatencyNumVecOg0.asUInt & isLatencyNumVecOg1.asUInt) | isLatencyNumVecDeq 57*de93b508SzhanglyGit 58*de93b508SzhanglyGit io.out.fuBusyTable := fuBusyTable 59*de93b508SzhanglyGit 60*de93b508SzhanglyGit} 61*de93b508SzhanglyGit 62*de93b508SzhanglyGitclass FuBusyTableWriteIO(val idx: Int)(implicit p: Parameters, iqParams: IssueBlockParams) extends XSBundle { 63*de93b508SzhanglyGit val in = new Bundle { 64*de93b508SzhanglyGit val deqResp = Vec(iqParams.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))) 65*de93b508SzhanglyGit val og0Resp = Vec(iqParams.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))) 66*de93b508SzhanglyGit val og1Resp = Vec(iqParams.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle))) 67*de93b508SzhanglyGit val fuTypeRegVec = Input(Vec(iqParams.numEntries, FuType())) 68*de93b508SzhanglyGit } 69*de93b508SzhanglyGit val out = new Bundle { 70*de93b508SzhanglyGit val fuBusyTable = Output(UInt(iqParams.exuBlockParams(idx).latencyValMax.get.W)) 71*de93b508SzhanglyGit } 72*de93b508SzhanglyGit}