17057673cSWilliam Wangpackage xiangshan.mem 27057673cSWilliam Wang 37057673cSWilliam Wangimport chisel3._ 47057673cSWilliam Wangimport chisel3.util._ 57057673cSWilliam Wangimport utils._ 67057673cSWilliam Wangimport xiangshan._ 77057673cSWilliam Wangimport xiangshan.cache._ 87057673cSWilliam Wangimport xiangshan.cache.{DCacheWordIO, DCacheLineIO, TlbRequestIO, MemoryOpConstants} 97057673cSWilliam Wangimport xiangshan.backend.LSUOpType 107057673cSWilliam Wangimport xiangshan.mem._ 117057673cSWilliam Wangimport xiangshan.backend.roq.RoqPtr 127057673cSWilliam Wang 137057673cSWilliam Wangclass LQDataEntry extends XSBundle { 147057673cSWilliam Wang // val vaddr = UInt(VAddrBits.W) 157057673cSWilliam Wang val paddr = UInt(PAddrBits.W) 167057673cSWilliam Wang val mask = UInt(8.W) 177057673cSWilliam Wang val data = UInt(XLEN.W) 187057673cSWilliam Wang val fwdMask = Vec(8, Bool()) 197057673cSWilliam Wang} 207057673cSWilliam Wang 21bf6b6e21SWilliam Wang// Data module define 22bf6b6e21SWilliam Wang// These data modules are like SyncDataModuleTemplate, but support cam-like ops 23b5b78226SWilliam Wangclass LQPaddrModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule with HasDCacheParameters { 24bf6b6e21SWilliam Wang val io = IO(new Bundle { 25f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 26f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt((PAddrBits).W))) 27f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 28f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 29f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 30f02b5115SWilliam Wang val violationMdata = Input(Vec(2, UInt((PAddrBits).W))) 31f02b5115SWilliam Wang val violationMmask = Output(Vec(2, Vec(numEntries, Bool()))) 32f02b5115SWilliam Wang val refillMdata = Input(UInt((PAddrBits).W)) 33f02b5115SWilliam Wang val refillMmask = Output(Vec(numEntries, Bool())) 34bf6b6e21SWilliam Wang }) 35bf6b6e21SWilliam Wang 36f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt((PAddrBits).W))) 37bf6b6e21SWilliam Wang 38bf6b6e21SWilliam Wang // read ports 39bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 4059a7acd8SWilliam Wang io.rdata(i) := data(RegNext(io.raddr(i))) 41bf6b6e21SWilliam Wang } 42bf6b6e21SWilliam Wang 43bf6b6e21SWilliam Wang // below is the write ports (with priorities) 44bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 45bf6b6e21SWilliam Wang when (io.wen(i)) { 46bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 47bf6b6e21SWilliam Wang } 48bf6b6e21SWilliam Wang } 49bf6b6e21SWilliam Wang 50bf6b6e21SWilliam Wang // content addressed match 51f02b5115SWilliam Wang for (i <- 0 until 2) { 52bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 53f02b5115SWilliam Wang io.violationMmask(i)(j) := io.violationMdata(i)(PAddrBits-1, 3) === data(j)(PAddrBits-1, 3) 54bf6b6e21SWilliam Wang } 55bf6b6e21SWilliam Wang } 56f02b5115SWilliam Wang 57f02b5115SWilliam Wang for (j <- 0 until numEntries) { 58f02b5115SWilliam Wang io.refillMmask(j) := get_block_addr(io.refillMdata) === get_block_addr(data(j)) 59bf6b6e21SWilliam Wang } 60bf6b6e21SWilliam Wang 61bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 62bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 63bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 64bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 65bf6b6e21SWilliam Wang } 66bf6b6e21SWilliam Wang } 67bf6b6e21SWilliam Wang} 68bf6b6e21SWilliam Wang 69f02b5115SWilliam Wangclass MaskModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule { 70bf6b6e21SWilliam Wang val io = IO(new Bundle { 71f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 72f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(8.W))) 73f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 74f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 75f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(8.W))) 76f02b5115SWilliam Wang val violationMdata = Input(Vec(2, UInt((PAddrBits).W))) 77f02b5115SWilliam Wang val violationMmask = Output(Vec(2, Vec(numEntries, Bool()))) 78bf6b6e21SWilliam Wang }) 79bf6b6e21SWilliam Wang 80f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt(8.W))) 81bf6b6e21SWilliam Wang 82bf6b6e21SWilliam Wang // read ports 83bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 8459a7acd8SWilliam Wang io.rdata(i) := data(RegNext(io.raddr(i))) 85bf6b6e21SWilliam Wang } 86bf6b6e21SWilliam Wang 87bf6b6e21SWilliam Wang // below is the write ports (with priorities) 88bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 89bf6b6e21SWilliam Wang when (io.wen(i)) { 90bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 91bf6b6e21SWilliam Wang } 92bf6b6e21SWilliam Wang } 93bf6b6e21SWilliam Wang 94bf6b6e21SWilliam Wang // content addressed match 95f02b5115SWilliam Wang for (i <- 0 until 2) { 96bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 97f02b5115SWilliam Wang io.violationMmask(i)(j) := (io.violationMdata(i) & data(j)).orR 98bf6b6e21SWilliam Wang } 99bf6b6e21SWilliam Wang } 100bf6b6e21SWilliam Wang 101bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 102bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 103bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 104bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 105bf6b6e21SWilliam Wang } 106bf6b6e21SWilliam Wang } 107bf6b6e21SWilliam Wang} 108bf6b6e21SWilliam Wang 109*0f22ee7cSWilliam Wang// class LQData8Module(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule with HasDCacheParameters { 110*0f22ee7cSWilliam Wang// val io = IO(new Bundle { 111*0f22ee7cSWilliam Wang// // read 112*0f22ee7cSWilliam Wang// val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 113*0f22ee7cSWilliam Wang// val rdata = Output(Vec(numRead, UInt(8.W))) 114*0f22ee7cSWilliam Wang// // address indexed write 115*0f22ee7cSWilliam Wang// val wen = Input(Vec(numWrite, Bool())) 116*0f22ee7cSWilliam Wang// val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 117*0f22ee7cSWilliam Wang// val wdata = Input(Vec(numWrite, UInt(8.W))) 118*0f22ee7cSWilliam Wang// // masked write 119*0f22ee7cSWilliam Wang// val mwmask = Input(Vec(blockWords, Vec(numEntries, Bool()))) 120*0f22ee7cSWilliam Wang// val mwdata = Input(Vec(blockWords, UInt(8.W))) 121*0f22ee7cSWilliam Wang// }) 1221c2ecc42SWilliam Wang 123*0f22ee7cSWilliam Wang// val data = Reg(Vec(numEntries, UInt(8.W))) 1241c2ecc42SWilliam Wang 125*0f22ee7cSWilliam Wang// // read ports 126*0f22ee7cSWilliam Wang// for (i <- 0 until numRead) { 127*0f22ee7cSWilliam Wang// io.rdata(i) := data(RegNext(io.raddr(i))) 128*0f22ee7cSWilliam Wang// } 1291c2ecc42SWilliam Wang 130*0f22ee7cSWilliam Wang// // below is the write ports (with priorities) 131*0f22ee7cSWilliam Wang// for (i <- 0 until numWrite) { 132*0f22ee7cSWilliam Wang// when (io.wen(i)) { 133*0f22ee7cSWilliam Wang// data(io.waddr(i)) := io.wdata(i) 134*0f22ee7cSWilliam Wang// } 135*0f22ee7cSWilliam Wang// } 1361c2ecc42SWilliam Wang 137*0f22ee7cSWilliam Wang// // masked write 138*0f22ee7cSWilliam Wang// for (j <- 0 until numEntries) { 139*0f22ee7cSWilliam Wang// val wen = VecInit((0 until blockWords).map(i => io.mwmask(i)(j))).asUInt.orR 140*0f22ee7cSWilliam Wang// when (wen) { 141*0f22ee7cSWilliam Wang// data(j) := VecInit((0 until blockWords).map(i => { 142*0f22ee7cSWilliam Wang// Mux(io.mwmask(i)(j), io.mwdata(i), 0.U) 143*0f22ee7cSWilliam Wang// })).reduce(_ | _) 144*0f22ee7cSWilliam Wang// } 145*0f22ee7cSWilliam Wang// } 1461c2ecc42SWilliam Wang 147*0f22ee7cSWilliam Wang// // DataModuleTemplate should not be used when there're any write conflicts 148*0f22ee7cSWilliam Wang// for (i <- 0 until numWrite) { 149*0f22ee7cSWilliam Wang// for (j <- i+1 until numWrite) { 150*0f22ee7cSWilliam Wang// assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 151*0f22ee7cSWilliam Wang// } 152*0f22ee7cSWilliam Wang// } 153*0f22ee7cSWilliam Wang// } 1541c2ecc42SWilliam Wang 155f02b5115SWilliam Wangclass CoredataModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule with HasDCacheParameters { 156bf6b6e21SWilliam Wang val io = IO(new Bundle { 157bf6b6e21SWilliam Wang // data io 158bf6b6e21SWilliam Wang // read 159f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 160f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(XLEN.W))) 161bf6b6e21SWilliam Wang // address indexed write 162f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 163f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 164f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(XLEN.W))) 165bf6b6e21SWilliam Wang // masked write 166bf6b6e21SWilliam Wang val mwmask = Input(Vec(numEntries, Bool())) 167f02b5115SWilliam Wang val refillData = Input(UInt((cfg.blockBytes * 8).W)) 168bf6b6e21SWilliam Wang 169bf6b6e21SWilliam Wang // fwdMask io 170f02b5115SWilliam Wang val fwdMaskWdata = Input(Vec(numWrite, UInt(8.W))) 171f02b5115SWilliam Wang val fwdMaskWen = Input(Vec(numWrite, Bool())) 172f02b5115SWilliam Wang // fwdMaskWaddr = waddr 173f02b5115SWilliam Wang 174f02b5115SWilliam Wang // paddr io 175f02b5115SWilliam Wang // 3 bits in paddr need to be stored in CoredataModule for refilling 176f02b5115SWilliam Wang val paddrWdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 177f02b5115SWilliam Wang val paddrWen = Input(Vec(numWrite, Bool())) 178bf6b6e21SWilliam Wang }) 179bf6b6e21SWilliam Wang 180*0f22ee7cSWilliam Wang val data8 = Seq.fill(8)(Module(new MaskedSyncDataModuleTemplate(UInt(8.W), numEntries, numRead, numWrite, numMWrite = blockWords))) 181f02b5115SWilliam Wang val fwdMask = Reg(Vec(numEntries, UInt(8.W))) 182f02b5115SWilliam Wang val wordIndex = Reg(Vec(numEntries, UInt((blockOffBits - wordOffBits).W))) 183bf6b6e21SWilliam Wang 184bf6b6e21SWilliam Wang // read ports 185bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 1861c2ecc42SWilliam Wang for (j <- 0 until 8) { 1871c2ecc42SWilliam Wang data8(j).io.raddr(i) := io.raddr(i) 1881c2ecc42SWilliam Wang } 1891c2ecc42SWilliam Wang io.rdata(i) := VecInit((0 until 8).map(j => data8(j).io.rdata(i))).asUInt 190bf6b6e21SWilliam Wang } 191bf6b6e21SWilliam Wang 192bf6b6e21SWilliam Wang // below is the write ports (with priorities) 193bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 1941c2ecc42SWilliam Wang // write to data8 1951c2ecc42SWilliam Wang for (j <- 0 until 8) { 1961c2ecc42SWilliam Wang data8(j).io.waddr(i) := io.waddr(i) 1971c2ecc42SWilliam Wang data8(j).io.wdata(i) := io.wdata(i)(8*(j+1)-1, 8*j) 1981c2ecc42SWilliam Wang data8(j).io.wen(i) := io.wen(i) 199bf6b6e21SWilliam Wang } 2001c2ecc42SWilliam Wang 2011c2ecc42SWilliam Wang // write ctrl info 202f02b5115SWilliam Wang when (io.fwdMaskWen(i)) { 203f02b5115SWilliam Wang fwdMask(io.waddr(i)) := io.fwdMaskWdata(i) 204bf6b6e21SWilliam Wang } 205f02b5115SWilliam Wang when (io.paddrWen(i)) { 206f02b5115SWilliam Wang wordIndex(io.waddr(i)) := get_word(io.paddrWdata(i)) 207f02b5115SWilliam Wang } 208f02b5115SWilliam Wang } 209f02b5115SWilliam Wang 2101c2ecc42SWilliam Wang // write refilled data to data8 211bf6b6e21SWilliam Wang 2121c2ecc42SWilliam Wang // select refill data 213f02b5115SWilliam Wang // split dcache result into words 214f02b5115SWilliam Wang val words = VecInit((0 until blockWords) map { i => io.refillData(DataBits * (i + 1) - 1, DataBits * i)}) 2151c2ecc42SWilliam Wang // select refill data according to wordIndex (paddr) 2161c2ecc42SWilliam Wang for (i <- 0 until 8) { 2176251d905SWilliam Wang for (j <- 0 until blockWords) { 2186251d905SWilliam Wang data8(i).io.mwdata(j) := words(j)(8*(i+1)-1, 8*i) 2191c2ecc42SWilliam Wang } 2201c2ecc42SWilliam Wang } 2216251d905SWilliam Wang 2221c2ecc42SWilliam Wang // gen refill wmask 2236251d905SWilliam Wang for (j <- 0 until blockWords) { 2246251d905SWilliam Wang for (k <- 0 until numEntries) { 2256251d905SWilliam Wang val wordMatch = wordIndex(k) === j.U 2261c2ecc42SWilliam Wang for (i <- 0 until 8) { 2276251d905SWilliam Wang data8(i).io.mwmask(j)(k) := wordMatch && io.mwmask(k) && !fwdMask(k)(i) 2286251d905SWilliam Wang } 229bf6b6e21SWilliam Wang } 230bf6b6e21SWilliam Wang } 231bf6b6e21SWilliam Wang 232bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 233bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 234bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 235bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 236bf6b6e21SWilliam Wang } 237bf6b6e21SWilliam Wang } 238bf6b6e21SWilliam Wang} 2397057673cSWilliam Wang 2407d91f790SWilliam Wangclass LoadQueueData(size: Int, wbNumRead: Int, wbNumWrite: Int) extends XSModule with HasDCacheParameters with HasCircularQueuePtrHelper { 2417057673cSWilliam Wang val io = IO(new Bundle() { 2427d91f790SWilliam Wang val wb = new Bundle() { 2437d91f790SWilliam Wang val wen = Vec(wbNumWrite, Input(Bool())) 2447d91f790SWilliam Wang val waddr = Input(Vec(wbNumWrite, UInt(log2Up(size).W))) 2457d91f790SWilliam Wang val wdata = Input(Vec(wbNumWrite, new LQDataEntry)) 2467d91f790SWilliam Wang val raddr = Input(Vec(wbNumRead, UInt(log2Up(size).W))) 2477d91f790SWilliam Wang val rdata = Output(Vec(wbNumRead, new LQDataEntry)) 2487d91f790SWilliam Wang } 2497057673cSWilliam Wang val uncache = new Bundle() { 2507057673cSWilliam Wang val wen = Input(Bool()) 2517d91f790SWilliam Wang val waddr = Input(UInt(log2Up(size).W)) 2527d91f790SWilliam Wang val wdata = Input(UInt(XLEN.W)) // only write back uncache data 2537d91f790SWilliam Wang val raddr = Input(UInt(log2Up(size).W)) 2547d91f790SWilliam Wang val rdata = Output(new LQDataEntry) 2557057673cSWilliam Wang } 2567057673cSWilliam Wang val refill = new Bundle() { 2577d91f790SWilliam Wang val valid = Input(Bool()) 2587d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 2597057673cSWilliam Wang val data = Input(UInt((cfg.blockBytes * 8).W)) 2607d91f790SWilliam Wang val refillMask = Input(Vec(size, Bool())) 2617d91f790SWilliam Wang val matchMask = Output(Vec(size, Bool())) 2627057673cSWilliam Wang } 2637d91f790SWilliam Wang val violation = Vec(StorePipelineWidth, new Bundle() { 2647d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 2657d91f790SWilliam Wang val mask = Input(UInt(8.W)) 2667d91f790SWilliam Wang val violationMask = Output(Vec(size, Bool())) 2677d91f790SWilliam Wang }) 2687d91f790SWilliam Wang val debug = Output(Vec(size, new LQDataEntry)) 2697057673cSWilliam Wang 2707d91f790SWilliam Wang def wbWrite(channel: Int, waddr: UInt, wdata: LQDataEntry): Unit = { 2717d91f790SWilliam Wang require(channel < wbNumWrite && wbNumWrite >= 0) 2727057673cSWilliam Wang // need extra "this.wb(channel).wen := true.B" 2737d91f790SWilliam Wang this.wb.waddr(channel) := waddr 2747d91f790SWilliam Wang this.wb.wdata(channel) := wdata 2757057673cSWilliam Wang } 2767057673cSWilliam Wang 2777d91f790SWilliam Wang def uncacheWrite(waddr: UInt, wdata: UInt): Unit = { 2787057673cSWilliam Wang // need extra "this.uncache.wen := true.B" 2797d91f790SWilliam Wang this.uncache.waddr := waddr 2807057673cSWilliam Wang this.uncache.wdata := wdata 2817057673cSWilliam Wang } 2827057673cSWilliam Wang 2837057673cSWilliam Wang // def refillWrite(ldIdx: Int): Unit = { 2847057673cSWilliam Wang // } 2857057673cSWilliam Wang // use "this.refill.wen(ldIdx) := true.B" instead 2867057673cSWilliam Wang }) 2877057673cSWilliam Wang 288f02b5115SWilliam Wang // val data = Reg(Vec(size, new LQDataEntry)) 289f02b5115SWilliam Wang // data module 290b5b78226SWilliam Wang val paddrModule = Module(new LQPaddrModule(size, numRead = 3, numWrite = 2)) 291f02b5115SWilliam Wang val maskModule = Module(new MaskModule(size, numRead = 3, numWrite = 2)) 292f02b5115SWilliam Wang val coredataModule = Module(new CoredataModule(size, numRead = 3, numWrite = 3)) 2937057673cSWilliam Wang 294a266fd76SWilliam Wang // read data 295f02b5115SWilliam Wang // read port 0 -> wbNumRead-1 296a266fd76SWilliam Wang (0 until wbNumRead).map(i => { 297f02b5115SWilliam Wang paddrModule.io.raddr(i) := io.wb.raddr(i) 298f02b5115SWilliam Wang maskModule.io.raddr(i) := io.wb.raddr(i) 299f02b5115SWilliam Wang coredataModule.io.raddr(i) := io.wb.raddr(i) 300f02b5115SWilliam Wang 301f02b5115SWilliam Wang io.wb.rdata(i).paddr := paddrModule.io.rdata(i) 302f02b5115SWilliam Wang io.wb.rdata(i).mask := maskModule.io.rdata(i) 303f02b5115SWilliam Wang io.wb.rdata(i).data := coredataModule.io.rdata(i) 304f02b5115SWilliam Wang io.wb.rdata(i).fwdMask := DontCare 305a266fd76SWilliam Wang }) 306a266fd76SWilliam Wang 307f02b5115SWilliam Wang // read port wbNumRead 308f02b5115SWilliam Wang paddrModule.io.raddr(wbNumRead) := io.uncache.raddr 309f02b5115SWilliam Wang maskModule.io.raddr(wbNumRead) := io.uncache.raddr 310f02b5115SWilliam Wang coredataModule.io.raddr(wbNumRead) := io.uncache.raddr 311a266fd76SWilliam Wang 312f02b5115SWilliam Wang io.uncache.rdata.paddr := paddrModule.io.rdata(wbNumRead) 313f02b5115SWilliam Wang io.uncache.rdata.mask := maskModule.io.rdata(wbNumRead) 314baf8def6SYinan Xu io.uncache.rdata.data := coredataModule.io.rdata(wbNumRead) 315f02b5115SWilliam Wang io.uncache.rdata.fwdMask := DontCare 316f02b5115SWilliam Wang 317f02b5115SWilliam Wang // write data 318f02b5115SWilliam Wang // write port 0 -> wbNumWrite-1 3197d91f790SWilliam Wang (0 until wbNumWrite).map(i => { 320f02b5115SWilliam Wang paddrModule.io.wen(i) := false.B 321f02b5115SWilliam Wang maskModule.io.wen(i) := false.B 322f02b5115SWilliam Wang coredataModule.io.wen(i) := false.B 323f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(i) := false.B 324f02b5115SWilliam Wang coredataModule.io.paddrWen(i) := false.B 325f02b5115SWilliam Wang 326f02b5115SWilliam Wang paddrModule.io.waddr(i) := io.wb.waddr(i) 327f02b5115SWilliam Wang maskModule.io.waddr(i) := io.wb.waddr(i) 328f02b5115SWilliam Wang coredataModule.io.waddr(i) := io.wb.waddr(i) 329f02b5115SWilliam Wang 330f02b5115SWilliam Wang paddrModule.io.wdata(i) := io.wb.wdata(i).paddr 331f02b5115SWilliam Wang maskModule.io.wdata(i) := io.wb.wdata(i).mask 332f02b5115SWilliam Wang coredataModule.io.wdata(i) := io.wb.wdata(i).data 333f02b5115SWilliam Wang coredataModule.io.fwdMaskWdata(i) := io.wb.wdata(i).fwdMask.asUInt 334f02b5115SWilliam Wang coredataModule.io.paddrWdata(i) := io.wb.wdata(i).paddr 335f02b5115SWilliam Wang 3367d91f790SWilliam Wang when(io.wb.wen(i)){ 337f02b5115SWilliam Wang paddrModule.io.wen(i) := true.B 338f02b5115SWilliam Wang maskModule.io.wen(i) := true.B 339f02b5115SWilliam Wang coredataModule.io.wen(i) := true.B 340f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(i) := true.B 341f02b5115SWilliam Wang coredataModule.io.paddrWen(i) := true.B 3427057673cSWilliam Wang } 3437057673cSWilliam Wang }) 3447057673cSWilliam Wang 345f02b5115SWilliam Wang // write port wbNumWrite 346f02b5115SWilliam Wang // exceptionModule.io.wen(wbNumWrite) := false.B 347f02b5115SWilliam Wang coredataModule.io.wen(wbNumWrite) := io.uncache.wen 348f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(wbNumWrite) := false.B 349f02b5115SWilliam Wang coredataModule.io.paddrWen(wbNumWrite) := false.B 350f02b5115SWilliam Wang 351f02b5115SWilliam Wang coredataModule.io.waddr(wbNumWrite) := io.uncache.waddr 352f02b5115SWilliam Wang 353f02b5115SWilliam Wang coredataModule.io.fwdMaskWdata(wbNumWrite) := DontCare 354f02b5115SWilliam Wang coredataModule.io.paddrWdata(wbNumWrite) := DontCare 355f02b5115SWilliam Wang coredataModule.io.wdata(wbNumWrite) := io.uncache.wdata 356f02b5115SWilliam Wang 357f02b5115SWilliam Wang // mem access violation check, gen violationMask 358f02b5115SWilliam Wang (0 until StorePipelineWidth).map(i => { 359f02b5115SWilliam Wang paddrModule.io.violationMdata(i) := io.violation(i).paddr 360f02b5115SWilliam Wang maskModule.io.violationMdata(i) := io.violation(i).mask 361f02b5115SWilliam Wang io.violation(i).violationMask := (paddrModule.io.violationMmask(i).asUInt & maskModule.io.violationMmask(i).asUInt).asBools 362f02b5115SWilliam Wang // VecInit((0 until size).map(j => { 363f02b5115SWilliam Wang // val addrMatch = io.violation(i).paddr(PAddrBits - 1, 3) === data(j).paddr(PAddrBits - 1, 3) 364f02b5115SWilliam Wang // val violationVec = (0 until 8).map(k => data(j).mask(k) && io.violation(i).mask(k)) 365f02b5115SWilliam Wang // Cat(violationVec).orR() && addrMatch 366f02b5115SWilliam Wang // })) 367f02b5115SWilliam Wang }) 3687057673cSWilliam Wang 3697057673cSWilliam Wang // refill missed load 3707057673cSWilliam Wang def mergeRefillData(refill: UInt, fwd: UInt, fwdMask: UInt): UInt = { 3717057673cSWilliam Wang val res = Wire(Vec(8, UInt(8.W))) 3727057673cSWilliam Wang (0 until 8).foreach(i => { 3737057673cSWilliam Wang res(i) := Mux(fwdMask(i), fwd(8 * (i + 1) - 1, 8 * i), refill(8 * (i + 1) - 1, 8 * i)) 3747057673cSWilliam Wang }) 3757057673cSWilliam Wang res.asUInt 3767057673cSWilliam Wang } 3777057673cSWilliam Wang 3787d91f790SWilliam Wang // gen paddr match mask 379f02b5115SWilliam Wang paddrModule.io.refillMdata := io.refill.paddr 3807057673cSWilliam Wang (0 until size).map(i => { 381f02b5115SWilliam Wang io.refill.matchMask := paddrModule.io.refillMmask 382f02b5115SWilliam Wang // io.refill.matchMask(i) := get_block_addr(data(i).paddr) === get_block_addr(io.refill.paddr) 3837d91f790SWilliam Wang }) 3847d91f790SWilliam Wang 3857d91f790SWilliam Wang // refill data according to matchMask, refillMask and refill.valid 386f02b5115SWilliam Wang coredataModule.io.refillData := io.refill.data 3877d91f790SWilliam Wang (0 until size).map(i => { 388f02b5115SWilliam Wang coredataModule.io.mwmask(i) := io.refill.valid && io.refill.matchMask(i) && io.refill.refillMask(i) 3897d91f790SWilliam Wang }) 3907d91f790SWilliam Wang 3917d91f790SWilliam Wang // debug data read 392f02b5115SWilliam Wang io.debug := DontCare 3937057673cSWilliam Wang} 394