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