xref: /XiangShan/src/main/scala/xiangshan/backend/fu/wrapper/BranchUnit.scala (revision a2fa0ad9374b49a289bfb9c9677adc3f6bc0db6e)
1730cfbc0SXuan Hupackage xiangshan.backend.fu.wrapper
2730cfbc0SXuan Hu
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4730cfbc0SXuan Huimport chisel3._
5*a2fa0ad9Sxiaofeibaoimport chisel3.util.log2Up
6730cfbc0SXuan Huimport utility.SignExt
7730cfbc0SXuan Huimport xiangshan.backend.decode.ImmUnion
8c1e19666Sxiaofeibao-xjtuimport xiangshan.backend.fu.{BranchModule, FuConfig, FuncUnit}
9730cfbc0SXuan Huimport xiangshan.backend.datapath.DataConfig.VAddrData
10*a2fa0ad9Sxiaofeibaoimport xiangshan.{RedirectLevel, SelImm, XSModule}
11730cfbc0SXuan Hu
12c1b28b66STang Haojinclass AddrAddModule(implicit p: Parameters) extends XSModule {
13730cfbc0SXuan Hu  val io = IO(new Bundle {
14c1b28b66STang Haojin    val pc = Input(UInt(VAddrBits.W))
1554c6d89dSxiaofeibao-xjtu    val taken = Input(Bool())
1654c6d89dSxiaofeibao-xjtu    val isRVC = Input(Bool())
17*a2fa0ad9Sxiaofeibao    val imm = Input(UInt(32.W)) // branch inst only support 12 bits immediate num
18c1b28b66STang Haojin    val target = Output(UInt(XLEN.W))
19*a2fa0ad9Sxiaofeibao    val nextPcOffset = Input(UInt((log2Up(PredictWidth) + 1).W))
20730cfbc0SXuan Hu  })
21e6f36bc4Sxiaofeibao  val pcExtend = SignExt(io.pc, VAddrBits + 1)
22*a2fa0ad9Sxiaofeibao  val immMinWidth = FuConfig.BrhCfg.immType.map(x => SelImm.getImmUnion(x).len).max
23*a2fa0ad9Sxiaofeibao  print(s"[Branch]: immMinWidth = $immMinWidth\n")
24e6f36bc4Sxiaofeibao  io.target := SignExt(Mux(io.taken,
25*a2fa0ad9Sxiaofeibao  pcExtend + SignExt(io.imm(immMinWidth + 2, 0), VAddrBits + 1),
26*a2fa0ad9Sxiaofeibao  pcExtend + (io.nextPcOffset << instOffsetBits).asUInt
27c1b28b66STang Haojin  ), XLEN)
28730cfbc0SXuan Hu}
29730cfbc0SXuan Hu
30c1e19666Sxiaofeibao-xjtuclass BranchUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) {
31730cfbc0SXuan Hu  val dataModule = Module(new BranchModule)
32c1b28b66STang Haojin  val addModule = Module(new AddrAddModule)
336a35d972SXuan Hu  dataModule.io.src(0) := io.in.bits.data.src(0) // rs1
346a35d972SXuan Hu  dataModule.io.src(1) := io.in.bits.data.src(1) // rs2
356a35d972SXuan Hu  dataModule.io.func := io.in.bits.ctrl.fuOpType
366a35d972SXuan Hu  dataModule.io.pred_taken := io.in.bits.ctrl.predictInfo.get.taken
37730cfbc0SXuan Hu
386a35d972SXuan Hu  addModule.io.pc := io.in.bits.data.pc.get // pc
39*a2fa0ad9Sxiaofeibao  addModule.io.imm := io.in.bits.data.imm // imm
4054c6d89dSxiaofeibao-xjtu  addModule.io.taken := dataModule.io.taken
4154c6d89dSxiaofeibao-xjtu  addModule.io.isRVC := io.in.bits.ctrl.preDecode.get.isRVC
42*a2fa0ad9Sxiaofeibao  addModule.io.nextPcOffset := io.in.bits.data.nextPcOffset.get
43730cfbc0SXuan Hu
44730cfbc0SXuan Hu  io.out.valid := io.in.valid
45730cfbc0SXuan Hu  io.in.ready := io.out.ready
46730cfbc0SXuan Hu
476a35d972SXuan Hu  io.out.bits.res.data := 0.U
486a35d972SXuan Hu  io.out.bits.res.redirect.get match {
496a35d972SXuan Hu    case redirect =>
506a35d972SXuan Hu      redirect.valid := io.out.valid && dataModule.io.mispredict
516a35d972SXuan Hu      redirect.bits := 0.U.asTypeOf(io.out.bits.res.redirect.get.bits)
526a35d972SXuan Hu      redirect.bits.level := RedirectLevel.flushAfter
536a35d972SXuan Hu      redirect.bits.robIdx := io.in.bits.ctrl.robIdx
546a35d972SXuan Hu      redirect.bits.ftqIdx := io.in.bits.ctrl.ftqIdx.get
556a35d972SXuan Hu      redirect.bits.ftqOffset := io.in.bits.ctrl.ftqOffset.get
56c1b28b66STang Haojin      redirect.bits.fullTarget := addModule.io.target
576a35d972SXuan Hu      redirect.bits.cfiUpdate.isMisPred := dataModule.io.mispredict
586a35d972SXuan Hu      redirect.bits.cfiUpdate.taken := dataModule.io.taken
596a35d972SXuan Hu      redirect.bits.cfiUpdate.predTaken := dataModule.io.pred_taken
606a35d972SXuan Hu      redirect.bits.cfiUpdate.target := addModule.io.target
6154c6d89dSxiaofeibao-xjtu      redirect.bits.cfiUpdate.pc := io.in.bits.data.pc.get
62c1b28b66STang Haojin      redirect.bits.cfiUpdate.backendIAF := io.instrAddrTransType.get.checkAccessFault(addModule.io.target)
63c1b28b66STang Haojin      redirect.bits.cfiUpdate.backendIPF := io.instrAddrTransType.get.checkPageFault(addModule.io.target)
64c1b28b66STang Haojin      redirect.bits.cfiUpdate.backendIGPF := io.instrAddrTransType.get.checkGuestPageFault(addModule.io.target)
656a35d972SXuan Hu  }
66c1e19666Sxiaofeibao-xjtu  connect0LatencyCtrlSingal
67730cfbc0SXuan Hu}
68