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