xref: /XiangShan/src/main/scala/xiangshan/backend/issue/FuBusyTableRead.scala (revision f7063a43ab34da917ba6c670d21871314340c550)
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}