19e12e8edScz4e/*************************************************************************************** 29e12e8edScz4e* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 39e12e8edScz4e* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences 49e12e8edScz4e* Copyright (c) 2020-2021 Peng Cheng Laboratory 59e12e8edScz4e* 69e12e8edScz4e* XiangShan is licensed under Mulan PSL v2. 79e12e8edScz4e* You can use this software according to the terms and conditions of the Mulan PSL v2. 89e12e8edScz4e* You may obtain a copy of Mulan PSL v2 at: 99e12e8edScz4e* http://license.coscl.org.cn/MulanPSL2 109e12e8edScz4e* 119e12e8edScz4e* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 129e12e8edScz4e* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 139e12e8edScz4e* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 149e12e8edScz4e* 159e12e8edScz4e* See the Mulan PSL v2 for more details. 169e12e8edScz4e***************************************************************************************/ 179e12e8edScz4e 189e12e8edScz4epackage xiangshan.mem 199e12e8edScz4e 209e12e8edScz4e 219e12e8edScz4eimport org.chipsalliance.cde.config.Parameters 229e12e8edScz4eimport chisel3._ 239e12e8edScz4eimport chisel3.util._ 249e12e8edScz4eimport utility._ 259e12e8edScz4eimport utils._ 269e12e8edScz4eimport xiangshan._ 279e12e8edScz4eimport xiangshan.backend.Bundles._ 289e12e8edScz4eimport xiangshan.backend.rob.RobPtr 299e12e8edScz4eimport xiangshan.backend.fu.FenceToSbuffer 309e12e8edScz4eimport xiangshan.backend.fu.vector.Bundles._ 319e12e8edScz4eimport xiangshan.backend.Bundles._ 329e12e8edScz4eimport xiangshan.mem.prefetch.PrefetchReqBundle 339e12e8edScz4eimport xiangshan.cache._ 349e12e8edScz4eimport xiangshan.cache.wpu.ReplayCarry 359e12e8edScz4eimport xiangshan.cache.mmu._ 369e12e8edScz4eimport math._ 379e12e8edScz4e 389e12e8edScz4eobject Bundles { 399e12e8edScz4e 409e12e8edScz4e class LsPipelineBundle(implicit p: Parameters) extends XSBundle 419e12e8edScz4e with HasDCacheParameters 429e12e8edScz4e with HasVLSUParameters { 439e12e8edScz4e val uop = new DynInst 449e12e8edScz4e val vaddr = UInt(VAddrBits.W) 459e12e8edScz4e // For exception vaddr generate 469e12e8edScz4e val fullva = UInt(XLEN.W) 479e12e8edScz4e val vaNeedExt = Bool() 489e12e8edScz4e val isHyper = Bool() 499e12e8edScz4e val paddr = UInt(PAddrBits.W) 509e12e8edScz4e val gpaddr = UInt(XLEN.W) 519e12e8edScz4e val isForVSnonLeafPTE = Bool() 529e12e8edScz4e // val func = UInt(6.W) 539e12e8edScz4e val mask = UInt((VLEN/8).W) 549e12e8edScz4e val data = UInt((VLEN+1).W) 559e12e8edScz4e val wlineflag = Bool() // store write the whole cache line 569e12e8edScz4e 579e12e8edScz4e val miss = Bool() 589e12e8edScz4e val tlbMiss = Bool() 599e12e8edScz4e val ptwBack = Bool() 609e12e8edScz4e val af = Bool() 619e12e8edScz4e val nc = Bool() 629e12e8edScz4e val mmio = Bool() 639e12e8edScz4e val memBackTypeMM = Bool() // 1: main memory, 0: IO 649e12e8edScz4e val atomic = Bool() 659e12e8edScz4e val hasException = Bool() 669e12e8edScz4e 679e12e8edScz4e val forwardMask = Vec(VLEN/8, Bool()) 689e12e8edScz4e val forwardData = Vec(VLEN/8, UInt(8.W)) 699e12e8edScz4e 709e12e8edScz4e // prefetch 719e12e8edScz4e val isPrefetch = Bool() 729e12e8edScz4e val isHWPrefetch = Bool() 739e12e8edScz4e def isSWPrefetch = isPrefetch && !isHWPrefetch 749e12e8edScz4e 759e12e8edScz4e // misalignBuffer 769e12e8edScz4e val isFrmMisAlignBuf = Bool() 779e12e8edScz4e 789e12e8edScz4e // vector 799e12e8edScz4e val isvec = Bool() 809e12e8edScz4e val isLastElem = Bool() 819e12e8edScz4e val is128bit = Bool() 829e12e8edScz4e val uop_unit_stride_fof = Bool() 839e12e8edScz4e val usSecondInv = Bool() 849e12e8edScz4e val elemIdx = UInt(elemIdxBits.W) 859e12e8edScz4e val alignedType = UInt(alignTypeBits.W) 869e12e8edScz4e val mbIndex = UInt(max(vlmBindexBits, vsmBindexBits).W) 879e12e8edScz4e // val rob_idx_valid = Vec(2,Bool()) 889e12e8edScz4e // val inner_idx = Vec(2,UInt(3.W)) 899e12e8edScz4e // val rob_idx = Vec(2,new RobPtr) 909e12e8edScz4e val reg_offset = UInt(vOffsetBits.W) 919e12e8edScz4e val elemIdxInsideVd = UInt(elemIdxBits.W) 929e12e8edScz4e // val offset = Vec(2,UInt(4.W)) 939e12e8edScz4e val vecActive = Bool() // 1: vector active element or scala mem operation, 0: vector not active element 949e12e8edScz4e val is_first_ele = Bool() 959e12e8edScz4e val vecBaseVaddr = UInt(VAddrBits.W) 969e12e8edScz4e val vecVaddrOffset = UInt(VAddrBits.W) 979e12e8edScz4e val vecTriggerMask = UInt((VLEN/8).W) 989e12e8edScz4e // val flowPtr = new VlflowPtr() // VLFlowQueue ptr 999e12e8edScz4e // val sflowPtr = new VsFlowPtr() // VSFlowQueue ptr 1009e12e8edScz4e 1019e12e8edScz4e // For debug usage 1029e12e8edScz4e val isFirstIssue = Bool() 1039e12e8edScz4e val hasROBEntry = Bool() 1049e12e8edScz4e 1059e12e8edScz4e // For load replay 1069e12e8edScz4e val isLoadReplay = Bool() 1079e12e8edScz4e val isFastPath = Bool() 1089e12e8edScz4e val isFastReplay = Bool() 1099e12e8edScz4e val replayCarry = new ReplayCarry(nWays) 1109e12e8edScz4e 1119e12e8edScz4e // For dcache miss load 1129e12e8edScz4e val mshrid = UInt(log2Up(cfg.nMissEntries).W) 1139e12e8edScz4e val handledByMSHR = Bool() 1149e12e8edScz4e val replacementUpdated = Bool() 1159e12e8edScz4e val missDbUpdated = Bool() 1169e12e8edScz4e 1179e12e8edScz4e val forward_tlDchannel = Bool() 1189e12e8edScz4e val dcacheRequireReplay = Bool() 1199e12e8edScz4e val delayedLoadError = Bool() 1209e12e8edScz4e val lateKill = Bool() 1219e12e8edScz4e val feedbacked = Bool() 1229e12e8edScz4e val ldCancel = ValidUndirectioned(UInt(log2Ceil(LoadPipelineWidth).W)) 1239e12e8edScz4e // loadQueueReplay index. 1249e12e8edScz4e val schedIndex = UInt(log2Up(LoadQueueReplaySize).W) 1259e12e8edScz4e // hardware prefetch and fast replay no need to query tlb 1269e12e8edScz4e val tlbNoQuery = Bool() 1279e12e8edScz4e 1289e12e8edScz4e // misalign 1299e12e8edScz4e val isMisalign = Bool() 1309e12e8edScz4e val isFinalSplit = Bool() 1319e12e8edScz4e val misalignWith16Byte = Bool() 1329e12e8edScz4e val misalignNeedWakeUp = Bool() 1339e12e8edScz4e val updateAddrValid = Bool() 1349e12e8edScz4e } 1359e12e8edScz4e 1369e12e8edScz4e class LdPrefetchTrainBundle(implicit p: Parameters) extends LsPipelineBundle { 1379e12e8edScz4e val meta_prefetch = UInt(L1PfSourceBits.W) 1389e12e8edScz4e val meta_access = Bool() 1399e12e8edScz4e 1409e12e8edScz4e def fromLsPipelineBundle(input: LsPipelineBundle, latch: Boolean = false, enable: Bool = true.B) = { 1419e12e8edScz4e if (latch) vaddr := RegEnable(input.vaddr, enable) else vaddr := input.vaddr 1429e12e8edScz4e if (latch) fullva := RegEnable(input.fullva, enable) else fullva := input.fullva 1439e12e8edScz4e if (latch) vaNeedExt := RegEnable(input.vaNeedExt, enable) else vaNeedExt := input.vaNeedExt 1449e12e8edScz4e if (latch) isHyper := RegEnable(input.isHyper, enable) else isHyper := input.isHyper 1459e12e8edScz4e if (latch) paddr := RegEnable(input.paddr, enable) else paddr := input.paddr 1469e12e8edScz4e if (latch) gpaddr := RegEnable(input.gpaddr, enable) else gpaddr := input.gpaddr 1479e12e8edScz4e if (latch) isForVSnonLeafPTE := RegEnable(input.isForVSnonLeafPTE, enable) else isForVSnonLeafPTE := input.isForVSnonLeafPTE 1489e12e8edScz4e if (latch) mask := RegEnable(input.mask, enable) else mask := input.mask 1499e12e8edScz4e if (latch) data := RegEnable(input.data, enable) else data := input.data 1509e12e8edScz4e if (latch) uop := RegEnable(input.uop, enable) else uop := input.uop 1519e12e8edScz4e if (latch) wlineflag := RegEnable(input.wlineflag, enable) else wlineflag := input.wlineflag 1529e12e8edScz4e if (latch) miss := RegEnable(input.miss, enable) else miss := input.miss 1539e12e8edScz4e if (latch) tlbMiss := RegEnable(input.tlbMiss, enable) else tlbMiss := input.tlbMiss 1549e12e8edScz4e if (latch) ptwBack := RegEnable(input.ptwBack, enable) else ptwBack := input.ptwBack 1559e12e8edScz4e if (latch) af := RegEnable(input.af, enable) else af := input.af 1569e12e8edScz4e if (latch) nc := RegEnable(input.nc, enable) else nc := input.nc 1579e12e8edScz4e if (latch) mmio := RegEnable(input.mmio, enable) else mmio := input.mmio 1589e12e8edScz4e if (latch) memBackTypeMM := RegEnable(input.memBackTypeMM, enable) else memBackTypeMM := input.memBackTypeMM 1599e12e8edScz4e if (latch) forwardMask := RegEnable(input.forwardMask, enable) else forwardMask := input.forwardMask 1609e12e8edScz4e if (latch) forwardData := RegEnable(input.forwardData, enable) else forwardData := input.forwardData 1619e12e8edScz4e if (latch) isPrefetch := RegEnable(input.isPrefetch, enable) else isPrefetch := input.isPrefetch 1629e12e8edScz4e if (latch) isHWPrefetch := RegEnable(input.isHWPrefetch, enable) else isHWPrefetch := input.isHWPrefetch 1639e12e8edScz4e if (latch) isFrmMisAlignBuf := RegEnable(input.isFrmMisAlignBuf, enable) else isFrmMisAlignBuf := input.isFrmMisAlignBuf 1649e12e8edScz4e if (latch) isFirstIssue := RegEnable(input.isFirstIssue, enable) else isFirstIssue := input.isFirstIssue 1659e12e8edScz4e if (latch) hasROBEntry := RegEnable(input.hasROBEntry, enable) else hasROBEntry := input.hasROBEntry 1669e12e8edScz4e if (latch) dcacheRequireReplay := RegEnable(input.dcacheRequireReplay, enable) else dcacheRequireReplay := input.dcacheRequireReplay 1679e12e8edScz4e if (latch) schedIndex := RegEnable(input.schedIndex, enable) else schedIndex := input.schedIndex 1689e12e8edScz4e if (latch) tlbNoQuery := RegEnable(input.tlbNoQuery, enable) else tlbNoQuery := input.tlbNoQuery 1699e12e8edScz4e if (latch) isvec := RegEnable(input.isvec, enable) else isvec := input.isvec 1709e12e8edScz4e if (latch) isLastElem := RegEnable(input.isLastElem, enable) else isLastElem := input.isLastElem 1719e12e8edScz4e if (latch) is128bit := RegEnable(input.is128bit, enable) else is128bit := input.is128bit 1729e12e8edScz4e if (latch) vecActive := RegEnable(input.vecActive, enable) else vecActive := input.vecActive 1739e12e8edScz4e if (latch) is_first_ele := RegEnable(input.is_first_ele, enable) else is_first_ele := input.is_first_ele 1749e12e8edScz4e if (latch) uop_unit_stride_fof := RegEnable(input.uop_unit_stride_fof, enable) else uop_unit_stride_fof := input.uop_unit_stride_fof 1759e12e8edScz4e if (latch) usSecondInv := RegEnable(input.usSecondInv, enable) else usSecondInv := input.usSecondInv 1769e12e8edScz4e if (latch) reg_offset := RegEnable(input.reg_offset, enable) else reg_offset := input.reg_offset 1779e12e8edScz4e if (latch) elemIdx := RegEnable(input.elemIdx, enable) else elemIdx := input.elemIdx 1789e12e8edScz4e if (latch) alignedType := RegEnable(input.alignedType, enable) else alignedType := input.alignedType 1799e12e8edScz4e if (latch) mbIndex := RegEnable(input.mbIndex, enable) else mbIndex := input.mbIndex 1809e12e8edScz4e if (latch) elemIdxInsideVd := RegEnable(input.elemIdxInsideVd, enable) else elemIdxInsideVd := input.elemIdxInsideVd 1819e12e8edScz4e if (latch) vecBaseVaddr := RegEnable(input.vecBaseVaddr, enable) else vecBaseVaddr := input.vecBaseVaddr 1829e12e8edScz4e if (latch) vecVaddrOffset := RegEnable(input.vecVaddrOffset, enable) else vecVaddrOffset := input.vecVaddrOffset 1839e12e8edScz4e if (latch) vecTriggerMask := RegEnable(input.vecTriggerMask, enable) else vecTriggerMask := input.vecTriggerMask 1849e12e8edScz4e // if (latch) flowPtr := RegEnable(input.flowPtr, enable) else flowPtr := input.flowPtr 1859e12e8edScz4e // if (latch) sflowPtr := RegEnable(input.sflowPtr, enable) else sflowPtr := input.sflowPtr 1869e12e8edScz4e 1879e12e8edScz4e meta_prefetch := DontCare 1889e12e8edScz4e meta_access := DontCare 1899e12e8edScz4e forward_tlDchannel := DontCare 1909e12e8edScz4e mshrid := DontCare 1919e12e8edScz4e replayCarry := DontCare 1929e12e8edScz4e atomic := DontCare 1939e12e8edScz4e isLoadReplay := DontCare 1949e12e8edScz4e isFastPath := DontCare 1959e12e8edScz4e isFastReplay := DontCare 1969e12e8edScz4e handledByMSHR := DontCare 1979e12e8edScz4e replacementUpdated := DontCare 1989e12e8edScz4e missDbUpdated := DontCare 1999e12e8edScz4e delayedLoadError := DontCare 2009e12e8edScz4e lateKill := DontCare 2019e12e8edScz4e feedbacked := DontCare 2029e12e8edScz4e ldCancel := DontCare 2039e12e8edScz4e } 2049e12e8edScz4e 2059e12e8edScz4e def asPrefetchReqBundle(): PrefetchReqBundle = { 2069e12e8edScz4e val res = Wire(new PrefetchReqBundle) 2079e12e8edScz4e res.vaddr := this.vaddr 2089e12e8edScz4e res.paddr := this.paddr 2099e12e8edScz4e res.pc := this.uop.pc 2109e12e8edScz4e res.miss := this.miss 2119e12e8edScz4e res.pfHitStream := isFromStream(this.meta_prefetch) 2129e12e8edScz4e 2139e12e8edScz4e res 2149e12e8edScz4e } 2159e12e8edScz4e } 2169e12e8edScz4e 2179e12e8edScz4e class StPrefetchTrainBundle(implicit p: Parameters) extends LdPrefetchTrainBundle {} 2189e12e8edScz4e 2199e12e8edScz4e class LqWriteBundle(implicit p: Parameters) extends LsPipelineBundle { 2209e12e8edScz4e // load inst replay informations 2219e12e8edScz4e val rep_info = new LoadToLsqReplayIO 222*638f3d84SYanqin Li val nc_with_data = Bool() // nc access with data 2239e12e8edScz4e // queue entry data, except flag bits, will be updated if writeQueue is true, 2249e12e8edScz4e // valid bit in LqWriteBundle will be ignored 2259e12e8edScz4e val data_wen_dup = Vec(6, Bool()) // dirty reg dup 2269e12e8edScz4e 2279e12e8edScz4e 2289e12e8edScz4e def fromLsPipelineBundle(input: LsPipelineBundle, latch: Boolean = false, enable: Bool = true.B) = { 2299e12e8edScz4e if(latch) vaddr := RegEnable(input.vaddr, enable) else vaddr := input.vaddr 2309e12e8edScz4e if(latch) fullva := RegEnable(input.fullva, enable) else fullva := input.fullva 2319e12e8edScz4e if(latch) vaNeedExt := RegEnable(input.vaNeedExt, enable) else vaNeedExt := input.vaNeedExt 2329e12e8edScz4e if(latch) isHyper := RegEnable(input.isHyper, enable) else isHyper := input.isHyper 2339e12e8edScz4e if(latch) paddr := RegEnable(input.paddr, enable) else paddr := input.paddr 2349e12e8edScz4e if(latch) gpaddr := RegEnable(input.gpaddr, enable) else gpaddr := input.gpaddr 2359e12e8edScz4e if(latch) isForVSnonLeafPTE := RegEnable(input.isForVSnonLeafPTE, enable) else isForVSnonLeafPTE := input.isForVSnonLeafPTE 2369e12e8edScz4e if(latch) mask := RegEnable(input.mask, enable) else mask := input.mask 2379e12e8edScz4e if(latch) data := RegEnable(input.data, enable) else data := input.data 2389e12e8edScz4e if(latch) uop := RegEnable(input.uop, enable) else uop := input.uop 2399e12e8edScz4e if(latch) wlineflag := RegEnable(input.wlineflag, enable) else wlineflag := input.wlineflag 2409e12e8edScz4e if(latch) miss := RegEnable(input.miss, enable) else miss := input.miss 2419e12e8edScz4e if(latch) tlbMiss := RegEnable(input.tlbMiss, enable) else tlbMiss := input.tlbMiss 2429e12e8edScz4e if(latch) ptwBack := RegEnable(input.ptwBack, enable) else ptwBack := input.ptwBack 2439e12e8edScz4e if(latch) mmio := RegEnable(input.mmio, enable) else mmio := input.mmio 2449e12e8edScz4e if(latch) atomic := RegEnable(input.atomic, enable) else atomic := input.atomic 2459e12e8edScz4e if(latch) forwardMask := RegEnable(input.forwardMask, enable) else forwardMask := input.forwardMask 2469e12e8edScz4e if(latch) forwardData := RegEnable(input.forwardData, enable) else forwardData := input.forwardData 2479e12e8edScz4e if(latch) isPrefetch := RegEnable(input.isPrefetch, enable) else isPrefetch := input.isPrefetch 2489e12e8edScz4e if(latch) isHWPrefetch := RegEnable(input.isHWPrefetch, enable) else isHWPrefetch := input.isHWPrefetch 2499e12e8edScz4e if(latch) isFrmMisAlignBuf := RegEnable(input.isFrmMisAlignBuf, enable) else isFrmMisAlignBuf := input.isFrmMisAlignBuf 2509e12e8edScz4e if(latch) isFirstIssue := RegEnable(input.isFirstIssue, enable) else isFirstIssue := input.isFirstIssue 2519e12e8edScz4e if(latch) hasROBEntry := RegEnable(input.hasROBEntry, enable) else hasROBEntry := input.hasROBEntry 2529e12e8edScz4e if(latch) isLoadReplay := RegEnable(input.isLoadReplay, enable) else isLoadReplay := input.isLoadReplay 2539e12e8edScz4e if(latch) isFastPath := RegEnable(input.isFastPath, enable) else isFastPath := input.isFastPath 2549e12e8edScz4e if(latch) isFastReplay := RegEnable(input.isFastReplay, enable) else isFastReplay := input.isFastReplay 2559e12e8edScz4e if(latch) mshrid := RegEnable(input.mshrid, enable) else mshrid := input.mshrid 2569e12e8edScz4e if(latch) forward_tlDchannel := RegEnable(input.forward_tlDchannel, enable) else forward_tlDchannel := input.forward_tlDchannel 2579e12e8edScz4e if(latch) replayCarry := RegEnable(input.replayCarry, enable) else replayCarry := input.replayCarry 2589e12e8edScz4e if(latch) dcacheRequireReplay := RegEnable(input.dcacheRequireReplay, enable) else dcacheRequireReplay := input.dcacheRequireReplay 2599e12e8edScz4e if(latch) schedIndex := RegEnable(input.schedIndex, enable) else schedIndex := input.schedIndex 2609e12e8edScz4e if(latch) handledByMSHR := RegEnable(input.handledByMSHR, enable) else handledByMSHR := input.handledByMSHR 2619e12e8edScz4e if(latch) replacementUpdated := RegEnable(input.replacementUpdated, enable) else replacementUpdated := input.replacementUpdated 2629e12e8edScz4e if(latch) missDbUpdated := RegEnable(input.missDbUpdated, enable) else missDbUpdated := input.missDbUpdated 2639e12e8edScz4e if(latch) delayedLoadError := RegEnable(input.delayedLoadError, enable) else delayedLoadError := input.delayedLoadError 2649e12e8edScz4e if(latch) lateKill := RegEnable(input.lateKill, enable) else lateKill := input.lateKill 2659e12e8edScz4e if(latch) feedbacked := RegEnable(input.feedbacked, enable) else feedbacked := input.feedbacked 2669e12e8edScz4e if(latch) isvec := RegEnable(input.isvec, enable) else isvec := input.isvec 2679e12e8edScz4e if(latch) is128bit := RegEnable(input.is128bit, enable) else is128bit := input.is128bit 2689e12e8edScz4e if(latch) vecActive := RegEnable(input.vecActive, enable) else vecActive := input.vecActive 2699e12e8edScz4e if(latch) uop_unit_stride_fof := RegEnable(input.uop_unit_stride_fof, enable) else uop_unit_stride_fof := input.uop_unit_stride_fof 2709e12e8edScz4e if(latch) reg_offset := RegEnable(input.reg_offset, enable) else reg_offset := input.reg_offset 2719e12e8edScz4e if(latch) mbIndex := RegEnable(input.mbIndex, enable) else mbIndex := input.mbIndex 2729e12e8edScz4e if(latch) elemIdxInsideVd := RegEnable(input.elemIdxInsideVd, enable) else elemIdxInsideVd := input.elemIdxInsideVd 2739e12e8edScz4e 2749e12e8edScz4e rep_info := DontCare 2759e12e8edScz4e data_wen_dup := DontCare 2769e12e8edScz4e } 2779e12e8edScz4e } 2789e12e8edScz4e 2799e12e8edScz4e class SqWriteBundle(implicit p: Parameters) extends LsPipelineBundle { 2809e12e8edScz4e val need_rep = Bool() 2819e12e8edScz4e } 2829e12e8edScz4e 2839e12e8edScz4e class LoadForwardQueryIO(implicit p: Parameters) extends XSBundle { 2849e12e8edScz4e val vaddr = Output(UInt(VAddrBits.W)) 2859e12e8edScz4e val paddr = Output(UInt(PAddrBits.W)) 2869e12e8edScz4e val mask = Output(UInt((VLEN/8).W)) 2879e12e8edScz4e val uop = Output(new DynInst) // for replay 2889e12e8edScz4e val pc = Output(UInt(VAddrBits.W)) //for debug 2899e12e8edScz4e val valid = Output(Bool()) 2909e12e8edScz4e 2919e12e8edScz4e val forwardMaskFast = Input(Vec((VLEN/8), Bool())) // resp to load_s1 2929e12e8edScz4e val forwardMask = Input(Vec((VLEN/8), Bool())) // resp to load_s2 2939e12e8edScz4e val forwardData = Input(Vec((VLEN/8), UInt(8.W))) // resp to load_s2 2949e12e8edScz4e 2959e12e8edScz4e // val lqIdx = Output(UInt(LoadQueueIdxWidth.W)) 2969e12e8edScz4e val sqIdx = Output(new SqPtr) 2979e12e8edScz4e 2989e12e8edScz4e // dataInvalid suggests store to load forward found forward should happen, 2999e12e8edScz4e // but data is not available for now. If dataInvalid, load inst should 3009e12e8edScz4e // be replayed from RS. Feedback type should be RSFeedbackType.dataInvalid 3019e12e8edScz4e val dataInvalid = Input(Bool()) // Addr match, but data is not valid for now 3029e12e8edScz4e 3039e12e8edScz4e // matchInvalid suggests in store to load forward logic, paddr cam result does 3049e12e8edScz4e // to equal to vaddr cam result. If matchInvalid, a microarchitectural exception 3059e12e8edScz4e // should be raised to flush SQ and committed sbuffer. 3069e12e8edScz4e val matchInvalid = Input(Bool()) // resp to load_s2 3079e12e8edScz4e 3089e12e8edScz4e // addrInvalid suggests store to load forward found forward should happen, 3099e12e8edScz4e // but address (SSID) is not available for now. If addrInvalid, load inst should 3109e12e8edScz4e // be replayed from RS. Feedback type should be RSFeedbackType.addrInvalid 3119e12e8edScz4e val addrInvalid = Input(Bool()) 3129e12e8edScz4e } 3139e12e8edScz4e 3149e12e8edScz4e // LoadForwardQueryIO used in load pipeline 3159e12e8edScz4e // 3169e12e8edScz4e // Difference between PipeLoadForwardQueryIO and LoadForwardQueryIO: 3179e12e8edScz4e // PipeIO use predecoded sqIdxMask for better forward timing 3189e12e8edScz4e class PipeLoadForwardQueryIO(implicit p: Parameters) extends LoadForwardQueryIO { 3199e12e8edScz4e // val sqIdx = Output(new SqPtr) // for debug, should not be used in pipeline for timing reasons 3209e12e8edScz4e // sqIdxMask is calcuated in earlier stage for better timing 3219e12e8edScz4e val sqIdxMask = Output(UInt(StoreQueueSize.W)) 3229e12e8edScz4e 3239e12e8edScz4e // dataInvalid: addr match, but data is not valid for now 3249e12e8edScz4e val dataInvalidFast = Input(Bool()) // resp to load_s1 3259e12e8edScz4e // val dataInvalid = Input(Bool()) // resp to load_s2 3269e12e8edScz4e val dataInvalidSqIdx = Input(new SqPtr) // resp to load_s2, sqIdx 3279e12e8edScz4e val addrInvalidSqIdx = Input(new SqPtr) // resp to load_s2, sqIdx 3289e12e8edScz4e } 3299e12e8edScz4e 3309e12e8edScz4e // Query load queue for ld-ld violation 3319e12e8edScz4e // 3329e12e8edScz4e // Req should be send in load_s1 3339e12e8edScz4e // Resp will be generated 1 cycle later 3349e12e8edScz4e // 3359e12e8edScz4e // Note that query req may be !ready, as dcache is releasing a block 3369e12e8edScz4e // If it happens, a replay from rs is needed. 3379e12e8edScz4e class LoadNukeQueryReq(implicit p: Parameters) extends XSBundle { // provide lqIdx 3389e12e8edScz4e val uop = new DynInst 3399e12e8edScz4e // mask: load's data mask. 3409e12e8edScz4e val mask = UInt((VLEN/8).W) 3419e12e8edScz4e 3429e12e8edScz4e // paddr: load's paddr. 3439e12e8edScz4e val paddr = UInt(PAddrBits.W) 3449e12e8edScz4e // dataInvalid: load data is invalid. 3459e12e8edScz4e val data_valid = Bool() 3469e12e8edScz4e // nc: is NC access 3479e12e8edScz4e val is_nc = Bool() 3489e12e8edScz4e } 3499e12e8edScz4e 3509e12e8edScz4e class LoadNukeQueryResp(implicit p: Parameters) extends XSBundle { 3519e12e8edScz4e // rep_frm_fetch: ld-ld violation check success, replay from fetch. 3529e12e8edScz4e val rep_frm_fetch = Bool() 3539e12e8edScz4e } 3549e12e8edScz4e 3559e12e8edScz4e class LoadNukeQueryIO(implicit p: Parameters) extends XSBundle { 3569e12e8edScz4e val req = Decoupled(new LoadNukeQueryReq) 3579e12e8edScz4e val resp = Flipped(Valid(new LoadNukeQueryResp)) 3589e12e8edScz4e val revoke = Output(Bool()) 3599e12e8edScz4e } 3609e12e8edScz4e 3619e12e8edScz4e class StoreNukeQueryIO(implicit p: Parameters) extends XSBundle { 3629e12e8edScz4e // robIdx: Requestor's (a store instruction) rob index for match logic. 3639e12e8edScz4e val robIdx = new RobPtr 3649e12e8edScz4e 3659e12e8edScz4e // paddr: requestor's (a store instruction) physical address for match logic. 3669e12e8edScz4e val paddr = UInt(PAddrBits.W) 3679e12e8edScz4e 3689e12e8edScz4e // mask: requestor's (a store instruction) data width mask for match logic. 3699e12e8edScz4e val mask = UInt((VLEN/8).W) 3709e12e8edScz4e 3719e12e8edScz4e // matchLine: if store is vector 128-bits, load unit need to compare 128-bits vaddr. 3729e12e8edScz4e val matchLine = Bool() 3739e12e8edScz4e } 3749e12e8edScz4e 3759e12e8edScz4e class StoreMaBufToSqControlIO(implicit p: Parameters) extends XSBundle { 3769e12e8edScz4e // from storeMisalignBuffer to storeQueue, control it's sbuffer write 3779e12e8edScz4e val toStoreQueue = Output(new XSBundle { 3789e12e8edScz4e // This entry is a cross page 3799e12e8edScz4e val crossPageWithHit = Bool() 3809e12e8edScz4e val crossPageCanDeq = Bool() 3819e12e8edScz4e // High page Paddr 3829e12e8edScz4e val paddr = UInt(PAddrBits.W) 3839e12e8edScz4e 3849e12e8edScz4e val withSameUop = Bool() 3859e12e8edScz4e }) 3869e12e8edScz4e // from storeQueue to storeMisalignBuffer, provide detail info of this store 3879e12e8edScz4e val toStoreMisalignBuffer = Input(new XSBundle { 3889e12e8edScz4e val sqPtr = new SqPtr 3899e12e8edScz4e val doDeq = Bool() 3909e12e8edScz4e 3919e12e8edScz4e val uop = new DynInst() 3929e12e8edScz4e }) 3939e12e8edScz4e } 3949e12e8edScz4e 3959e12e8edScz4e class StoreMaBufToVecStoreMergeBufferIO(implicit p: Parameters) extends VLSUBundle{ 3969e12e8edScz4e val mbIndex = Output(UInt(vsmBindexBits.W)) 3979e12e8edScz4e val flush = Output(Bool()) 3989e12e8edScz4e } 3999e12e8edScz4e 4009e12e8edScz4e // Store byte valid mask write bundle 4019e12e8edScz4e // 4029e12e8edScz4e // Store byte valid mask write to SQ takes 2 cycles 4039e12e8edScz4e class StoreMaskBundle(implicit p: Parameters) extends XSBundle { 4049e12e8edScz4e val sqIdx = new SqPtr 4059e12e8edScz4e val mask = UInt((VLEN/8).W) 4069e12e8edScz4e } 4079e12e8edScz4e 4089e12e8edScz4e class LoadDataFromDcacheBundle(implicit p: Parameters) extends DCacheBundle { 4099e12e8edScz4e // old dcache: optimize data sram read fanout 4109e12e8edScz4e // val bankedDcacheData = Vec(DCacheBanks, UInt(64.W)) 4119e12e8edScz4e // val bank_oh = UInt(DCacheBanks.W) 4129e12e8edScz4e 4139e12e8edScz4e // new dcache 4149e12e8edScz4e val respDcacheData = UInt(VLEN.W) 4159e12e8edScz4e val forwardMask = Vec(VLEN/8, Bool()) 4169e12e8edScz4e val forwardData = Vec(VLEN/8, UInt(8.W)) 4179e12e8edScz4e val uop = new DynInst // for data selection, only fwen and fuOpType are used 4189e12e8edScz4e val addrOffset = UInt(4.W) // for data selection 4199e12e8edScz4e 4209e12e8edScz4e // forward tilelink D channel 4219e12e8edScz4e val forward_D = Bool() 4229e12e8edScz4e val forwardData_D = Vec(VLEN/8, UInt(8.W)) 4239e12e8edScz4e 4249e12e8edScz4e // forward mshr data 4259e12e8edScz4e val forward_mshr = Bool() 4269e12e8edScz4e val forwardData_mshr = Vec(VLEN/8, UInt(8.W)) 4279e12e8edScz4e 4289e12e8edScz4e val forward_result_valid = Bool() 4299e12e8edScz4e 4309e12e8edScz4e def mergeTLData(): UInt = { 4319e12e8edScz4e // merge TL D or MSHR data at load s2 4329e12e8edScz4e val dcache_data = respDcacheData 4339e12e8edScz4e val use_D = forward_D && forward_result_valid 4349e12e8edScz4e val use_mshr = forward_mshr && forward_result_valid 4359e12e8edScz4e Mux( 4369e12e8edScz4e use_D || use_mshr, 4379e12e8edScz4e Mux( 4389e12e8edScz4e use_D, 4399e12e8edScz4e forwardData_D.asUInt, 4409e12e8edScz4e forwardData_mshr.asUInt 4419e12e8edScz4e ), 4429e12e8edScz4e dcache_data 4439e12e8edScz4e ) 4449e12e8edScz4e } 4459e12e8edScz4e 4469e12e8edScz4e def mergeLsqFwdData(dcacheData: UInt): UInt = { 4479e12e8edScz4e // merge dcache and lsq forward data at load s3 4489e12e8edScz4e val rdataVec = VecInit((0 until VLEN / 8).map(j => 4499e12e8edScz4e Mux(forwardMask(j), forwardData(j), dcacheData(8*(j+1)-1, 8*j)) 4509e12e8edScz4e )) 4519e12e8edScz4e rdataVec.asUInt 4529e12e8edScz4e } 4539e12e8edScz4e } 4549e12e8edScz4e 4559e12e8edScz4e // Load writeback data from load queue (refill) 4569e12e8edScz4e class LoadDataFromLQBundle(implicit p: Parameters) extends XSBundle { 4579e12e8edScz4e val lqData = UInt(64.W) // load queue has merged data 4589e12e8edScz4e val uop = new DynInst // for data selection, only fwen and fuOpType are used 4599e12e8edScz4e val addrOffset = UInt(3.W) // for data selection 4609e12e8edScz4e 4619e12e8edScz4e def mergedData(): UInt = { 4629e12e8edScz4e lqData 4639e12e8edScz4e } 4649e12e8edScz4e } 4659e12e8edScz4e 4669e12e8edScz4e // Bundle for load / store wait waking up 4679e12e8edScz4e class MemWaitUpdateReq(implicit p: Parameters) extends XSBundle { 4689e12e8edScz4e val robIdx = Vec(backendParams.StaExuCnt, ValidIO(new RobPtr)) 4699e12e8edScz4e val sqIdx = Vec(backendParams.StdCnt, ValidIO(new SqPtr)) 4709e12e8edScz4e } 4719e12e8edScz4e 4729e12e8edScz4e} 473