xref: /XiangShan/src/main/scala/xiangshan/backend/exu/ExuBlock.scala (revision 93a5bfb838f13c2bacd33942aa1f38b0acc941a2)
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.in <> input
41    output <> exu.io.out
42    if (exu.wrapper.exuParams.fuConfigs.contains(AluCfg) || exu.wrapper.exuParams.fuConfigs.contains(BrhCfg)){
43      XSPerfAccumulate(s"${(exu.wrapper.exuParams.name)}_fire_cnt", PopCount(exu.io.in.fire))
44    }
45  }
46  val aluFireSeq = exus.filter(_.wrapper.exuParams.fuConfigs.contains(AluCfg)).map(_.io.in.fire)
47  for (i <- 0 until (aluFireSeq.size + 1)){
48    XSPerfAccumulate(s"alu_fire_${i}_cnt", PopCount(aluFireSeq) === i.U)
49  }
50  val brhFireSeq = exus.filter(_.wrapper.exuParams.fuConfigs.contains(BrhCfg)).map(_.io.in.fire)
51  for (i <- 0 until (brhFireSeq.size + 1)) {
52    XSPerfAccumulate(s"brh_fire_${i}_cnt", PopCount(brhFireSeq) === i.U)
53  }
54}
55
56class ExuBlockIO(implicit p: Parameters, params: SchdBlockParams) extends XSBundle {
57  val flush = Flipped(ValidIO(new Redirect))
58  // in(i)(j): issueblock(i), exu(j)
59  val in: MixedVec[MixedVec[DecoupledIO[ExuInput]]] = Flipped(params.genExuInputBundle)
60  // out(i)(j): issueblock(i), exu(j).
61  val out: MixedVec[MixedVec[DecoupledIO[ExuOutput]]] = params.genExuOutputDecoupledBundle
62
63  val csrio = if (params.hasCSR) Some(new CSRFileIO) else None
64  val fenceio = if (params.hasFence) Some(new FenceIO) else None
65  val frm = if (params.needSrcFrm) Some(Input(UInt(3.W))) else None
66}