xref: /XiangShan/src/main/scala/xiangshan/backend/datapath/PcTargetMem.scala (revision 9477429f7dc92dfd72de3908b8e953de2886a01d)
1d8a24b06SzhanglyGitpackage xiangshan.backend
2d8a24b06SzhanglyGit
383ba63b3SXuan Huimport org.chipsalliance.cde.config.Parameters
4d8a24b06SzhanglyGitimport chisel3._
53827c997SsinceforYyimport chisel3.util._
6d8a24b06SzhanglyGitimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp}
7d8a24b06SzhanglyGitimport utility._
8d8a24b06SzhanglyGitimport xiangshan._
9d8a24b06SzhanglyGitimport xiangshan.backend.datapath.DataConfig.VAddrData
10d8a24b06SzhanglyGitimport xiangshan.frontend.{FtqPtr, FtqToCtrlIO, Ftq_RF_Components}
11d8a24b06SzhanglyGit
12d8a24b06SzhanglyGitclass PcTargetMem(params: BackendParams)(implicit p: Parameters) extends LazyModule {
131ca4a39dSXuan Hu  override def shouldBeInlined: Boolean = false
141ca4a39dSXuan Hu
15d8a24b06SzhanglyGit  lazy val module = new PcTargetMemImp(this)(p, params)
16d8a24b06SzhanglyGit}
17d8a24b06SzhanglyGit
18d8a24b06SzhanglyGitclass PcTargetMemImp(override val wrapper: PcTargetMem)(implicit p: Parameters, params: BackendParams) extends LazyModuleImp(wrapper) with HasXSParameter {
19d8a24b06SzhanglyGit
205f80df32Sxiaofeibao-xjtu  private val numTargetMemRead = params.numTargetReadPort + params.numPcMemReadPort
21d8a24b06SzhanglyGit  val io = IO(new PcTargetMemIO())
22d8a24b06SzhanglyGit
23*9477429fSsinceforYy  private def hasRen: Boolean = true
24*9477429fSsinceforYy  private val targetMem = Module(new SyncDataModuleTemplate(new Ftq_RF_Components, FtqSize, numTargetMemRead, 1, hasRen = hasRen))
25d8a24b06SzhanglyGit  private val jumpTargetReadVec : Vec[UInt] = Wire(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W)))
26d8a24b06SzhanglyGit  private val jumpTargetVec     : Vec[UInt] = Wire(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W)))
27d8a24b06SzhanglyGit
28d8a24b06SzhanglyGit  targetMem.io.wen.head := RegNext(io.fromFrontendFtq.pc_mem_wen)
293827c997SsinceforYy  targetMem.io.waddr.head := RegEnable(io.fromFrontendFtq.pc_mem_waddr, io.fromFrontendFtq.pc_mem_wen)
305f80df32Sxiaofeibao-xjtu  targetMem.io.wdata.head := RegEnable(io.fromFrontendFtq.pc_mem_wdata, io.fromFrontendFtq.pc_mem_wen)
31d8a24b06SzhanglyGit
326022c595SsinceforYy  private val newestEn: Bool = io.fromFrontendFtq.newest_entry_en
33d8a24b06SzhanglyGit  private val newestTarget: UInt = io.fromFrontendFtq.newest_entry_target
345f80df32Sxiaofeibao-xjtu  for (i <- 0 until params.numTargetReadPort) {
35*9477429fSsinceforYy    val targetVld = io.fromDataPathVld(i)
36d8a24b06SzhanglyGit    val targetPtr = io.fromDataPathFtq(i)
37d8a24b06SzhanglyGit    // target pc stored in next entry
38*9477429fSsinceforYy    targetMem.io.ren.get(i) := targetVld
39d8a24b06SzhanglyGit    targetMem.io.raddr(i) := (targetPtr + 1.U).value
405f80df32Sxiaofeibao-xjtu    jumpTargetReadVec(i) := targetMem.io.rdata(i).startAddr
41d8a24b06SzhanglyGit    val needNewestTarget = RegNext(targetPtr === io.fromFrontendFtq.newest_entry_ptr)
42d8a24b06SzhanglyGit    jumpTargetVec(i) := Mux(
43d8a24b06SzhanglyGit      needNewestTarget,
446022c595SsinceforYy      RegEnable(newestTarget, newestEn),
45d8a24b06SzhanglyGit      jumpTargetReadVec(i)
46d8a24b06SzhanglyGit    )
47d8a24b06SzhanglyGit  }
485f80df32Sxiaofeibao-xjtu  private val pcReadVec = Wire(Vec(params.numPcMemReadPort, UInt(VAddrData().dataWidth.W)))
495f80df32Sxiaofeibao-xjtu  private val pcVec = Wire(Vec(params.numPcMemReadPort, UInt(VAddrData().dataWidth.W)))
505f80df32Sxiaofeibao-xjtu  for (i <- 0 until params.numPcMemReadPort) {
51*9477429fSsinceforYy    val vld = io.pcToDataPath.fromDataPathFtqVld(i)
525f80df32Sxiaofeibao-xjtu    val pcAddr = io.pcToDataPath.fromDataPathFtqPtr(i)
535f80df32Sxiaofeibao-xjtu    // pc stored in this entry
545f80df32Sxiaofeibao-xjtu    val offset = io.pcToDataPath.fromDataPathFtqOffset(i)
55*9477429fSsinceforYy    targetMem.io.ren.get(i + params.numTargetReadPort) := vld
565f80df32Sxiaofeibao-xjtu    targetMem.io.raddr(i + params.numTargetReadPort) := pcAddr.value
575f80df32Sxiaofeibao-xjtu    pcReadVec(i) := targetMem.io.rdata(i + params.numTargetReadPort).getPc(RegNext(offset))
585f80df32Sxiaofeibao-xjtu    pcVec(i) := pcReadVec(i)
595f80df32Sxiaofeibao-xjtu  }
605f80df32Sxiaofeibao-xjtu  io.pcToDataPath.toDataPathPC := pcVec
61d8a24b06SzhanglyGit  io.toExus := jumpTargetVec
62d8a24b06SzhanglyGit
63d8a24b06SzhanglyGit}
64d8a24b06SzhanglyGit
655f80df32Sxiaofeibao-xjtuclass PcToDataPathIO(params: BackendParams)(implicit p: Parameters) extends XSBundle {
665f80df32Sxiaofeibao-xjtu  val toDataPathPC = Output(Vec(params.numPcMemReadPort, UInt(VAddrData().dataWidth.W)))
67*9477429fSsinceforYy  val fromDataPathFtqVld = Input(Vec(params.numPcMemReadPort, Bool()))
685f80df32Sxiaofeibao-xjtu  val fromDataPathFtqPtr = Input(Vec(params.numPcMemReadPort, new FtqPtr))
695f80df32Sxiaofeibao-xjtu  val fromDataPathFtqOffset = Input(Vec(params.numPcMemReadPort, UInt(log2Up(PredictWidth).W)))
705f80df32Sxiaofeibao-xjtu}
715f80df32Sxiaofeibao-xjtu
72d8a24b06SzhanglyGitclass PcTargetMemIO()(implicit p: Parameters, params: BackendParams) extends XSBundle {
73d8a24b06SzhanglyGit  //input
74d8a24b06SzhanglyGit  val fromFrontendFtq = Flipped(new FtqToCtrlIO)
75*9477429fSsinceforYy  val fromDataPathVld = Input(Vec(params.numTargetReadPort, Bool()))
76d8a24b06SzhanglyGit  val fromDataPathFtq = Input(Vec(params.numTargetReadPort, new FtqPtr))
77d8a24b06SzhanglyGit  //output
78d8a24b06SzhanglyGit  val toExus = Output(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W)))
795f80df32Sxiaofeibao-xjtu  val pcToDataPath = new PcToDataPathIO(params)
80d8a24b06SzhanglyGit}