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 177057673cSWilliam Wangpackage xiangshan.mem 187057673cSWilliam Wang 192225d46eSJiawei Linimport chipsalliance.rocketchip.config.Parameters 207057673cSWilliam Wangimport chisel3._ 217057673cSWilliam Wangimport chisel3.util._ 227057673cSWilliam Wangimport utils._ 237057673cSWilliam Wangimport xiangshan._ 247057673cSWilliam Wangimport xiangshan.cache._ 256d5ddbceSLemoverimport xiangshan.cache.{DCacheWordIO, DCacheLineIO, MemoryOpConstants} 267057673cSWilliam Wangimport xiangshan.mem._ 279aca92b9SYinan Xuimport xiangshan.backend.rob.RobPtr 287057673cSWilliam Wang 292225d46eSJiawei Linclass LQDataEntry(implicit p: Parameters) extends XSBundle { 307057673cSWilliam Wang val paddr = UInt(PAddrBits.W) 317057673cSWilliam Wang val mask = UInt(8.W) 327057673cSWilliam Wang val data = UInt(XLEN.W) 337057673cSWilliam Wang val fwdMask = Vec(8, Bool()) 347057673cSWilliam Wang} 357057673cSWilliam Wang 36bf6b6e21SWilliam Wang// Data module define 37bf6b6e21SWilliam Wang// These data modules are like SyncDataModuleTemplate, but support cam-like ops 3896b1e495SWilliam Wang 3996b1e495SWilliam Wang// load queue paddr module 4096b1e495SWilliam Wang// 4196b1e495SWilliam Wang// It supports 3 cam sources: 4296b1e495SWilliam Wang// * st-ld violation addr cam 4396b1e495SWilliam Wang// * data release addr cam 4496b1e495SWilliam Wang// * data refill addr cam 452225d46eSJiawei Linclass LQPaddrModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters { 46bf6b6e21SWilliam Wang val io = IO(new Bundle { 4796b1e495SWilliam Wang // normal read/write ports 48f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 49f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt((PAddrBits).W))) 50f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 51f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 52f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 5396b1e495SWilliam Wang // violation cam: hit if addr is in the same word 5496b1e495SWilliam Wang val violationMdata = Input(Vec(StorePipelineWidth, UInt((PAddrBits).W))) // addr 5596b1e495SWilliam Wang val violationMmask = Output(Vec(StorePipelineWidth, Vec(numEntries, Bool()))) // cam result mask 5696b1e495SWilliam Wang // release cam: hit if addr is in the same cacheline 5767682d05SWilliam Wang val releaseMdata = Input(Vec(LoadPipelineWidth, UInt((PAddrBits).W))) 5867682d05SWilliam Wang val releaseMmask = Output(Vec(LoadPipelineWidth, Vec(numEntries, Bool()))) 5996b1e495SWilliam Wang // refill cam: hit if addr is in the same cacheline 60f02b5115SWilliam Wang val refillMdata = Input(UInt((PAddrBits).W)) 61f02b5115SWilliam Wang val refillMmask = Output(Vec(numEntries, Bool())) 62bf6b6e21SWilliam Wang }) 63bf6b6e21SWilliam Wang 64f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt((PAddrBits).W))) 65bf6b6e21SWilliam Wang 66bf6b6e21SWilliam Wang // read ports 67bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 6859a7acd8SWilliam Wang io.rdata(i) := data(RegNext(io.raddr(i))) 69bf6b6e21SWilliam Wang } 70bf6b6e21SWilliam Wang 71bf6b6e21SWilliam Wang // below is the write ports (with priorities) 72bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 73bf6b6e21SWilliam Wang when (io.wen(i)) { 74bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 75bf6b6e21SWilliam Wang } 76bf6b6e21SWilliam Wang } 77bf6b6e21SWilliam Wang 78bf6b6e21SWilliam Wang // content addressed match 7967682d05SWilliam Wang for (i <- 0 until StorePipelineWidth) { 80bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 81*ef3b5b96SWilliam Wang io.violationMmask(i)(j) := io.violationMdata(i)(PAddrBits-1, DCacheWordOffset) === data(j)(PAddrBits-1, DCacheWordOffset) 8267682d05SWilliam Wang } 8367682d05SWilliam Wang } 8467682d05SWilliam Wang for (i <- 0 until LoadPipelineWidth) { 8567682d05SWilliam Wang for (j <- 0 until numEntries) { 86*ef3b5b96SWilliam Wang io.releaseMmask(i)(j) := io.releaseMdata(i)(PAddrBits-1, DCacheLineOffset) === data(j)(PAddrBits-1, DCacheLineOffset) 87bf6b6e21SWilliam Wang } 88bf6b6e21SWilliam Wang } 89f02b5115SWilliam Wang 90f02b5115SWilliam Wang for (j <- 0 until numEntries) { 91594ba8acSWilliam Wang io.refillMmask(j) := get_refill_addr(io.refillMdata) === get_refill_addr(data(j)) 92bf6b6e21SWilliam Wang } 93bf6b6e21SWilliam Wang 94bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 95bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 96bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 97bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 98bf6b6e21SWilliam Wang } 99bf6b6e21SWilliam Wang } 100bf6b6e21SWilliam Wang} 101bf6b6e21SWilliam Wang 10296b1e495SWilliam Wang// load queue load mask module 10396b1e495SWilliam Wangclass LQMaskModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule { 104bf6b6e21SWilliam Wang val io = IO(new Bundle { 105f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 106f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(8.W))) 107f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 108f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 109f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(8.W))) 11096b1e495SWilliam Wang // st-ld violation check wmask compare 11196b1e495SWilliam Wang val violationMdata = Input(Vec(StorePipelineWidth, UInt(8.W))) // input 8-bit wmask 11296b1e495SWilliam Wang val violationMmask = Output(Vec(StorePipelineWidth, Vec(numEntries, Bool()))) // output wmask overlap vector 113bf6b6e21SWilliam Wang }) 114bf6b6e21SWilliam Wang 115f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt(8.W))) 116bf6b6e21SWilliam Wang 117bf6b6e21SWilliam Wang // read ports 118bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 11959a7acd8SWilliam Wang io.rdata(i) := data(RegNext(io.raddr(i))) 120bf6b6e21SWilliam Wang } 121bf6b6e21SWilliam Wang 122bf6b6e21SWilliam Wang // below is the write ports (with priorities) 123bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 124bf6b6e21SWilliam Wang when (io.wen(i)) { 125bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 126bf6b6e21SWilliam Wang } 127bf6b6e21SWilliam Wang } 128bf6b6e21SWilliam Wang 12996b1e495SWilliam Wang // st-ld violation check wmask compare 13067682d05SWilliam Wang for (i <- 0 until StorePipelineWidth) { 131bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 132f02b5115SWilliam Wang io.violationMmask(i)(j) := (io.violationMdata(i) & data(j)).orR 133bf6b6e21SWilliam Wang } 134bf6b6e21SWilliam Wang } 135bf6b6e21SWilliam Wang 136bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 137bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 138bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 139bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 140bf6b6e21SWilliam Wang } 141bf6b6e21SWilliam Wang } 142bf6b6e21SWilliam Wang} 143bf6b6e21SWilliam Wang 14496b1e495SWilliam Wang// SQDataModule is a wrapper of 8 bit MaskedSyncDataModuleTemplates 14596b1e495SWilliam Wang// 14696b1e495SWilliam Wang// It also contains: 14796b1e495SWilliam Wang// * fwdMask, which is used to merge refill data and forwarded data 14896b1e495SWilliam Wang// * word index extracted from paddr, which is used to select data from refill data (a cacheline) 14996b1e495SWilliam Wangclass LQDataModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters { 150bf6b6e21SWilliam Wang val io = IO(new Bundle { 15196b1e495SWilliam Wang // sync read 152f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 153f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(XLEN.W))) 15496b1e495SWilliam Wang 155bf6b6e21SWilliam Wang // address indexed write 156f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 157f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 158f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(XLEN.W))) 15996b1e495SWilliam Wang // forward mask needs to be recorded to merge data 16096b1e495SWilliam Wang val fwdMaskWdata = Input(Vec(numWrite, UInt(8.W))) 16196b1e495SWilliam Wang // refillOffBits - wordOffBits bits in paddr need to be stored in LQDataModule for refilling 16296b1e495SWilliam Wang val paddrWdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 16396b1e495SWilliam Wang 164bf6b6e21SWilliam Wang // masked write 165bf6b6e21SWilliam Wang val mwmask = Input(Vec(numEntries, Bool())) 166594ba8acSWilliam Wang val refillData = Input(UInt(l1BusDataWidth.W)) 167bf6b6e21SWilliam Wang }) 168bf6b6e21SWilliam Wang 169594ba8acSWilliam Wang val data8 = Seq.fill(8)(Module(new MaskedSyncDataModuleTemplate(UInt(8.W), numEntries, numRead, numWrite, numMWrite = refillWords))) 170f02b5115SWilliam Wang val fwdMask = Reg(Vec(numEntries, UInt(8.W))) 171594ba8acSWilliam Wang val wordIndex = Reg(Vec(numEntries, UInt((refillOffBits - wordOffBits).W))) 172bf6b6e21SWilliam Wang 173bf6b6e21SWilliam Wang // read ports 174bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 1751c2ecc42SWilliam Wang for (j <- 0 until 8) { 1761c2ecc42SWilliam Wang data8(j).io.raddr(i) := io.raddr(i) 1771c2ecc42SWilliam Wang } 1781c2ecc42SWilliam Wang io.rdata(i) := VecInit((0 until 8).map(j => data8(j).io.rdata(i))).asUInt 179bf6b6e21SWilliam Wang } 180bf6b6e21SWilliam Wang 181bf6b6e21SWilliam Wang // below is the write ports (with priorities) 182bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 1831c2ecc42SWilliam Wang // write to data8 1841c2ecc42SWilliam Wang for (j <- 0 until 8) { 1851c2ecc42SWilliam Wang data8(j).io.waddr(i) := io.waddr(i) 1861c2ecc42SWilliam Wang data8(j).io.wdata(i) := io.wdata(i)(8*(j+1)-1, 8*j) 1871c2ecc42SWilliam Wang data8(j).io.wen(i) := io.wen(i) 188bf6b6e21SWilliam Wang } 1891c2ecc42SWilliam Wang 1901c2ecc42SWilliam Wang // write ctrl info 19196b1e495SWilliam Wang when (io.wen(i)) { 192f02b5115SWilliam Wang fwdMask(io.waddr(i)) := io.fwdMaskWdata(i) 193bf6b6e21SWilliam Wang } 19496b1e495SWilliam Wang when (io.wen(i)) { 195f02b5115SWilliam Wang wordIndex(io.waddr(i)) := get_word(io.paddrWdata(i)) 196f02b5115SWilliam Wang } 197f02b5115SWilliam Wang } 198f02b5115SWilliam Wang 1991c2ecc42SWilliam Wang // write refilled data to data8 200bf6b6e21SWilliam Wang 2011c2ecc42SWilliam Wang // select refill data 202f02b5115SWilliam Wang // split dcache result into words 203594ba8acSWilliam Wang val words = VecInit((0 until refillWords) map { i => io.refillData(DataBits * (i + 1) - 1, DataBits * i)}) 2041c2ecc42SWilliam Wang // select refill data according to wordIndex (paddr) 2051c2ecc42SWilliam Wang for (i <- 0 until 8) { 206594ba8acSWilliam Wang for (j <- 0 until refillWords) { 2076251d905SWilliam Wang data8(i).io.mwdata(j) := words(j)(8*(i+1)-1, 8*i) 2081c2ecc42SWilliam Wang } 2091c2ecc42SWilliam Wang } 2106251d905SWilliam Wang 2111c2ecc42SWilliam Wang // gen refill wmask 212594ba8acSWilliam Wang for (j <- 0 until refillWords) { 2136251d905SWilliam Wang for (k <- 0 until numEntries) { 2146251d905SWilliam Wang val wordMatch = wordIndex(k) === j.U 2151c2ecc42SWilliam Wang for (i <- 0 until 8) { 2166251d905SWilliam Wang data8(i).io.mwmask(j)(k) := wordMatch && io.mwmask(k) && !fwdMask(k)(i) 2176251d905SWilliam Wang } 218bf6b6e21SWilliam Wang } 219bf6b6e21SWilliam Wang } 220bf6b6e21SWilliam Wang 221bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 222bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 223bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 224bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 225bf6b6e21SWilliam Wang } 226bf6b6e21SWilliam Wang } 227bf6b6e21SWilliam Wang} 2287057673cSWilliam Wang 22996b1e495SWilliam Wang// LoadQueueDataWrapper wraps: 23096b1e495SWilliam Wang// * load queue paddrModule 23196b1e495SWilliam Wang// * load queue maskModule 23296b1e495SWilliam Wang// * load queue dataModule 23396b1e495SWilliam Wang// and their interconnect 23496b1e495SWilliam Wangclass LoadQueueDataWrapper(size: Int, wbNumRead: Int, wbNumWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters with HasCircularQueuePtrHelper { 2357057673cSWilliam Wang val io = IO(new Bundle() { 2367d91f790SWilliam Wang val wb = new Bundle() { 2377d91f790SWilliam Wang val wen = Vec(wbNumWrite, Input(Bool())) 2387d91f790SWilliam Wang val waddr = Input(Vec(wbNumWrite, UInt(log2Up(size).W))) 2397d91f790SWilliam Wang val wdata = Input(Vec(wbNumWrite, new LQDataEntry)) 2407d91f790SWilliam Wang val raddr = Input(Vec(wbNumRead, UInt(log2Up(size).W))) 2417d91f790SWilliam Wang val rdata = Output(Vec(wbNumRead, new LQDataEntry)) 2427d91f790SWilliam Wang } 2437057673cSWilliam Wang val uncache = new Bundle() { 2447057673cSWilliam Wang val wen = Input(Bool()) 2457d91f790SWilliam Wang val waddr = Input(UInt(log2Up(size).W)) 2467d91f790SWilliam Wang val wdata = Input(UInt(XLEN.W)) // only write back uncache data 2477d91f790SWilliam Wang val raddr = Input(UInt(log2Up(size).W)) 2487d91f790SWilliam Wang val rdata = Output(new LQDataEntry) 2497057673cSWilliam Wang } 2507057673cSWilliam Wang val refill = new Bundle() { 2517d91f790SWilliam Wang val valid = Input(Bool()) 2527d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 253594ba8acSWilliam Wang val data = Input(UInt(l1BusDataWidth.W)) 2547d91f790SWilliam Wang val refillMask = Input(Vec(size, Bool())) 2557d91f790SWilliam Wang val matchMask = Output(Vec(size, Bool())) 2567057673cSWilliam Wang } 25767682d05SWilliam Wang // st-ld violation query, word level cam 2587d91f790SWilliam Wang val violation = Vec(StorePipelineWidth, new Bundle() { 2597d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 2607d91f790SWilliam Wang val mask = Input(UInt(8.W)) 2617d91f790SWilliam Wang val violationMask = Output(Vec(size, Bool())) 2627d91f790SWilliam Wang }) 26367682d05SWilliam Wang // ld-ld violation query, cache line level cam 26467682d05SWilliam Wang val release_violation = Vec(LoadPipelineWidth, new Bundle() { 26567682d05SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 26667682d05SWilliam Wang val match_mask = Output(Vec(size, Bool())) 26767682d05SWilliam Wang // if ld-ld violation does happened, we replay from the elder load 26867682d05SWilliam Wang }) 2697d91f790SWilliam Wang val debug = Output(Vec(size, new LQDataEntry)) 2707057673cSWilliam Wang 2717d91f790SWilliam Wang def wbWrite(channel: Int, waddr: UInt, wdata: LQDataEntry): Unit = { 2727d91f790SWilliam Wang require(channel < wbNumWrite && wbNumWrite >= 0) 2737057673cSWilliam Wang // need extra "this.wb(channel).wen := true.B" 2747d91f790SWilliam Wang this.wb.waddr(channel) := waddr 2757d91f790SWilliam Wang this.wb.wdata(channel) := wdata 2767057673cSWilliam Wang } 2777057673cSWilliam Wang 2787d91f790SWilliam Wang def uncacheWrite(waddr: UInt, wdata: UInt): Unit = { 2797057673cSWilliam Wang // need extra "this.uncache.wen := true.B" 2807d91f790SWilliam Wang this.uncache.waddr := waddr 2817057673cSWilliam Wang this.uncache.wdata := wdata 2827057673cSWilliam Wang } 2837057673cSWilliam Wang }) 2847057673cSWilliam Wang 285f02b5115SWilliam Wang // data module 28667682d05SWilliam Wang val paddrModule = Module(new LQPaddrModule(size, numRead = LoadPipelineWidth+1, numWrite = LoadPipelineWidth)) 28796b1e495SWilliam Wang val maskModule = Module(new LQMaskModule(size, numRead = LoadPipelineWidth+1, numWrite = LoadPipelineWidth)) 28896b1e495SWilliam Wang val dataModule = Module(new LQDataModule(size, numRead = LoadPipelineWidth+1, numWrite = LoadPipelineWidth+1)) 2897057673cSWilliam Wang 290a266fd76SWilliam Wang // read data 291f02b5115SWilliam Wang // read port 0 -> wbNumRead-1 292a266fd76SWilliam Wang (0 until wbNumRead).map(i => { 293f02b5115SWilliam Wang paddrModule.io.raddr(i) := io.wb.raddr(i) 294f02b5115SWilliam Wang maskModule.io.raddr(i) := io.wb.raddr(i) 29596b1e495SWilliam Wang dataModule.io.raddr(i) := io.wb.raddr(i) 296f02b5115SWilliam Wang 297f02b5115SWilliam Wang io.wb.rdata(i).paddr := paddrModule.io.rdata(i) 298f02b5115SWilliam Wang io.wb.rdata(i).mask := maskModule.io.rdata(i) 29996b1e495SWilliam Wang io.wb.rdata(i).data := dataModule.io.rdata(i) 300f02b5115SWilliam Wang io.wb.rdata(i).fwdMask := DontCare 301a266fd76SWilliam Wang }) 302a266fd76SWilliam Wang 303f02b5115SWilliam Wang // read port wbNumRead 304f02b5115SWilliam Wang paddrModule.io.raddr(wbNumRead) := io.uncache.raddr 305f02b5115SWilliam Wang maskModule.io.raddr(wbNumRead) := io.uncache.raddr 30696b1e495SWilliam Wang dataModule.io.raddr(wbNumRead) := io.uncache.raddr 307a266fd76SWilliam Wang 308f02b5115SWilliam Wang io.uncache.rdata.paddr := paddrModule.io.rdata(wbNumRead) 309f02b5115SWilliam Wang io.uncache.rdata.mask := maskModule.io.rdata(wbNumRead) 31096b1e495SWilliam Wang io.uncache.rdata.data := dataModule.io.rdata(wbNumRead) 311f02b5115SWilliam Wang io.uncache.rdata.fwdMask := DontCare 312f02b5115SWilliam Wang 313f02b5115SWilliam Wang // write data 314f02b5115SWilliam Wang // write port 0 -> wbNumWrite-1 3157d91f790SWilliam Wang (0 until wbNumWrite).map(i => { 316f02b5115SWilliam Wang paddrModule.io.wen(i) := false.B 317f02b5115SWilliam Wang maskModule.io.wen(i) := false.B 31896b1e495SWilliam Wang dataModule.io.wen(i) := false.B 319f02b5115SWilliam Wang 320f02b5115SWilliam Wang paddrModule.io.waddr(i) := io.wb.waddr(i) 321f02b5115SWilliam Wang maskModule.io.waddr(i) := io.wb.waddr(i) 32296b1e495SWilliam Wang dataModule.io.waddr(i) := io.wb.waddr(i) 323f02b5115SWilliam Wang 324f02b5115SWilliam Wang paddrModule.io.wdata(i) := io.wb.wdata(i).paddr 325f02b5115SWilliam Wang maskModule.io.wdata(i) := io.wb.wdata(i).mask 32696b1e495SWilliam Wang dataModule.io.wdata(i) := io.wb.wdata(i).data 32796b1e495SWilliam Wang dataModule.io.fwdMaskWdata(i) := io.wb.wdata(i).fwdMask.asUInt 32896b1e495SWilliam Wang dataModule.io.paddrWdata(i) := io.wb.wdata(i).paddr 329f02b5115SWilliam Wang 3307d91f790SWilliam Wang when(io.wb.wen(i)){ 331f02b5115SWilliam Wang paddrModule.io.wen(i) := true.B 332f02b5115SWilliam Wang maskModule.io.wen(i) := true.B 33396b1e495SWilliam Wang dataModule.io.wen(i) := true.B 3347057673cSWilliam Wang } 3357057673cSWilliam Wang }) 3367057673cSWilliam Wang 337f02b5115SWilliam Wang // write port wbNumWrite 33896b1e495SWilliam Wang dataModule.io.wen(wbNumWrite) := io.uncache.wen 33996b1e495SWilliam Wang // dataModule.io.fwdMaskWen(wbNumWrite) := false.B 34096b1e495SWilliam Wang // dataModule.io.paddrWen(wbNumWrite) := false.B 341f02b5115SWilliam Wang 34296b1e495SWilliam Wang dataModule.io.waddr(wbNumWrite) := io.uncache.waddr 343f02b5115SWilliam Wang 34496b1e495SWilliam Wang dataModule.io.fwdMaskWdata(wbNumWrite) := DontCare 34596b1e495SWilliam Wang dataModule.io.paddrWdata(wbNumWrite) := DontCare 34696b1e495SWilliam Wang dataModule.io.wdata(wbNumWrite) := io.uncache.wdata 347f02b5115SWilliam Wang 34867682d05SWilliam Wang // st-ld mem access violation check, gen violationMask 349f02b5115SWilliam Wang (0 until StorePipelineWidth).map(i => { 350f02b5115SWilliam Wang paddrModule.io.violationMdata(i) := io.violation(i).paddr 351f02b5115SWilliam Wang maskModule.io.violationMdata(i) := io.violation(i).mask 352f02b5115SWilliam Wang io.violation(i).violationMask := (paddrModule.io.violationMmask(i).asUInt & maskModule.io.violationMmask(i).asUInt).asBools 35367682d05SWilliam Wang }) 35467682d05SWilliam Wang 35567682d05SWilliam Wang // ld-ld mem access violation check, gen violationMask (cam match mask) 35667682d05SWilliam Wang (0 until LoadPipelineWidth).map(i => { 35767682d05SWilliam Wang paddrModule.io.releaseMdata(i) := io.release_violation(i).paddr 35867682d05SWilliam Wang io.release_violation(i).match_mask := paddrModule.io.releaseMmask(i) 359f02b5115SWilliam Wang }) 3607057673cSWilliam Wang 3617d91f790SWilliam Wang // gen paddr match mask 362f02b5115SWilliam Wang paddrModule.io.refillMdata := io.refill.paddr 3637057673cSWilliam Wang (0 until size).map(i => { 364f02b5115SWilliam Wang io.refill.matchMask := paddrModule.io.refillMmask 365f02b5115SWilliam Wang // io.refill.matchMask(i) := get_block_addr(data(i).paddr) === get_block_addr(io.refill.paddr) 3667d91f790SWilliam Wang }) 3677d91f790SWilliam Wang 3687d91f790SWilliam Wang // refill data according to matchMask, refillMask and refill.valid 36996b1e495SWilliam Wang dataModule.io.refillData := io.refill.data 3707d91f790SWilliam Wang (0 until size).map(i => { 37196b1e495SWilliam Wang dataModule.io.mwmask(i) := io.refill.valid && io.refill.matchMask(i) && io.refill.refillMask(i) 3727d91f790SWilliam Wang }) 3737d91f790SWilliam Wang 3747d91f790SWilliam Wang // debug data read 375f02b5115SWilliam Wang io.debug := DontCare 3767057673cSWilliam Wang} 377