xref: /XiangShan/src/main/scala/xiangshan/backend/ctrlblock/MemCtrl.scala (revision 730cfbc0bf03569aa07dd82ba3fb41eb7413e13c)
1package xiangshan.backend.ctrlblock
2
3import chipsalliance.rocketchip.config.Parameters
4import chisel3.util.ValidIO
5import chisel3._
6import xiangshan.backend.BackendParams
7import xiangshan.{CustomCSRCtrlIO, MemPredUpdateReq, Redirect, XSBundle, XSModule}
8import xiangshan.mem.mdp.{DispatchLFSTIO, LFST, SSIT, SSITEntry, WaitTable}
9import xiangshan.backend.Bundles.DynInst
10
11class MemCtrl(params: BackendParams)(implicit p: Parameters) extends XSModule {
12  val io = IO(new MemCtrlIO(params))
13
14  private val ssit = Module(new SSIT)
15  private val waittable = Module(new WaitTable)
16  private val lfst = Module(new LFST)
17  ssit.io.update <> RegNext(io.memPredUpdate)
18  waittable.io.update <> RegNext(io.memPredUpdate)
19  ssit.io.csrCtrl := RegNext(io.csrCtrl)
20  waittable.io.csrCtrl := RegNext(io.csrCtrl)
21
22  for (i <- 0 until RenameWidth) {
23    ssit.io.raddr(i) := io.mdpFlodPcVec(i)
24    waittable.io.raddr(i) := io.mdpFlodPcVec(i)
25  }
26  lfst.io.redirect <> RegNext(io.redirect)
27  lfst.io.storeIssue <> RegNext(io.stIn)
28  lfst.io.csrCtrl <> RegNext(io.csrCtrl)
29  lfst.io.dispatch <> io.dispatchLFSTio
30
31  io.waitTable2Rename := waittable.io.rdata
32  io.ssit2Rename := ssit.io.rdata
33}
34
35class MemCtrlIO(params: BackendParams)(implicit p: Parameters) extends XSBundle {
36  val redirect = Flipped(ValidIO(new Redirect))
37  val csrCtrl = Input(new CustomCSRCtrlIO)
38  val stIn = Vec(params.StaCnt, Flipped(ValidIO(new DynInst))) // use storeSetHit, ssid, robIdx
39  val memPredUpdate = Input(new MemPredUpdateReq)
40  val mdpFlodPcVec = Input(Vec(DecodeWidth, UInt(MemPredPCWidth.W)))
41  val dispatchLFSTio = Flipped(new DispatchLFSTIO)
42  val waitTable2Rename = Vec(DecodeWidth, Output(Bool()))   // loadWaitBit
43  val ssit2Rename = Vec(RenameWidth, Output(new SSITEntry)) // ssit read result
44}
45