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 20*5f80df32Sxiaofeibao-xjtu private val numTargetMemRead = params.numTargetReadPort + params.numPcMemReadPort 21d8a24b06SzhanglyGit val io = IO(new PcTargetMemIO()) 22d8a24b06SzhanglyGit 23*5f80df32Sxiaofeibao-xjtu private val targetMem = Module(new SyncDataModuleTemplate(new Ftq_RF_Components, FtqSize, numTargetMemRead, 1)) 24d8a24b06SzhanglyGit private val jumpTargetReadVec : Vec[UInt] = Wire(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W))) 25d8a24b06SzhanglyGit private val jumpTargetVec : Vec[UInt] = Wire(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W))) 26d8a24b06SzhanglyGit 27d8a24b06SzhanglyGit targetMem.io.wen.head := RegNext(io.fromFrontendFtq.pc_mem_wen) 283827c997SsinceforYy targetMem.io.waddr.head := RegEnable(io.fromFrontendFtq.pc_mem_waddr, io.fromFrontendFtq.pc_mem_wen) 29*5f80df32Sxiaofeibao-xjtu targetMem.io.wdata.head := RegEnable(io.fromFrontendFtq.pc_mem_wdata, io.fromFrontendFtq.pc_mem_wen) 30d8a24b06SzhanglyGit 316022c595SsinceforYy private val newestEn: Bool = io.fromFrontendFtq.newest_entry_en 32d8a24b06SzhanglyGit private val newestTarget: UInt = io.fromFrontendFtq.newest_entry_target 33*5f80df32Sxiaofeibao-xjtu for (i <- 0 until params.numTargetReadPort) { 34d8a24b06SzhanglyGit val targetPtr = io.fromDataPathFtq(i) 35d8a24b06SzhanglyGit // target pc stored in next entry 36d8a24b06SzhanglyGit targetMem.io.raddr(i) := (targetPtr + 1.U).value 37*5f80df32Sxiaofeibao-xjtu jumpTargetReadVec(i) := targetMem.io.rdata(i).startAddr 38d8a24b06SzhanglyGit val needNewestTarget = RegNext(targetPtr === io.fromFrontendFtq.newest_entry_ptr) 39d8a24b06SzhanglyGit jumpTargetVec(i) := Mux( 40d8a24b06SzhanglyGit needNewestTarget, 416022c595SsinceforYy RegEnable(newestTarget, newestEn), 42d8a24b06SzhanglyGit jumpTargetReadVec(i) 43d8a24b06SzhanglyGit ) 44d8a24b06SzhanglyGit } 45*5f80df32Sxiaofeibao-xjtu private val pcReadVec = Wire(Vec(params.numPcMemReadPort, UInt(VAddrData().dataWidth.W))) 46*5f80df32Sxiaofeibao-xjtu private val pcVec = Wire(Vec(params.numPcMemReadPort, UInt(VAddrData().dataWidth.W))) 47*5f80df32Sxiaofeibao-xjtu for (i <- 0 until params.numPcMemReadPort) { 48*5f80df32Sxiaofeibao-xjtu val pcAddr = io.pcToDataPath.fromDataPathFtqPtr(i) 49*5f80df32Sxiaofeibao-xjtu // pc stored in this entry 50*5f80df32Sxiaofeibao-xjtu val offset = io.pcToDataPath.fromDataPathFtqOffset(i) 51*5f80df32Sxiaofeibao-xjtu targetMem.io.raddr(i + params.numTargetReadPort) := pcAddr.value 52*5f80df32Sxiaofeibao-xjtu pcReadVec(i) := targetMem.io.rdata(i + params.numTargetReadPort).getPc(RegNext(offset)) 53*5f80df32Sxiaofeibao-xjtu pcVec(i) := pcReadVec(i) 54*5f80df32Sxiaofeibao-xjtu } 55*5f80df32Sxiaofeibao-xjtu io.pcToDataPath.toDataPathPC := pcVec 56d8a24b06SzhanglyGit io.toExus := jumpTargetVec 57d8a24b06SzhanglyGit 58d8a24b06SzhanglyGit} 59d8a24b06SzhanglyGit 60*5f80df32Sxiaofeibao-xjtuclass PcToDataPathIO(params: BackendParams)(implicit p: Parameters) extends XSBundle { 61*5f80df32Sxiaofeibao-xjtu val toDataPathPC = Output(Vec(params.numPcMemReadPort, UInt(VAddrData().dataWidth.W))) 62*5f80df32Sxiaofeibao-xjtu val fromDataPathFtqPtr = Input(Vec(params.numPcMemReadPort, new FtqPtr)) 63*5f80df32Sxiaofeibao-xjtu val fromDataPathFtqOffset = Input(Vec(params.numPcMemReadPort, UInt(log2Up(PredictWidth).W))) 64*5f80df32Sxiaofeibao-xjtu} 65*5f80df32Sxiaofeibao-xjtu 66d8a24b06SzhanglyGitclass PcTargetMemIO()(implicit p: Parameters, params: BackendParams) extends XSBundle { 67d8a24b06SzhanglyGit //input 68d8a24b06SzhanglyGit val fromFrontendFtq = Flipped(new FtqToCtrlIO) 69d8a24b06SzhanglyGit val fromDataPathFtq = Input(Vec(params.numTargetReadPort, new FtqPtr)) 70d8a24b06SzhanglyGit //output 71d8a24b06SzhanglyGit val toExus = Output(Vec(params.numTargetReadPort, UInt(VAddrData().dataWidth.W))) 72*5f80df32Sxiaofeibao-xjtu val pcToDataPath = new PcToDataPathIO(params) 73d8a24b06SzhanglyGit}