1de93b508SzhanglyGitpackage xiangshan.backend.issue 2de93b508SzhanglyGit 3de93b508SzhanglyGitimport chisel3._ 4de93b508SzhanglyGitimport chisel3.util._ 5*bf44d649SXuan Huimport utils.MapUtils 6*bf44d649SXuan Huimport xiangshan.backend.fu.FuType 7de93b508SzhanglyGit 8*bf44d649SXuan Huclass FuBusyTableRead(fuLatencyMap: Map[Int, Int])(implicit iqParams: IssueBlockParams) extends Module { 9*bf44d649SXuan Hu private val numEntries = iqParams.numEntries 10*bf44d649SXuan Hu private val latMax = fuLatencyMap.values.fold(0)(_ max _) 11de93b508SzhanglyGit 12*bf44d649SXuan Hu val io = IO(new FuBusyTableReadIO(latMax, numEntries)) 13de93b508SzhanglyGit 14*bf44d649SXuan Hu val fuBusyVec = VecInit(io.in.fuBusyTable.asBools) 15*bf44d649SXuan Hu val fuTypeVec = io.in.fuTypeRegVec 16de93b508SzhanglyGit 17*bf44d649SXuan Hu /** 18*bf44d649SXuan Hu * Map[latency, Set[fuType]] 19*bf44d649SXuan Hu */ 20*bf44d649SXuan Hu private val latMappedFuTypeSet: Map[Int, Set[Int]] = MapUtils.groupByValueUnique(fuLatencyMap) 21*bf44d649SXuan Hu 22*bf44d649SXuan Hu val readMaskVec = fuBusyVec.zipWithIndex.map { case (busy, lat) => 23*bf44d649SXuan Hu val latencyHitVec = WireInit(0.U(numEntries.W)) 24*bf44d649SXuan Hu when(busy) { 25*bf44d649SXuan Hu latencyHitVec := VecInit(fuTypeVec.map { fuType => 26*bf44d649SXuan Hu val latencyHitFuType = latMappedFuTypeSet.getOrElse(lat, Set()).toSeq 27*bf44d649SXuan Hu val isLatencyNum = Cat(latencyHitFuType.map(_.U === fuType)).orR 28de93b508SzhanglyGit isLatencyNum 29de93b508SzhanglyGit }).asUInt 30de93b508SzhanglyGit } 31*bf44d649SXuan Hu 32de93b508SzhanglyGit latencyHitVec 33de93b508SzhanglyGit } 34de93b508SzhanglyGit 35*bf44d649SXuan Hu io.out.fuBusyTableMask := readMaskVec.fold(0.U(iqParams.numEntries.W))(_ | _) 36de93b508SzhanglyGit} 37de93b508SzhanglyGit 38*bf44d649SXuan Huclass FuBusyTableReadIO(latencyValMax: Int, numEntries: Int) extends Bundle { 39*bf44d649SXuan Hu private val tableSize = latencyValMax + 1 40*bf44d649SXuan Hu 41de93b508SzhanglyGit val in = new Bundle { 42*bf44d649SXuan Hu val fuBusyTable = Input(UInt(tableSize.W)) 43*bf44d649SXuan Hu val fuTypeRegVec = Input(Vec(numEntries, FuType())) 44de93b508SzhanglyGit } 45de93b508SzhanglyGit val out = new Bundle { 46*bf44d649SXuan Hu val fuBusyTableMask = Output(UInt(numEntries.W)) 47de93b508SzhanglyGit } 48de93b508SzhanglyGit}