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} 11import utils._ 12import xiangshan.backend.fu.FuConfig.{AluCfg, BrhCfg} 13 14class ExuBlock(params: SchdBlockParams)(implicit p: Parameters) extends LazyModule with HasXSParameter { 15 override def shouldBeInlined: Boolean = false 16 17 val exus: Seq[ExeUnit] = params.issueBlockParams.flatMap(_.exuBlockParams.map(x => LazyModule(x.genExuModule))) 18 19 lazy val module = new ExuBlockImp(this)(p, params) 20} 21 22class ExuBlockImp( 23 override val wrapper: ExuBlock 24)(implicit 25 p: Parameters, 26 params: SchdBlockParams 27) extends LazyModuleImp(wrapper) { 28 val io = IO(new ExuBlockIO) 29 30 private val exus = wrapper.exus.map(_.module) 31 32 private val ins: collection.IndexedSeq[DecoupledIO[ExuInput]] = io.in.flatten 33 private val outs: collection.IndexedSeq[DecoupledIO[ExuOutput]] = io.out.flatten 34 35 (ins zip exus zip outs).foreach { case ((input, exu), output) => 36 exu.io.flush <> io.flush 37 exu.io.csrio.foreach(exuio => io.csrio.get <> exuio) 38 exu.io.fenceio.foreach(exuio => io.fenceio.get <> exuio) 39 exu.io.frm.foreach(exuio => io.frm.get <> exuio) 40 exu.io.vxrm.foreach(exuio => io.vxrm.get <> exuio) 41 exu.io.in <> input 42 output <> exu.io.out 43 if (exu.wrapper.exuParams.fuConfigs.contains(AluCfg) || exu.wrapper.exuParams.fuConfigs.contains(BrhCfg)){ 44 XSPerfAccumulate(s"${(exu.wrapper.exuParams.name)}_fire_cnt", PopCount(exu.io.in.fire)) 45 } 46 } 47 val aluFireSeq = exus.filter(_.wrapper.exuParams.fuConfigs.contains(AluCfg)).map(_.io.in.fire) 48 for (i <- 0 until (aluFireSeq.size + 1)){ 49 XSPerfAccumulate(s"alu_fire_${i}_cnt", PopCount(aluFireSeq) === i.U) 50 } 51 val brhFireSeq = exus.filter(_.wrapper.exuParams.fuConfigs.contains(BrhCfg)).map(_.io.in.fire) 52 for (i <- 0 until (brhFireSeq.size + 1)) { 53 XSPerfAccumulate(s"brh_fire_${i}_cnt", PopCount(brhFireSeq) === i.U) 54 } 55} 56 57class ExuBlockIO(implicit p: Parameters, params: SchdBlockParams) extends XSBundle { 58 val flush = Flipped(ValidIO(new Redirect)) 59 // in(i)(j): issueblock(i), exu(j) 60 val in: MixedVec[MixedVec[DecoupledIO[ExuInput]]] = Flipped(params.genExuInputBundle) 61 // out(i)(j): issueblock(i), exu(j). 62 val out: MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = params.genExuOutputDecoupledBundle 63 64 val csrio = if (params.hasCSR) Some(new CSRFileIO) else None 65 val fenceio = if (params.hasFence) Some(new FenceIO) else None 66 val frm = if (params.needSrcFrm) Some(Input(UInt(3.W))) else None 67 val vxrm = if (params.needSrcVxrm) Some(Input(UInt(2.W))) else None 68}