xref: /XiangShan/src/main/scala/xiangshan/backend/exu/ExuBlock.scala (revision 1ca4a39d94e1f073c5b88bb48c58ef894afa74ff)
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}