xref: /XiangShan/src/main/scala/xiangshan/backend/issue/FuBusyTableRead.scala (revision de93b50824dbba16b462d31c87da7274fadafdf3)
1*de93b508SzhanglyGitpackage xiangshan.backend.issue
2*de93b508SzhanglyGit
3*de93b508SzhanglyGitimport chipsalliance.rocketchip.config.Parameters
4*de93b508SzhanglyGitimport chisel3._
5*de93b508SzhanglyGitimport chisel3.util._
6*de93b508SzhanglyGitimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
7*de93b508SzhanglyGitimport utility.HasCircularQueuePtrHelper
8*de93b508SzhanglyGitimport xiangshan._
9*de93b508SzhanglyGitimport xiangshan.backend.fu.{FuConfig, FuType}
10*de93b508SzhanglyGitimport xiangshan.mem.{MemWaitUpdateReq, SqPtr}
11*de93b508SzhanglyGitimport xiangshan.backend.Bundles.{DynInst, IssueQueueIssueBundle, IssueQueueWakeUpBundle}
12*de93b508SzhanglyGitimport xiangshan.backend.datapath.DataConfig._
13*de93b508SzhanglyGitimport xiangshan.backend.exu.ExeUnitParams
14*de93b508SzhanglyGit
15*de93b508SzhanglyGitclass FuBusyTableRead(val idx: Int, isWb: Boolean, isVf: Boolean = false)(implicit p: Parameters, iqParams: IssueBlockParams) extends XSModule {
16*de93b508SzhanglyGit  val io = IO(new FuBusyTableReadIO(idx, isWb, isVf))
17*de93b508SzhanglyGit
18*de93b508SzhanglyGit  val fuBusyTableSplit = if (!isWb) io.in.fuBusyTable.asBools.reverse else io.in.fuBusyTable.asBools
19*de93b508SzhanglyGit  val latencyMap = if (!isWb) iqParams.exuBlockParams(idx).fuLatencyMap
20*de93b508SzhanglyGit                   else if (isVf) iqParams.exuBlockParams(idx).vfFuLatencyMap
21*de93b508SzhanglyGit                   else iqParams.exuBlockParams(idx).intFuLatencyMap
22*de93b508SzhanglyGit  val fuTypeRegVec = io.in.fuTypeRegVec
23*de93b508SzhanglyGit
24*de93b508SzhanglyGit
25*de93b508SzhanglyGit  val isReadLatencyNumVec2 = fuBusyTableSplit.zipWithIndex.map { case (en, latencyIdx) =>
26*de93b508SzhanglyGit    val latencyHitVec = WireInit(0.U(iqParams.numEntries.W))
27*de93b508SzhanglyGit    when(en) {
28*de93b508SzhanglyGit      latencyHitVec := VecInit(fuTypeRegVec.map { case futype =>
29*de93b508SzhanglyGit        val latencyHitFuType = latencyMap.get.filter(_._2 == latencyIdx).map(_._1)
30*de93b508SzhanglyGit        val isLatencyNum = Cat(latencyHitFuType.map(_.U === futype)).asUInt.orR
31*de93b508SzhanglyGit        isLatencyNum
32*de93b508SzhanglyGit      }).asUInt
33*de93b508SzhanglyGit    }
34*de93b508SzhanglyGit    latencyHitVec
35*de93b508SzhanglyGit  }
36*de93b508SzhanglyGit
37*de93b508SzhanglyGit  io.out.fuBusyTableMask := isReadLatencyNumVec2.fold(0.U(iqParams.numEntries.W))(_ | _)
38*de93b508SzhanglyGit}
39*de93b508SzhanglyGit
40*de93b508SzhanglyGitclass FuBusyTableReadIO(val idx: Int, isWb: Boolean, isVf: Boolean)(implicit p: Parameters, iqParams: IssueBlockParams) extends XSBundle {
41*de93b508SzhanglyGit  val in = new Bundle {
42*de93b508SzhanglyGit    val fuBusyTable = if (!isWb) Input(UInt(iqParams.exuBlockParams(idx).latencyValMax.get.W))
43*de93b508SzhanglyGit                      else if (isVf) Input(UInt((iqParams.exuBlockParams(idx).vfLatencyValMax.get + 1).W))
44*de93b508SzhanglyGit                      else Input(UInt((iqParams.exuBlockParams(idx).intLatencyValMax.get + 1).W))
45*de93b508SzhanglyGit    val fuTypeRegVec = Input(Vec(iqParams.numEntries, FuType()))
46*de93b508SzhanglyGit  }
47*de93b508SzhanglyGit  val out = new Bundle {
48*de93b508SzhanglyGit    val fuBusyTableMask = Output(UInt(iqParams.numEntries.W))
49*de93b508SzhanglyGit  }
50*de93b508SzhanglyGit}