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