1package xiangshan.backend.exu 2 3import org.chipsalliance.cde.config.Parameters 4import chisel3._ 5import chisel3.util._ 6import freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 7import xiangshan.backend.fu.{CSRFileIO, FenceIO} 8import xiangshan.backend.Bundles._ 9import xiangshan.backend.issue.SchdBlockParams 10import xiangshan.{HasXSParameter, Redirect, XSBundle} 11 12class ExuBlock(params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 13 override def shouldBeInlined: Boolean = false 14 15 val exus: Seq[ExeUnit] = params.issueBlockParams.flatMap(_.exuBlockParams.map(x => LazyModule(x.genExuModule))) 16 17 lazy val module = new ExuBlockImp(this)(p, params) 18} 19 20class ExuBlockImp( 21 override val wrapper: ExuBlock 22)(implicit 23 p: Parameters, 24 params: SchdBlockParams 25) extends LazyModuleImp(wrapper) { 26 val io = IO(new ExuBlockIO) 27 28 private val exus = wrapper.exus.map(_.module) 29 30 private val ins: collection.IndexedSeq[DecoupledIO[ExuInput]] = io.in.flatten 31 private val outs: collection.IndexedSeq[DecoupledIO[ExuOutput]] = io.out.flatten 32 33 (ins zip exus zip outs).foreach { case ((input, exu), output) => 34 exu.io.flush <> io.flush 35 exu.io.csrio.foreach(exuio => io.csrio.get <> exuio) 36 exu.io.fenceio.foreach(exuio => io.fenceio.get <> exuio) 37 exu.io.frm.foreach(exuio => io.frm.get <> exuio) 38 exu.io.in <> input 39 output <> exu.io.out 40 } 41} 42 43class ExuBlockIO(implicit p: Parameters, params: SchdBlockParams) extends XSBundle { 44 val flush = Flipped(ValidIO(new Redirect)) 45 // in(i)(j): issueblock(i), exu(j) 46 val in: MixedVec[MixedVec[DecoupledIO[ExuInput]]] = Flipped(params.genExuInputBundle) 47 // out(i)(j): issueblock(i), exu(j). 48 val out: MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = params.genExuOutputDecoupledBundle 49 50 val csrio = if (params.hasCSR) Some(new CSRFileIO) else None 51 val fenceio = if (params.hasFence) Some(new FenceIO) else None 52 val frm = if (params.needSrcFrm) Some(Input(UInt(3.W))) else None 53}