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