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}