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