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*09c6f1ddSLingrui98 17*09c6f1ddSLingrui98package xiangshan.frontend 18*09c6f1ddSLingrui98import utils._ 19*09c6f1ddSLingrui98import chisel3._ 20*09c6f1ddSLingrui98import chisel3.util._ 21*09c6f1ddSLingrui98import chipsalliance.rocketchip.config.Parameters 22*09c6f1ddSLingrui98import freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 23*09c6f1ddSLingrui98import xiangshan._ 24*09c6f1ddSLingrui98import xiangshan.cache._ 25*09c6f1ddSLingrui98import xiangshan.cache.prefetch.L1plusPrefetcher 26*09c6f1ddSLingrui98import xiangshan.cache.mmu.{TlbRequestIO, TlbPtwIO,TLB} 27*09c6f1ddSLingrui98import xiangshan.backend.fu.HasExceptionNO 28*09c6f1ddSLingrui98import system.L1CacheErrorInfo 29*09c6f1ddSLingrui98 30*09c6f1ddSLingrui98 31*09c6f1ddSLingrui98class Frontend()(implicit p: Parameters) extends LazyModule with HasXSParameter{ 32*09c6f1ddSLingrui98 33*09c6f1ddSLingrui98 val instrUncache = LazyModule(new InstrUncache()) 34*09c6f1ddSLingrui98 val icache = LazyModule(new ICache()) 35*09c6f1ddSLingrui98 36*09c6f1ddSLingrui98 lazy val module = new FrontendImp(this) 37*09c6f1ddSLingrui98} 38*09c6f1ddSLingrui98 39*09c6f1ddSLingrui98 40*09c6f1ddSLingrui98class FrontendImp (outer: Frontend) extends LazyModuleImp(outer) 41*09c6f1ddSLingrui98 with HasL1plusCacheParameters 42*09c6f1ddSLingrui98 with HasXSParameter 43*09c6f1ddSLingrui98 with HasExceptionNO 44*09c6f1ddSLingrui98{ 45*09c6f1ddSLingrui98 val io = IO(new Bundle() { 46*09c6f1ddSLingrui98 val fencei = Input(Bool()) 47*09c6f1ddSLingrui98 val ptw = new TlbPtwIO(2) 48*09c6f1ddSLingrui98 val backend = new FrontendToCtrlIO 49*09c6f1ddSLingrui98 val sfence = Input(new SfenceBundle) 50*09c6f1ddSLingrui98 val tlbCsr = Input(new TlbCsrBundle) 51*09c6f1ddSLingrui98 val csrCtrl = Input(new CustomCSRCtrlIO) 52*09c6f1ddSLingrui98 val error = new L1CacheErrorInfo 53*09c6f1ddSLingrui98 val frontendInfo = new Bundle { 54*09c6f1ddSLingrui98 val ibufFull = Output(Bool()) 55*09c6f1ddSLingrui98 val bpuInfo = new Bundle { 56*09c6f1ddSLingrui98 val bpRight = Output(UInt(XLEN.W)) 57*09c6f1ddSLingrui98 val bpWrong = Output(UInt(XLEN.W)) 58*09c6f1ddSLingrui98 } 59*09c6f1ddSLingrui98 } 60*09c6f1ddSLingrui98 }) 61*09c6f1ddSLingrui98 62*09c6f1ddSLingrui98 //decouped-frontend modules 63*09c6f1ddSLingrui98 val bpu = Module(new Predictor) 64*09c6f1ddSLingrui98 val ifu = Module(new NewIFU) 65*09c6f1ddSLingrui98 val ibuffer = Module(new Ibuffer) 66*09c6f1ddSLingrui98 val ftq = Module(new Ftq) 67*09c6f1ddSLingrui98 //icache 68*09c6f1ddSLingrui98 69*09c6f1ddSLingrui98 io.ptw <> TLB( 70*09c6f1ddSLingrui98 in = Seq(ifu.io.iTLBInter(0), ifu.io.iTLBInter(1)), 71*09c6f1ddSLingrui98 sfence = io.sfence, 72*09c6f1ddSLingrui98 csr = io.tlbCsr, 73*09c6f1ddSLingrui98 width = 2, 74*09c6f1ddSLingrui98 isDtlb = false, 75*09c6f1ddSLingrui98 shouldBlock = true 76*09c6f1ddSLingrui98 ) 77*09c6f1ddSLingrui98 //TODO: modules need to be removed 78*09c6f1ddSLingrui98 val instrUncache = outer.instrUncache.module 79*09c6f1ddSLingrui98 val icache = outer.icache.module 80*09c6f1ddSLingrui98 81*09c6f1ddSLingrui98 val needFlush = io.backend.toFtq.stage3Redirect.valid 82*09c6f1ddSLingrui98 83*09c6f1ddSLingrui98 //IFU-Ftq 84*09c6f1ddSLingrui98 ifu.io.ftqInter.fromFtq <> ftq.io.toIfu 85*09c6f1ddSLingrui98 ftq.io.fromIfu <> ifu.io.ftqInter.toFtq 86*09c6f1ddSLingrui98 bpu.io.ftq_to_bpu <> ftq.io.toBpu 87*09c6f1ddSLingrui98 ftq.io.fromBpu <> bpu.io.bpu_to_ftq 88*09c6f1ddSLingrui98 //IFU-ICache 89*09c6f1ddSLingrui98 ifu.io.icacheInter.toIMeta <> icache.io.metaRead.req 90*09c6f1ddSLingrui98 ifu.io.icacheInter.fromIMeta <> icache.io.metaRead.resp 91*09c6f1ddSLingrui98 ifu.io.icacheInter.toIData <> icache.io.dataRead.req 92*09c6f1ddSLingrui98 ifu.io.icacheInter.fromIData <> icache.io.dataRead.resp 93*09c6f1ddSLingrui98 94*09c6f1ddSLingrui98 for(i <- 0 until 2){ 95*09c6f1ddSLingrui98 ifu.io.icacheInter.toMissQueue(i) <> icache.io.missQueue.req(i) 96*09c6f1ddSLingrui98 ifu.io.icacheInter.fromMissQueue(i) <> icache.io.missQueue.resp(i) 97*09c6f1ddSLingrui98 } 98*09c6f1ddSLingrui98 99*09c6f1ddSLingrui98 icache.io.missQueue.flush := ifu.io.ftqInter.fromFtq.redirect.valid || (ifu.io.ftqInter.toFtq.pdWb.valid && ifu.io.ftqInter.toFtq.pdWb.bits.misOffset.valid) 100*09c6f1ddSLingrui98 101*09c6f1ddSLingrui98 //IFU-Ibuffer 102*09c6f1ddSLingrui98 ifu.io.toIbuffer <> ibuffer.io.in 103*09c6f1ddSLingrui98 104*09c6f1ddSLingrui98 ftq.io.fromBackend <> io.backend.toFtq 105*09c6f1ddSLingrui98 io.backend.fromFtq <> ftq.io.toBackend 106*09c6f1ddSLingrui98 io.frontendInfo.bpuInfo <> ftq.io.bpuInfo 107*09c6f1ddSLingrui98 108*09c6f1ddSLingrui98 ibuffer.io.flush := needFlush 109*09c6f1ddSLingrui98 io.backend.cfVec <> ibuffer.io.out 110*09c6f1ddSLingrui98 111*09c6f1ddSLingrui98 instrUncache.io.req <> DontCare 112*09c6f1ddSLingrui98 instrUncache.io.resp <> DontCare 113*09c6f1ddSLingrui98 instrUncache.io.flush <> DontCare 114*09c6f1ddSLingrui98 io.error <> DontCare 115*09c6f1ddSLingrui98 116*09c6f1ddSLingrui98 val frontendBubble = PopCount((0 until DecodeWidth).map(i => io.backend.cfVec(i).ready && !ibuffer.io.out(i).valid)) 117*09c6f1ddSLingrui98 XSPerfAccumulate("FrontendBubble", frontendBubble) 118*09c6f1ddSLingrui98 119*09c6f1ddSLingrui98 io.frontendInfo.ibufFull := RegNext(ibuffer.io.full) 120*09c6f1ddSLingrui98} 121