1730cfbc0SXuan Hupackage xiangshan.backend 2730cfbc0SXuan Hu 3730cfbc0SXuan Huimport chipsalliance.rocketchip.config.Parameters 4730cfbc0SXuan Huimport chisel3._ 5730cfbc0SXuan Huimport chisel3.util._ 6730cfbc0SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 7c0be7f33SXuan Huimport utility.ZeroExt 8730cfbc0SXuan Huimport xiangshan._ 90f55a0d3SHaojin Tangimport xiangshan.backend.Bundles.{DynInst, IssueQueueIQWakeUpBundle, MemExuInput, MemExuOutput, LoadShouldCancel} 10870f462dSXuan Huimport xiangshan.backend.ctrlblock.{DebugLSIO, LsTopdownInfo} 1139c59369SXuan Huimport xiangshan.backend.datapath.DataConfig.{IntData, VecData} 12c34b4b06SXuan Huimport xiangshan.backend.datapath.RdConfig.{IntRD, VfRD} 13730cfbc0SXuan Huimport xiangshan.backend.datapath.WbConfig._ 14c34b4b06SXuan Huimport xiangshan.backend.datapath._ 15730cfbc0SXuan Huimport xiangshan.backend.exu.ExuBlock 16a8db15d8Sfdyimport xiangshan.backend.fu.vector.Bundles.{VConfig, VType} 17fb4849e5SXuan Huimport xiangshan.backend.fu.{FenceIO, FenceToSbuffer, FuConfig, PerfCounterIO} 187fb1e4e4SXuan Huimport xiangshan.backend.issue.{CancelNetwork, Scheduler} 19730cfbc0SXuan Huimport xiangshan.backend.rob.RobLsqIO 20730cfbc0SXuan Huimport xiangshan.frontend.{FtqPtr, FtqRead} 21730cfbc0SXuan Huimport xiangshan.mem.{LqPtr, LsqEnqIO, SqPtr} 22730cfbc0SXuan Hu 23730cfbc0SXuan Huclass Backend(val params: BackendParams)(implicit p: Parameters) extends LazyModule 24730cfbc0SXuan Hu with HasXSParameter { 25730cfbc0SXuan Hu 269b258a00Sxgkiri /* Only update the idx in mem-scheduler here 279b258a00Sxgkiri * Idx in other schedulers can be updated the same way if needed 289b258a00Sxgkiri * 299b258a00Sxgkiri * Also note that we filter out the 'stData issue-queues' when counting 309b258a00Sxgkiri */ 319b258a00Sxgkiri for ((ibp, idx) <- params.memSchdParams.get.issueBlockParams.filter(iq => iq.StdCnt == 0).zipWithIndex) { 329b258a00Sxgkiri ibp.updateIdx(idx) 339b258a00Sxgkiri } 349b258a00Sxgkiri 35bf35baadSXuan Hu println(params.iqWakeUpParams) 36bf35baadSXuan Hu 37dd473fffSXuan Hu for ((schdCfg, i) <- params.allSchdParams.zipWithIndex) { 38dd473fffSXuan Hu schdCfg.bindBackendParam(params) 39dd473fffSXuan Hu } 40dd473fffSXuan Hu 41dd473fffSXuan Hu for ((iqCfg, i) <- params.allIssueParams.zipWithIndex) { 42dd473fffSXuan Hu iqCfg.bindBackendParam(params) 43dd473fffSXuan Hu } 44dd473fffSXuan Hu 45bf35baadSXuan Hu for ((exuCfg, i) <- params.allExuParams.zipWithIndex) { 46bf35baadSXuan Hu exuCfg.updateIQWakeUpConfigs(params.iqWakeUpParams) 47bf35baadSXuan Hu exuCfg.updateExuIdx(i) 48dd473fffSXuan Hu exuCfg.bindBackendParam(params) 49bf35baadSXuan Hu } 50bf35baadSXuan Hu 510655b1a0SXuan Hu println("[Backend] ExuConfigs:") 52730cfbc0SXuan Hu for (exuCfg <- params.allExuParams) { 53730cfbc0SXuan Hu val fuConfigs = exuCfg.fuConfigs 54730cfbc0SXuan Hu val wbPortConfigs = exuCfg.wbPortConfigs 55730cfbc0SXuan Hu val immType = exuCfg.immType 56bf44d649SXuan Hu 570655b1a0SXuan Hu println("[Backend] " + 580655b1a0SXuan Hu s"${exuCfg.name}: " + 590655b1a0SXuan Hu s"${fuConfigs.map(_.name).mkString("fu(s): {", ",", "}")}, " + 600655b1a0SXuan Hu s"${wbPortConfigs.mkString("wb: {", ",", "}")}, " + 61bf44d649SXuan Hu s"${immType.map(SelImm.mkString(_)).mkString("imm: {", ",", "}")}, " + 62c0be7f33SXuan Hu s"latMax(${exuCfg.latencyValMax}), ${exuCfg.fuLatancySet.mkString("lat: {", ",", "}")}, " 63c0be7f33SXuan Hu ) 64c0be7f33SXuan Hu require( 65c0be7f33SXuan Hu wbPortConfigs.collectFirst { case x: IntWB => x }.nonEmpty == 66730cfbc0SXuan Hu fuConfigs.map(_.writeIntRf).reduce(_ || _), 67c0be7f33SXuan Hu "int wb port has no priority" 68c0be7f33SXuan Hu ) 69c0be7f33SXuan Hu require( 70c0be7f33SXuan Hu wbPortConfigs.collectFirst { case x: VfWB => x }.nonEmpty == 71730cfbc0SXuan Hu fuConfigs.map(x => x.writeFpRf || x.writeVecRf).reduce(_ || _), 72c0be7f33SXuan Hu "vec wb port has no priority" 73c0be7f33SXuan Hu ) 74730cfbc0SXuan Hu } 75730cfbc0SXuan Hu 76c34b4b06SXuan Hu println(s"[Backend] all fu configs") 77b6b11f60SXuan Hu for (cfg <- FuConfig.allConfigs) { 78b6b11f60SXuan Hu println(s"[Backend] $cfg") 79b6b11f60SXuan Hu } 80b6b11f60SXuan Hu 81c34b4b06SXuan Hu println(s"[Backend] Int RdConfigs: ExuName(Priority)") 8239c59369SXuan Hu for ((port, seq) <- params.getRdPortParams(IntData())) { 83c34b4b06SXuan Hu println(s"[Backend] port($port): ${seq.map(x => params.getExuName(x._1) + "(" + x._2.toString + ")").mkString(",")}") 84c34b4b06SXuan Hu } 85c34b4b06SXuan Hu 86c34b4b06SXuan Hu println(s"[Backend] Int WbConfigs: ExuName(Priority)") 8739c59369SXuan Hu for ((port, seq) <- params.getWbPortParams(IntData())) { 88c34b4b06SXuan Hu println(s"[Backend] port($port): ${seq.map(x => params.getExuName(x._1) + "(" + x._2.toString + ")").mkString(",")}") 89c34b4b06SXuan Hu } 90c34b4b06SXuan Hu 91c34b4b06SXuan Hu println(s"[Backend] Vf RdConfigs: ExuName(Priority)") 9239c59369SXuan Hu for ((port, seq) <- params.getRdPortParams(VecData())) { 93c34b4b06SXuan Hu println(s"[Backend] port($port): ${seq.map(x => params.getExuName(x._1) + "(" + x._2.toString + ")").mkString(",")}") 94c34b4b06SXuan Hu } 95c34b4b06SXuan Hu 96c34b4b06SXuan Hu println(s"[Backend] Vf WbConfigs: ExuName(Priority)") 9739c59369SXuan Hu for ((port, seq) <- params.getWbPortParams(VecData())) { 98c34b4b06SXuan Hu println(s"[Backend] port($port): ${seq.map(x => params.getExuName(x._1) + "(" + x._2.toString + ")").mkString(",")}") 99c34b4b06SXuan Hu } 100c34b4b06SXuan Hu 101730cfbc0SXuan Hu val ctrlBlock = LazyModule(new CtrlBlock(params)) 102d8a24b06SzhanglyGit val pcTargetMem = LazyModule(new PcTargetMem(params)) 103730cfbc0SXuan Hu val intScheduler = params.intSchdParams.map(x => LazyModule(new Scheduler(x))) 104730cfbc0SXuan Hu val vfScheduler = params.vfSchdParams.map(x => LazyModule(new Scheduler(x))) 105730cfbc0SXuan Hu val memScheduler = params.memSchdParams.map(x => LazyModule(new Scheduler(x))) 1067fb1e4e4SXuan Hu val cancelNetwork = LazyModule(new CancelNetwork(params)) 107730cfbc0SXuan Hu val dataPath = LazyModule(new DataPath(params)) 108730cfbc0SXuan Hu val intExuBlock = params.intSchdParams.map(x => LazyModule(new ExuBlock(x))) 109730cfbc0SXuan Hu val vfExuBlock = params.vfSchdParams.map(x => LazyModule(new ExuBlock(x))) 1107f847969SzhanglyGit val wbFuBusyTable = LazyModule(new WbFuBusyTable(params)) 111730cfbc0SXuan Hu 112730cfbc0SXuan Hu lazy val module = new BackendImp(this) 113730cfbc0SXuan Hu} 114730cfbc0SXuan Hu 115d91483a6Sfdyclass BackendImp(override val wrapper: Backend)(implicit p: Parameters) extends LazyModuleImp(wrapper) 116d91483a6Sfdy with HasXSParameter { 117730cfbc0SXuan Hu implicit private val params = wrapper.params 118870f462dSXuan Hu 119730cfbc0SXuan Hu val io = IO(new BackendIO()(p, wrapper.params)) 120730cfbc0SXuan Hu 121730cfbc0SXuan Hu private val ctrlBlock = wrapper.ctrlBlock.module 122d8a24b06SzhanglyGit private val pcTargetMem = wrapper.pcTargetMem.module 123730cfbc0SXuan Hu private val intScheduler = wrapper.intScheduler.get.module 124730cfbc0SXuan Hu private val vfScheduler = wrapper.vfScheduler.get.module 125730cfbc0SXuan Hu private val memScheduler = wrapper.memScheduler.get.module 1267fb1e4e4SXuan Hu private val cancelNetwork = wrapper.cancelNetwork.module 127730cfbc0SXuan Hu private val dataPath = wrapper.dataPath.module 128730cfbc0SXuan Hu private val intExuBlock = wrapper.intExuBlock.get.module 129730cfbc0SXuan Hu private val vfExuBlock = wrapper.vfExuBlock.get.module 1305d2b9cadSXuan Hu private val bypassNetwork = Module(new BypassNetwork) 131730cfbc0SXuan Hu private val wbDataPath = Module(new WbDataPath(params)) 1327f847969SzhanglyGit private val wbFuBusyTable = wrapper.wbFuBusyTable.module 133730cfbc0SXuan Hu 134c0be7f33SXuan Hu private val iqWakeUpMappedBundle: Map[Int, ValidIO[IssueQueueIQWakeUpBundle]] = ( 135bf35baadSXuan Hu intScheduler.io.toSchedulers.wakeupVec ++ 136bf35baadSXuan Hu vfScheduler.io.toSchedulers.wakeupVec ++ 137bf35baadSXuan Hu memScheduler.io.toSchedulers.wakeupVec 138c0be7f33SXuan Hu ).map(x => (x.bits.exuIdx, x)).toMap 139bf35baadSXuan Hu 140bf35baadSXuan Hu println(s"[Backend] iq wake up keys: ${iqWakeUpMappedBundle.keys}") 141bf35baadSXuan Hu 142dd970561SzhanglyGit wbFuBusyTable.io.in.intSchdBusyTable := intScheduler.io.wbFuBusyTable 143dd970561SzhanglyGit wbFuBusyTable.io.in.vfSchdBusyTable := vfScheduler.io.wbFuBusyTable 144dd970561SzhanglyGit wbFuBusyTable.io.in.memSchdBusyTable := memScheduler.io.wbFuBusyTable 145dd970561SzhanglyGit intScheduler.io.fromWbFuBusyTable.fuBusyTableRead := wbFuBusyTable.io.out.intRespRead 146dd970561SzhanglyGit vfScheduler.io.fromWbFuBusyTable.fuBusyTableRead := wbFuBusyTable.io.out.vfRespRead 147dd970561SzhanglyGit memScheduler.io.fromWbFuBusyTable.fuBusyTableRead := wbFuBusyTable.io.out.memRespRead 148dd970561SzhanglyGit dataPath.io.wbConfictRead := wbFuBusyTable.io.out.wbConflictRead 1492e0a7dc5Sfdy 1508d29ec32Sczw wbDataPath.io.fromIntExu.flatten.filter(x => x.bits.params.writeIntRf) 1512e0a7dc5Sfdy 152fb4849e5SXuan Hu private val vconfig = dataPath.io.vconfigReadPort.data 15310fe9778SXuan Hu private val og1CancelVec: Vec[Bool] = dataPath.io.og1CancelVec 15410fe9778SXuan Hu private val og0CancelVecFromDataPath: Vec[Bool] = dataPath.io.og0CancelVec 1557fb1e4e4SXuan Hu private val og0CancelVecFromCancelNet: Vec[Bool] = cancelNetwork.io.out.og0CancelVec 1560f55a0d3SHaojin Tang private val og0CancelVecFromFinalIssue: Vec[Bool] = Wire(chiselTypeOf(dataPath.io.og0CancelVec)) 1570f55a0d3SHaojin Tang private val og0CancelVec: Seq[Bool] = og0CancelVecFromDataPath.zip(og0CancelVecFromCancelNet).zip(og0CancelVecFromFinalIssue).map(x => x._1._1 | x._1._2 | x._2) 158bc7d6943SzhanglyGit private val cancelToBusyTable = dataPath.io.cancelToBusyTable 159fb4849e5SXuan Hu 160730cfbc0SXuan Hu ctrlBlock.io.fromTop.hartId := io.fromTop.hartId 161730cfbc0SXuan Hu ctrlBlock.io.frontend <> io.frontend 162730cfbc0SXuan Hu ctrlBlock.io.fromWB.wbData <> wbDataPath.io.toCtrlBlock.writeback 163730cfbc0SXuan Hu ctrlBlock.io.fromMem.stIn <> io.mem.stIn 164730cfbc0SXuan Hu ctrlBlock.io.fromMem.violation <> io.mem.memoryViolation 16517b21f45SHaojin Tang ctrlBlock.io.lqCanAccept := io.mem.lqCanAccept 16617b21f45SHaojin Tang ctrlBlock.io.sqCanAccept := io.mem.sqCanAccept 167730cfbc0SXuan Hu ctrlBlock.io.csrCtrl <> intExuBlock.io.csrio.get.customCtrl 168730cfbc0SXuan Hu ctrlBlock.io.robio.csr.intrBitSet := intExuBlock.io.csrio.get.interrupt 169730cfbc0SXuan Hu ctrlBlock.io.robio.csr.trapTarget := intExuBlock.io.csrio.get.trapTarget 170730cfbc0SXuan Hu ctrlBlock.io.robio.csr.isXRet := intExuBlock.io.csrio.get.isXRet 171730cfbc0SXuan Hu ctrlBlock.io.robio.csr.wfiEvent := intExuBlock.io.csrio.get.wfi_event 172730cfbc0SXuan Hu ctrlBlock.io.robio.lsq <> io.mem.robLsqIO 17317b21f45SHaojin Tang ctrlBlock.io.robio.lsTopdownInfo <> io.mem.lsTopdownInfo 17417b21f45SHaojin Tang ctrlBlock.io.robio.debug_ls <> io.mem.debugLS 175fb4849e5SXuan Hu ctrlBlock.io.fromDataPath.vtype := vconfig(7, 0).asTypeOf(new VType) 176730cfbc0SXuan Hu 177730cfbc0SXuan Hu intScheduler.io.fromTop.hartId := io.fromTop.hartId 178730cfbc0SXuan Hu intScheduler.io.fromCtrlBlock.flush := ctrlBlock.io.toIssueBlock.flush 179730cfbc0SXuan Hu intScheduler.io.fromCtrlBlock.pcVec := ctrlBlock.io.toIssueBlock.pcVec 180730cfbc0SXuan Hu intScheduler.io.fromDispatch.allocPregs <> ctrlBlock.io.toIssueBlock.allocPregs 181730cfbc0SXuan Hu intScheduler.io.fromDispatch.uops <> ctrlBlock.io.toIssueBlock.intUops 182730cfbc0SXuan Hu intScheduler.io.intWriteBack := wbDataPath.io.toIntPreg 183730cfbc0SXuan Hu intScheduler.io.vfWriteBack := 0.U.asTypeOf(intScheduler.io.vfWriteBack) 184c0be7f33SXuan Hu intScheduler.io.fromDataPath.resp := dataPath.io.toIntIQ 185c0be7f33SXuan Hu intScheduler.io.fromSchedulers.wakeupVec.foreach { wakeup => wakeup := iqWakeUpMappedBundle(wakeup.bits.exuIdx) } 186ea46c302SXuan Hu intScheduler.io.fromDataPath.og0Cancel := og0CancelVec 187ea46c302SXuan Hu intScheduler.io.fromDataPath.og1Cancel := og1CancelVec 1880f55a0d3SHaojin Tang intScheduler.io.ldCancel := io.mem.ldCancel 189bc7d6943SzhanglyGit intScheduler.io.fromDataPath.cancelToBusyTable := cancelToBusyTable 190730cfbc0SXuan Hu 191730cfbc0SXuan Hu memScheduler.io.fromTop.hartId := io.fromTop.hartId 192730cfbc0SXuan Hu memScheduler.io.fromCtrlBlock.flush := ctrlBlock.io.toIssueBlock.flush 193730cfbc0SXuan Hu memScheduler.io.fromDispatch.allocPregs <> ctrlBlock.io.toIssueBlock.allocPregs 194730cfbc0SXuan Hu memScheduler.io.fromDispatch.uops <> ctrlBlock.io.toIssueBlock.memUops 195730cfbc0SXuan Hu memScheduler.io.intWriteBack := wbDataPath.io.toIntPreg 196730cfbc0SXuan Hu memScheduler.io.vfWriteBack := wbDataPath.io.toVfPreg 197730cfbc0SXuan Hu memScheduler.io.fromMem.get.scommit := io.mem.sqDeq 198e450f9ecSXuan Hu memScheduler.io.fromMem.get.lcommit := io.mem.lqDeq 199730cfbc0SXuan Hu memScheduler.io.fromMem.get.sqCancelCnt := io.mem.sqCancelCnt 200730cfbc0SXuan Hu memScheduler.io.fromMem.get.lqCancelCnt := io.mem.lqCancelCnt 201730cfbc0SXuan Hu memScheduler.io.fromMem.get.stIssuePtr := io.mem.stIssuePtr 202730cfbc0SXuan Hu memScheduler.io.fromMem.get.memWaitUpdateReq.staIssue.zip(io.mem.stIn).foreach { case (sink, source) => 203730cfbc0SXuan Hu sink.valid := source.valid 204730cfbc0SXuan Hu sink.bits.uop := 0.U.asTypeOf(sink.bits.uop) 205730cfbc0SXuan Hu sink.bits.uop.robIdx := source.bits.robIdx 206730cfbc0SXuan Hu } 207c0be7f33SXuan Hu memScheduler.io.fromDataPath.resp := dataPath.io.toMemIQ 208fb4849e5SXuan Hu memScheduler.io.fromMem.get.ldaFeedback := io.mem.ldaIqFeedback 209fb4849e5SXuan Hu memScheduler.io.fromMem.get.staFeedback := io.mem.staIqFeedback 210c0be7f33SXuan Hu memScheduler.io.fromSchedulers.wakeupVec.foreach { wakeup => wakeup := iqWakeUpMappedBundle(wakeup.bits.exuIdx) } 211ea46c302SXuan Hu memScheduler.io.fromDataPath.og0Cancel := og0CancelVec 212ea46c302SXuan Hu memScheduler.io.fromDataPath.og1Cancel := og1CancelVec 2130f55a0d3SHaojin Tang memScheduler.io.ldCancel := io.mem.ldCancel 214bc7d6943SzhanglyGit memScheduler.io.fromDataPath.cancelToBusyTable := cancelToBusyTable 215730cfbc0SXuan Hu 216730cfbc0SXuan Hu vfScheduler.io.fromTop.hartId := io.fromTop.hartId 217730cfbc0SXuan Hu vfScheduler.io.fromCtrlBlock.flush := ctrlBlock.io.toIssueBlock.flush 218730cfbc0SXuan Hu vfScheduler.io.fromDispatch.allocPregs <> ctrlBlock.io.toIssueBlock.allocPregs 219730cfbc0SXuan Hu vfScheduler.io.fromDispatch.uops <> ctrlBlock.io.toIssueBlock.vfUops 220730cfbc0SXuan Hu vfScheduler.io.intWriteBack := 0.U.asTypeOf(vfScheduler.io.intWriteBack) 221730cfbc0SXuan Hu vfScheduler.io.vfWriteBack := wbDataPath.io.toVfPreg 222c0be7f33SXuan Hu vfScheduler.io.fromDataPath.resp := dataPath.io.toVfIQ 223c0be7f33SXuan Hu vfScheduler.io.fromSchedulers.wakeupVec.foreach { wakeup => wakeup := iqWakeUpMappedBundle(wakeup.bits.exuIdx) } 224ea46c302SXuan Hu vfScheduler.io.fromDataPath.og0Cancel := og0CancelVec 225ea46c302SXuan Hu vfScheduler.io.fromDataPath.og1Cancel := og1CancelVec 2260f55a0d3SHaojin Tang vfScheduler.io.ldCancel := io.mem.ldCancel 227bc7d6943SzhanglyGit vfScheduler.io.fromDataPath.cancelToBusyTable := cancelToBusyTable 228730cfbc0SXuan Hu 2297fb1e4e4SXuan Hu cancelNetwork.io.in.int <> intScheduler.io.toDataPath 2307fb1e4e4SXuan Hu cancelNetwork.io.in.vf <> vfScheduler.io.toDataPath 2317fb1e4e4SXuan Hu cancelNetwork.io.in.mem <> memScheduler.io.toDataPath 2320f55a0d3SHaojin Tang cancelNetwork.io.in.og0CancelVec := og0CancelVecFromDataPath.zip(og0CancelVecFromFinalIssue).map(x => x._1 || x._2) 2337fb1e4e4SXuan Hu cancelNetwork.io.in.og1CancelVec := og1CancelVec 23459ef6009Sxiaofeibao-xjtu intScheduler.io.fromCancelNetwork <> cancelNetwork.io.out.int 23559ef6009Sxiaofeibao-xjtu vfScheduler.io.fromCancelNetwork <> cancelNetwork.io.out.vf 23659ef6009Sxiaofeibao-xjtu memScheduler.io.fromCancelNetwork <> cancelNetwork.io.out.mem 2377fb1e4e4SXuan Hu 238730cfbc0SXuan Hu dataPath.io.flush := ctrlBlock.io.toDataPath.flush 239d91483a6Sfdy dataPath.io.vconfigReadPort.addr := ctrlBlock.io.toDataPath.vtypeAddr 240fb4849e5SXuan Hu 24159ef6009Sxiaofeibao-xjtu dataPath.io.fromIntIQ <> intScheduler.io.toDataPathAfterDelay 24259ef6009Sxiaofeibao-xjtu dataPath.io.fromVfIQ <> vfScheduler.io.toDataPathAfterDelay 24359ef6009Sxiaofeibao-xjtu dataPath.io.fromMemIQ <> memScheduler.io.toDataPathAfterDelay 244730cfbc0SXuan Hu 2450f55a0d3SHaojin Tang dataPath.io.ldCancel := io.mem.ldCancel 2460f55a0d3SHaojin Tang 247730cfbc0SXuan Hu println(s"[Backend] wbDataPath.io.toIntPreg: ${wbDataPath.io.toIntPreg.size}, dataPath.io.fromIntWb: ${dataPath.io.fromIntWb.size}") 248730cfbc0SXuan Hu println(s"[Backend] wbDataPath.io.toVfPreg: ${wbDataPath.io.toVfPreg.size}, dataPath.io.fromFpWb: ${dataPath.io.fromVfWb.size}") 249730cfbc0SXuan Hu dataPath.io.fromIntWb := wbDataPath.io.toIntPreg 250730cfbc0SXuan Hu dataPath.io.fromVfWb := wbDataPath.io.toVfPreg 251730cfbc0SXuan Hu dataPath.io.debugIntRat := ctrlBlock.io.debug_int_rat 252730cfbc0SXuan Hu dataPath.io.debugFpRat := ctrlBlock.io.debug_fp_rat 253730cfbc0SXuan Hu dataPath.io.debugVecRat := ctrlBlock.io.debug_vec_rat 254a8db15d8Sfdy dataPath.io.debugVconfigRat := ctrlBlock.io.debug_vconfig_rat 255730cfbc0SXuan Hu 2565d2b9cadSXuan Hu bypassNetwork.io.fromDataPath.int <> dataPath.io.toIntExu 2575d2b9cadSXuan Hu bypassNetwork.io.fromDataPath.vf <> dataPath.io.toFpExu 2585d2b9cadSXuan Hu bypassNetwork.io.fromDataPath.mem <> dataPath.io.toMemExu 2595d2b9cadSXuan Hu bypassNetwork.io.fromExus.connectExuOutput(_.int)(intExuBlock.io.out) 2605d2b9cadSXuan Hu bypassNetwork.io.fromExus.connectExuOutput(_.vf)(vfExuBlock.io.out) 2615d2b9cadSXuan Hu bypassNetwork.io.fromExus.mem.flatten.zip(io.mem.writeBack).foreach { case (sink, source) => 2625d2b9cadSXuan Hu sink.valid := source.valid 2635d2b9cadSXuan Hu sink.bits.pdest := source.bits.uop.pdest 2645d2b9cadSXuan Hu sink.bits.data := source.bits.data 2655d2b9cadSXuan Hu } 2665d2b9cadSXuan Hu 267d8a24b06SzhanglyGit 268730cfbc0SXuan Hu intExuBlock.io.flush := ctrlBlock.io.toExuBlock.flush 269730cfbc0SXuan Hu for (i <- 0 until intExuBlock.io.in.length) { 270730cfbc0SXuan Hu for (j <- 0 until intExuBlock.io.in(i).length) { 2710f55a0d3SHaojin Tang val shouldLdCancel = LoadShouldCancel(bypassNetwork.io.toExus.int(i)(j).bits.loadDependency, io.mem.ldCancel) 272c0be7f33SXuan Hu NewPipelineConnect( 273c0be7f33SXuan Hu bypassNetwork.io.toExus.int(i)(j), intExuBlock.io.in(i)(j), intExuBlock.io.in(i)(j).fire, 274c0be7f33SXuan Hu Mux( 275c0be7f33SXuan Hu bypassNetwork.io.toExus.int(i)(j).fire, 2760f55a0d3SHaojin Tang bypassNetwork.io.toExus.int(i)(j).bits.robIdx.needFlush(ctrlBlock.io.toExuBlock.flush) || shouldLdCancel, 277c0be7f33SXuan Hu intExuBlock.io.in(i)(j).bits.robIdx.needFlush(ctrlBlock.io.toExuBlock.flush) 278c0be7f33SXuan Hu ) 279c0be7f33SXuan Hu ) 280730cfbc0SXuan Hu } 281730cfbc0SXuan Hu } 282730cfbc0SXuan Hu 283d8a24b06SzhanglyGit pcTargetMem.io.fromFrontendFtq := io.frontend.fromFtq 284d8a24b06SzhanglyGit pcTargetMem.io.fromDataPathFtq := bypassNetwork.io.toExus.int.flatten.filter(_.bits.params.hasPredecode).map(_.bits.ftqIdx.get) 285d8a24b06SzhanglyGit intExuBlock.io.in.flatten.filter(_.bits.params.hasPredecode).map(_.bits.predictInfo.get.target).zipWithIndex.foreach { 286d8a24b06SzhanglyGit case (sink, i) => 287d8a24b06SzhanglyGit sink := pcTargetMem.io.toExus(i) 288d8a24b06SzhanglyGit } 289d8a24b06SzhanglyGit 290730cfbc0SXuan Hu private val csrio = intExuBlock.io.csrio.get 291730cfbc0SXuan Hu csrio.hartId := io.fromTop.hartId 292730cfbc0SXuan Hu csrio.perf.retiredInstr <> ctrlBlock.io.robio.csr.perfinfo.retiredInstr 293730cfbc0SXuan Hu csrio.perf.ctrlInfo <> ctrlBlock.io.perfInfo.ctrlInfo 294730cfbc0SXuan Hu csrio.perf.perfEventsCtrl <> ctrlBlock.getPerf 295730cfbc0SXuan Hu csrio.fpu.fflags := ctrlBlock.io.robio.csr.fflags 296730cfbc0SXuan Hu csrio.fpu.isIllegal := false.B // Todo: remove it 297730cfbc0SXuan Hu csrio.fpu.dirty_fs := ctrlBlock.io.robio.csr.dirty_fs 298730cfbc0SXuan Hu csrio.vpu <> 0.U.asTypeOf(csrio.vpu) // Todo 299a8db15d8Sfdy 300a8db15d8Sfdy val debugVconfig = dataPath.io.debugVconfig.asTypeOf(new VConfig) 301a8db15d8Sfdy val debugVtype = VType.toVtypeStruct(debugVconfig.vtype).asUInt 302a8db15d8Sfdy val debugVl = debugVconfig.vl 30301ceb97cSZiyue Zhang csrio.vpu.set_vxsat := ctrlBlock.io.robio.csr.vxsat 304a8db15d8Sfdy csrio.vpu.set_vstart.valid := ctrlBlock.io.robio.csr.vcsrFlag 305d91483a6Sfdy csrio.vpu.set_vstart.bits := 0.U 306a8db15d8Sfdy csrio.vpu.set_vtype.valid := ctrlBlock.io.robio.csr.vcsrFlag 307a8db15d8Sfdy csrio.vpu.set_vtype.bits := ZeroExt(debugVtype, XLEN) 308a8db15d8Sfdy csrio.vpu.set_vl.valid := ctrlBlock.io.robio.csr.vcsrFlag 309a8db15d8Sfdy csrio.vpu.set_vl.bits := ZeroExt(debugVl, XLEN) 310730cfbc0SXuan Hu csrio.exception := ctrlBlock.io.robio.exception 311730cfbc0SXuan Hu csrio.memExceptionVAddr := io.mem.exceptionVAddr 312730cfbc0SXuan Hu csrio.externalInterrupt := io.fromTop.externalInterrupt 313730cfbc0SXuan Hu csrio.distributedUpdate(0) := io.mem.csrDistributedUpdate 314730cfbc0SXuan Hu csrio.distributedUpdate(1) := io.frontendCsrDistributedUpdate 315730cfbc0SXuan Hu csrio.perf <> io.perf 316730cfbc0SXuan Hu private val fenceio = intExuBlock.io.fenceio.get 317730cfbc0SXuan Hu fenceio.disableSfence := csrio.disableSfence 318730cfbc0SXuan Hu io.fenceio <> fenceio 319730cfbc0SXuan Hu 320730cfbc0SXuan Hu vfExuBlock.io.flush := ctrlBlock.io.toExuBlock.flush 321730cfbc0SXuan Hu for (i <- 0 until vfExuBlock.io.in.size) { 322730cfbc0SXuan Hu for (j <- 0 until vfExuBlock.io.in(i).size) { 3230f55a0d3SHaojin Tang val shouldLdCancel = LoadShouldCancel(bypassNetwork.io.toExus.vf(i)(j).bits.loadDependency, io.mem.ldCancel) 324c0be7f33SXuan Hu NewPipelineConnect( 325c0be7f33SXuan Hu bypassNetwork.io.toExus.vf(i)(j), vfExuBlock.io.in(i)(j), vfExuBlock.io.in(i)(j).fire, 326c0be7f33SXuan Hu Mux( 327c0be7f33SXuan Hu bypassNetwork.io.toExus.vf(i)(j).fire, 3280f55a0d3SHaojin Tang bypassNetwork.io.toExus.vf(i)(j).bits.robIdx.needFlush(ctrlBlock.io.toExuBlock.flush) || shouldLdCancel, 329c0be7f33SXuan Hu vfExuBlock.io.in(i)(j).bits.robIdx.needFlush(ctrlBlock.io.toExuBlock.flush) 330c0be7f33SXuan Hu ) 331c0be7f33SXuan Hu ) 33285f2adbfSsinsanction 33385f2adbfSsinsanction vfExuBlock.io.in(i)(j).bits.vpu.foreach(_.vstart := csrio.vpu.vstart) 334730cfbc0SXuan Hu } 335730cfbc0SXuan Hu } 336b6b11f60SXuan Hu vfExuBlock.io.frm.foreach(_ := csrio.fpu.frm) 337730cfbc0SXuan Hu 338730cfbc0SXuan Hu wbDataPath.io.flush := ctrlBlock.io.redirect 339730cfbc0SXuan Hu wbDataPath.io.fromTop.hartId := io.fromTop.hartId 340730cfbc0SXuan Hu wbDataPath.io.fromIntExu <> intExuBlock.io.out 341730cfbc0SXuan Hu wbDataPath.io.fromVfExu <> vfExuBlock.io.out 342730cfbc0SXuan Hu wbDataPath.io.fromMemExu.flatten.zip(io.mem.writeBack).foreach { case (sink, source) => 343730cfbc0SXuan Hu sink.valid := source.valid 344730cfbc0SXuan Hu source.ready := sink.ready 345730cfbc0SXuan Hu sink.bits.data := source.bits.data 346730cfbc0SXuan Hu sink.bits.pdest := source.bits.uop.pdest 347730cfbc0SXuan Hu sink.bits.robIdx := source.bits.uop.robIdx 348730cfbc0SXuan Hu sink.bits.intWen.foreach(_ := source.bits.uop.rfWen) 349730cfbc0SXuan Hu sink.bits.fpWen.foreach(_ := source.bits.uop.fpWen) 350730cfbc0SXuan Hu sink.bits.vecWen.foreach(_ := source.bits.uop.vecWen) 351730cfbc0SXuan Hu sink.bits.exceptionVec.foreach(_ := source.bits.uop.exceptionVec) 352730cfbc0SXuan Hu sink.bits.flushPipe.foreach(_ := source.bits.uop.flushPipe) 353730cfbc0SXuan Hu sink.bits.replay.foreach(_ := source.bits.uop.replayInst) 354730cfbc0SXuan Hu sink.bits.debug := source.bits.debug 355*96e858baSXuan Hu sink.bits.debugInfo := source.bits.uop.debugInfo 356730cfbc0SXuan Hu sink.bits.lqIdx.foreach(_ := source.bits.uop.lqIdx) 357730cfbc0SXuan Hu sink.bits.sqIdx.foreach(_ := source.bits.uop.sqIdx) 358730cfbc0SXuan Hu sink.bits.ftqIdx.foreach(_ := source.bits.uop.ftqPtr) 359730cfbc0SXuan Hu sink.bits.ftqOffset.foreach(_ := source.bits.uop.ftqOffset) 360730cfbc0SXuan Hu } 361730cfbc0SXuan Hu 362730cfbc0SXuan Hu // to mem 3630f55a0d3SHaojin Tang private val memIssueParams = params.memSchdParams.get.issueBlockParams 3640f55a0d3SHaojin Tang private val memExuBlocksHasLDU = memIssueParams.map(_.exuBlockParams.map(_.fuConfigs.contains(FuConfig.LduCfg))) 3655d2b9cadSXuan Hu private val toMem = Wire(bypassNetwork.io.toExus.mem.cloneType) 3665d2b9cadSXuan Hu for (i <- toMem.indices) { 3675d2b9cadSXuan Hu for (j <- toMem(i).indices) { 3680f55a0d3SHaojin Tang val shouldLdCancel = LoadShouldCancel(bypassNetwork.io.toExus.mem(i)(j).bits.loadDependency, io.mem.ldCancel) 3690f55a0d3SHaojin Tang val issueTimeout = 3700f55a0d3SHaojin Tang if (memExuBlocksHasLDU(i)(j)) 3710f55a0d3SHaojin Tang Counter(0 until 16, toMem(i)(j).valid && !toMem(i)(j).fire, bypassNetwork.io.toExus.mem(i)(j).fire)._2 3720f55a0d3SHaojin Tang else 3730f55a0d3SHaojin Tang false.B 3740f55a0d3SHaojin Tang 3750f55a0d3SHaojin Tang if (memScheduler.io.loadFinalIssueResp(i).nonEmpty) { 3760f55a0d3SHaojin Tang memScheduler.io.loadFinalIssueResp(i)(j).valid := issueTimeout 3770f55a0d3SHaojin Tang memScheduler.io.loadFinalIssueResp(i)(j).bits.dataInvalidSqIdx := DontCare 3780f55a0d3SHaojin Tang memScheduler.io.loadFinalIssueResp(i)(j).bits.fuType := toMem(i)(j).bits.fuType 3790f55a0d3SHaojin Tang memScheduler.io.loadFinalIssueResp(i)(j).bits.respType := RSFeedbackType.fuBusy 3800f55a0d3SHaojin Tang memScheduler.io.loadFinalIssueResp(i)(j).bits.rfWen := toMem(i)(j).bits.rfWen.getOrElse(false.B) 3810f55a0d3SHaojin Tang memScheduler.io.loadFinalIssueResp(i)(j).bits.robIdx := toMem(i)(j).bits.robIdx 3820f55a0d3SHaojin Tang } 3830f55a0d3SHaojin Tang 3845d2b9cadSXuan Hu NewPipelineConnect( 3855d2b9cadSXuan Hu bypassNetwork.io.toExus.mem(i)(j), toMem(i)(j), toMem(i)(j).fire, 3865d2b9cadSXuan Hu Mux( 3875d2b9cadSXuan Hu bypassNetwork.io.toExus.mem(i)(j).fire, 3880f55a0d3SHaojin Tang bypassNetwork.io.toExus.mem(i)(j).bits.robIdx.needFlush(ctrlBlock.io.toExuBlock.flush) || shouldLdCancel, 3890f55a0d3SHaojin Tang toMem(i)(j).bits.robIdx.needFlush(ctrlBlock.io.toExuBlock.flush) || issueTimeout 3905d2b9cadSXuan Hu ) 3915d2b9cadSXuan Hu ) 3925d2b9cadSXuan Hu } 3935d2b9cadSXuan Hu } 3945d2b9cadSXuan Hu 395730cfbc0SXuan Hu io.mem.redirect := ctrlBlock.io.redirect 3965d2b9cadSXuan Hu io.mem.issueUops.zip(toMem.flatten).foreach { case (sink, source) => 397730cfbc0SXuan Hu sink.valid := source.valid 398730cfbc0SXuan Hu source.ready := sink.ready 399730cfbc0SXuan Hu sink.bits.iqIdx := source.bits.iqIdx 400730cfbc0SXuan Hu sink.bits.isFirstIssue := source.bits.isFirstIssue 401730cfbc0SXuan Hu sink.bits.uop := 0.U.asTypeOf(sink.bits.uop) 402730cfbc0SXuan Hu sink.bits.src := 0.U.asTypeOf(sink.bits.src) 403730cfbc0SXuan Hu sink.bits.src.zip(source.bits.src).foreach { case (l, r) => l := r} 4040f55a0d3SHaojin Tang sink.bits.deqPortIdx := source.bits.deqPortIdx.getOrElse(0.U) 405730cfbc0SXuan Hu sink.bits.uop.fuType := source.bits.fuType 406730cfbc0SXuan Hu sink.bits.uop.fuOpType := source.bits.fuOpType 407730cfbc0SXuan Hu sink.bits.uop.imm := source.bits.imm 408730cfbc0SXuan Hu sink.bits.uop.robIdx := source.bits.robIdx 409730cfbc0SXuan Hu sink.bits.uop.pdest := source.bits.pdest 410730cfbc0SXuan Hu sink.bits.uop.rfWen := source.bits.rfWen.getOrElse(false.B) 411730cfbc0SXuan Hu sink.bits.uop.fpWen := source.bits.fpWen.getOrElse(false.B) 412730cfbc0SXuan Hu sink.bits.uop.vecWen := source.bits.vecWen.getOrElse(false.B) 413730cfbc0SXuan Hu sink.bits.uop.flushPipe := source.bits.flushPipe.getOrElse(false.B) 414730cfbc0SXuan Hu sink.bits.uop.pc := source.bits.pc.getOrElse(0.U) 415730cfbc0SXuan Hu sink.bits.uop.lqIdx := source.bits.lqIdx.getOrElse(0.U.asTypeOf(new LqPtr)) 416730cfbc0SXuan Hu sink.bits.uop.sqIdx := source.bits.sqIdx.getOrElse(0.U.asTypeOf(new SqPtr)) 417730cfbc0SXuan Hu sink.bits.uop.ftqPtr := source.bits.ftqIdx.getOrElse(0.U.asTypeOf(new FtqPtr)) 418730cfbc0SXuan Hu sink.bits.uop.ftqOffset := source.bits.ftqOffset.getOrElse(0.U) 419*96e858baSXuan Hu sink.bits.uop.debugInfo := source.bits.perfDebugInfo 420730cfbc0SXuan Hu } 421730cfbc0SXuan Hu io.mem.loadFastMatch := memScheduler.io.toMem.get.loadFastMatch.map(_.fastMatch) 422730cfbc0SXuan Hu io.mem.loadFastImm := memScheduler.io.toMem.get.loadFastMatch.map(_.fastImm) 423730cfbc0SXuan Hu io.mem.tlbCsr := csrio.tlb 424730cfbc0SXuan Hu io.mem.csrCtrl := csrio.customCtrl 425730cfbc0SXuan Hu io.mem.sfence := fenceio.sfence 426730cfbc0SXuan Hu io.mem.isStoreException := CommitType.lsInstIsStore(ctrlBlock.io.robio.exception.bits.commitType) 427730cfbc0SXuan Hu require(io.mem.loadPcRead.size == params.LduCnt) 428730cfbc0SXuan Hu io.mem.loadPcRead.zipWithIndex.foreach { case (loadPcRead, i) => 429730cfbc0SXuan Hu loadPcRead.data := ctrlBlock.io.memLdPcRead(i).data 430730cfbc0SXuan Hu ctrlBlock.io.memLdPcRead(i).ptr := loadPcRead.ptr 431730cfbc0SXuan Hu ctrlBlock.io.memLdPcRead(i).offset := loadPcRead.offset 432730cfbc0SXuan Hu } 43317b21f45SHaojin Tang 43417b21f45SHaojin Tang ctrlBlock.io.robio.robHeadLsIssue := io.mem.issueUops.map(deq => deq.fire && deq.bits.uop.robIdx === ctrlBlock.io.robio.robDeqPtr).reduce(_ || _) 43517b21f45SHaojin Tang 436730cfbc0SXuan Hu // mem io 437730cfbc0SXuan Hu io.mem.lsqEnqIO <> memScheduler.io.memIO.get.lsqEnqIO 438730cfbc0SXuan Hu io.mem.robLsqIO <> ctrlBlock.io.robio.lsq 439730cfbc0SXuan Hu io.mem.toSbuffer <> fenceio.sbuffer 440730cfbc0SXuan Hu 4410f55a0d3SHaojin Tang private val intFinalIssueBlock = intExuBlock.io.in.flatten.map(_ => false.B) 4420f55a0d3SHaojin Tang private val vfFinalIssueBlock = vfExuBlock.io.in.flatten.map(_ => false.B) 4430f55a0d3SHaojin Tang private val memFinalIssueBlock = io.mem.issueUops zip memExuBlocksHasLDU.flatten map { 4440f55a0d3SHaojin Tang case (out, isLdu) => 4450f55a0d3SHaojin Tang if (isLdu) RegNext(out.valid && !out.ready, false.B) 4460f55a0d3SHaojin Tang else false.B 4470f55a0d3SHaojin Tang } 4480f55a0d3SHaojin Tang og0CancelVecFromFinalIssue := intFinalIssueBlock ++ vfFinalIssueBlock ++ memFinalIssueBlock 4490f55a0d3SHaojin Tang 450730cfbc0SXuan Hu io.frontendSfence := fenceio.sfence 451730cfbc0SXuan Hu io.frontendTlbCsr := csrio.tlb 452730cfbc0SXuan Hu io.frontendCsrCtrl := csrio.customCtrl 453730cfbc0SXuan Hu 454730cfbc0SXuan Hu io.tlb <> csrio.tlb 455730cfbc0SXuan Hu 456730cfbc0SXuan Hu io.csrCustomCtrl := csrio.customCtrl 457730cfbc0SXuan Hu 458730cfbc0SXuan Hu dontTouch(memScheduler.io) 459730cfbc0SXuan Hu dontTouch(io.mem) 460730cfbc0SXuan Hu dontTouch(dataPath.io.toMemExu) 461730cfbc0SXuan Hu dontTouch(wbDataPath.io.fromMemExu) 462730cfbc0SXuan Hu} 463730cfbc0SXuan Hu 464730cfbc0SXuan Huclass BackendMemIO(implicit p: Parameters, params: BackendParams) extends XSBundle { 46568d13085SXuan Hu // params alias 46668d13085SXuan Hu private val LoadQueueSize = VirtualLoadQueueSize 467730cfbc0SXuan Hu // In/Out // Todo: split it into one-direction bundle 468730cfbc0SXuan Hu val lsqEnqIO = Flipped(new LsqEnqIO) 469730cfbc0SXuan Hu val robLsqIO = new RobLsqIO 470730cfbc0SXuan Hu val toSbuffer = new FenceToSbuffer 4717b753bebSXuan Hu val ldaIqFeedback = Vec(params.LduCnt, Flipped(new MemRSFeedbackIO)) 4727b753bebSXuan Hu val staIqFeedback = Vec(params.StaCnt, Flipped(new MemRSFeedbackIO)) 4730f55a0d3SHaojin Tang val ldCancel = Vec(params.LduCnt, Flipped(new LoadCancelIO)) 474730cfbc0SXuan Hu val loadPcRead = Vec(params.LduCnt, Flipped(new FtqRead(UInt(VAddrBits.W)))) 475730cfbc0SXuan Hu 476730cfbc0SXuan Hu // Input 4774ee69032SzhanglyGit val writeBack = MixedVec(Seq.fill(params.LduCnt + params.StaCnt * 2)(Flipped(DecoupledIO(new MemExuOutput()))) ++ Seq.fill(params.VlduCnt)(Flipped(DecoupledIO(new MemExuOutput(true))))) 478730cfbc0SXuan Hu 479730cfbc0SXuan Hu val s3_delayed_load_error = Input(Vec(LoadPipelineWidth, Bool())) 480730cfbc0SXuan Hu val stIn = Input(Vec(params.StaCnt, ValidIO(new DynInst()))) 481730cfbc0SXuan Hu val memoryViolation = Flipped(ValidIO(new Redirect)) 482730cfbc0SXuan Hu val exceptionVAddr = Input(UInt(VAddrBits.W)) 48360f1a5feSzhanglyGit val sqDeq = Input(UInt(log2Ceil(EnsbufferWidth + 1).W)) 48460f1a5feSzhanglyGit val lqDeq = Input(UInt(log2Up(CommitWidth + 1).W)) 485730cfbc0SXuan Hu 48660f1a5feSzhanglyGit val lqCancelCnt = Input(UInt(log2Up(VirtualLoadQueueSize + 1).W)) 487730cfbc0SXuan Hu val sqCancelCnt = Input(UInt(log2Up(StoreQueueSize + 1).W)) 488730cfbc0SXuan Hu 48917b21f45SHaojin Tang val lqCanAccept = Input(Bool()) 49017b21f45SHaojin Tang val sqCanAccept = Input(Bool()) 49117b21f45SHaojin Tang 492730cfbc0SXuan Hu val otherFastWakeup = Flipped(Vec(params.LduCnt + 2 * params.StaCnt, ValidIO(new DynInst))) 493730cfbc0SXuan Hu val stIssuePtr = Input(new SqPtr()) 494730cfbc0SXuan Hu 495730cfbc0SXuan Hu val csrDistributedUpdate = Flipped(new DistributedCSRUpdateReq) 496730cfbc0SXuan Hu 497870f462dSXuan Hu val debugLS = Flipped(Output(new DebugLSIO)) 498870f462dSXuan Hu 499870f462dSXuan Hu val lsTopdownInfo = Vec(params.LduCnt, Flipped(Output(new LsTopdownInfo))) 500730cfbc0SXuan Hu // Output 501730cfbc0SXuan Hu val redirect = ValidIO(new Redirect) // rob flush MemBlock 502870f462dSXuan Hu val issueUops = MixedVec(Seq.fill(params.LduCnt + params.StaCnt + params.StdCnt)(DecoupledIO(new MemExuInput())) ++ Seq.fill(params.VlduCnt)(DecoupledIO(new MemExuInput(true)))) 503730cfbc0SXuan Hu val loadFastMatch = Vec(params.LduCnt, Output(UInt(params.LduCnt.W))) 504730cfbc0SXuan Hu val loadFastImm = Vec(params.LduCnt, Output(UInt(12.W))) // Imm_I 505730cfbc0SXuan Hu 506730cfbc0SXuan Hu val tlbCsr = Output(new TlbCsrBundle) 507730cfbc0SXuan Hu val csrCtrl = Output(new CustomCSRCtrlIO) 508730cfbc0SXuan Hu val sfence = Output(new SfenceBundle) 509730cfbc0SXuan Hu val isStoreException = Output(Bool()) 510730cfbc0SXuan Hu} 511730cfbc0SXuan Hu 512730cfbc0SXuan Huclass BackendIO(implicit p: Parameters, params: BackendParams) extends XSBundle { 513730cfbc0SXuan Hu val fromTop = new Bundle { 514730cfbc0SXuan Hu val hartId = Input(UInt(8.W)) 515730cfbc0SXuan Hu val externalInterrupt = new ExternalInterruptIO 516730cfbc0SXuan Hu } 517730cfbc0SXuan Hu 518730cfbc0SXuan Hu val toTop = new Bundle { 519730cfbc0SXuan Hu val cpuHalted = Output(Bool()) 520730cfbc0SXuan Hu } 521730cfbc0SXuan Hu 522730cfbc0SXuan Hu val fenceio = new FenceIO 523730cfbc0SXuan Hu // Todo: merge these bundles into BackendFrontendIO 524730cfbc0SXuan Hu val frontend = Flipped(new FrontendToCtrlIO) 525730cfbc0SXuan Hu val frontendSfence = Output(new SfenceBundle) 526730cfbc0SXuan Hu val frontendCsrCtrl = Output(new CustomCSRCtrlIO) 527730cfbc0SXuan Hu val frontendTlbCsr = Output(new TlbCsrBundle) 528730cfbc0SXuan Hu // distributed csr write 529730cfbc0SXuan Hu val frontendCsrDistributedUpdate = Flipped(new DistributedCSRUpdateReq) 530730cfbc0SXuan Hu 531730cfbc0SXuan Hu val mem = new BackendMemIO 532730cfbc0SXuan Hu 533730cfbc0SXuan Hu val perf = Input(new PerfCounterIO) 534730cfbc0SXuan Hu 535730cfbc0SXuan Hu val tlb = Output(new TlbCsrBundle) 536730cfbc0SXuan Hu 537730cfbc0SXuan Hu val csrCustomCtrl = Output(new CustomCSRCtrlIO) 538730cfbc0SXuan Hu} 539