109c6f1ddSLingrui98/*************************************************************************************** 209c6f1ddSLingrui98* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 309c6f1ddSLingrui98* Copyright (c) 2020-2021 Peng Cheng Laboratory 409c6f1ddSLingrui98* 509c6f1ddSLingrui98* XiangShan is licensed under Mulan PSL v2. 609c6f1ddSLingrui98* You can use this software according to the terms and conditions of the Mulan PSL v2. 709c6f1ddSLingrui98* You may obtain a copy of Mulan PSL v2 at: 809c6f1ddSLingrui98* http://license.coscl.org.cn/MulanPSL2 909c6f1ddSLingrui98* 1009c6f1ddSLingrui98* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 1109c6f1ddSLingrui98* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 1209c6f1ddSLingrui98* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 1309c6f1ddSLingrui98* 1409c6f1ddSLingrui98* See the Mulan PSL v2 for more details. 1509c6f1ddSLingrui98***************************************************************************************/ 1609c6f1ddSLingrui98package xiangshan.frontend 1709c6f1ddSLingrui98 1809c6f1ddSLingrui98import chipsalliance.rocketchip.config.Parameters 1909c6f1ddSLingrui98import chisel3._ 2009c6f1ddSLingrui98import chisel3.util._ 2109c6f1ddSLingrui98import xiangshan._ 2209c6f1ddSLingrui98import utils._ 2309c6f1ddSLingrui98 2409c6f1ddSLingrui98class FetchRequestBundle(implicit p: Parameters) extends XSBundle { 2509c6f1ddSLingrui98 val startAddr = UInt(VAddrBits.W) 2609c6f1ddSLingrui98 val fallThruAddr = UInt(VAddrBits.W) 2709c6f1ddSLingrui98 val fallThruError = Bool() 2809c6f1ddSLingrui98 val ftqIdx = new FtqPtr 2909c6f1ddSLingrui98 val ftqOffset = ValidUndirectioned(UInt(log2Ceil(PredictWidth).W)) 3009c6f1ddSLingrui98 val target = UInt(VAddrBits.W) 3109c6f1ddSLingrui98 val oversize = Bool() 3209c6f1ddSLingrui98 3309c6f1ddSLingrui98 def fallThroughError() = { 3409c6f1ddSLingrui98 def carryPos = instOffsetBits+log2Ceil(PredictWidth)+1 3509c6f1ddSLingrui98 def getLower(pc: UInt) = pc(instOffsetBits+log2Ceil(PredictWidth), instOffsetBits) 3609c6f1ddSLingrui98 val carry = (startAddr(carryPos) =/= fallThruAddr(carryPos)).asUInt 3709c6f1ddSLingrui98 val startLower = Cat(0.U(1.W), getLower(startAddr)) 3809c6f1ddSLingrui98 val endLowerwithCarry = Cat(carry, getLower(fallThruAddr)) 3909c6f1ddSLingrui98 require(startLower.getWidth == log2Ceil(PredictWidth)+2) 4009c6f1ddSLingrui98 require(endLowerwithCarry.getWidth == log2Ceil(PredictWidth)+2) 4109c6f1ddSLingrui98 startLower >= endLowerwithCarry || (endLowerwithCarry - startLower) > (PredictWidth+1).U 4209c6f1ddSLingrui98 } 4309c6f1ddSLingrui98 def fromFtqPcBundle(b: Ftq_RF_Components) = { 4409c6f1ddSLingrui98 this.startAddr := b.startAddr 4509c6f1ddSLingrui98 this.fallThruAddr := b.getFallThrough() 4609c6f1ddSLingrui98 this.oversize := b.oversize 4709c6f1ddSLingrui98 this 4809c6f1ddSLingrui98 } 4909c6f1ddSLingrui98 def fromBpuResp(resp: BranchPredictionBundle) = { 5009c6f1ddSLingrui98 // only used to bypass, so some fields remains unchanged 5109c6f1ddSLingrui98 this.startAddr := resp.pc 5209c6f1ddSLingrui98 this.target := resp.target 5309c6f1ddSLingrui98 this.ftqOffset := resp.genCfiIndex 5409c6f1ddSLingrui98 this.fallThruAddr := resp.fallThroughAddr 5509c6f1ddSLingrui98 this.oversize := resp.ftb_entry.oversize 5609c6f1ddSLingrui98 this 5709c6f1ddSLingrui98 } 5809c6f1ddSLingrui98 override def toPrintable: Printable = { 5909c6f1ddSLingrui98 p"[start] ${Hexadecimal(startAddr)} [pft] ${Hexadecimal(fallThruAddr)}" + 6009c6f1ddSLingrui98 p"[tgt] ${Hexadecimal(target)} [ftqIdx] $ftqIdx [jmp] v:${ftqOffset.valid}" + 6109c6f1ddSLingrui98 p" offset: ${ftqOffset.bits}\n" 6209c6f1ddSLingrui98 } 6309c6f1ddSLingrui98} 6409c6f1ddSLingrui98 6509c6f1ddSLingrui98class PredecodeWritebackBundle(implicit p:Parameters) extends XSBundle { 6609c6f1ddSLingrui98 val pc = Vec(PredictWidth, UInt(VAddrBits.W)) 6709c6f1ddSLingrui98 val pd = Vec(PredictWidth, new PreDecodeInfo) // TODO: redefine Predecode 6809c6f1ddSLingrui98 val ftqIdx = new FtqPtr 6909c6f1ddSLingrui98 val ftqOffset = UInt(log2Ceil(PredictWidth).W) 7009c6f1ddSLingrui98 val misOffset = ValidUndirectioned(UInt(log2Ceil(PredictWidth).W)) 7109c6f1ddSLingrui98 val cfiOffset = ValidUndirectioned(UInt(log2Ceil(PredictWidth).W)) 7209c6f1ddSLingrui98 val target = UInt(VAddrBits.W) 7309c6f1ddSLingrui98 val jalTarget = UInt(VAddrBits.W) 7409c6f1ddSLingrui98 val instrRange = Vec(PredictWidth, Bool()) 7509c6f1ddSLingrui98} 7609c6f1ddSLingrui98 7709c6f1ddSLingrui98class Exception(implicit p: Parameters) extends XSBundle { 7809c6f1ddSLingrui98 7909c6f1ddSLingrui98} 8009c6f1ddSLingrui98 8109c6f1ddSLingrui98class FetchToIBuffer(implicit p: Parameters) extends XSBundle { 8209c6f1ddSLingrui98 val instrs = Vec(PredictWidth, UInt(32.W)) 8309c6f1ddSLingrui98 val valid = UInt(PredictWidth.W) 8409c6f1ddSLingrui98 val pd = Vec(PredictWidth, new PreDecodeInfo) 8509c6f1ddSLingrui98 val pc = Vec(PredictWidth, UInt(VAddrBits.W)) 8609c6f1ddSLingrui98 val foldpc = Vec(PredictWidth, UInt(MemPredPCWidth.W)) 8709c6f1ddSLingrui98 //val exception = new Exception 8809c6f1ddSLingrui98 val ftqPtr = new FtqPtr 8909c6f1ddSLingrui98 val ftqOffset = Vec(PredictWidth, ValidUndirectioned(UInt(log2Ceil(PredictWidth).W))) 9009c6f1ddSLingrui98 val ipf = Vec(PredictWidth, Bool()) 9109c6f1ddSLingrui98 val acf = Vec(PredictWidth, Bool()) 9209c6f1ddSLingrui98 val crossPageIPFFix = Vec(PredictWidth, Bool()) 9309c6f1ddSLingrui98} 9409c6f1ddSLingrui98 9509c6f1ddSLingrui98// Move from BPU 9609c6f1ddSLingrui98class GlobalHistory(implicit p: Parameters) extends XSBundle with HasBPUConst { 9709c6f1ddSLingrui98 val predHist = UInt(HistoryLength.W) 9809c6f1ddSLingrui98 // def update(sawNTBr: Bool, takenOnBr: Bool, hist: UInt = predHist): GlobalHistory = { 9909c6f1ddSLingrui98 // val g = Wire(new GlobalHistory) 10009c6f1ddSLingrui98 // val shifted = takenOnBr || sawNTBr 10109c6f1ddSLingrui98 // g.predHist := Mux(shifted, (hist << 1) | takenOnBr.asUInt, hist) 10209c6f1ddSLingrui98 // g 10309c6f1ddSLingrui98 // } 10409c6f1ddSLingrui98 10509c6f1ddSLingrui98 // def update(brValids: UInt, taken_mask: UInt, hist: UInt = predHist): GlobalHistory = { 10609c6f1ddSLingrui98 // val shift = PopCount(brValids & Mux(taken_mask =/= 0.U, LowerMask(taken_mask), ((1.U<<numBr) - 1.U))) 10709c6f1ddSLingrui98 // val g = Wire(new GlobalHistory) 10809c6f1ddSLingrui98 // g.predHist := (hist << shift) | (taken_mask =/= 0.U) 10909c6f1ddSLingrui98 // g 11009c6f1ddSLingrui98 // } 11109c6f1ddSLingrui98 11209c6f1ddSLingrui98 def update(shift: UInt, taken: Bool, hist: UInt = predHist): GlobalHistory = { 11309c6f1ddSLingrui98 val g = Wire(new GlobalHistory) 11409c6f1ddSLingrui98 g.predHist := (hist << shift) | taken 11509c6f1ddSLingrui98 g 11609c6f1ddSLingrui98 } 11709c6f1ddSLingrui98 11809c6f1ddSLingrui98 final def === (that: GlobalHistory): Bool = { 11909c6f1ddSLingrui98 predHist === that.predHist 12009c6f1ddSLingrui98 } 12109c6f1ddSLingrui98 12209c6f1ddSLingrui98 final def =/= (that: GlobalHistory): Bool = !(this === that) 12309c6f1ddSLingrui98 12409c6f1ddSLingrui98 implicit val name = "IFU" 12509c6f1ddSLingrui98 def debug(where: String) = XSDebug(p"[${where}_GlobalHistory] hist=${Binary(predHist)}\n") 12609c6f1ddSLingrui98 // override def toString(): String = "histPtr=%d, sawNTBr=%d, takenOnBr=%d, saveHalfRVI=%d".format(histPtr, sawNTBr, takenOnBr, saveHalfRVI) 12709c6f1ddSLingrui98} 12809c6f1ddSLingrui98 12909c6f1ddSLingrui98class TableAddr(val idxBits: Int, val banks: Int)(implicit p: Parameters) extends XSBundle{ 13009c6f1ddSLingrui98 def tagBits = VAddrBits - idxBits - instOffsetBits 13109c6f1ddSLingrui98 13209c6f1ddSLingrui98 val tag = UInt(tagBits.W) 13309c6f1ddSLingrui98 val idx = UInt(idxBits.W) 13409c6f1ddSLingrui98 val offset = UInt(instOffsetBits.W) 13509c6f1ddSLingrui98 13609c6f1ddSLingrui98 def fromUInt(x: UInt) = x.asTypeOf(UInt(VAddrBits.W)).asTypeOf(this) 13709c6f1ddSLingrui98 def getTag(x: UInt) = fromUInt(x).tag 13809c6f1ddSLingrui98 def getIdx(x: UInt) = fromUInt(x).idx 13909c6f1ddSLingrui98 def getBank(x: UInt) = if (banks > 1) getIdx(x)(log2Up(banks) - 1, 0) else 0.U 14009c6f1ddSLingrui98 def getBankIdx(x: UInt) = if (banks > 1) getIdx(x)(idxBits - 1, log2Up(banks)) else getIdx(x) 14109c6f1ddSLingrui98} 14209c6f1ddSLingrui98class BranchPrediction(implicit p: Parameters) extends XSBundle with HasBPUConst { 14309c6f1ddSLingrui98 val taken_mask = Vec(numBr, Bool()) 14409c6f1ddSLingrui98 14509c6f1ddSLingrui98 val br_valids = Vec(numBr, Bool()) 14609c6f1ddSLingrui98 val br_targets = Vec(numBr, UInt(VAddrBits.W)) 14709c6f1ddSLingrui98 14809c6f1ddSLingrui98 val jmp_valid = Bool() 14909c6f1ddSLingrui98 val jmp_target = UInt(VAddrBits.W) 15009c6f1ddSLingrui98 15109c6f1ddSLingrui98 val is_jal = Bool() 15209c6f1ddSLingrui98 val is_jalr = Bool() 15309c6f1ddSLingrui98 val is_call = Bool() 15409c6f1ddSLingrui98 val is_ret = Bool() 15509c6f1ddSLingrui98 15609c6f1ddSLingrui98 // val call_is_rvc = Bool() 15709c6f1ddSLingrui98 val hit = Bool() 15809c6f1ddSLingrui98 15909c6f1ddSLingrui98 def taken = taken_mask.reduce(_||_) // || (is_jal || is_jalr) 16009c6f1ddSLingrui98 16109c6f1ddSLingrui98 def fromFtbEntry(entry: FTBEntry, pc: UInt) = { 16209c6f1ddSLingrui98 br_valids := entry.brValids 16309c6f1ddSLingrui98 br_targets := entry.getBrTargets(pc) 16409c6f1ddSLingrui98 jmp_valid := entry.jmpValid 16509c6f1ddSLingrui98 jmp_target := entry.getJmpTarget(pc) 16609c6f1ddSLingrui98 is_jal := entry.jmpValid && entry.isJal 16709c6f1ddSLingrui98 is_jalr := entry.jmpValid && entry.isJalr 16809c6f1ddSLingrui98 is_call := entry.jmpValid && entry.isCall 16909c6f1ddSLingrui98 is_ret := entry.jmpValid && entry.isRet 17009c6f1ddSLingrui98 } 17109c6f1ddSLingrui98 // override def toPrintable: Printable = { 17209c6f1ddSLingrui98 // p"-----------BranchPrediction----------- " + 17309c6f1ddSLingrui98 // p"[taken_mask] ${Binary(taken_mask.asUInt)} " + 17409c6f1ddSLingrui98 // p"[is_br] ${Binary(is_br.asUInt)}, [is_jal] ${Binary(is_jal.asUInt)} " + 17509c6f1ddSLingrui98 // p"[is_jalr] ${Binary(is_jalr.asUInt)}, [is_call] ${Binary(is_call.asUInt)}, [is_ret] ${Binary(is_ret.asUInt)} " + 17609c6f1ddSLingrui98 // p"[target] ${Hexadecimal(target)}}, [hit] $hit " 17709c6f1ddSLingrui98 // } 17809c6f1ddSLingrui98 17909c6f1ddSLingrui98 def display(cond: Bool): Unit = { 18009c6f1ddSLingrui98 XSDebug(cond, p"[taken_mask] ${Binary(taken_mask.asUInt)} [hit] $hit\n") 18109c6f1ddSLingrui98 } 18209c6f1ddSLingrui98} 18309c6f1ddSLingrui98 18409c6f1ddSLingrui98class BranchPredictionBundle(implicit p: Parameters) extends XSBundle with HasBPUConst with BPUUtils{ 18509c6f1ddSLingrui98 val pc = UInt(VAddrBits.W) 18609c6f1ddSLingrui98 18709c6f1ddSLingrui98 val valid = Bool() 18809c6f1ddSLingrui98 18909c6f1ddSLingrui98 val hasRedirect = Bool() 19009c6f1ddSLingrui98 val ftq_idx = new FtqPtr 19109c6f1ddSLingrui98 // val hit = Bool() 19209c6f1ddSLingrui98 val preds = new BranchPrediction 19309c6f1ddSLingrui98 19409c6f1ddSLingrui98 val ghist = new GlobalHistory() 19509c6f1ddSLingrui98 val phist = UInt(PathHistoryLength.W) 19609c6f1ddSLingrui98 val rasSp = UInt(log2Ceil(RasSize).W) 19709c6f1ddSLingrui98 val rasTop = new RASEntry 19809c6f1ddSLingrui98 val specCnt = Vec(numBr, UInt(10.W)) 19909c6f1ddSLingrui98 // val meta = UInt(MaxMetaLength.W) 20009c6f1ddSLingrui98 20109c6f1ddSLingrui98 val ftb_entry = new FTBEntry() // TODO: Send this entry to ftq 20209c6f1ddSLingrui98 20309c6f1ddSLingrui98 def real_taken_mask(): Vec[Bool] = { 20409c6f1ddSLingrui98 Mux(preds.hit, 20509c6f1ddSLingrui98 VecInit(preds.taken_mask.zip(preds.br_valids).map{ case(m, b) => m && b } :+ preds.jmp_valid), 20609c6f1ddSLingrui98 VecInit(Seq.fill(numBr+1)(false.B))) 20709c6f1ddSLingrui98 } 20809c6f1ddSLingrui98 20909c6f1ddSLingrui98 def real_br_taken_mask(): Vec[Bool] = { 21009c6f1ddSLingrui98 Mux(preds.hit, 21109c6f1ddSLingrui98 VecInit(preds.taken_mask.zip(preds.br_valids).map{ case(m, b) => m && b }), 21209c6f1ddSLingrui98 VecInit(Seq.fill(numBr)(false.B))) 21309c6f1ddSLingrui98 } 21409c6f1ddSLingrui98 def hit_taken_on_call = !VecInit(real_taken_mask.take(numBr)).asUInt.orR && preds.hit && preds.is_call && preds.jmp_valid 21509c6f1ddSLingrui98 def hit_taken_on_ret = !VecInit(real_taken_mask.take(numBr)).asUInt.orR && preds.hit && preds.is_ret && preds.jmp_valid 21660f966c8SGuokai Chen def hit_taken_on_jalr = !VecInit(real_taken_mask.take(numBr)).asUInt.orR && preds.hit && preds.is_jalr && preds.jmp_valid 21709c6f1ddSLingrui98 21809c6f1ddSLingrui98 def fallThroughAddr = getFallThroughAddr(pc, ftb_entry.carry, ftb_entry.pftAddr) 21909c6f1ddSLingrui98 def target(): UInt = { 22009c6f1ddSLingrui98 Mux(preds.hit, 22109c6f1ddSLingrui98 // when hit 22209c6f1ddSLingrui98 Mux((real_taken_mask.asUInt & preds.br_valids.asUInt) =/= 0.U, 22309c6f1ddSLingrui98 PriorityMux(real_taken_mask.asUInt & preds.br_valids.asUInt, preds.br_targets), 22409c6f1ddSLingrui98 Mux(preds.jmp_valid, preds.jmp_target, fallThroughAddr)), 22509c6f1ddSLingrui98 //otherwise 22609c6f1ddSLingrui98 pc + (FetchWidth*4).U 22709c6f1ddSLingrui98 ) 22809c6f1ddSLingrui98 } 22909c6f1ddSLingrui98 def genCfiIndex = { 23009c6f1ddSLingrui98 val cfiIndex = Wire(ValidUndirectioned(UInt(log2Ceil(PredictWidth).W))) 23109c6f1ddSLingrui98 cfiIndex.valid := real_taken_mask.asUInt.orR 23209c6f1ddSLingrui98 // when no takens, set cfiIndex to PredictWidth-1 23309c6f1ddSLingrui98 cfiIndex.bits := 23409c6f1ddSLingrui98 ParallelPriorityMux(real_taken_mask, ftb_entry.getOffsetVec) | 23509c6f1ddSLingrui98 Fill(log2Ceil(PredictWidth), (!real_taken_mask.asUInt.orR).asUInt) 23609c6f1ddSLingrui98 cfiIndex 23709c6f1ddSLingrui98 } 23809c6f1ddSLingrui98 23909c6f1ddSLingrui98 24009c6f1ddSLingrui98 // override def toPrintable: Printable = { 24109c6f1ddSLingrui98 // p"-----------BranchPredictionBundle----------- " + 24209c6f1ddSLingrui98 // p"[pc] ${Hexadecimal(pc)} " + 24309c6f1ddSLingrui98 // p"[ghist] ${Binary(ghist.predHist)} " + 24409c6f1ddSLingrui98 // preds.toPrintable + 24509c6f1ddSLingrui98 // ftb_entry.toPrintable 24609c6f1ddSLingrui98 // } 24709c6f1ddSLingrui98 24809c6f1ddSLingrui98 def display(cond: Bool): Unit = { 24909c6f1ddSLingrui98 XSDebug(cond, p"[pc] ${Hexadecimal(pc)}\n") 25009c6f1ddSLingrui98 XSDebug(cond, p"[ghist] ${Binary(ghist.predHist)}\n") 25109c6f1ddSLingrui98 preds.display(cond) 25209c6f1ddSLingrui98 ftb_entry.display(cond) 25309c6f1ddSLingrui98 } 25409c6f1ddSLingrui98} 25509c6f1ddSLingrui98 25609c6f1ddSLingrui98class BranchPredictionResp(implicit p: Parameters) extends XSBundle with HasBPUConst { 25709c6f1ddSLingrui98 // val valids = Vec(3, Bool()) 25809c6f1ddSLingrui98 val s1 = new BranchPredictionBundle() 25909c6f1ddSLingrui98 val s2 = new BranchPredictionBundle() 26009c6f1ddSLingrui98 val s3 = new BranchPredictionBundle() 26109c6f1ddSLingrui98 26209c6f1ddSLingrui98 def selectedResp = 26309c6f1ddSLingrui98 PriorityMux(Seq( 26409c6f1ddSLingrui98 ((s3.valid && s3.hasRedirect) -> s3), 26509c6f1ddSLingrui98 ((s2.valid && s2.hasRedirect) -> s2), 26609c6f1ddSLingrui98 (s1.valid -> s1) 26709c6f1ddSLingrui98 )) 26809c6f1ddSLingrui98 def selectedRespIdx = 26909c6f1ddSLingrui98 PriorityMux(Seq( 27009c6f1ddSLingrui98 ((s3.valid && s3.hasRedirect) -> BP_S3), 27109c6f1ddSLingrui98 ((s2.valid && s2.hasRedirect) -> BP_S2), 27209c6f1ddSLingrui98 (s1.valid -> BP_S1) 27309c6f1ddSLingrui98 )) 27409c6f1ddSLingrui98 def lastStage = s3 27509c6f1ddSLingrui98} 27609c6f1ddSLingrui98 27709c6f1ddSLingrui98class BpuToFtqBundle(implicit p: Parameters) extends BranchPredictionResp with HasBPUConst { 27809c6f1ddSLingrui98 val meta = UInt(MaxMetaLength.W) 27909c6f1ddSLingrui98} 28009c6f1ddSLingrui98 28109c6f1ddSLingrui98object BpuToFtqBundle { 28209c6f1ddSLingrui98 def apply(resp: BranchPredictionResp)(implicit p: Parameters): BpuToFtqBundle = { 28309c6f1ddSLingrui98 val e = Wire(new BpuToFtqBundle()) 28409c6f1ddSLingrui98 e.s1 := resp.s1 28509c6f1ddSLingrui98 e.s2 := resp.s2 28609c6f1ddSLingrui98 e.s3 := resp.s3 28709c6f1ddSLingrui98 28809c6f1ddSLingrui98 e.meta := DontCare 28909c6f1ddSLingrui98 e 29009c6f1ddSLingrui98 } 29109c6f1ddSLingrui98} 29209c6f1ddSLingrui98 29309c6f1ddSLingrui98class BranchPredictionUpdate(implicit p: Parameters) extends BranchPredictionBundle with HasBPUConst { 29409c6f1ddSLingrui98 val mispred_mask = Vec(numBr+1, Bool()) 29509c6f1ddSLingrui98 val false_hit = Bool() 29609c6f1ddSLingrui98 val new_br_insert_pos = Vec(numBr, Bool()) 29709c6f1ddSLingrui98 val old_entry = Bool() 29809c6f1ddSLingrui98 val meta = UInt(MaxMetaLength.W) 299abdbe4b7SLingrui98 val full_target = UInt(VAddrBits.W) 30009c6f1ddSLingrui98 // val ghist = new GlobalHistory() This in spec_meta 30109c6f1ddSLingrui98 30209c6f1ddSLingrui98 def fromFtqRedirectSram(entry: Ftq_Redirect_SRAMEntry) = { 30309c6f1ddSLingrui98 ghist := entry.ghist 30409c6f1ddSLingrui98 phist := entry.phist 30509c6f1ddSLingrui98 rasSp := entry.rasSp 30609c6f1ddSLingrui98 rasTop := entry.rasEntry 30709c6f1ddSLingrui98 specCnt := entry.specCnt 30809c6f1ddSLingrui98 this 30909c6f1ddSLingrui98 } 31009c6f1ddSLingrui98 // override def toPrintable: Printable = { 31109c6f1ddSLingrui98 // p"-----------BranchPredictionUpdate----------- " + 31209c6f1ddSLingrui98 // p"[mispred_mask] ${Binary(mispred_mask.asUInt)} [false_hit] ${Binary(false_hit)} " + 31309c6f1ddSLingrui98 // p"[new_br_insert_pos] ${Binary(new_br_insert_pos.asUInt)} " + 31409c6f1ddSLingrui98 // super.toPrintable + 31509c6f1ddSLingrui98 // p"\n" 31609c6f1ddSLingrui98 // } 31709c6f1ddSLingrui98 31809c6f1ddSLingrui98 override def display(cond: Bool) { 31909c6f1ddSLingrui98 XSDebug(cond, p"-----------BranchPredictionUpdate-----------\n") 32009c6f1ddSLingrui98 XSDebug(cond, p"[mispred_mask] ${Binary(mispred_mask.asUInt)} [false_hit] $false_hit\n") 32109c6f1ddSLingrui98 XSDebug(cond, p"[new_br_insert_pos] ${Binary(new_br_insert_pos.asUInt)}\n") 32209c6f1ddSLingrui98 super.display(cond) 32309c6f1ddSLingrui98 XSDebug(cond, p"--------------------------------------------\n") 32409c6f1ddSLingrui98 } 32509c6f1ddSLingrui98} 32609c6f1ddSLingrui98 32709c6f1ddSLingrui98class BranchPredictionRedirect(implicit p: Parameters) extends Redirect with HasBPUConst { 32809c6f1ddSLingrui98 // override def toPrintable: Printable = { 32909c6f1ddSLingrui98 // p"-----------BranchPredictionRedirect----------- " + 33009c6f1ddSLingrui98 // p"-----------cfiUpdate----------- " + 33109c6f1ddSLingrui98 // p"[pc] ${Hexadecimal(cfiUpdate.pc)} " + 33209c6f1ddSLingrui98 // p"[predTaken] ${cfiUpdate.predTaken}, [taken] ${cfiUpdate.taken}, [isMisPred] ${cfiUpdate.isMisPred} " + 33309c6f1ddSLingrui98 // p"[target] ${Hexadecimal(cfiUpdate.target)} " + 33409c6f1ddSLingrui98 // p"------------------------------- " + 335*9aca92b9SYinan Xu // p"[robPtr] f=${robIdx.flag} v=${robIdx.value} " + 33609c6f1ddSLingrui98 // p"[ftqPtr] f=${ftqIdx.flag} v=${ftqIdx.value} " + 33709c6f1ddSLingrui98 // p"[ftqOffset] ${ftqOffset} " + 33809c6f1ddSLingrui98 // p"[level] ${level}, [interrupt] ${interrupt} " + 33909c6f1ddSLingrui98 // p"[stFtqIdx] f=${stFtqIdx.flag} v=${stFtqIdx.value} " + 34009c6f1ddSLingrui98 // p"[stFtqOffset] ${stFtqOffset} " + 34109c6f1ddSLingrui98 // p"\n" 34209c6f1ddSLingrui98 34309c6f1ddSLingrui98 // } 34409c6f1ddSLingrui98 34509c6f1ddSLingrui98 def display(cond: Bool): Unit = { 34609c6f1ddSLingrui98 XSDebug(cond, p"-----------BranchPredictionRedirect----------- \n") 34709c6f1ddSLingrui98 XSDebug(cond, p"-----------cfiUpdate----------- \n") 34809c6f1ddSLingrui98 XSDebug(cond, p"[pc] ${Hexadecimal(cfiUpdate.pc)}\n") 34909c6f1ddSLingrui98 XSDebug(cond, p"[hist] ${Binary(cfiUpdate.hist.predHist)}\n") 35009c6f1ddSLingrui98 XSDebug(cond, p"[br_hit] ${cfiUpdate.br_hit} [isMisPred] ${cfiUpdate.isMisPred}\n") 35109c6f1ddSLingrui98 XSDebug(cond, p"[pred_taken] ${cfiUpdate.predTaken} [taken] ${cfiUpdate.taken} [isMisPred] ${cfiUpdate.isMisPred}\n") 35209c6f1ddSLingrui98 XSDebug(cond, p"[target] ${Hexadecimal(cfiUpdate.target)} \n") 35309c6f1ddSLingrui98 XSDebug(cond, p"[shift] ${cfiUpdate.shift}\n") 35409c6f1ddSLingrui98 XSDebug(cond, p"------------------------------- \n") 355*9aca92b9SYinan Xu XSDebug(cond, p"[robPtr] f=${robIdx.flag} v=${robIdx.value}\n") 35609c6f1ddSLingrui98 XSDebug(cond, p"[ftqPtr] f=${ftqIdx.flag} v=${ftqIdx.value} \n") 35709c6f1ddSLingrui98 XSDebug(cond, p"[ftqOffset] ${ftqOffset} \n") 35809c6f1ddSLingrui98 XSDebug(cond, p"[stFtqIdx] f=${stFtqIdx.flag} v=${stFtqIdx.value}\n") 35909c6f1ddSLingrui98 XSDebug(cond, p"[stFtqOffset] ${stFtqOffset}\n") 36009c6f1ddSLingrui98 XSDebug(cond, p"---------------------------------------------- \n") 36109c6f1ddSLingrui98 } 36209c6f1ddSLingrui98} 363