1*09c6f1ddSLingrui98/*************************************************************************************** 2*09c6f1ddSLingrui98* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*09c6f1ddSLingrui98* Copyright (c) 2020-2021 Peng Cheng Laboratory 4*09c6f1ddSLingrui98* 5*09c6f1ddSLingrui98* XiangShan is licensed under Mulan PSL v2. 6*09c6f1ddSLingrui98* You can use this software according to the terms and conditions of the Mulan PSL v2. 7*09c6f1ddSLingrui98* You may obtain a copy of Mulan PSL v2 at: 8*09c6f1ddSLingrui98* http://license.coscl.org.cn/MulanPSL2 9*09c6f1ddSLingrui98* 10*09c6f1ddSLingrui98* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*09c6f1ddSLingrui98* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*09c6f1ddSLingrui98* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*09c6f1ddSLingrui98* 14*09c6f1ddSLingrui98* See the Mulan PSL v2 for more details. 15*09c6f1ddSLingrui98***************************************************************************************/ 16*09c6f1ddSLingrui98package xiangshan.frontend 17*09c6f1ddSLingrui98 18*09c6f1ddSLingrui98import chipsalliance.rocketchip.config.Parameters 19*09c6f1ddSLingrui98import chisel3._ 20*09c6f1ddSLingrui98import chisel3.util._ 21*09c6f1ddSLingrui98import xiangshan._ 22*09c6f1ddSLingrui98import utils._ 23*09c6f1ddSLingrui98 24*09c6f1ddSLingrui98class FetchRequestBundle(implicit p: Parameters) extends XSBundle { 25*09c6f1ddSLingrui98 val startAddr = UInt(VAddrBits.W) 26*09c6f1ddSLingrui98 val fallThruAddr = UInt(VAddrBits.W) 27*09c6f1ddSLingrui98 val fallThruError = Bool() 28*09c6f1ddSLingrui98 val ftqIdx = new FtqPtr 29*09c6f1ddSLingrui98 val ftqOffset = ValidUndirectioned(UInt(log2Ceil(PredictWidth).W)) 30*09c6f1ddSLingrui98 val target = UInt(VAddrBits.W) 31*09c6f1ddSLingrui98 val oversize = Bool() 32*09c6f1ddSLingrui98 33*09c6f1ddSLingrui98 def fallThroughError() = { 34*09c6f1ddSLingrui98 def carryPos = instOffsetBits+log2Ceil(PredictWidth)+1 35*09c6f1ddSLingrui98 def getLower(pc: UInt) = pc(instOffsetBits+log2Ceil(PredictWidth), instOffsetBits) 36*09c6f1ddSLingrui98 val carry = (startAddr(carryPos) =/= fallThruAddr(carryPos)).asUInt 37*09c6f1ddSLingrui98 val startLower = Cat(0.U(1.W), getLower(startAddr)) 38*09c6f1ddSLingrui98 val endLowerwithCarry = Cat(carry, getLower(fallThruAddr)) 39*09c6f1ddSLingrui98 require(startLower.getWidth == log2Ceil(PredictWidth)+2) 40*09c6f1ddSLingrui98 require(endLowerwithCarry.getWidth == log2Ceil(PredictWidth)+2) 41*09c6f1ddSLingrui98 startLower >= endLowerwithCarry || (endLowerwithCarry - startLower) > (PredictWidth+1).U 42*09c6f1ddSLingrui98 } 43*09c6f1ddSLingrui98 def fromFtqPcBundle(b: Ftq_RF_Components) = { 44*09c6f1ddSLingrui98 this.startAddr := b.startAddr 45*09c6f1ddSLingrui98 this.fallThruAddr := b.getFallThrough() 46*09c6f1ddSLingrui98 this.oversize := b.oversize 47*09c6f1ddSLingrui98 this 48*09c6f1ddSLingrui98 } 49*09c6f1ddSLingrui98 def fromBpuResp(resp: BranchPredictionBundle) = { 50*09c6f1ddSLingrui98 // only used to bypass, so some fields remains unchanged 51*09c6f1ddSLingrui98 this.startAddr := resp.pc 52*09c6f1ddSLingrui98 this.target := resp.target 53*09c6f1ddSLingrui98 this.ftqOffset := resp.genCfiIndex 54*09c6f1ddSLingrui98 this.fallThruAddr := resp.fallThroughAddr 55*09c6f1ddSLingrui98 this.oversize := resp.ftb_entry.oversize 56*09c6f1ddSLingrui98 this 57*09c6f1ddSLingrui98 } 58*09c6f1ddSLingrui98 override def toPrintable: Printable = { 59*09c6f1ddSLingrui98 p"[start] ${Hexadecimal(startAddr)} [pft] ${Hexadecimal(fallThruAddr)}" + 60*09c6f1ddSLingrui98 p"[tgt] ${Hexadecimal(target)} [ftqIdx] $ftqIdx [jmp] v:${ftqOffset.valid}" + 61*09c6f1ddSLingrui98 p" offset: ${ftqOffset.bits}\n" 62*09c6f1ddSLingrui98 } 63*09c6f1ddSLingrui98} 64*09c6f1ddSLingrui98 65*09c6f1ddSLingrui98class PredecodeWritebackBundle(implicit p:Parameters) extends XSBundle { 66*09c6f1ddSLingrui98 val pc = Vec(PredictWidth, UInt(VAddrBits.W)) 67*09c6f1ddSLingrui98 val pd = Vec(PredictWidth, new PreDecodeInfo) // TODO: redefine Predecode 68*09c6f1ddSLingrui98 val ftqIdx = new FtqPtr 69*09c6f1ddSLingrui98 val ftqOffset = UInt(log2Ceil(PredictWidth).W) 70*09c6f1ddSLingrui98 val misOffset = ValidUndirectioned(UInt(log2Ceil(PredictWidth).W)) 71*09c6f1ddSLingrui98 val cfiOffset = ValidUndirectioned(UInt(log2Ceil(PredictWidth).W)) 72*09c6f1ddSLingrui98 val target = UInt(VAddrBits.W) 73*09c6f1ddSLingrui98 val jalTarget = UInt(VAddrBits.W) 74*09c6f1ddSLingrui98 val instrRange = Vec(PredictWidth, Bool()) 75*09c6f1ddSLingrui98} 76*09c6f1ddSLingrui98 77*09c6f1ddSLingrui98class Exception(implicit p: Parameters) extends XSBundle { 78*09c6f1ddSLingrui98 79*09c6f1ddSLingrui98} 80*09c6f1ddSLingrui98 81*09c6f1ddSLingrui98class FetchToIBuffer(implicit p: Parameters) extends XSBundle { 82*09c6f1ddSLingrui98 val instrs = Vec(PredictWidth, UInt(32.W)) 83*09c6f1ddSLingrui98 val valid = UInt(PredictWidth.W) 84*09c6f1ddSLingrui98 val pd = Vec(PredictWidth, new PreDecodeInfo) 85*09c6f1ddSLingrui98 val pc = Vec(PredictWidth, UInt(VAddrBits.W)) 86*09c6f1ddSLingrui98 val foldpc = Vec(PredictWidth, UInt(MemPredPCWidth.W)) 87*09c6f1ddSLingrui98 //val exception = new Exception 88*09c6f1ddSLingrui98 val ftqPtr = new FtqPtr 89*09c6f1ddSLingrui98 val ftqOffset = Vec(PredictWidth, ValidUndirectioned(UInt(log2Ceil(PredictWidth).W))) 90*09c6f1ddSLingrui98 val ipf = Vec(PredictWidth, Bool()) 91*09c6f1ddSLingrui98 val acf = Vec(PredictWidth, Bool()) 92*09c6f1ddSLingrui98 val crossPageIPFFix = Vec(PredictWidth, Bool()) 93*09c6f1ddSLingrui98} 94*09c6f1ddSLingrui98 95*09c6f1ddSLingrui98// Move from BPU 96*09c6f1ddSLingrui98class GlobalHistory(implicit p: Parameters) extends XSBundle with HasBPUConst { 97*09c6f1ddSLingrui98 val predHist = UInt(HistoryLength.W) 98*09c6f1ddSLingrui98 // def update(sawNTBr: Bool, takenOnBr: Bool, hist: UInt = predHist): GlobalHistory = { 99*09c6f1ddSLingrui98 // val g = Wire(new GlobalHistory) 100*09c6f1ddSLingrui98 // val shifted = takenOnBr || sawNTBr 101*09c6f1ddSLingrui98 // g.predHist := Mux(shifted, (hist << 1) | takenOnBr.asUInt, hist) 102*09c6f1ddSLingrui98 // g 103*09c6f1ddSLingrui98 // } 104*09c6f1ddSLingrui98 105*09c6f1ddSLingrui98 // def update(brValids: UInt, taken_mask: UInt, hist: UInt = predHist): GlobalHistory = { 106*09c6f1ddSLingrui98 // val shift = PopCount(brValids & Mux(taken_mask =/= 0.U, LowerMask(taken_mask), ((1.U<<numBr) - 1.U))) 107*09c6f1ddSLingrui98 // val g = Wire(new GlobalHistory) 108*09c6f1ddSLingrui98 // g.predHist := (hist << shift) | (taken_mask =/= 0.U) 109*09c6f1ddSLingrui98 // g 110*09c6f1ddSLingrui98 // } 111*09c6f1ddSLingrui98 112*09c6f1ddSLingrui98 def update(shift: UInt, taken: Bool, hist: UInt = predHist): GlobalHistory = { 113*09c6f1ddSLingrui98 val g = Wire(new GlobalHistory) 114*09c6f1ddSLingrui98 g.predHist := (hist << shift) | taken 115*09c6f1ddSLingrui98 g 116*09c6f1ddSLingrui98 } 117*09c6f1ddSLingrui98 118*09c6f1ddSLingrui98 final def === (that: GlobalHistory): Bool = { 119*09c6f1ddSLingrui98 predHist === that.predHist 120*09c6f1ddSLingrui98 } 121*09c6f1ddSLingrui98 122*09c6f1ddSLingrui98 final def =/= (that: GlobalHistory): Bool = !(this === that) 123*09c6f1ddSLingrui98 124*09c6f1ddSLingrui98 implicit val name = "IFU" 125*09c6f1ddSLingrui98 def debug(where: String) = XSDebug(p"[${where}_GlobalHistory] hist=${Binary(predHist)}\n") 126*09c6f1ddSLingrui98 // override def toString(): String = "histPtr=%d, sawNTBr=%d, takenOnBr=%d, saveHalfRVI=%d".format(histPtr, sawNTBr, takenOnBr, saveHalfRVI) 127*09c6f1ddSLingrui98} 128*09c6f1ddSLingrui98 129*09c6f1ddSLingrui98class TableAddr(val idxBits: Int, val banks: Int)(implicit p: Parameters) extends XSBundle{ 130*09c6f1ddSLingrui98 def tagBits = VAddrBits - idxBits - instOffsetBits 131*09c6f1ddSLingrui98 132*09c6f1ddSLingrui98 val tag = UInt(tagBits.W) 133*09c6f1ddSLingrui98 val idx = UInt(idxBits.W) 134*09c6f1ddSLingrui98 val offset = UInt(instOffsetBits.W) 135*09c6f1ddSLingrui98 136*09c6f1ddSLingrui98 def fromUInt(x: UInt) = x.asTypeOf(UInt(VAddrBits.W)).asTypeOf(this) 137*09c6f1ddSLingrui98 def getTag(x: UInt) = fromUInt(x).tag 138*09c6f1ddSLingrui98 def getIdx(x: UInt) = fromUInt(x).idx 139*09c6f1ddSLingrui98 def getBank(x: UInt) = if (banks > 1) getIdx(x)(log2Up(banks) - 1, 0) else 0.U 140*09c6f1ddSLingrui98 def getBankIdx(x: UInt) = if (banks > 1) getIdx(x)(idxBits - 1, log2Up(banks)) else getIdx(x) 141*09c6f1ddSLingrui98} 142*09c6f1ddSLingrui98class BranchPrediction(implicit p: Parameters) extends XSBundle with HasBPUConst { 143*09c6f1ddSLingrui98 val taken_mask = Vec(numBr, Bool()) 144*09c6f1ddSLingrui98 145*09c6f1ddSLingrui98 val br_valids = Vec(numBr, Bool()) 146*09c6f1ddSLingrui98 val br_targets = Vec(numBr, UInt(VAddrBits.W)) 147*09c6f1ddSLingrui98 148*09c6f1ddSLingrui98 val jmp_valid = Bool() 149*09c6f1ddSLingrui98 val jmp_target = UInt(VAddrBits.W) 150*09c6f1ddSLingrui98 151*09c6f1ddSLingrui98 val is_jal = Bool() 152*09c6f1ddSLingrui98 val is_jalr = Bool() 153*09c6f1ddSLingrui98 val is_call = Bool() 154*09c6f1ddSLingrui98 val is_ret = Bool() 155*09c6f1ddSLingrui98 156*09c6f1ddSLingrui98 // val call_is_rvc = Bool() 157*09c6f1ddSLingrui98 val hit = Bool() 158*09c6f1ddSLingrui98 159*09c6f1ddSLingrui98 def taken = taken_mask.reduce(_||_) // || (is_jal || is_jalr) 160*09c6f1ddSLingrui98 161*09c6f1ddSLingrui98 def fromFtbEntry(entry: FTBEntry, pc: UInt) = { 162*09c6f1ddSLingrui98 br_valids := entry.brValids 163*09c6f1ddSLingrui98 br_targets := entry.getBrTargets(pc) 164*09c6f1ddSLingrui98 jmp_valid := entry.jmpValid 165*09c6f1ddSLingrui98 jmp_target := entry.getJmpTarget(pc) 166*09c6f1ddSLingrui98 is_jal := entry.jmpValid && entry.isJal 167*09c6f1ddSLingrui98 is_jalr := entry.jmpValid && entry.isJalr 168*09c6f1ddSLingrui98 is_call := entry.jmpValid && entry.isCall 169*09c6f1ddSLingrui98 is_ret := entry.jmpValid && entry.isRet 170*09c6f1ddSLingrui98 } 171*09c6f1ddSLingrui98 // override def toPrintable: Printable = { 172*09c6f1ddSLingrui98 // p"-----------BranchPrediction----------- " + 173*09c6f1ddSLingrui98 // p"[taken_mask] ${Binary(taken_mask.asUInt)} " + 174*09c6f1ddSLingrui98 // p"[is_br] ${Binary(is_br.asUInt)}, [is_jal] ${Binary(is_jal.asUInt)} " + 175*09c6f1ddSLingrui98 // p"[is_jalr] ${Binary(is_jalr.asUInt)}, [is_call] ${Binary(is_call.asUInt)}, [is_ret] ${Binary(is_ret.asUInt)} " + 176*09c6f1ddSLingrui98 // p"[target] ${Hexadecimal(target)}}, [hit] $hit " 177*09c6f1ddSLingrui98 // } 178*09c6f1ddSLingrui98 179*09c6f1ddSLingrui98 def display(cond: Bool): Unit = { 180*09c6f1ddSLingrui98 XSDebug(cond, p"[taken_mask] ${Binary(taken_mask.asUInt)} [hit] $hit\n") 181*09c6f1ddSLingrui98 } 182*09c6f1ddSLingrui98} 183*09c6f1ddSLingrui98 184*09c6f1ddSLingrui98class BranchPredictionBundle(implicit p: Parameters) extends XSBundle with HasBPUConst with BPUUtils{ 185*09c6f1ddSLingrui98 val pc = UInt(VAddrBits.W) 186*09c6f1ddSLingrui98 187*09c6f1ddSLingrui98 val valid = Bool() 188*09c6f1ddSLingrui98 189*09c6f1ddSLingrui98 val hasRedirect = Bool() 190*09c6f1ddSLingrui98 val ftq_idx = new FtqPtr 191*09c6f1ddSLingrui98 // val hit = Bool() 192*09c6f1ddSLingrui98 val preds = new BranchPrediction 193*09c6f1ddSLingrui98 194*09c6f1ddSLingrui98 val ghist = new GlobalHistory() 195*09c6f1ddSLingrui98 val phist = UInt(PathHistoryLength.W) 196*09c6f1ddSLingrui98 val rasSp = UInt(log2Ceil(RasSize).W) 197*09c6f1ddSLingrui98 val rasTop = new RASEntry 198*09c6f1ddSLingrui98 val specCnt = Vec(numBr, UInt(10.W)) 199*09c6f1ddSLingrui98 // val meta = UInt(MaxMetaLength.W) 200*09c6f1ddSLingrui98 201*09c6f1ddSLingrui98 val ftb_entry = new FTBEntry() // TODO: Send this entry to ftq 202*09c6f1ddSLingrui98 203*09c6f1ddSLingrui98 def real_taken_mask(): Vec[Bool] = { 204*09c6f1ddSLingrui98 Mux(preds.hit, 205*09c6f1ddSLingrui98 VecInit(preds.taken_mask.zip(preds.br_valids).map{ case(m, b) => m && b } :+ preds.jmp_valid), 206*09c6f1ddSLingrui98 VecInit(Seq.fill(numBr+1)(false.B))) 207*09c6f1ddSLingrui98 } 208*09c6f1ddSLingrui98 209*09c6f1ddSLingrui98 def real_br_taken_mask(): Vec[Bool] = { 210*09c6f1ddSLingrui98 Mux(preds.hit, 211*09c6f1ddSLingrui98 VecInit(preds.taken_mask.zip(preds.br_valids).map{ case(m, b) => m && b }), 212*09c6f1ddSLingrui98 VecInit(Seq.fill(numBr)(false.B))) 213*09c6f1ddSLingrui98 } 214*09c6f1ddSLingrui98 def hit_taken_on_call = !VecInit(real_taken_mask.take(numBr)).asUInt.orR && preds.hit && preds.is_call && preds.jmp_valid 215*09c6f1ddSLingrui98 def hit_taken_on_ret = !VecInit(real_taken_mask.take(numBr)).asUInt.orR && preds.hit && preds.is_ret && preds.jmp_valid 216*09c6f1ddSLingrui98 217*09c6f1ddSLingrui98 def fallThroughAddr = getFallThroughAddr(pc, ftb_entry.carry, ftb_entry.pftAddr) 218*09c6f1ddSLingrui98 def target(): UInt = { 219*09c6f1ddSLingrui98 Mux(preds.hit, 220*09c6f1ddSLingrui98 // when hit 221*09c6f1ddSLingrui98 Mux((real_taken_mask.asUInt & preds.br_valids.asUInt) =/= 0.U, 222*09c6f1ddSLingrui98 PriorityMux(real_taken_mask.asUInt & preds.br_valids.asUInt, preds.br_targets), 223*09c6f1ddSLingrui98 Mux(preds.jmp_valid, preds.jmp_target, fallThroughAddr)), 224*09c6f1ddSLingrui98 //otherwise 225*09c6f1ddSLingrui98 pc + (FetchWidth*4).U 226*09c6f1ddSLingrui98 ) 227*09c6f1ddSLingrui98 } 228*09c6f1ddSLingrui98 def genCfiIndex = { 229*09c6f1ddSLingrui98 val cfiIndex = Wire(ValidUndirectioned(UInt(log2Ceil(PredictWidth).W))) 230*09c6f1ddSLingrui98 cfiIndex.valid := real_taken_mask.asUInt.orR 231*09c6f1ddSLingrui98 // when no takens, set cfiIndex to PredictWidth-1 232*09c6f1ddSLingrui98 cfiIndex.bits := 233*09c6f1ddSLingrui98 ParallelPriorityMux(real_taken_mask, ftb_entry.getOffsetVec) | 234*09c6f1ddSLingrui98 Fill(log2Ceil(PredictWidth), (!real_taken_mask.asUInt.orR).asUInt) 235*09c6f1ddSLingrui98 cfiIndex 236*09c6f1ddSLingrui98 } 237*09c6f1ddSLingrui98 238*09c6f1ddSLingrui98 239*09c6f1ddSLingrui98 // override def toPrintable: Printable = { 240*09c6f1ddSLingrui98 // p"-----------BranchPredictionBundle----------- " + 241*09c6f1ddSLingrui98 // p"[pc] ${Hexadecimal(pc)} " + 242*09c6f1ddSLingrui98 // p"[ghist] ${Binary(ghist.predHist)} " + 243*09c6f1ddSLingrui98 // preds.toPrintable + 244*09c6f1ddSLingrui98 // ftb_entry.toPrintable 245*09c6f1ddSLingrui98 // } 246*09c6f1ddSLingrui98 247*09c6f1ddSLingrui98 def display(cond: Bool): Unit = { 248*09c6f1ddSLingrui98 XSDebug(cond, p"[pc] ${Hexadecimal(pc)}\n") 249*09c6f1ddSLingrui98 XSDebug(cond, p"[ghist] ${Binary(ghist.predHist)}\n") 250*09c6f1ddSLingrui98 preds.display(cond) 251*09c6f1ddSLingrui98 ftb_entry.display(cond) 252*09c6f1ddSLingrui98 } 253*09c6f1ddSLingrui98} 254*09c6f1ddSLingrui98 255*09c6f1ddSLingrui98class BranchPredictionResp(implicit p: Parameters) extends XSBundle with HasBPUConst { 256*09c6f1ddSLingrui98 // val valids = Vec(3, Bool()) 257*09c6f1ddSLingrui98 val s1 = new BranchPredictionBundle() 258*09c6f1ddSLingrui98 val s2 = new BranchPredictionBundle() 259*09c6f1ddSLingrui98 val s3 = new BranchPredictionBundle() 260*09c6f1ddSLingrui98 261*09c6f1ddSLingrui98 def selectedResp = 262*09c6f1ddSLingrui98 PriorityMux(Seq( 263*09c6f1ddSLingrui98 ((s3.valid && s3.hasRedirect) -> s3), 264*09c6f1ddSLingrui98 ((s2.valid && s2.hasRedirect) -> s2), 265*09c6f1ddSLingrui98 (s1.valid -> s1) 266*09c6f1ddSLingrui98 )) 267*09c6f1ddSLingrui98 def selectedRespIdx = 268*09c6f1ddSLingrui98 PriorityMux(Seq( 269*09c6f1ddSLingrui98 ((s3.valid && s3.hasRedirect) -> BP_S3), 270*09c6f1ddSLingrui98 ((s2.valid && s2.hasRedirect) -> BP_S2), 271*09c6f1ddSLingrui98 (s1.valid -> BP_S1) 272*09c6f1ddSLingrui98 )) 273*09c6f1ddSLingrui98 def lastStage = s3 274*09c6f1ddSLingrui98} 275*09c6f1ddSLingrui98 276*09c6f1ddSLingrui98class BpuToFtqBundle(implicit p: Parameters) extends BranchPredictionResp with HasBPUConst { 277*09c6f1ddSLingrui98 val meta = UInt(MaxMetaLength.W) 278*09c6f1ddSLingrui98} 279*09c6f1ddSLingrui98 280*09c6f1ddSLingrui98object BpuToFtqBundle { 281*09c6f1ddSLingrui98 def apply(resp: BranchPredictionResp)(implicit p: Parameters): BpuToFtqBundle = { 282*09c6f1ddSLingrui98 val e = Wire(new BpuToFtqBundle()) 283*09c6f1ddSLingrui98 e.s1 := resp.s1 284*09c6f1ddSLingrui98 e.s2 := resp.s2 285*09c6f1ddSLingrui98 e.s3 := resp.s3 286*09c6f1ddSLingrui98 287*09c6f1ddSLingrui98 e.meta := DontCare 288*09c6f1ddSLingrui98 e 289*09c6f1ddSLingrui98 } 290*09c6f1ddSLingrui98} 291*09c6f1ddSLingrui98 292*09c6f1ddSLingrui98class BranchPredictionUpdate(implicit p: Parameters) extends BranchPredictionBundle with HasBPUConst { 293*09c6f1ddSLingrui98 val mispred_mask = Vec(numBr+1, Bool()) 294*09c6f1ddSLingrui98 val false_hit = Bool() 295*09c6f1ddSLingrui98 val new_br_insert_pos = Vec(numBr, Bool()) 296*09c6f1ddSLingrui98 val old_entry = Bool() 297*09c6f1ddSLingrui98 val meta = UInt(MaxMetaLength.W) 298*09c6f1ddSLingrui98 // val ghist = new GlobalHistory() This in spec_meta 299*09c6f1ddSLingrui98 300*09c6f1ddSLingrui98 def fromFtqRedirectSram(entry: Ftq_Redirect_SRAMEntry) = { 301*09c6f1ddSLingrui98 ghist := entry.ghist 302*09c6f1ddSLingrui98 phist := entry.phist 303*09c6f1ddSLingrui98 rasSp := entry.rasSp 304*09c6f1ddSLingrui98 rasTop := entry.rasEntry 305*09c6f1ddSLingrui98 specCnt := entry.specCnt 306*09c6f1ddSLingrui98 this 307*09c6f1ddSLingrui98 } 308*09c6f1ddSLingrui98 // override def toPrintable: Printable = { 309*09c6f1ddSLingrui98 // p"-----------BranchPredictionUpdate----------- " + 310*09c6f1ddSLingrui98 // p"[mispred_mask] ${Binary(mispred_mask.asUInt)} [false_hit] ${Binary(false_hit)} " + 311*09c6f1ddSLingrui98 // p"[new_br_insert_pos] ${Binary(new_br_insert_pos.asUInt)} " + 312*09c6f1ddSLingrui98 // super.toPrintable + 313*09c6f1ddSLingrui98 // p"\n" 314*09c6f1ddSLingrui98 // } 315*09c6f1ddSLingrui98 316*09c6f1ddSLingrui98 override def display(cond: Bool) { 317*09c6f1ddSLingrui98 XSDebug(cond, p"-----------BranchPredictionUpdate-----------\n") 318*09c6f1ddSLingrui98 XSDebug(cond, p"[mispred_mask] ${Binary(mispred_mask.asUInt)} [false_hit] $false_hit\n") 319*09c6f1ddSLingrui98 XSDebug(cond, p"[new_br_insert_pos] ${Binary(new_br_insert_pos.asUInt)}\n") 320*09c6f1ddSLingrui98 super.display(cond) 321*09c6f1ddSLingrui98 XSDebug(cond, p"--------------------------------------------\n") 322*09c6f1ddSLingrui98 } 323*09c6f1ddSLingrui98} 324*09c6f1ddSLingrui98 325*09c6f1ddSLingrui98class BranchPredictionRedirect(implicit p: Parameters) extends Redirect with HasBPUConst { 326*09c6f1ddSLingrui98 // override def toPrintable: Printable = { 327*09c6f1ddSLingrui98 // p"-----------BranchPredictionRedirect----------- " + 328*09c6f1ddSLingrui98 // p"-----------cfiUpdate----------- " + 329*09c6f1ddSLingrui98 // p"[pc] ${Hexadecimal(cfiUpdate.pc)} " + 330*09c6f1ddSLingrui98 // p"[predTaken] ${cfiUpdate.predTaken}, [taken] ${cfiUpdate.taken}, [isMisPred] ${cfiUpdate.isMisPred} " + 331*09c6f1ddSLingrui98 // p"[target] ${Hexadecimal(cfiUpdate.target)} " + 332*09c6f1ddSLingrui98 // p"------------------------------- " + 333*09c6f1ddSLingrui98 // p"[roqPtr] f=${roqIdx.flag} v=${roqIdx.value} " + 334*09c6f1ddSLingrui98 // p"[ftqPtr] f=${ftqIdx.flag} v=${ftqIdx.value} " + 335*09c6f1ddSLingrui98 // p"[ftqOffset] ${ftqOffset} " + 336*09c6f1ddSLingrui98 // p"[level] ${level}, [interrupt] ${interrupt} " + 337*09c6f1ddSLingrui98 // p"[stFtqIdx] f=${stFtqIdx.flag} v=${stFtqIdx.value} " + 338*09c6f1ddSLingrui98 // p"[stFtqOffset] ${stFtqOffset} " + 339*09c6f1ddSLingrui98 // p"\n" 340*09c6f1ddSLingrui98 341*09c6f1ddSLingrui98 // } 342*09c6f1ddSLingrui98 343*09c6f1ddSLingrui98 def display(cond: Bool): Unit = { 344*09c6f1ddSLingrui98 XSDebug(cond, p"-----------BranchPredictionRedirect----------- \n") 345*09c6f1ddSLingrui98 XSDebug(cond, p"-----------cfiUpdate----------- \n") 346*09c6f1ddSLingrui98 XSDebug(cond, p"[pc] ${Hexadecimal(cfiUpdate.pc)}\n") 347*09c6f1ddSLingrui98 XSDebug(cond, p"[hist] ${Binary(cfiUpdate.hist.predHist)}\n") 348*09c6f1ddSLingrui98 XSDebug(cond, p"[br_hit] ${cfiUpdate.br_hit} [isMisPred] ${cfiUpdate.isMisPred}\n") 349*09c6f1ddSLingrui98 XSDebug(cond, p"[pred_taken] ${cfiUpdate.predTaken} [taken] ${cfiUpdate.taken} [isMisPred] ${cfiUpdate.isMisPred}\n") 350*09c6f1ddSLingrui98 XSDebug(cond, p"[target] ${Hexadecimal(cfiUpdate.target)} \n") 351*09c6f1ddSLingrui98 XSDebug(cond, p"[shift] ${cfiUpdate.shift}\n") 352*09c6f1ddSLingrui98 XSDebug(cond, p"------------------------------- \n") 353*09c6f1ddSLingrui98 XSDebug(cond, p"[roqPtr] f=${roqIdx.flag} v=${roqIdx.value}\n") 354*09c6f1ddSLingrui98 XSDebug(cond, p"[ftqPtr] f=${ftqIdx.flag} v=${ftqIdx.value} \n") 355*09c6f1ddSLingrui98 XSDebug(cond, p"[ftqOffset] ${ftqOffset} \n") 356*09c6f1ddSLingrui98 XSDebug(cond, p"[stFtqIdx] f=${stFtqIdx.flag} v=${stFtqIdx.value}\n") 357*09c6f1ddSLingrui98 XSDebug(cond, p"[stFtqOffset] ${stFtqOffset}\n") 358*09c6f1ddSLingrui98 XSDebug(cond, p"---------------------------------------------- \n") 359*09c6f1ddSLingrui98 } 360*09c6f1ddSLingrui98} 361