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***************************************************************************************/ 16*adc0b8dfSGuokai Chen/* 1709c6f1ddSLingrui98package xiangshan.frontend 1809c6f1ddSLingrui98 1909c6f1ddSLingrui98import chipsalliance.rocketchip.config.Parameters 2009c6f1ddSLingrui98import chisel3._ 2109c6f1ddSLingrui98import chisel3.util._ 2209c6f1ddSLingrui98import xiangshan._ 2309c6f1ddSLingrui98import utils._ 243c02ee8fSwakafaimport utility._ 2509c6f1ddSLingrui98import chisel3.experimental.chiselName 2609c6f1ddSLingrui98 2709c6f1ddSLingrui98trait BimParams extends HasXSParameter { 2809c6f1ddSLingrui98 val bimSize = 2048 2909c6f1ddSLingrui98 val bypassEntries = 4 3009c6f1ddSLingrui98} 3109c6f1ddSLingrui98 3209c6f1ddSLingrui98@chiselName 3309c6f1ddSLingrui98class BIM(implicit p: Parameters) extends BasePredictor with BimParams with BPUUtils { 3409c6f1ddSLingrui98 val bimAddr = new TableAddr(log2Up(bimSize), 1) 3509c6f1ddSLingrui98 3609c6f1ddSLingrui98 val bim = Module(new SRAMTemplate(UInt(2.W), set = bimSize, way=numBr, shouldReset = false, holdRead = true)) 3709c6f1ddSLingrui98 3809c6f1ddSLingrui98 val doing_reset = RegInit(true.B) 3909c6f1ddSLingrui98 val resetRow = RegInit(0.U(log2Ceil(bimSize).W)) 4009c6f1ddSLingrui98 resetRow := resetRow + doing_reset 4109c6f1ddSLingrui98 when (resetRow === (bimSize-1).U) { doing_reset := false.B } 4209c6f1ddSLingrui98 43*adc0b8dfSGuokai Chen val s0_idx = bimAddr.getIdx(s0_pc_dup(0)) 4409c6f1ddSLingrui98 454dec0a5eSLingrui98 // bim.io.r.req.valid := io.s0_fire 464dec0a5eSLingrui98 bim.io.r.req.valid := false.B 4709c6f1ddSLingrui98 bim.io.r.req.bits.setIdx := s0_idx 4809c6f1ddSLingrui98 4909c6f1ddSLingrui98 io.in.ready := bim.io.r.req.ready 5009c6f1ddSLingrui98 io.s1_ready := bim.io.r.req.ready 5109c6f1ddSLingrui98 5209c6f1ddSLingrui98 val s1_read = bim.io.r.resp.data 5309c6f1ddSLingrui98 54c2d1ec7dSLingrui98 io.out := io.in.bits.resp_in(0) 5509c6f1ddSLingrui98 5609c6f1ddSLingrui98 val s1_latch_taken_mask = VecInit(Cat((0 until numBr reverse).map(i => s1_read(i)(1))).asBools()) 5709c6f1ddSLingrui98 val s1_latch_meta = s1_read.asUInt() 5809c6f1ddSLingrui98 override val meta_size = s1_latch_meta.getWidth 5909c6f1ddSLingrui98 60c2d1ec7dSLingrui98 // io.out.s1.full_pred.br_taken_mask := s1_latch_taken_mask 61c2d1ec7dSLingrui98 // io.out.s2.full_pred.br_taken_mask := RegEnable(s1_latch_taken_mask, 0.U.asTypeOf(Vec(numBr, Bool())), io.s1_fire) 6209c6f1ddSLingrui98 63*adc0b8dfSGuokai Chen io.out.last_stage_meta := RegEnable(RegEnable(s1_latch_meta, io.s1_fire(0)), io.s2_fire(0)) // TODO: configurable with total-stages 6409c6f1ddSLingrui98 6509c6f1ddSLingrui98 // Update logic 6609c6f1ddSLingrui98 val u_valid = RegNext(io.update.valid) 6709c6f1ddSLingrui98 val update = RegNext(io.update.bits) 6809c6f1ddSLingrui98 val u_idx = bimAddr.getIdx(update.pc) 6909c6f1ddSLingrui98 70803124a6SLingrui98 val update_mask = LowerMask(PriorityEncoderOH(update.br_taken_mask.asUInt)) 71569b279fSLingrui98 val newCtrs = Wire(Vec(numBr, UInt(2.W))) 72569b279fSLingrui98 val need_to_update = VecInit((0 until numBr).map(i => u_valid && update.ftb_entry.brValids(i) && update_mask(i))) 73569b279fSLingrui98 74569b279fSLingrui98 7509c6f1ddSLingrui98 // Bypass logic 76569b279fSLingrui98 val wrbypass = Module(new WrBypass(UInt(2.W), bypassEntries, log2Up(bimSize), numWays = numBr)) 77569b279fSLingrui98 wrbypass.io.wen := need_to_update.reduce(_||_) 78569b279fSLingrui98 wrbypass.io.write_idx := u_idx 79569b279fSLingrui98 wrbypass.io.write_data := newCtrs 80569b279fSLingrui98 wrbypass.io.write_way_mask.map(_ := need_to_update) 8109c6f1ddSLingrui98 82569b279fSLingrui98 val oldCtrs = 83569b279fSLingrui98 VecInit((0 until numBr).map(i => 84569b279fSLingrui98 Mux(wrbypass.io.hit && wrbypass.io.hit_data(i).valid, 85569b279fSLingrui98 wrbypass.io.hit_data(i).bits, 86569b279fSLingrui98 update.meta(2*i+1, 2*i)) 87569b279fSLingrui98 )) 8809c6f1ddSLingrui98 89803124a6SLingrui98 val newTakens = update.br_taken_mask 90569b279fSLingrui98 newCtrs := VecInit((0 until numBr).map(i => 9109c6f1ddSLingrui98 satUpdate(oldCtrs(i), 2, newTakens(i)) 9209c6f1ddSLingrui98 )) 9309c6f1ddSLingrui98 9409c6f1ddSLingrui98 9509c6f1ddSLingrui98 bim.io.w.apply( 964dec0a5eSLingrui98 valid = false.B, 974dec0a5eSLingrui98 // valid = need_to_update.asUInt.orR || doing_reset, 9809c6f1ddSLingrui98 data = Mux(doing_reset, VecInit(Seq.fill(numBr)(2.U(2.W))), newCtrs), 9909c6f1ddSLingrui98 setIdx = Mux(doing_reset, resetRow, u_idx), 10009c6f1ddSLingrui98 waymask = Mux(doing_reset, Fill(numBr, 1.U(1.W)).asUInt(), need_to_update.asUInt()) 10109c6f1ddSLingrui98 ) 10209c6f1ddSLingrui98 10309c6f1ddSLingrui98 val latch_s0_fire = RegNext(io.s0_fire) 10409c6f1ddSLingrui98 10509c6f1ddSLingrui98 XSDebug(doing_reset, "Doing reset...\n") 10609c6f1ddSLingrui98 107*adc0b8dfSGuokai Chen XSDebug(io.s0_fire, "req_pc=%x, req_idx=%d\n", s0_pc_dup(0), s0_idx) 10809c6f1ddSLingrui98 10909c6f1ddSLingrui98 for(i <- 0 until numBr) { 11009c6f1ddSLingrui98 XSDebug(latch_s0_fire, "last_cycle req %d: ctr=%b\n", i.U, s1_read(i)) 11109c6f1ddSLingrui98 } 11209c6f1ddSLingrui98 11309c6f1ddSLingrui98 XSDebug(u_valid, "update_pc=%x, update_idx=%d, is_br=%b\n", update.pc, u_idx, update.ftb_entry.brValids.asUInt) 11409c6f1ddSLingrui98 11509c6f1ddSLingrui98 XSDebug(u_valid, "newTakens=%b\n", newTakens.asUInt) 11609c6f1ddSLingrui98 11709c6f1ddSLingrui98 for(i <- 0 until numBr) { 11809c6f1ddSLingrui98 XSDebug(u_valid, "oldCtrs%d=%b\n", i.U, oldCtrs(i)) 11909c6f1ddSLingrui98 } 12009c6f1ddSLingrui98 12109c6f1ddSLingrui98 for(i <- 0 until numBr) { 12209c6f1ddSLingrui98 XSDebug(u_valid, "newCtrs%d=%b\n", i.U, newCtrs(i)) 12309c6f1ddSLingrui98 } 12409c6f1ddSLingrui98 12509c6f1ddSLingrui98} 126*adc0b8dfSGuokai Chen*/