xref: /XiangShan/src/main/scala/xiangshan/backend/fu/wrapper/JumpUnit.scala (revision 94aa21c6009c2f39c5c5dae9c87260c78887efcc)
1package xiangshan.backend.fu.wrapper
2
3import org.chipsalliance.cde.config.Parameters
4import chisel3._
5import fudian.SignExt
6import xiangshan.RedirectLevel
7import xiangshan.backend.fu.{FuConfig, FuncUnit, JumpDataModule, PipedFuncUnit}
8import xiangshan.backend.datapath.DataConfig.VAddrData
9
10
11class JumpUnit(cfg: FuConfig)(implicit p: Parameters) extends PipedFuncUnit(cfg) {
12  private val jumpDataModule = Module(new JumpDataModule)
13
14  private val flushed = io.in.bits.ctrl.robIdx.needFlush(io.flush)
15
16  // associated with AddrData's position of JmpCfg.srcData
17  private val src = io.in.bits.data.src(0)
18  private val pc = SignExt(io.in.bits.data.pc.get, cfg.destDataBits)
19  private val imm = io.in.bits.data.imm
20  private val func = io.in.bits.ctrl.fuOpType
21  private val isRVC = io.in.bits.ctrl.preDecode.get.isRVC
22
23  jumpDataModule.io.src := src
24  jumpDataModule.io.pc := pc
25  jumpDataModule.io.imm := imm
26  jumpDataModule.io.nextPcOffset := io.in.bits.data.nextPcOffset.get
27  jumpDataModule.io.func := func
28  jumpDataModule.io.isRVC := isRVC
29
30  val jmpTarget = io.in.bits.ctrl.predictInfo.get.target
31  val predTaken = io.in.bits.ctrl.predictInfo.get.taken
32
33  val redirect = io.out.bits.res.redirect.get.bits
34  val redirectValid = io.out.bits.res.redirect.get.valid
35  redirectValid := io.in.valid && !jumpDataModule.io.isAuipc
36  redirect := 0.U.asTypeOf(redirect)
37  redirect.level := RedirectLevel.flushAfter
38  redirect.robIdx := io.in.bits.ctrl.robIdx
39  redirect.ftqIdx := io.in.bits.ctrl.ftqIdx.get
40  redirect.ftqOffset := io.in.bits.ctrl.ftqOffset.get
41  redirect.fullTarget := jumpDataModule.io.target
42  redirect.cfiUpdate.predTaken := true.B
43  redirect.cfiUpdate.taken := true.B
44  redirect.cfiUpdate.target := jumpDataModule.io.target
45  redirect.cfiUpdate.pc := io.in.bits.data.pc.get
46  redirect.cfiUpdate.isMisPred := jumpDataModule.io.target(VAddrData().dataWidth - 1, 0) =/= jmpTarget || !predTaken
47  redirect.cfiUpdate.backendIAF := io.instrAddrTransType.get.checkAccessFault(jumpDataModule.io.target)
48  redirect.cfiUpdate.backendIPF := io.instrAddrTransType.get.checkPageFault(jumpDataModule.io.target)
49  redirect.cfiUpdate.backendIGPF := io.instrAddrTransType.get.checkGuestPageFault(jumpDataModule.io.target)
50//  redirect.debug_runahead_checkpoint_id := uop.debugInfo.runahead_checkpoint_id // Todo: assign it
51
52  io.in.ready := io.out.ready
53  io.out.valid := io.in.valid
54  io.out.bits.res.data := jumpDataModule.io.result
55  connect0LatencyCtrlSingal
56}
57