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