xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/PcTargetMem.scala (revision 83ba63b34cf09b33c0a9e1b3203138e51af4491b)
1package xiangshan.backend
2
3import org.chipsalliance.cde.config.Parameters
4import chisel3._
5import freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
6import utility._
7import xiangshan._
8import xiangshan.backend.datapath.DataConfig.VAddrData
9import xiangshan.frontend.{FtqPtr, FtqToCtrlIO, Ftq_RF_Components}
10
11class PcTargetMem(params: BackendParams)(implicit p: Parameters) extends LazyModule {
12  lazy val module = new PcTargetMemImp(this)(p, params)
13}
14
15class PcTargetMemImp(override val wrapper: PcTargetMem)(implicit p: Parameters, params: BackendParams) extends LazyModuleImp(wrapper) with HasXSParameter {
16
17  private val numTargetMemRead = params.numTargetReadPort
18  val io = IO(new PcTargetMemIO())
19
20  private val targetMem = Module(new SyncDataModuleTemplate(UInt(VAddrData().dataWidth.W), FtqSize, numTargetMemRead, 1))
21  private val jumpTargetReadVec : Vec[UInt] = Wire(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W)))
22  private val jumpTargetVec     : Vec[UInt] = Wire(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W)))
23
24  targetMem.io.wen.head := RegNext(io.fromFrontendFtq.pc_mem_wen)
25  targetMem.io.waddr.head := RegNext(io.fromFrontendFtq.pc_mem_waddr)
26  targetMem.io.wdata.head := RegNext(io.fromFrontendFtq.pc_mem_wdata.startAddr)
27
28  private val newestTarget: UInt = io.fromFrontendFtq.newest_entry_target
29  for (i <- 0 until numTargetMemRead) {
30    val targetPtr = io.fromDataPathFtq(i)
31    // target pc stored in next entry
32    targetMem.io.raddr(i) := (targetPtr + 1.U).value
33    jumpTargetReadVec(i) := targetMem.io.rdata(i)
34    val needNewestTarget = RegNext(targetPtr === io.fromFrontendFtq.newest_entry_ptr)
35    jumpTargetVec(i) := Mux(
36      needNewestTarget,
37      RegNext(newestTarget),
38      jumpTargetReadVec(i)
39    )
40  }
41
42  io.toExus := jumpTargetVec
43
44}
45
46class PcTargetMemIO()(implicit p: Parameters, params: BackendParams) extends XSBundle {
47  //input
48  val fromFrontendFtq = Flipped(new FtqToCtrlIO)
49  val fromDataPathFtq = Input(Vec(params.numTargetReadPort, new FtqPtr))
50  //output
51  val toExus = Output(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W)))
52}