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}