xref: /XiangShan/src/main/scala/xiangshan/backend/issue/FuBusyTableWrite.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 FuBusyTableWrite(val idx: Int) (implicit  p: Parameters, iqParams: IssueBlockParams) extends XSModule {
16*de93b508SzhanglyGit  val io = IO(new FuBusyTableWriteIO(idx))
17*de93b508SzhanglyGit
18*de93b508SzhanglyGit  val fuLatencyMap: Option[Seq[(Int, Int)]] = iqParams.exuBlockParams(idx).fuLatencyMap
19*de93b508SzhanglyGit  val latencyValMax: Option[Int] = iqParams.exuBlockParams(idx).latencyValMax
20*de93b508SzhanglyGit
21*de93b508SzhanglyGit  val deqResp = io.in.deqResp
22*de93b508SzhanglyGit  val og0Resp = io.in.og0Resp
23*de93b508SzhanglyGit  val og1Resp = io.in.og1Resp
24*de93b508SzhanglyGit  val fuTypeRegVec = io.in.fuTypeRegVec
25*de93b508SzhanglyGit
26*de93b508SzhanglyGit  val fuBusyTable = Reg(UInt(latencyValMax.get.W)) //instance of FuBusyTable insists only when latencyValMax > 0
27*de93b508SzhanglyGit
28*de93b508SzhanglyGit  // fuBusyTable write
29*de93b508SzhanglyGit  val isLatencyNumVecDeq = Mux(deqResp(idx).valid && deqResp(idx).bits.respType === RSFeedbackType.issueSuccess,
30*de93b508SzhanglyGit    Cat((0 until latencyValMax.get).map { case num =>
31*de93b508SzhanglyGit      val latencyNumFuType = fuLatencyMap.get.filter(_._2 == num + 1).map(_._1) // futype with latency equal to num+1
32*de93b508SzhanglyGit      val isLatencyNum = Cat(latencyNumFuType.map(futype => fuTypeRegVec(OHToUInt(deqResp(idx).bits.addrOH)) === futype.U)).asUInt.orR // The latency of the deq inst is Num
33*de93b508SzhanglyGit      isLatencyNum
34*de93b508SzhanglyGit    }),
35*de93b508SzhanglyGit    0.U
36*de93b508SzhanglyGit  ) // |  when N cycle is 2 latency, N+1 cycle could not 1 latency
37*de93b508SzhanglyGit  val isLatencyNumVecOg0 = WireInit(~(0.U.asTypeOf(isLatencyNumVecDeq)))
38*de93b508SzhanglyGit  isLatencyNumVecOg0 := Mux(og0Resp(idx).valid && (og0Resp(idx).bits.respType === RSFeedbackType.rfArbitFail || og0Resp(idx).bits.respType === RSFeedbackType.fuBusy),
39*de93b508SzhanglyGit    ~(Cat(Cat((0 until latencyValMax.get).map { case num =>
40*de93b508SzhanglyGit      val latencyNumFuType = fuLatencyMap.get.filter(_._2 == num + 1).map(_._1) // futype with latency equal to num+1
41*de93b508SzhanglyGit      val isLatencyNum = Cat(latencyNumFuType.map(futype => fuTypeRegVec(OHToUInt(og0Resp(idx).bits.addrOH)) === futype.U)).asUInt.orR // The latency of the deq inst is Num
42*de93b508SzhanglyGit      isLatencyNum
43*de93b508SzhanglyGit    }), 0.U(1.W))),
44*de93b508SzhanglyGit    ~(0.U.asTypeOf(isLatencyNumVecDeq))
45*de93b508SzhanglyGit  )
46*de93b508SzhanglyGit  val isLatencyNumVecOg1 = WireInit(~(0.U.asTypeOf(isLatencyNumVecDeq)))
47*de93b508SzhanglyGit  isLatencyNumVecOg1 := Mux(og1Resp(idx).valid && og1Resp(idx).bits.respType === RSFeedbackType.fuBusy,
48*de93b508SzhanglyGit    ~(Cat(Cat((0 until latencyValMax.get).map { case num =>
49*de93b508SzhanglyGit      val latencyNumFuType = fuLatencyMap.get.filter(_._2 == num + 1).map(_._1) // futype with latency equal to num+1
50*de93b508SzhanglyGit      val isLatencyNum = Cat(latencyNumFuType.map(futype => fuTypeRegVec(OHToUInt(og1Resp(idx).bits.addrOH)) === futype.U)).asUInt.orR // The latency of the deq inst is Num
51*de93b508SzhanglyGit      isLatencyNum
52*de93b508SzhanglyGit    }), 0.U(2.W))),
53*de93b508SzhanglyGit    ~(0.U.asTypeOf(isLatencyNumVecDeq))
54*de93b508SzhanglyGit  )
55*de93b508SzhanglyGit
56*de93b508SzhanglyGit  fuBusyTable := ((fuBusyTable << 1.U).asUInt & isLatencyNumVecOg0.asUInt & isLatencyNumVecOg1.asUInt) | isLatencyNumVecDeq
57*de93b508SzhanglyGit
58*de93b508SzhanglyGit  io.out.fuBusyTable := fuBusyTable
59*de93b508SzhanglyGit
60*de93b508SzhanglyGit}
61*de93b508SzhanglyGit
62*de93b508SzhanglyGitclass FuBusyTableWriteIO(val idx: Int)(implicit p: Parameters, iqParams: IssueBlockParams) extends XSBundle {
63*de93b508SzhanglyGit  val in = new Bundle {
64*de93b508SzhanglyGit    val deqResp = Vec(iqParams.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle)))
65*de93b508SzhanglyGit    val og0Resp = Vec(iqParams.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle)))
66*de93b508SzhanglyGit    val og1Resp = Vec(iqParams.numDeq, Flipped(ValidIO(new IssueQueueDeqRespBundle)))
67*de93b508SzhanglyGit    val fuTypeRegVec = Input(Vec(iqParams.numEntries, FuType()))
68*de93b508SzhanglyGit  }
69*de93b508SzhanglyGit  val out = new Bundle {
70*de93b508SzhanglyGit    val fuBusyTable = Output(UInt(iqParams.exuBlockParams(idx).latencyValMax.get.W))
71*de93b508SzhanglyGit  }
72*de93b508SzhanglyGit}