xref: /XiangShan/src/main/scala/xiangshan/backend/rob/RobEnqPtrWrapper.scala (revision 780712aa4d2ede8944b843c01f0a3ac94679530e)
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}