1package xiangshan.backend.ctrlblock 2 3import org.chipsalliance.cde.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.ren(i) := io.mdpFoldPcVecVld(i) 24 ssit.io.raddr(i) := io.mdpFlodPcVec(i) 25 waittable.io.raddr(i) := io.mdpFlodPcVec(i) 26 } 27 lfst.io.redirect <> RegNext(io.redirect) 28 lfst.io.storeIssue <> RegNext(io.stIn) 29 lfst.io.csrCtrl <> RegNext(io.csrCtrl) 30 lfst.io.dispatch <> io.dispatchLFSTio 31 32 io.waitTable2Rename := waittable.io.rdata 33 io.ssit2Rename := ssit.io.rdata 34} 35 36class MemCtrlIO(params: BackendParams)(implicit p: Parameters) extends XSBundle { 37 val redirect = Flipped(ValidIO(new Redirect)) 38 val csrCtrl = Input(new CustomCSRCtrlIO) 39 val stIn = Vec(params.StaExuCnt, Flipped(ValidIO(new DynInst))) // use storeSetHit, ssid, robIdx 40 val memPredUpdate = Input(new MemPredUpdateReq) 41 val mdpFoldPcVecVld = Input(Vec(DecodeWidth, Bool())) 42 val mdpFlodPcVec = Input(Vec(DecodeWidth, UInt(MemPredPCWidth.W))) 43 val dispatchLFSTio = Flipped(new DispatchLFSTIO) 44 val waitTable2Rename = Vec(DecodeWidth, Output(Bool())) // loadWaitBit 45 val ssit2Rename = Vec(RenameWidth, Output(new SSITEntry)) // ssit read result 46} 47