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