xref: /XiangShan/src/main/scala/xiangshan/mem/lsqueue/LoadQueue.scala (revision 99a48a761cc875d460b8ef13263c4c69b3c4be48)
1c6d43980SLemover/***************************************************************************************
2c6d43980SLemover* Copyright (c) 2020-2021 Institute of Computing Technology, Chinese Academy of Sciences
3f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory
4c6d43980SLemover*
5c6d43980SLemover* XiangShan is licensed under Mulan PSL v2.
6c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2.
7c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at:
8c6d43980SLemover*          http://license.coscl.org.cn/MulanPSL2
9c6d43980SLemover*
10c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13c6d43980SLemover*
14c6d43980SLemover* See the Mulan PSL v2 for more details.
15c6d43980SLemover***************************************************************************************/
16c6d43980SLemover
17c7658a75SYinan Xupackage xiangshan.mem
18c7658a75SYinan Xu
198891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
20c7658a75SYinan Xuimport chisel3._
21c7658a75SYinan Xuimport chisel3.util._
22c7658a75SYinan Xuimport utils._
233c02ee8fSwakafaimport utility._
24c7658a75SYinan Xuimport xiangshan._
259e12e8edScz4eimport xiangshan.ExceptionNO._
269e12e8edScz4eimport xiangshan.frontend.FtqPtr
2793eb4d85Ssfencevmaimport xiangshan.backend._
2893eb4d85Ssfencevmaimport xiangshan.backend.fu.fpu._
296ab6918fSYinan Xuimport xiangshan.backend.rob.RobLsqIO
30730cfbc0SXuan Huimport xiangshan.backend.Bundles.{DynInst, MemExuOutput, MemMicroOpRbExt}
31e4f69d78Ssfencevmaimport xiangshan.backend.rob.RobPtr
329e12e8edScz4eimport xiangshan.mem.mdp._
339e12e8edScz4eimport xiangshan.mem.Bundles._
349e12e8edScz4eimport xiangshan.cache._
359e12e8edScz4eimport xiangshan.cache.mmu._
36c7658a75SYinan Xu
372225d46eSJiawei Linclass LqPtr(implicit p: Parameters) extends CircularQueuePtr[LqPtr](
38e4f69d78Ssfencevma  p => p(XSCoreParamsKey).VirtualLoadQueueSize
392225d46eSJiawei Lin){
402225d46eSJiawei Lin}
41c7658a75SYinan Xu
422225d46eSJiawei Linobject LqPtr {
432225d46eSJiawei Lin  def apply(f: Bool, v: UInt)(implicit p: Parameters): LqPtr = {
44c7658a75SYinan Xu    val ptr = Wire(new LqPtr)
45c7658a75SYinan Xu    ptr.flag := f
46c7658a75SYinan Xu    ptr.value := v
47c7658a75SYinan Xu    ptr
48c7658a75SYinan Xu  }
49c7658a75SYinan Xu}
50c7658a75SYinan Xu
51579b9f28SLinJiaweitrait HasLoadHelper { this: XSModule =>
523b739f49SXuan Hu  def rdataHelper(uop: DynInst, rdata: UInt): UInt = {
533b739f49SXuan Hu    val fpWen = uop.fpWen
543b739f49SXuan Hu    LookupTree(uop.fuOpType, List(
55579b9f28SLinJiawei      LSUOpType.lb   -> SignExt(rdata(7, 0) , XLEN),
56579b9f28SLinJiawei      LSUOpType.lh   -> SignExt(rdata(15, 0), XLEN),
57dc597826SJiawei Lin      /*
58dc597826SJiawei Lin          riscv-spec-20191213: 12.2 NaN Boxing of Narrower Values
59dc597826SJiawei Lin          Any operation that writes a narrower result to an f register must write
60dc597826SJiawei Lin          all 1s to the uppermost FLEN−n bits to yield a legal NaN-boxed value.
61dc597826SJiawei Lin      */
62dc597826SJiawei Lin      LSUOpType.lw   -> Mux(fpWen, FPU.box(rdata, FPU.S), SignExt(rdata(31, 0), XLEN)),
63dc597826SJiawei Lin      LSUOpType.ld   -> Mux(fpWen, FPU.box(rdata, FPU.D), SignExt(rdata(63, 0), XLEN)),
64579b9f28SLinJiawei      LSUOpType.lbu  -> ZeroExt(rdata(7, 0) , XLEN),
65579b9f28SLinJiawei      LSUOpType.lhu  -> ZeroExt(rdata(15, 0), XLEN),
66579b9f28SLinJiawei      LSUOpType.lwu  -> ZeroExt(rdata(31, 0), XLEN),
67d0de7e4aSpeixiaokun
68d0de7e4aSpeixiaokun      // hypervisor
69d0de7e4aSpeixiaokun      LSUOpType.hlvb -> SignExt(rdata(7, 0), XLEN),
70d0de7e4aSpeixiaokun      LSUOpType.hlvh -> SignExt(rdata(15, 0), XLEN),
71d0de7e4aSpeixiaokun      LSUOpType.hlvw -> SignExt(rdata(31, 0), XLEN),
72d0de7e4aSpeixiaokun      LSUOpType.hlvd -> SignExt(rdata(63, 0), XLEN),
73d0de7e4aSpeixiaokun      LSUOpType.hlvbu -> ZeroExt(rdata(7, 0), XLEN),
74d0de7e4aSpeixiaokun      LSUOpType.hlvhu -> ZeroExt(rdata(15, 0), XLEN),
75d0de7e4aSpeixiaokun      LSUOpType.hlvwu -> ZeroExt(rdata(31, 0), XLEN),
76d0de7e4aSpeixiaokun      LSUOpType.hlvxhu -> ZeroExt(rdata(15, 0), XLEN),
77d0de7e4aSpeixiaokun      LSUOpType.hlvxwu -> ZeroExt(rdata(31, 0), XLEN),
78579b9f28SLinJiawei    ))
79579b9f28SLinJiawei  }
8020a5248fSzhanglinjuan
813406b3afSweiding liu  def genRdataOH(uop: DynInst): UInt = {
823406b3afSweiding liu    val fuOpType = uop.fuOpType
833406b3afSweiding liu    val fpWen    = uop.fpWen
843406b3afSweiding liu    val result = Cat(
853406b3afSweiding liu      (fuOpType === LSUOpType.lw && fpWen),
86b189aafaSzmx      (fuOpType === LSUOpType.lh && fpWen),
873406b3afSweiding liu      (fuOpType === LSUOpType.lw && !fpWen) || (fuOpType === LSUOpType.hlvw),
88b189aafaSzmx      (fuOpType === LSUOpType.lh && !fpWen) || (fuOpType === LSUOpType.hlvh),
893406b3afSweiding liu      (fuOpType === LSUOpType.lb)           || (fuOpType === LSUOpType.hlvb),
903406b3afSweiding liu      (fuOpType === LSUOpType.ld)           || (fuOpType === LSUOpType.hlvd),
913406b3afSweiding liu      (fuOpType === LSUOpType.lwu)          || (fuOpType === LSUOpType.hlvwu) || (fuOpType === LSUOpType.hlvxwu),
923406b3afSweiding liu      (fuOpType === LSUOpType.lhu)          || (fuOpType === LSUOpType.hlvhu) || (fuOpType === LSUOpType.hlvxhu),
933406b3afSweiding liu      (fuOpType === LSUOpType.lbu)          || (fuOpType === LSUOpType.hlvbu),
943406b3afSweiding liu    )
953406b3afSweiding liu    result
963406b3afSweiding liu  }
973406b3afSweiding liu
983406b3afSweiding liu  def newRdataHelper(select: UInt, rdata: UInt): UInt = {
993406b3afSweiding liu    XSError(PopCount(select) > 1.U, "data selector must be One-Hot!\n")
1003406b3afSweiding liu    val selData = Seq(
1013406b3afSweiding liu      ZeroExt(rdata(7, 0), XLEN),
1023406b3afSweiding liu      ZeroExt(rdata(15, 0), XLEN),
1033406b3afSweiding liu      ZeroExt(rdata(31, 0), XLEN),
1043406b3afSweiding liu      rdata(63, 0),
1053406b3afSweiding liu      SignExt(rdata(7, 0) , XLEN),
1063406b3afSweiding liu      SignExt(rdata(15, 0) , XLEN),
1073406b3afSweiding liu      SignExt(rdata(31, 0) , XLEN),
108b189aafaSzmx      FPU.box(rdata, FPU.H),
1093406b3afSweiding liu      FPU.box(rdata, FPU.S)
1103406b3afSweiding liu    )
1113406b3afSweiding liu    Mux1H(select, selData)
1123406b3afSweiding liu  }
1133406b3afSweiding liu
1143406b3afSweiding liu  def genDataSelectByOffset(addrOffset: UInt): Vec[Bool] = {
1150b4afd34Scz4e    require(addrOffset.getWidth == 4)
1160b4afd34Scz4e    VecInit((0 until 16).map{ case i =>
1173406b3afSweiding liu      addrOffset === i.U
1183406b3afSweiding liu    })
1193406b3afSweiding liu  }
1203406b3afSweiding liu
12120a5248fSzhanglinjuan  def rdataVecHelper(alignedType: UInt, rdata: UInt): UInt = {
12220a5248fSzhanglinjuan    LookupTree(alignedType, List(
12320a5248fSzhanglinjuan      "b00".U -> ZeroExt(rdata(7, 0), VLEN),
12420a5248fSzhanglinjuan      "b01".U -> ZeroExt(rdata(15, 0), VLEN),
12520a5248fSzhanglinjuan      "b10".U -> ZeroExt(rdata(31, 0), VLEN),
12620a5248fSzhanglinjuan      "b11".U -> ZeroExt(rdata(63, 0), VLEN)
12720a5248fSzhanglinjuan    ))
12820a5248fSzhanglinjuan  }
129579b9f28SLinJiawei}
130579b9f28SLinJiawei
13193eb4d85Ssfencevmaclass LqEnqIO(implicit p: Parameters) extends MemBlockBundle {
132780ade3fSYinan Xu  val canAccept = Output(Bool())
13303f2ceceSYinan Xu  val sqCanAccept = Input(Bool())
13454dc1a5aSXuan Hu  val needAlloc = Vec(LSQEnqWidth, Input(Bool()))
13554dc1a5aSXuan Hu  val req = Vec(LSQEnqWidth, Flipped(ValidIO(new DynInst)))
13654dc1a5aSXuan Hu  val resp = Vec(LSQEnqWidth, Output(new LqPtr))
137780ade3fSYinan Xu}
138c7658a75SYinan Xu
139b978565cSWilliam Wangclass LqTriggerIO(implicit p: Parameters) extends XSBundle {
140f7af4c74Schengguanghui  val hitLoadAddrTriggerHitVec = Input(Vec(TriggerNum, Bool()))
141f7af4c74Schengguanghui  val lqLoadAddrTriggerHitVec = Output(Vec(TriggerNum, Bool()))
142b978565cSWilliam Wang}
143b978565cSWilliam Wang
14460ebee38STang Haojinclass LoadQueueTopDownIO(implicit p: Parameters) extends XSBundle {
14560ebee38STang Haojin  val robHeadVaddr = Flipped(Valid(UInt(VAddrBits.W)))
14660ebee38STang Haojin  val robHeadTlbReplay = Output(Bool())
14760ebee38STang Haojin  val robHeadTlbMiss = Output(Bool())
14860ebee38STang Haojin  val robHeadLoadVio = Output(Bool())
14960ebee38STang Haojin  val robHeadLoadMSHR = Output(Bool())
15060ebee38STang Haojin  val robHeadMissInDTlb = Input(Bool())
15160ebee38STang Haojin  val robHeadOtherReplay = Output(Bool())
15260ebee38STang Haojin}
153e4f69d78Ssfencevma
154e4f69d78Ssfencevmaclass LoadQueue(implicit p: Parameters) extends XSModule
155e4f69d78Ssfencevma  with HasDCacheParameters
156e4f69d78Ssfencevma  with HasCircularQueuePtrHelper
157e4f69d78Ssfencevma  with HasLoadHelper
158e4f69d78Ssfencevma  with HasPerfEvents
159e4f69d78Ssfencevma{
160e4f69d78Ssfencevma  val io = IO(new Bundle() {
161e4f69d78Ssfencevma    val redirect = Flipped(Valid(new Redirect))
162627be78bSgood-circle    val vecFeedback = Vec(VecLoadPipelineWidth, Flipped(ValidIO(new FeedbackToLsqIO)))
163e4f69d78Ssfencevma    val enq = new LqEnqIO
164e4f69d78Ssfencevma    val ldu = new Bundle() {
16514a67055Ssfencevma        val stld_nuke_query = Vec(LoadPipelineWidth, Flipped(new LoadNukeQueryIO)) // from load_s2
16614a67055Ssfencevma        val ldld_nuke_query = Vec(LoadPipelineWidth, Flipped(new LoadNukeQueryIO)) // from load_s2
16714a67055Ssfencevma        val ldin         = Vec(LoadPipelineWidth, Flipped(Decoupled(new LqWriteBundle))) // from load_s3
168e4f69d78Ssfencevma    }
169e4f69d78Ssfencevma    val sta = new Bundle() {
170e4f69d78Ssfencevma      val storeAddrIn = Vec(StorePipelineWidth, Flipped(Valid(new LsPipelineBundle))) // from store_s1
171e4f69d78Ssfencevma    }
172e4f69d78Ssfencevma    val std = new Bundle() {
17326af847eSgood-circle      val storeDataIn = Vec(StorePipelineWidth, Flipped(Valid(new MemExuOutput(isVector = true)))) // from store_s0, store data, send to sq from rs
174e4f69d78Ssfencevma    }
175e4f69d78Ssfencevma    val sq = new Bundle() {
176e4f69d78Ssfencevma      val stAddrReadySqPtr = Input(new SqPtr)
177e4f69d78Ssfencevma      val stAddrReadyVec   = Input(Vec(StoreQueueSize, Bool()))
178e4f69d78Ssfencevma      val stDataReadySqPtr = Input(new SqPtr)
179e4f69d78Ssfencevma      val stDataReadyVec   = Input(Vec(StoreQueueSize, Bool()))
180e4f69d78Ssfencevma      val stIssuePtr       = Input(new SqPtr)
181e4f69d78Ssfencevma      val sqEmpty          = Input(Bool())
182e4f69d78Ssfencevma    }
183c61abc0cSXuan Hu    val ldout = Vec(LoadPipelineWidth, DecoupledIO(new MemExuOutput))
18414a67055Ssfencevma    val ld_raw_data = Vec(LoadPipelineWidth, Output(new LoadDataFromLQBundle))
185bb76fc1bSYanqin Li    val ncOut = Vec(LoadPipelineWidth, DecoupledIO(new LsPipelineBundle))
186e4f69d78Ssfencevma    val replay = Vec(LoadPipelineWidth, Decoupled(new LsPipelineBundle))
187692e2fafSHuijin Li  //  val refill = Flipped(ValidIO(new Refill))
1889444e131Ssfencevma    val tl_d_channel  = Input(new DcacheToLduForwardIO)
189e4f69d78Ssfencevma    val release = Flipped(Valid(new Release))
19016ede6bbSweiding liu    val nuke_rollback = Vec(StorePipelineWidth, Output(Valid(new Redirect)))
191e9e6cd09SYanqin Li    val nack_rollback = Vec(1, Output(Valid(new Redirect))) // uncachebuffer
192e4f69d78Ssfencevma    val rob = Flipped(new RobLsqIO)
193e4f69d78Ssfencevma    val uncache = new UncacheWordIO
194e4f69d78Ssfencevma    val exceptionAddr = new ExceptionAddrIO
195b240e1c0SAnzooooo    val loadMisalignFull = Input(Bool())
196522c7f99SAnzo    val misalignAllowSpec = Input(Bool())
197e4f69d78Ssfencevma    val lqFull = Output(Bool())
198e4f69d78Ssfencevma    val lqDeq = Output(UInt(log2Up(CommitWidth + 1).W))
199e4f69d78Ssfencevma    val lqCancelCnt = Output(UInt(log2Up(VirtualLoadQueueSize+1).W))
20014a67055Ssfencevma    val lq_rep_full = Output(Bool())
201e4f69d78Ssfencevma    val tlbReplayDelayCycleCtrl = Vec(4, Input(UInt(ReSelectLen.W)))
20214a67055Ssfencevma    val l2_hint = Input(Valid(new L2ToL1Hint()))
203185e6164SHaoyuan Feng    val tlb_hint = Flipped(new TlbHintIO)
2040d32f713Shappy-lx    val lqEmpty = Output(Bool())
20520a5248fSzhanglinjuan
20658dbfdf7Szhanglinjuan    val lqDeqPtr = Output(new LqPtr)
20720a5248fSzhanglinjuan
208522c7f99SAnzo    val rarValidCount = Output(UInt())
209522c7f99SAnzo
21060ebee38STang Haojin    val debugTopDown = new LoadQueueTopDownIO
211e836c770SZhaoyang You    val noUopsIssed = Input(Bool())
212e4f69d78Ssfencevma  })
213e4f69d78Ssfencevma
214e4f69d78Ssfencevma  val loadQueueRAR = Module(new LoadQueueRAR)  //  read-after-read violation
215e4f69d78Ssfencevma  val loadQueueRAW = Module(new LoadQueueRAW)  //  read-after-write violation
216e4f69d78Ssfencevma  val loadQueueReplay = Module(new LoadQueueReplay)  //  enqueue if need replay
217e4f69d78Ssfencevma  val virtualLoadQueue = Module(new VirtualLoadQueue)  //  control state
218e4f69d78Ssfencevma  val exceptionBuffer = Module(new LqExceptionBuffer) // exception buffer
219e9e6cd09SYanqin Li  val uncacheBuffer = Module(new LoadQueueUncache) // uncache
2209eb258c3SYinan Xu  /**
221e4f69d78Ssfencevma   * LoadQueueRAR
2229eb258c3SYinan Xu   */
223e4f69d78Ssfencevma  loadQueueRAR.io.redirect  <> io.redirect
224e4f69d78Ssfencevma  loadQueueRAR.io.release   <> io.release
225e4f69d78Ssfencevma  loadQueueRAR.io.ldWbPtr   <> virtualLoadQueue.io.ldWbPtr
226522c7f99SAnzo  loadQueueRAR.io.validCount<> io.rarValidCount
227e4f69d78Ssfencevma  for (w <- 0 until LoadPipelineWidth) {
22814a67055Ssfencevma    loadQueueRAR.io.query(w).req    <> io.ldu.ldld_nuke_query(w).req // from load_s1
22914a67055Ssfencevma    loadQueueRAR.io.query(w).resp   <> io.ldu.ldld_nuke_query(w).resp // to load_s2
23014a67055Ssfencevma    loadQueueRAR.io.query(w).revoke := io.ldu.ldld_nuke_query(w).revoke // from load_s3
2319eb258c3SYinan Xu  }
232c7658a75SYinan Xu
2339eb258c3SYinan Xu  /**
234e4f69d78Ssfencevma   * LoadQueueRAW
23567682d05SWilliam Wang   */
236e4f69d78Ssfencevma  loadQueueRAW.io.redirect         <> io.redirect
237e4f69d78Ssfencevma  loadQueueRAW.io.storeIn          <> io.sta.storeAddrIn
238e4f69d78Ssfencevma  loadQueueRAW.io.stAddrReadySqPtr <> io.sq.stAddrReadySqPtr
239e4f69d78Ssfencevma  loadQueueRAW.io.stIssuePtr       <> io.sq.stIssuePtr
240e4f69d78Ssfencevma  for (w <- 0 until LoadPipelineWidth) {
24114a67055Ssfencevma    loadQueueRAW.io.query(w).req    <> io.ldu.stld_nuke_query(w).req // from load_s1
24214a67055Ssfencevma    loadQueueRAW.io.query(w).resp   <> io.ldu.stld_nuke_query(w).resp // to load_s2
24314a67055Ssfencevma    loadQueueRAW.io.query(w).revoke := io.ldu.stld_nuke_query(w).revoke // from load_s3
244ef3b5b96SWilliam Wang  }
245ef3b5b96SWilliam Wang
24667682d05SWilliam Wang  /**
247e4f69d78Ssfencevma   * VirtualLoadQueue
2489eb258c3SYinan Xu   */
249e4f69d78Ssfencevma  virtualLoadQueue.io.redirect      <> io.redirect
25026af847eSgood-circle  virtualLoadQueue.io.vecCommit     <> io.vecFeedback
251e4f69d78Ssfencevma  virtualLoadQueue.io.enq           <> io.enq
25214a67055Ssfencevma  virtualLoadQueue.io.ldin          <> io.ldu.ldin // from load_s3
253e4f69d78Ssfencevma  virtualLoadQueue.io.lqFull        <> io.lqFull
254e4f69d78Ssfencevma  virtualLoadQueue.io.lqDeq         <> io.lqDeq
255e4f69d78Ssfencevma  virtualLoadQueue.io.lqCancelCnt   <> io.lqCancelCnt
2560d32f713Shappy-lx  virtualLoadQueue.io.lqEmpty       <> io.lqEmpty
25758dbfdf7Szhanglinjuan  virtualLoadQueue.io.ldWbPtr       <> io.lqDeqPtr
258e4f69d78Ssfencevma
259e4f69d78Ssfencevma  /**
260e4f69d78Ssfencevma   * Load queue exception buffer
261e4f69d78Ssfencevma   */
262e4f69d78Ssfencevma  exceptionBuffer.io.redirect <> io.redirect
26326af847eSgood-circle  for (i <- 0 until LoadPipelineWidth) {
26421e4bcfbSgood-circle    exceptionBuffer.io.req(i).valid := io.ldu.ldin(i).valid && !io.ldu.ldin(i).bits.isvec // from load_s3
26526af847eSgood-circle    exceptionBuffer.io.req(i).bits := io.ldu.ldin(i).bits
26610aac6e7SWilliam Wang  }
26755178b77Sweiding liu  // vlsu exception!
268627be78bSgood-circle  for (i <- 0 until VecLoadPipelineWidth) {
269627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).valid                 := io.vecFeedback(i).valid && io.vecFeedback(i).bits.feedback(VecFeedbacks.FLUSH) // have exception
270627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).bits                  := DontCare
271627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.vaddr            := io.vecFeedback(i).bits.vaddr
27287b463aaSAnzo    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.fullva           := io.vecFeedback(i).bits.vaddr
27346e9ee74SHaoyuan Feng    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.vaNeedExt        := io.vecFeedback(i).bits.vaNeedExt
274a53daa0fSHaoyuan Feng    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.gpaddr           := io.vecFeedback(i).bits.gpaddr
275627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.uop.uopIdx       := io.vecFeedback(i).bits.uopidx
276627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.uop.robIdx       := io.vecFeedback(i).bits.robidx
277627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.uop.vpu.vstart   := io.vecFeedback(i).bits.vstart
278627be78bSgood-circle    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.uop.vpu.vl       := io.vecFeedback(i).bits.vl
27947986d36SAnzo    exceptionBuffer.io.req(LoadPipelineWidth + i).bits.uop.exceptionVec := io.vecFeedback(i).bits.exceptionVec
280627be78bSgood-circle  }
28158cb1b0bSzhanglinjuan  // mmio non-data error exception
282e9e6cd09SYanqin Li  exceptionBuffer.io.req(LoadPipelineWidth + VecLoadPipelineWidth) := uncacheBuffer.io.exception
283c7353d05SYanqin Li  exceptionBuffer.io.req(LoadPipelineWidth + VecLoadPipelineWidth).bits.vaNeedExt := true.B
284b240e1c0SAnzooooo
285b240e1c0SAnzooooo  loadQueueReplay.io.loadMisalignFull := io.loadMisalignFull
286522c7f99SAnzo  loadQueueReplay.io.misalignAllowSpec := io.misalignAllowSpec
287627be78bSgood-circle
288e4f69d78Ssfencevma  io.exceptionAddr <> exceptionBuffer.io.exceptionAddr
289e4f69d78Ssfencevma
290e4f69d78Ssfencevma  /**
291e4f69d78Ssfencevma   * Load uncache buffer
292e4f69d78Ssfencevma   */
293e9e6cd09SYanqin Li  uncacheBuffer.io.redirect <> io.redirect
294e9e6cd09SYanqin Li  uncacheBuffer.io.mmioOut <> io.ldout
295e9e6cd09SYanqin Li  uncacheBuffer.io.ncOut <> io.ncOut
296e9e6cd09SYanqin Li  uncacheBuffer.io.mmioRawData <> io.ld_raw_data
297e9e6cd09SYanqin Li  uncacheBuffer.io.rob <> io.rob
298e9e6cd09SYanqin Li  uncacheBuffer.io.uncache <> io.uncache
299e9e6cd09SYanqin Li
300e9e6cd09SYanqin Li  for ((buff, w) <- uncacheBuffer.io.req.zipWithIndex) {
301e9e6cd09SYanqin Li    // from load_s3
302e9e6cd09SYanqin Li    val ldinBits = io.ldu.ldin(w).bits
303*99a48a76Scz4e    buff.valid := io.ldu.ldin(w).valid && !ldinBits.nc_with_data
304e9e6cd09SYanqin Li    buff.bits := ldinBits
30510aac6e7SWilliam Wang  }
306e9e6cd09SYanqin Li
307c7353d05SYanqin Li  io.uncache.resp.ready := true.B
30872951335SLi Qianruo
309cd2ff98bShappy-lx  io.nuke_rollback := loadQueueRAW.io.rollback
310e9e6cd09SYanqin Li  io.nack_rollback(0) := uncacheBuffer.io.rollback
311e4f69d78Ssfencevma
312e4f69d78Ssfencevma  /* <------- DANGEROUS: Don't change sequence here ! -------> */
313a13210f6SYinan Xu
314a13210f6SYinan Xu  /**
315e4f69d78Ssfencevma   * LoadQueueReplay
316a13210f6SYinan Xu   */
317e4f69d78Ssfencevma  loadQueueReplay.io.redirect         <> io.redirect
31814a67055Ssfencevma  loadQueueReplay.io.enq              <> io.ldu.ldin // from load_s3
319e4f69d78Ssfencevma  loadQueueReplay.io.storeAddrIn      <> io.sta.storeAddrIn // from store_s1
320e4f69d78Ssfencevma  loadQueueReplay.io.storeDataIn      <> io.std.storeDataIn // from store_s0
321e4f69d78Ssfencevma  loadQueueReplay.io.replay           <> io.replay
322692e2fafSHuijin Li  //loadQueueReplay.io.refill           <> io.refill
3239444e131Ssfencevma  loadQueueReplay.io.tl_d_channel     <> io.tl_d_channel
324e4f69d78Ssfencevma  loadQueueReplay.io.stAddrReadySqPtr <> io.sq.stAddrReadySqPtr
325e4f69d78Ssfencevma  loadQueueReplay.io.stAddrReadyVec   <> io.sq.stAddrReadyVec
326e4f69d78Ssfencevma  loadQueueReplay.io.stDataReadySqPtr <> io.sq.stDataReadySqPtr
327e4f69d78Ssfencevma  loadQueueReplay.io.stDataReadyVec   <> io.sq.stDataReadyVec
328e4f69d78Ssfencevma  loadQueueReplay.io.sqEmpty          <> io.sq.sqEmpty
32914a67055Ssfencevma  loadQueueReplay.io.lqFull           <> io.lq_rep_full
33014a67055Ssfencevma  loadQueueReplay.io.ldWbPtr          <> virtualLoadQueue.io.ldWbPtr
33114a67055Ssfencevma  loadQueueReplay.io.rarFull          <> loadQueueRAR.io.lqFull
33214a67055Ssfencevma  loadQueueReplay.io.rawFull          <> loadQueueRAW.io.lqFull
33314a67055Ssfencevma  loadQueueReplay.io.l2_hint          <> io.l2_hint
334185e6164SHaoyuan Feng  loadQueueReplay.io.tlb_hint         <> io.tlb_hint
335e4f69d78Ssfencevma  loadQueueReplay.io.tlbReplayDelayCycleCtrl <> io.tlbReplayDelayCycleCtrl
336b240e1c0SAnzooooo
337b7618691Sweiding liu  // TODO: implement it!
338627be78bSgood-circle  loadQueueReplay.io.vecFeedback := io.vecFeedback
339c7658a75SYinan Xu
34060ebee38STang Haojin  loadQueueReplay.io.debugTopDown <> io.debugTopDown
34160ebee38STang Haojin
342e836c770SZhaoyang You  virtualLoadQueue.io.noUopsIssued := io.noUopsIssed
343e836c770SZhaoyang You
344e4f69d78Ssfencevma  val full_mask = Cat(loadQueueRAR.io.lqFull, loadQueueRAW.io.lqFull, loadQueueReplay.io.lqFull)
345e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_000", full_mask === 0.U)
346e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_001", full_mask === 1.U)
347e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_010", full_mask === 2.U)
348e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_011", full_mask === 3.U)
349e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_100", full_mask === 4.U)
350e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_101", full_mask === 5.U)
351e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_110", full_mask === 6.U)
352e4f69d78Ssfencevma  XSPerfAccumulate("full_mask_111", full_mask === 7.U)
35316ede6bbSweiding liu  XSPerfAccumulate("nuke_rollback", io.nuke_rollback.map(_.valid).reduce(_ || _).asUInt)
354c7353d05SYanqin Li  XSPerfAccumulate("nack_rollabck", io.nack_rollback.map(_.valid).reduce(_ || _).asUInt)
355a13210f6SYinan Xu
356e4f69d78Ssfencevma  // perf cnt
357e4f69d78Ssfencevma  val perfEvents = Seq(virtualLoadQueue, loadQueueRAR, loadQueueRAW, loadQueueReplay).flatMap(_.getPerfEvents) ++
358e4f69d78Ssfencevma  Seq(
359e4f69d78Ssfencevma    ("full_mask_000", full_mask === 0.U),
360e4f69d78Ssfencevma    ("full_mask_001", full_mask === 1.U),
361e4f69d78Ssfencevma    ("full_mask_010", full_mask === 2.U),
362e4f69d78Ssfencevma    ("full_mask_011", full_mask === 3.U),
363e4f69d78Ssfencevma    ("full_mask_100", full_mask === 4.U),
364e4f69d78Ssfencevma    ("full_mask_101", full_mask === 5.U),
365e4f69d78Ssfencevma    ("full_mask_110", full_mask === 6.U),
366e4f69d78Ssfencevma    ("full_mask_111", full_mask === 7.U),
36716ede6bbSweiding liu    ("nuke_rollback", io.nuke_rollback.map(_.valid).reduce(_ || _).asUInt),
368c7353d05SYanqin Li    ("nack_rollback", io.nack_rollback.map(_.valid).reduce(_ || _).asUInt)
369cd365d4cSrvcoresjw  )
3701ca0e4f3SYinan Xu  generatePerfEvent()
371e4f69d78Ssfencevma  // end
372c7658a75SYinan Xu}
373