1*780712aaSxiaofeibao-xjtu/*************************************************************************************** 2*780712aaSxiaofeibao-xjtu * Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences 3*780712aaSxiaofeibao-xjtu * Copyright (c) 2020-2021 Peng Cheng Laboratory 4*780712aaSxiaofeibao-xjtu * 5*780712aaSxiaofeibao-xjtu * XiangShan is licensed under Mulan PSL v2. 6*780712aaSxiaofeibao-xjtu * You can use this software according to the terms and conditions of the Mulan PSL v2. 7*780712aaSxiaofeibao-xjtu * You may obtain a copy of Mulan PSL v2 at: 8*780712aaSxiaofeibao-xjtu * http://license.coscl.org.cn/MulanPSL2 9*780712aaSxiaofeibao-xjtu * 10*780712aaSxiaofeibao-xjtu * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 11*780712aaSxiaofeibao-xjtu * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 12*780712aaSxiaofeibao-xjtu * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 13*780712aaSxiaofeibao-xjtu * 14*780712aaSxiaofeibao-xjtu * See the Mulan PSL v2 for more details. 15*780712aaSxiaofeibao-xjtu ***************************************************************************************/ 16*780712aaSxiaofeibao-xjtu 17*780712aaSxiaofeibao-xjtupackage xiangshan.backend.rob 18*780712aaSxiaofeibao-xjtu 19*780712aaSxiaofeibao-xjtuimport org.chipsalliance.cde.config.Parameters 20*780712aaSxiaofeibao-xjtuimport chisel3._ 21*780712aaSxiaofeibao-xjtuimport chisel3.util._ 22*780712aaSxiaofeibao-xjtuimport difftest._ 23*780712aaSxiaofeibao-xjtuimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 24*780712aaSxiaofeibao-xjtuimport utility._ 25*780712aaSxiaofeibao-xjtuimport utils._ 26*780712aaSxiaofeibao-xjtuimport xiangshan._ 27*780712aaSxiaofeibao-xjtuimport xiangshan.backend.BackendParams 28*780712aaSxiaofeibao-xjtuimport xiangshan.backend.Bundles.{DynInst, ExceptionInfo, ExuOutput} 29*780712aaSxiaofeibao-xjtuimport xiangshan.backend.fu.{FuConfig, FuType} 30*780712aaSxiaofeibao-xjtuimport xiangshan.frontend.FtqPtr 31*780712aaSxiaofeibao-xjtuimport xiangshan.mem.{LqPtr, LsqEnqIO, SqPtr} 32*780712aaSxiaofeibao-xjtuimport xiangshan.backend.Bundles.{DynInst, ExceptionInfo, ExuOutput} 33*780712aaSxiaofeibao-xjtuimport xiangshan.backend.ctrlblock.{DebugLSIO, DebugLsInfo, LsTopdownInfo} 34*780712aaSxiaofeibao-xjtuimport xiangshan.backend.fu.vector.Bundles.VType 35*780712aaSxiaofeibao-xjtuimport xiangshan.backend.rename.SnapshotGenerator 36*780712aaSxiaofeibao-xjtu 37*780712aaSxiaofeibao-xjtuclass RobEnqPtrWrapper(implicit p: Parameters) extends XSModule with HasCircularQueuePtrHelper { 38*780712aaSxiaofeibao-xjtu val io = IO(new Bundle { 39*780712aaSxiaofeibao-xjtu // for input redirect 40*780712aaSxiaofeibao-xjtu val redirect = Input(Valid(new Redirect)) 41*780712aaSxiaofeibao-xjtu // for enqueue 42*780712aaSxiaofeibao-xjtu val allowEnqueue = Input(Bool()) 43*780712aaSxiaofeibao-xjtu val hasBlockBackward = Input(Bool()) 44*780712aaSxiaofeibao-xjtu val enq = Vec(RenameWidth, Input(Bool())) 45*780712aaSxiaofeibao-xjtu val out = Output(Vec(RenameWidth, new RobPtr)) 46*780712aaSxiaofeibao-xjtu }) 47*780712aaSxiaofeibao-xjtu 48*780712aaSxiaofeibao-xjtu val enqPtrVec = RegInit(VecInit.tabulate(RenameWidth)(_.U.asTypeOf(new RobPtr))) 49*780712aaSxiaofeibao-xjtu 50*780712aaSxiaofeibao-xjtu // enqueue 51*780712aaSxiaofeibao-xjtu val canAccept = io.allowEnqueue && !io.hasBlockBackward 52*780712aaSxiaofeibao-xjtu val dispatchNum = Mux(canAccept, PopCount(io.enq), 0.U) 53*780712aaSxiaofeibao-xjtu 54*780712aaSxiaofeibao-xjtu for ((ptr, i) <- enqPtrVec.zipWithIndex) { 55*780712aaSxiaofeibao-xjtu when(io.redirect.valid) { 56*780712aaSxiaofeibao-xjtu ptr := Mux(io.redirect.bits.flushItself(), io.redirect.bits.robIdx + i.U, io.redirect.bits.robIdx + (i + 1).U) 57*780712aaSxiaofeibao-xjtu }.otherwise { 58*780712aaSxiaofeibao-xjtu ptr := ptr + dispatchNum 59*780712aaSxiaofeibao-xjtu } 60*780712aaSxiaofeibao-xjtu } 61*780712aaSxiaofeibao-xjtu 62*780712aaSxiaofeibao-xjtu io.out := enqPtrVec 63*780712aaSxiaofeibao-xjtu 64*780712aaSxiaofeibao-xjtu}