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