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._ 27*9aca92b9SYinan Xuimport xiangshan.backend.rob.RobPtr 287057673cSWilliam Wang 292225d46eSJiawei Linclass LQDataEntry(implicit p: Parameters) extends XSBundle { 307057673cSWilliam Wang // val vaddr = UInt(VAddrBits.W) 317057673cSWilliam Wang val paddr = UInt(PAddrBits.W) 327057673cSWilliam Wang val mask = UInt(8.W) 337057673cSWilliam Wang val data = UInt(XLEN.W) 347057673cSWilliam Wang val fwdMask = Vec(8, Bool()) 357057673cSWilliam Wang} 367057673cSWilliam Wang 37bf6b6e21SWilliam Wang// Data module define 38bf6b6e21SWilliam Wang// These data modules are like SyncDataModuleTemplate, but support cam-like ops 392225d46eSJiawei Linclass LQPaddrModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters { 40bf6b6e21SWilliam Wang val io = IO(new Bundle { 41f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 42f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt((PAddrBits).W))) 43f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 44f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 45f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 46f02b5115SWilliam Wang val violationMdata = Input(Vec(2, UInt((PAddrBits).W))) 47f02b5115SWilliam Wang val violationMmask = Output(Vec(2, Vec(numEntries, Bool()))) 48f02b5115SWilliam Wang val refillMdata = Input(UInt((PAddrBits).W)) 49f02b5115SWilliam Wang val refillMmask = Output(Vec(numEntries, Bool())) 50bf6b6e21SWilliam Wang }) 51bf6b6e21SWilliam Wang 52f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt((PAddrBits).W))) 53bf6b6e21SWilliam Wang 54bf6b6e21SWilliam Wang // read ports 55bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 5659a7acd8SWilliam Wang io.rdata(i) := data(RegNext(io.raddr(i))) 57bf6b6e21SWilliam Wang } 58bf6b6e21SWilliam Wang 59bf6b6e21SWilliam Wang // below is the write ports (with priorities) 60bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 61bf6b6e21SWilliam Wang when (io.wen(i)) { 62bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 63bf6b6e21SWilliam Wang } 64bf6b6e21SWilliam Wang } 65bf6b6e21SWilliam Wang 66bf6b6e21SWilliam Wang // content addressed match 67f02b5115SWilliam Wang for (i <- 0 until 2) { 68bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 69f02b5115SWilliam Wang io.violationMmask(i)(j) := io.violationMdata(i)(PAddrBits-1, 3) === data(j)(PAddrBits-1, 3) 70bf6b6e21SWilliam Wang } 71bf6b6e21SWilliam Wang } 72f02b5115SWilliam Wang 73f02b5115SWilliam Wang for (j <- 0 until numEntries) { 74594ba8acSWilliam Wang io.refillMmask(j) := get_refill_addr(io.refillMdata) === get_refill_addr(data(j)) 75bf6b6e21SWilliam Wang } 76bf6b6e21SWilliam Wang 77bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 78bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 79bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 80bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 81bf6b6e21SWilliam Wang } 82bf6b6e21SWilliam Wang } 83bf6b6e21SWilliam Wang} 84bf6b6e21SWilliam Wang 852225d46eSJiawei Linclass MaskModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule { 86bf6b6e21SWilliam Wang val io = IO(new Bundle { 87f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 88f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(8.W))) 89f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 90f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 91f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(8.W))) 92f02b5115SWilliam Wang val violationMdata = Input(Vec(2, UInt((PAddrBits).W))) 93f02b5115SWilliam Wang val violationMmask = Output(Vec(2, Vec(numEntries, Bool()))) 94bf6b6e21SWilliam Wang }) 95bf6b6e21SWilliam Wang 96f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt(8.W))) 97bf6b6e21SWilliam Wang 98bf6b6e21SWilliam Wang // read ports 99bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 10059a7acd8SWilliam Wang io.rdata(i) := data(RegNext(io.raddr(i))) 101bf6b6e21SWilliam Wang } 102bf6b6e21SWilliam Wang 103bf6b6e21SWilliam Wang // below is the write ports (with priorities) 104bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 105bf6b6e21SWilliam Wang when (io.wen(i)) { 106bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 107bf6b6e21SWilliam Wang } 108bf6b6e21SWilliam Wang } 109bf6b6e21SWilliam Wang 110bf6b6e21SWilliam Wang // content addressed match 111f02b5115SWilliam Wang for (i <- 0 until 2) { 112bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 113f02b5115SWilliam Wang io.violationMmask(i)(j) := (io.violationMdata(i) & data(j)).orR 114bf6b6e21SWilliam Wang } 115bf6b6e21SWilliam Wang } 116bf6b6e21SWilliam Wang 117bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 118bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 119bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 120bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 121bf6b6e21SWilliam Wang } 122bf6b6e21SWilliam Wang } 123bf6b6e21SWilliam Wang} 124bf6b6e21SWilliam Wang 1250f22ee7cSWilliam Wang// class LQData8Module(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule with HasDCacheParameters { 1260f22ee7cSWilliam Wang// val io = IO(new Bundle { 1270f22ee7cSWilliam Wang// // read 1280f22ee7cSWilliam Wang// val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 1290f22ee7cSWilliam Wang// val rdata = Output(Vec(numRead, UInt(8.W))) 1300f22ee7cSWilliam Wang// // address indexed write 1310f22ee7cSWilliam Wang// val wen = Input(Vec(numWrite, Bool())) 1320f22ee7cSWilliam Wang// val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 1330f22ee7cSWilliam Wang// val wdata = Input(Vec(numWrite, UInt(8.W))) 1340f22ee7cSWilliam Wang// // masked write 1350f22ee7cSWilliam Wang// val mwmask = Input(Vec(blockWords, Vec(numEntries, Bool()))) 1360f22ee7cSWilliam Wang// val mwdata = Input(Vec(blockWords, UInt(8.W))) 1370f22ee7cSWilliam Wang// }) 1381c2ecc42SWilliam Wang 1390f22ee7cSWilliam Wang// val data = Reg(Vec(numEntries, UInt(8.W))) 1401c2ecc42SWilliam Wang 1410f22ee7cSWilliam Wang// // read ports 1420f22ee7cSWilliam Wang// for (i <- 0 until numRead) { 1430f22ee7cSWilliam Wang// io.rdata(i) := data(RegNext(io.raddr(i))) 1440f22ee7cSWilliam Wang// } 1451c2ecc42SWilliam Wang 1460f22ee7cSWilliam Wang// // below is the write ports (with priorities) 1470f22ee7cSWilliam Wang// for (i <- 0 until numWrite) { 1480f22ee7cSWilliam Wang// when (io.wen(i)) { 1490f22ee7cSWilliam Wang// data(io.waddr(i)) := io.wdata(i) 1500f22ee7cSWilliam Wang// } 1510f22ee7cSWilliam Wang// } 1521c2ecc42SWilliam Wang 1530f22ee7cSWilliam Wang// // masked write 1540f22ee7cSWilliam Wang// for (j <- 0 until numEntries) { 1550f22ee7cSWilliam Wang// val wen = VecInit((0 until blockWords).map(i => io.mwmask(i)(j))).asUInt.orR 1560f22ee7cSWilliam Wang// when (wen) { 1570f22ee7cSWilliam Wang// data(j) := VecInit((0 until blockWords).map(i => { 1580f22ee7cSWilliam Wang// Mux(io.mwmask(i)(j), io.mwdata(i), 0.U) 1590f22ee7cSWilliam Wang// })).reduce(_ | _) 1600f22ee7cSWilliam Wang// } 1610f22ee7cSWilliam Wang// } 1621c2ecc42SWilliam Wang 1630f22ee7cSWilliam Wang// // DataModuleTemplate should not be used when there're any write conflicts 1640f22ee7cSWilliam Wang// for (i <- 0 until numWrite) { 1650f22ee7cSWilliam Wang// for (j <- i+1 until numWrite) { 1660f22ee7cSWilliam Wang// assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 1670f22ee7cSWilliam Wang// } 1680f22ee7cSWilliam Wang// } 1690f22ee7cSWilliam Wang// } 1701c2ecc42SWilliam Wang 1712225d46eSJiawei Linclass CoredataModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters { 172bf6b6e21SWilliam Wang val io = IO(new Bundle { 173bf6b6e21SWilliam Wang // data io 174bf6b6e21SWilliam Wang // read 175f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 176f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(XLEN.W))) 177bf6b6e21SWilliam Wang // address indexed write 178f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 179f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 180f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(XLEN.W))) 181bf6b6e21SWilliam Wang // masked write 182bf6b6e21SWilliam Wang val mwmask = Input(Vec(numEntries, Bool())) 183594ba8acSWilliam Wang val refillData = Input(UInt(l1BusDataWidth.W)) 184bf6b6e21SWilliam Wang 185bf6b6e21SWilliam Wang // fwdMask io 186f02b5115SWilliam Wang val fwdMaskWdata = Input(Vec(numWrite, UInt(8.W))) 187f02b5115SWilliam Wang val fwdMaskWen = Input(Vec(numWrite, Bool())) 188f02b5115SWilliam Wang // fwdMaskWaddr = waddr 189f02b5115SWilliam Wang 190f02b5115SWilliam Wang // paddr io 191594ba8acSWilliam Wang // refillOffBits - wordOffBits bits in paddr need to be stored in CoredataModule for refilling 192f02b5115SWilliam Wang val paddrWdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 193f02b5115SWilliam Wang val paddrWen = Input(Vec(numWrite, Bool())) 194bf6b6e21SWilliam Wang }) 195bf6b6e21SWilliam Wang 196594ba8acSWilliam Wang val data8 = Seq.fill(8)(Module(new MaskedSyncDataModuleTemplate(UInt(8.W), numEntries, numRead, numWrite, numMWrite = refillWords))) 197f02b5115SWilliam Wang val fwdMask = Reg(Vec(numEntries, UInt(8.W))) 198594ba8acSWilliam Wang val wordIndex = Reg(Vec(numEntries, UInt((refillOffBits - wordOffBits).W))) 199bf6b6e21SWilliam Wang 200bf6b6e21SWilliam Wang // read ports 201bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 2021c2ecc42SWilliam Wang for (j <- 0 until 8) { 2031c2ecc42SWilliam Wang data8(j).io.raddr(i) := io.raddr(i) 2041c2ecc42SWilliam Wang } 2051c2ecc42SWilliam Wang io.rdata(i) := VecInit((0 until 8).map(j => data8(j).io.rdata(i))).asUInt 206bf6b6e21SWilliam Wang } 207bf6b6e21SWilliam Wang 208bf6b6e21SWilliam Wang // below is the write ports (with priorities) 209bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 2101c2ecc42SWilliam Wang // write to data8 2111c2ecc42SWilliam Wang for (j <- 0 until 8) { 2121c2ecc42SWilliam Wang data8(j).io.waddr(i) := io.waddr(i) 2131c2ecc42SWilliam Wang data8(j).io.wdata(i) := io.wdata(i)(8*(j+1)-1, 8*j) 2141c2ecc42SWilliam Wang data8(j).io.wen(i) := io.wen(i) 215bf6b6e21SWilliam Wang } 2161c2ecc42SWilliam Wang 2171c2ecc42SWilliam Wang // write ctrl info 218f02b5115SWilliam Wang when (io.fwdMaskWen(i)) { 219f02b5115SWilliam Wang fwdMask(io.waddr(i)) := io.fwdMaskWdata(i) 220bf6b6e21SWilliam Wang } 221f02b5115SWilliam Wang when (io.paddrWen(i)) { 222f02b5115SWilliam Wang wordIndex(io.waddr(i)) := get_word(io.paddrWdata(i)) 223f02b5115SWilliam Wang } 224f02b5115SWilliam Wang } 225f02b5115SWilliam Wang 2261c2ecc42SWilliam Wang // write refilled data to data8 227bf6b6e21SWilliam Wang 2281c2ecc42SWilliam Wang // select refill data 229f02b5115SWilliam Wang // split dcache result into words 230594ba8acSWilliam Wang val words = VecInit((0 until refillWords) map { i => io.refillData(DataBits * (i + 1) - 1, DataBits * i)}) 2311c2ecc42SWilliam Wang // select refill data according to wordIndex (paddr) 2321c2ecc42SWilliam Wang for (i <- 0 until 8) { 233594ba8acSWilliam Wang for (j <- 0 until refillWords) { 2346251d905SWilliam Wang data8(i).io.mwdata(j) := words(j)(8*(i+1)-1, 8*i) 2351c2ecc42SWilliam Wang } 2361c2ecc42SWilliam Wang } 2376251d905SWilliam Wang 2381c2ecc42SWilliam Wang // gen refill wmask 239594ba8acSWilliam Wang for (j <- 0 until refillWords) { 2406251d905SWilliam Wang for (k <- 0 until numEntries) { 2416251d905SWilliam Wang val wordMatch = wordIndex(k) === j.U 2421c2ecc42SWilliam Wang for (i <- 0 until 8) { 2436251d905SWilliam Wang data8(i).io.mwmask(j)(k) := wordMatch && io.mwmask(k) && !fwdMask(k)(i) 2446251d905SWilliam Wang } 245bf6b6e21SWilliam Wang } 246bf6b6e21SWilliam Wang } 247bf6b6e21SWilliam Wang 248bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 249bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 250bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 251bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 252bf6b6e21SWilliam Wang } 253bf6b6e21SWilliam Wang } 254bf6b6e21SWilliam Wang} 2557057673cSWilliam Wang 2562225d46eSJiawei Linclass LoadQueueData(size: Int, wbNumRead: Int, wbNumWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters with HasCircularQueuePtrHelper { 2577057673cSWilliam Wang val io = IO(new Bundle() { 2587d91f790SWilliam Wang val wb = new Bundle() { 2597d91f790SWilliam Wang val wen = Vec(wbNumWrite, Input(Bool())) 2607d91f790SWilliam Wang val waddr = Input(Vec(wbNumWrite, UInt(log2Up(size).W))) 2617d91f790SWilliam Wang val wdata = Input(Vec(wbNumWrite, new LQDataEntry)) 2627d91f790SWilliam Wang val raddr = Input(Vec(wbNumRead, UInt(log2Up(size).W))) 2637d91f790SWilliam Wang val rdata = Output(Vec(wbNumRead, new LQDataEntry)) 2647d91f790SWilliam Wang } 2657057673cSWilliam Wang val uncache = new Bundle() { 2667057673cSWilliam Wang val wen = Input(Bool()) 2677d91f790SWilliam Wang val waddr = Input(UInt(log2Up(size).W)) 2687d91f790SWilliam Wang val wdata = Input(UInt(XLEN.W)) // only write back uncache data 2697d91f790SWilliam Wang val raddr = Input(UInt(log2Up(size).W)) 2707d91f790SWilliam Wang val rdata = Output(new LQDataEntry) 2717057673cSWilliam Wang } 2727057673cSWilliam Wang val refill = new Bundle() { 2737d91f790SWilliam Wang val valid = Input(Bool()) 2747d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 275594ba8acSWilliam Wang val data = Input(UInt(l1BusDataWidth.W)) 2767d91f790SWilliam Wang val refillMask = Input(Vec(size, Bool())) 2777d91f790SWilliam Wang val matchMask = Output(Vec(size, Bool())) 2787057673cSWilliam Wang } 2797d91f790SWilliam Wang val violation = Vec(StorePipelineWidth, new Bundle() { 2807d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 2817d91f790SWilliam Wang val mask = Input(UInt(8.W)) 2827d91f790SWilliam Wang val violationMask = Output(Vec(size, Bool())) 2837d91f790SWilliam Wang }) 2847d91f790SWilliam Wang val debug = Output(Vec(size, new LQDataEntry)) 2857057673cSWilliam Wang 2867d91f790SWilliam Wang def wbWrite(channel: Int, waddr: UInt, wdata: LQDataEntry): Unit = { 2877d91f790SWilliam Wang require(channel < wbNumWrite && wbNumWrite >= 0) 2887057673cSWilliam Wang // need extra "this.wb(channel).wen := true.B" 2897d91f790SWilliam Wang this.wb.waddr(channel) := waddr 2907d91f790SWilliam Wang this.wb.wdata(channel) := wdata 2917057673cSWilliam Wang } 2927057673cSWilliam Wang 2937d91f790SWilliam Wang def uncacheWrite(waddr: UInt, wdata: UInt): Unit = { 2947057673cSWilliam Wang // need extra "this.uncache.wen := true.B" 2957d91f790SWilliam Wang this.uncache.waddr := waddr 2967057673cSWilliam Wang this.uncache.wdata := wdata 2977057673cSWilliam Wang } 2987057673cSWilliam Wang 2997057673cSWilliam Wang // def refillWrite(ldIdx: Int): Unit = { 3007057673cSWilliam Wang // } 3017057673cSWilliam Wang // use "this.refill.wen(ldIdx) := true.B" instead 3027057673cSWilliam Wang }) 3037057673cSWilliam Wang 304f02b5115SWilliam Wang // val data = Reg(Vec(size, new LQDataEntry)) 305f02b5115SWilliam Wang // data module 306b5b78226SWilliam Wang val paddrModule = Module(new LQPaddrModule(size, numRead = 3, numWrite = 2)) 307f02b5115SWilliam Wang val maskModule = Module(new MaskModule(size, numRead = 3, numWrite = 2)) 308f02b5115SWilliam Wang val coredataModule = Module(new CoredataModule(size, numRead = 3, numWrite = 3)) 3097057673cSWilliam Wang 310a266fd76SWilliam Wang // read data 311f02b5115SWilliam Wang // read port 0 -> wbNumRead-1 312a266fd76SWilliam Wang (0 until wbNumRead).map(i => { 313f02b5115SWilliam Wang paddrModule.io.raddr(i) := io.wb.raddr(i) 314f02b5115SWilliam Wang maskModule.io.raddr(i) := io.wb.raddr(i) 315f02b5115SWilliam Wang coredataModule.io.raddr(i) := io.wb.raddr(i) 316f02b5115SWilliam Wang 317f02b5115SWilliam Wang io.wb.rdata(i).paddr := paddrModule.io.rdata(i) 318f02b5115SWilliam Wang io.wb.rdata(i).mask := maskModule.io.rdata(i) 319f02b5115SWilliam Wang io.wb.rdata(i).data := coredataModule.io.rdata(i) 320f02b5115SWilliam Wang io.wb.rdata(i).fwdMask := DontCare 321a266fd76SWilliam Wang }) 322a266fd76SWilliam Wang 323f02b5115SWilliam Wang // read port wbNumRead 324f02b5115SWilliam Wang paddrModule.io.raddr(wbNumRead) := io.uncache.raddr 325f02b5115SWilliam Wang maskModule.io.raddr(wbNumRead) := io.uncache.raddr 326f02b5115SWilliam Wang coredataModule.io.raddr(wbNumRead) := io.uncache.raddr 327a266fd76SWilliam Wang 328f02b5115SWilliam Wang io.uncache.rdata.paddr := paddrModule.io.rdata(wbNumRead) 329f02b5115SWilliam Wang io.uncache.rdata.mask := maskModule.io.rdata(wbNumRead) 330baf8def6SYinan Xu io.uncache.rdata.data := coredataModule.io.rdata(wbNumRead) 331f02b5115SWilliam Wang io.uncache.rdata.fwdMask := DontCare 332f02b5115SWilliam Wang 333f02b5115SWilliam Wang // write data 334f02b5115SWilliam Wang // write port 0 -> wbNumWrite-1 3357d91f790SWilliam Wang (0 until wbNumWrite).map(i => { 336f02b5115SWilliam Wang paddrModule.io.wen(i) := false.B 337f02b5115SWilliam Wang maskModule.io.wen(i) := false.B 338f02b5115SWilliam Wang coredataModule.io.wen(i) := false.B 339f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(i) := false.B 340f02b5115SWilliam Wang coredataModule.io.paddrWen(i) := false.B 341f02b5115SWilliam Wang 342f02b5115SWilliam Wang paddrModule.io.waddr(i) := io.wb.waddr(i) 343f02b5115SWilliam Wang maskModule.io.waddr(i) := io.wb.waddr(i) 344f02b5115SWilliam Wang coredataModule.io.waddr(i) := io.wb.waddr(i) 345f02b5115SWilliam Wang 346f02b5115SWilliam Wang paddrModule.io.wdata(i) := io.wb.wdata(i).paddr 347f02b5115SWilliam Wang maskModule.io.wdata(i) := io.wb.wdata(i).mask 348f02b5115SWilliam Wang coredataModule.io.wdata(i) := io.wb.wdata(i).data 349f02b5115SWilliam Wang coredataModule.io.fwdMaskWdata(i) := io.wb.wdata(i).fwdMask.asUInt 350f02b5115SWilliam Wang coredataModule.io.paddrWdata(i) := io.wb.wdata(i).paddr 351f02b5115SWilliam Wang 3527d91f790SWilliam Wang when(io.wb.wen(i)){ 353f02b5115SWilliam Wang paddrModule.io.wen(i) := true.B 354f02b5115SWilliam Wang maskModule.io.wen(i) := true.B 355f02b5115SWilliam Wang coredataModule.io.wen(i) := true.B 356f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(i) := true.B 357f02b5115SWilliam Wang coredataModule.io.paddrWen(i) := true.B 3587057673cSWilliam Wang } 3597057673cSWilliam Wang }) 3607057673cSWilliam Wang 361f02b5115SWilliam Wang // write port wbNumWrite 362f02b5115SWilliam Wang // exceptionModule.io.wen(wbNumWrite) := false.B 363f02b5115SWilliam Wang coredataModule.io.wen(wbNumWrite) := io.uncache.wen 364f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(wbNumWrite) := false.B 365f02b5115SWilliam Wang coredataModule.io.paddrWen(wbNumWrite) := false.B 366f02b5115SWilliam Wang 367f02b5115SWilliam Wang coredataModule.io.waddr(wbNumWrite) := io.uncache.waddr 368f02b5115SWilliam Wang 369f02b5115SWilliam Wang coredataModule.io.fwdMaskWdata(wbNumWrite) := DontCare 370f02b5115SWilliam Wang coredataModule.io.paddrWdata(wbNumWrite) := DontCare 371f02b5115SWilliam Wang coredataModule.io.wdata(wbNumWrite) := io.uncache.wdata 372f02b5115SWilliam Wang 373f02b5115SWilliam Wang // mem access violation check, gen violationMask 374f02b5115SWilliam Wang (0 until StorePipelineWidth).map(i => { 375f02b5115SWilliam Wang paddrModule.io.violationMdata(i) := io.violation(i).paddr 376f02b5115SWilliam Wang maskModule.io.violationMdata(i) := io.violation(i).mask 377f02b5115SWilliam Wang io.violation(i).violationMask := (paddrModule.io.violationMmask(i).asUInt & maskModule.io.violationMmask(i).asUInt).asBools 378f02b5115SWilliam Wang // VecInit((0 until size).map(j => { 379f02b5115SWilliam Wang // val addrMatch = io.violation(i).paddr(PAddrBits - 1, 3) === data(j).paddr(PAddrBits - 1, 3) 380f02b5115SWilliam Wang // val violationVec = (0 until 8).map(k => data(j).mask(k) && io.violation(i).mask(k)) 381f02b5115SWilliam Wang // Cat(violationVec).orR() && addrMatch 382f02b5115SWilliam Wang // })) 383f02b5115SWilliam Wang }) 3847057673cSWilliam Wang 3857057673cSWilliam Wang // refill missed load 3867057673cSWilliam Wang def mergeRefillData(refill: UInt, fwd: UInt, fwdMask: UInt): UInt = { 3877057673cSWilliam Wang val res = Wire(Vec(8, UInt(8.W))) 3887057673cSWilliam Wang (0 until 8).foreach(i => { 3897057673cSWilliam Wang res(i) := Mux(fwdMask(i), fwd(8 * (i + 1) - 1, 8 * i), refill(8 * (i + 1) - 1, 8 * i)) 3907057673cSWilliam Wang }) 3917057673cSWilliam Wang res.asUInt 3927057673cSWilliam Wang } 3937057673cSWilliam Wang 3947d91f790SWilliam Wang // gen paddr match mask 395f02b5115SWilliam Wang paddrModule.io.refillMdata := io.refill.paddr 3967057673cSWilliam Wang (0 until size).map(i => { 397f02b5115SWilliam Wang io.refill.matchMask := paddrModule.io.refillMmask 398f02b5115SWilliam Wang // io.refill.matchMask(i) := get_block_addr(data(i).paddr) === get_block_addr(io.refill.paddr) 3997d91f790SWilliam Wang }) 4007d91f790SWilliam Wang 4017d91f790SWilliam Wang // refill data according to matchMask, refillMask and refill.valid 402f02b5115SWilliam Wang coredataModule.io.refillData := io.refill.data 4037d91f790SWilliam Wang (0 until size).map(i => { 404f02b5115SWilliam Wang coredataModule.io.mwmask(i) := io.refill.valid && io.refill.matchMask(i) && io.refill.refillMask(i) 4057d91f790SWilliam Wang }) 4067d91f790SWilliam Wang 4077d91f790SWilliam Wang // debug data read 408f02b5115SWilliam Wang io.debug := DontCare 4097057673cSWilliam Wang} 410