xref: /XiangShan/src/main/scala/xiangshan/backend/fu/wrapper/BranchUnit.scala (revision 6a35d972887e2dbfc0705b0fa8b979b13df0f3d1)
1package xiangshan.backend.fu.wrapper
2
3import chipsalliance.rocketchip.config.Parameters
4import chisel3._
5import utility.SignExt
6import xiangshan.backend.decode.ImmUnion
7import xiangshan.backend.fu.{BranchModule, FuncUnit}
8import xiangshan.backend.fu.FuConfig
9import xiangshan.backend.datapath.DataConfig.VAddrData
10import xiangshan.{RedirectLevel, XSModule}
11
12class AddrAddModule(len: Int)(implicit p: Parameters) extends XSModule {
13  val io = IO(new Bundle {
14    val pc = Input(UInt(len.W))
15    val offset = Input(UInt(12.W)) // branch inst only support 12 bits immediate num
16    val target = Output(UInt(len.W))
17  })
18  io.target := io.pc + SignExt(ImmUnion.B.toImm32(io.offset), len)
19}
20
21class BranchUnit(cfg: FuConfig)(implicit p: Parameters) extends FuncUnit(cfg) {
22  val dataModule = Module(new BranchModule)
23  val addModule = Module(new AddrAddModule(VAddrData().dataWidth))
24  dataModule.io.src(0) := io.in.bits.data.src(0) // rs1
25  dataModule.io.src(1) := io.in.bits.data.src(1) // rs2
26  dataModule.io.func := io.in.bits.ctrl.fuOpType
27  dataModule.io.pred_taken := io.in.bits.ctrl.predictInfo.get.taken
28
29  addModule.io.pc := io.in.bits.data.pc.get // pc
30  addModule.io.offset := io.in.bits.data.imm // imm
31
32  io.out.valid := io.in.valid
33  io.in.ready := io.out.ready
34
35  io.out.bits.res.data := 0.U
36  io.out.bits.res.redirect.get match {
37    case redirect =>
38      redirect.valid := io.out.valid && dataModule.io.mispredict
39      redirect.bits := 0.U.asTypeOf(io.out.bits.res.redirect.get.bits)
40      redirect.bits.level := RedirectLevel.flushAfter
41      redirect.bits.robIdx := io.in.bits.ctrl.robIdx
42      redirect.bits.ftqIdx := io.in.bits.ctrl.ftqIdx.get
43      redirect.bits.ftqOffset := io.in.bits.ctrl.ftqOffset.get
44      redirect.bits.cfiUpdate.isMisPred := dataModule.io.mispredict
45      redirect.bits.cfiUpdate.taken := dataModule.io.taken
46      redirect.bits.cfiUpdate.predTaken := dataModule.io.pred_taken
47      redirect.bits.cfiUpdate.target := addModule.io.target
48  }
49  connectNonPipedCtrlSingal
50}
51