package xiangshan.backend.exu import org.chipsalliance.cde.config.Parameters import chisel3._ import chisel3.util._ import freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} import xiangshan.backend.fu.{CSRFileIO, FenceIO} import xiangshan.backend.Bundles._ import xiangshan.backend.issue.SchdBlockParams import xiangshan.{HasXSParameter, Redirect, XSBundle} import utils._ import xiangshan.backend.fu.FuConfig.{AluCfg, BrhCfg} class ExuBlock(params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { override def shouldBeInlined: Boolean = false val exus: Seq[ExeUnit] = params.issueBlockParams.flatMap(_.exuBlockParams.map(x => LazyModule(x.genExuModule))) lazy val module = new ExuBlockImp(this)(p, params) } class ExuBlockImp( override val wrapper: ExuBlock )(implicit p: Parameters, params: SchdBlockParams ) extends LazyModuleImp(wrapper) { val io = IO(new ExuBlockIO) private val exus = wrapper.exus.map(_.module) private val ins: collection.IndexedSeq[DecoupledIO[ExuInput]] = io.in.flatten private val outs: collection.IndexedSeq[DecoupledIO[ExuOutput]] = io.out.flatten (ins zip exus zip outs).foreach { case ((input, exu), output) => exu.io.flush <> io.flush exu.io.csrio.foreach(exuio => io.csrio.get <> exuio) exu.io.fenceio.foreach(exuio => io.fenceio.get <> exuio) exu.io.frm.foreach(exuio => io.frm.get <> exuio) exu.io.vxrm.foreach(exuio => io.vxrm.get <> exuio) exu.io.in <> input output <> exu.io.out if (exu.wrapper.exuParams.fuConfigs.contains(AluCfg) || exu.wrapper.exuParams.fuConfigs.contains(BrhCfg)){ XSPerfAccumulate(s"${(exu.wrapper.exuParams.name)}_fire_cnt", PopCount(exu.io.in.fire)) } } val aluFireSeq = exus.filter(_.wrapper.exuParams.fuConfigs.contains(AluCfg)).map(_.io.in.fire) for (i <- 0 until (aluFireSeq.size + 1)){ XSPerfAccumulate(s"alu_fire_${i}_cnt", PopCount(aluFireSeq) === i.U) } val brhFireSeq = exus.filter(_.wrapper.exuParams.fuConfigs.contains(BrhCfg)).map(_.io.in.fire) for (i <- 0 until (brhFireSeq.size + 1)) { XSPerfAccumulate(s"brh_fire_${i}_cnt", PopCount(brhFireSeq) === i.U) } } class ExuBlockIO(implicit p: Parameters, params: SchdBlockParams) extends XSBundle { val flush = Flipped(ValidIO(new Redirect)) // in(i)(j): issueblock(i), exu(j) val in: MixedVec[MixedVec[DecoupledIO[ExuInput]]] = Flipped(params.genExuInputBundle) // out(i)(j): issueblock(i), exu(j). val out: MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = params.genExuOutputDecoupledBundle val csrio = if (params.hasCSR) Some(new CSRFileIO) else None val fenceio = if (params.hasFence) Some(new FenceIO) else None val frm = if (params.needSrcFrm) Some(Input(UInt(3.W))) else None val vxrm = if (params.needSrcVxrm) Some(Input(UInt(2.W))) else None }