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