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