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) 18*baf8def6SYinan Xu val exception = ExceptionVec() 197057673cSWilliam Wang val fwdMask = Vec(8, Bool()) 207057673cSWilliam Wang} 217057673cSWilliam Wang 22bf6b6e21SWilliam Wang// Data module define 23bf6b6e21SWilliam Wang// These data modules are like SyncDataModuleTemplate, but support cam-like ops 24f02b5115SWilliam Wangclass PaddrModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule with HasDCacheParameters { 25bf6b6e21SWilliam Wang val io = IO(new Bundle { 26f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 27f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt((PAddrBits).W))) 28f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 29f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 30f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 31f02b5115SWilliam Wang val violationMdata = Input(Vec(2, UInt((PAddrBits).W))) 32f02b5115SWilliam Wang val violationMmask = Output(Vec(2, Vec(numEntries, Bool()))) 33f02b5115SWilliam Wang val refillMdata = Input(UInt((PAddrBits).W)) 34f02b5115SWilliam Wang val refillMmask = Output(Vec(numEntries, Bool())) 35bf6b6e21SWilliam Wang }) 36bf6b6e21SWilliam Wang 37f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt((PAddrBits).W))) 38bf6b6e21SWilliam Wang 39bf6b6e21SWilliam Wang // read ports 40bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 41bf6b6e21SWilliam Wang io.rdata(i) := data(io.raddr(i)) 42bf6b6e21SWilliam Wang } 43bf6b6e21SWilliam Wang 44bf6b6e21SWilliam Wang // below is the write ports (with priorities) 45bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 46bf6b6e21SWilliam Wang when (io.wen(i)) { 47bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 48bf6b6e21SWilliam Wang } 49bf6b6e21SWilliam Wang } 50bf6b6e21SWilliam Wang 51bf6b6e21SWilliam Wang // content addressed match 52f02b5115SWilliam Wang for (i <- 0 until 2) { 53bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 54f02b5115SWilliam Wang io.violationMmask(i)(j) := io.violationMdata(i)(PAddrBits-1, 3) === data(j)(PAddrBits-1, 3) 55bf6b6e21SWilliam Wang } 56bf6b6e21SWilliam Wang } 57f02b5115SWilliam Wang 58f02b5115SWilliam Wang for (j <- 0 until numEntries) { 59f02b5115SWilliam Wang io.refillMmask(j) := get_block_addr(io.refillMdata) === get_block_addr(data(j)) 60bf6b6e21SWilliam Wang } 61bf6b6e21SWilliam Wang 62bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 63bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 64bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 65bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 66bf6b6e21SWilliam Wang } 67bf6b6e21SWilliam Wang } 68bf6b6e21SWilliam Wang} 69bf6b6e21SWilliam Wang 70f02b5115SWilliam Wangclass MaskModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule { 71bf6b6e21SWilliam Wang val io = IO(new Bundle { 72f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 73f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(8.W))) 74f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 75f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 76f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(8.W))) 77f02b5115SWilliam Wang val violationMdata = Input(Vec(2, UInt((PAddrBits).W))) 78f02b5115SWilliam Wang val violationMmask = Output(Vec(2, Vec(numEntries, Bool()))) 79bf6b6e21SWilliam Wang }) 80bf6b6e21SWilliam Wang 81f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt(8.W))) 82bf6b6e21SWilliam Wang 83bf6b6e21SWilliam Wang // read ports 84bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 85bf6b6e21SWilliam Wang io.rdata(i) := data(io.raddr(i)) 86bf6b6e21SWilliam Wang } 87bf6b6e21SWilliam Wang 88bf6b6e21SWilliam Wang // below is the write ports (with priorities) 89bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 90bf6b6e21SWilliam Wang when (io.wen(i)) { 91bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 92bf6b6e21SWilliam Wang } 93bf6b6e21SWilliam Wang } 94bf6b6e21SWilliam Wang 95bf6b6e21SWilliam Wang // content addressed match 96f02b5115SWilliam Wang for (i <- 0 until 2) { 97bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 98f02b5115SWilliam Wang io.violationMmask(i)(j) := (io.violationMdata(i) & data(j)).orR 99bf6b6e21SWilliam Wang } 100bf6b6e21SWilliam Wang } 101bf6b6e21SWilliam Wang 102bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 103bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 104bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 105bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 106bf6b6e21SWilliam Wang } 107bf6b6e21SWilliam Wang } 108bf6b6e21SWilliam Wang} 109bf6b6e21SWilliam Wang 110f02b5115SWilliam Wangclass CoredataModule(numEntries: Int, numRead: Int, numWrite: Int) extends XSModule with HasDCacheParameters { 111bf6b6e21SWilliam Wang val io = IO(new Bundle { 112bf6b6e21SWilliam Wang // data io 113bf6b6e21SWilliam Wang // read 114f02b5115SWilliam Wang val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W))) 115f02b5115SWilliam Wang val rdata = Output(Vec(numRead, UInt(XLEN.W))) 116bf6b6e21SWilliam Wang // address indexed write 117f02b5115SWilliam Wang val wen = Input(Vec(numWrite, Bool())) 118f02b5115SWilliam Wang val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W))) 119f02b5115SWilliam Wang val wdata = Input(Vec(numWrite, UInt(XLEN.W))) 120bf6b6e21SWilliam Wang // masked write 121bf6b6e21SWilliam Wang val mwmask = Input(Vec(numEntries, Bool())) 122f02b5115SWilliam Wang val refillData = Input(UInt((cfg.blockBytes * 8).W)) 123bf6b6e21SWilliam Wang 124bf6b6e21SWilliam Wang // fwdMask io 125f02b5115SWilliam Wang val fwdMaskWdata = Input(Vec(numWrite, UInt(8.W))) 126f02b5115SWilliam Wang val fwdMaskWen = Input(Vec(numWrite, Bool())) 127f02b5115SWilliam Wang // fwdMaskWaddr = waddr 128f02b5115SWilliam Wang 129f02b5115SWilliam Wang // paddr io 130f02b5115SWilliam Wang // 3 bits in paddr need to be stored in CoredataModule for refilling 131f02b5115SWilliam Wang val paddrWdata = Input(Vec(numWrite, UInt((PAddrBits).W))) 132f02b5115SWilliam Wang val paddrWen = Input(Vec(numWrite, Bool())) 133bf6b6e21SWilliam Wang }) 134bf6b6e21SWilliam Wang 135f02b5115SWilliam Wang val data = Reg(Vec(numEntries, UInt(XLEN.W))) 136f02b5115SWilliam Wang val fwdMask = Reg(Vec(numEntries, UInt(8.W))) 137f02b5115SWilliam Wang val wordIndex = Reg(Vec(numEntries, UInt((blockOffBits - wordOffBits).W))) 138bf6b6e21SWilliam Wang 139bf6b6e21SWilliam Wang // read ports 140bf6b6e21SWilliam Wang for (i <- 0 until numRead) { 141bf6b6e21SWilliam Wang io.rdata(i) := data(io.raddr(i)) 142bf6b6e21SWilliam Wang } 143bf6b6e21SWilliam Wang 144bf6b6e21SWilliam Wang // below is the write ports (with priorities) 145bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 146bf6b6e21SWilliam Wang when (io.wen(i)) { 147bf6b6e21SWilliam Wang data(io.waddr(i)) := io.wdata(i) 148bf6b6e21SWilliam Wang } 149f02b5115SWilliam Wang when (io.fwdMaskWen(i)) { 150f02b5115SWilliam Wang fwdMask(io.waddr(i)) := io.fwdMaskWdata(i) 151bf6b6e21SWilliam Wang } 152f02b5115SWilliam Wang when (io.paddrWen(i)) { 153f02b5115SWilliam Wang wordIndex(io.waddr(i)) := get_word(io.paddrWdata(i)) 154f02b5115SWilliam Wang } 155f02b5115SWilliam Wang } 156f02b5115SWilliam Wang 157bf6b6e21SWilliam Wang 158bf6b6e21SWilliam Wang // masked write 159bf6b6e21SWilliam Wang // refill missed load 160bf6b6e21SWilliam Wang def mergeRefillData(refill: UInt, fwd: UInt, fwdMask: UInt): UInt = { 161bf6b6e21SWilliam Wang val res = Wire(Vec(8, UInt(8.W))) 162bf6b6e21SWilliam Wang (0 until 8).foreach(i => { 163bf6b6e21SWilliam Wang res(i) := Mux(fwdMask(i), fwd(8 * (i + 1) - 1, 8 * i), refill(8 * (i + 1) - 1, 8 * i)) 164bf6b6e21SWilliam Wang }) 165bf6b6e21SWilliam Wang res.asUInt 166bf6b6e21SWilliam Wang } 167bf6b6e21SWilliam Wang 168f02b5115SWilliam Wang // split dcache result into words 169f02b5115SWilliam Wang val words = VecInit((0 until blockWords) map { i => io.refillData(DataBits * (i + 1) - 1, DataBits * i)}) 170f02b5115SWilliam Wang 171f02b5115SWilliam Wang // refill data according to matchMask, refillMask and refill.vald 172bf6b6e21SWilliam Wang for (j <- 0 until numEntries) { 173bf6b6e21SWilliam Wang when (io.mwmask(j)) { 174f02b5115SWilliam Wang val refillData = words(wordIndex(j)) // TODO 175f02b5115SWilliam Wang data(j) := mergeRefillData(refillData, data(j), fwdMask(j)) 176bf6b6e21SWilliam Wang } 177bf6b6e21SWilliam Wang } 178bf6b6e21SWilliam Wang 179bf6b6e21SWilliam Wang // DataModuleTemplate should not be used when there're any write conflicts 180bf6b6e21SWilliam Wang for (i <- 0 until numWrite) { 181bf6b6e21SWilliam Wang for (j <- i+1 until numWrite) { 182bf6b6e21SWilliam Wang assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j))) 183bf6b6e21SWilliam Wang } 184bf6b6e21SWilliam Wang } 185bf6b6e21SWilliam Wang} 1867057673cSWilliam Wang 1877d91f790SWilliam Wangclass LoadQueueData(size: Int, wbNumRead: Int, wbNumWrite: Int) extends XSModule with HasDCacheParameters with HasCircularQueuePtrHelper { 1887057673cSWilliam Wang val io = IO(new Bundle() { 1897d91f790SWilliam Wang val wb = new Bundle() { 1907d91f790SWilliam Wang val wen = Vec(wbNumWrite, Input(Bool())) 1917d91f790SWilliam Wang val waddr = Input(Vec(wbNumWrite, UInt(log2Up(size).W))) 1927d91f790SWilliam Wang val wdata = Input(Vec(wbNumWrite, new LQDataEntry)) 1937d91f790SWilliam Wang val raddr = Input(Vec(wbNumRead, UInt(log2Up(size).W))) 1947d91f790SWilliam Wang val rdata = Output(Vec(wbNumRead, new LQDataEntry)) 1957d91f790SWilliam Wang } 1967057673cSWilliam Wang val uncache = new Bundle() { 1977057673cSWilliam Wang val wen = Input(Bool()) 1987d91f790SWilliam Wang val waddr = Input(UInt(log2Up(size).W)) 1997d91f790SWilliam Wang val wdata = Input(UInt(XLEN.W)) // only write back uncache data 2007d91f790SWilliam Wang val raddr = Input(UInt(log2Up(size).W)) 2017d91f790SWilliam Wang val rdata = Output(new LQDataEntry) 2027057673cSWilliam Wang } 2037057673cSWilliam Wang val refill = new Bundle() { 2047d91f790SWilliam Wang val valid = Input(Bool()) 2057d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 2067057673cSWilliam Wang val data = Input(UInt((cfg.blockBytes * 8).W)) 2077d91f790SWilliam Wang val refillMask = Input(Vec(size, Bool())) 2087d91f790SWilliam Wang val matchMask = Output(Vec(size, Bool())) 2097057673cSWilliam Wang } 2107d91f790SWilliam Wang val violation = Vec(StorePipelineWidth, new Bundle() { 2117d91f790SWilliam Wang val paddr = Input(UInt(PAddrBits.W)) 2127d91f790SWilliam Wang val mask = Input(UInt(8.W)) 2137d91f790SWilliam Wang val violationMask = Output(Vec(size, Bool())) 2147d91f790SWilliam Wang }) 2157d91f790SWilliam Wang val debug = Output(Vec(size, new LQDataEntry)) 2167057673cSWilliam Wang 2177d91f790SWilliam Wang def wbWrite(channel: Int, waddr: UInt, wdata: LQDataEntry): Unit = { 2187d91f790SWilliam Wang require(channel < wbNumWrite && wbNumWrite >= 0) 2197057673cSWilliam Wang // need extra "this.wb(channel).wen := true.B" 2207d91f790SWilliam Wang this.wb.waddr(channel) := waddr 2217d91f790SWilliam Wang this.wb.wdata(channel) := wdata 2227057673cSWilliam Wang } 2237057673cSWilliam Wang 2247d91f790SWilliam Wang def uncacheWrite(waddr: UInt, wdata: UInt): Unit = { 2257057673cSWilliam Wang // need extra "this.uncache.wen := true.B" 2267d91f790SWilliam Wang this.uncache.waddr := waddr 2277057673cSWilliam Wang this.uncache.wdata := wdata 2287057673cSWilliam Wang } 2297057673cSWilliam Wang 2307057673cSWilliam Wang // def refillWrite(ldIdx: Int): Unit = { 2317057673cSWilliam Wang // } 2327057673cSWilliam Wang // use "this.refill.wen(ldIdx) := true.B" instead 2337057673cSWilliam Wang }) 2347057673cSWilliam Wang 235f02b5115SWilliam Wang // val data = Reg(Vec(size, new LQDataEntry)) 236f02b5115SWilliam Wang // data module 237f02b5115SWilliam Wang val paddrModule = Module(new PaddrModule(size, numRead = 3, numWrite = 2)) 238f02b5115SWilliam Wang val maskModule = Module(new MaskModule(size, numRead = 3, numWrite = 2)) 239*baf8def6SYinan Xu val exceptionModule = Module(new AsyncDataModuleTemplate(ExceptionVec(), size, numRead = 3, numWrite = 2)) 240f02b5115SWilliam Wang val coredataModule = Module(new CoredataModule(size, numRead = 3, numWrite = 3)) 2417057673cSWilliam Wang 242a266fd76SWilliam Wang // read data 243f02b5115SWilliam Wang // read port 0 -> wbNumRead-1 244a266fd76SWilliam Wang (0 until wbNumRead).map(i => { 245f02b5115SWilliam Wang paddrModule.io.raddr(i) := io.wb.raddr(i) 246f02b5115SWilliam Wang maskModule.io.raddr(i) := io.wb.raddr(i) 247f02b5115SWilliam Wang exceptionModule.io.raddr(i) := io.wb.raddr(i) 248f02b5115SWilliam Wang coredataModule.io.raddr(i) := io.wb.raddr(i) 249f02b5115SWilliam Wang 250f02b5115SWilliam Wang io.wb.rdata(i).paddr := paddrModule.io.rdata(i) 251f02b5115SWilliam Wang io.wb.rdata(i).mask := maskModule.io.rdata(i) 252f02b5115SWilliam Wang io.wb.rdata(i).data := coredataModule.io.rdata(i) 253f02b5115SWilliam Wang io.wb.rdata(i).exception := exceptionModule.io.rdata(i) 254f02b5115SWilliam Wang io.wb.rdata(i).fwdMask := DontCare 255a266fd76SWilliam Wang }) 256a266fd76SWilliam Wang 257f02b5115SWilliam Wang // read port wbNumRead 258f02b5115SWilliam Wang paddrModule.io.raddr(wbNumRead) := io.uncache.raddr 259f02b5115SWilliam Wang maskModule.io.raddr(wbNumRead) := io.uncache.raddr 260f02b5115SWilliam Wang exceptionModule.io.raddr(wbNumRead) := io.uncache.raddr 261f02b5115SWilliam Wang coredataModule.io.raddr(wbNumRead) := io.uncache.raddr 262a266fd76SWilliam Wang 263f02b5115SWilliam Wang io.uncache.rdata.paddr := paddrModule.io.rdata(wbNumRead) 264f02b5115SWilliam Wang io.uncache.rdata.mask := maskModule.io.rdata(wbNumRead) 265*baf8def6SYinan Xu io.uncache.rdata.data := coredataModule.io.rdata(wbNumRead) 266*baf8def6SYinan Xu io.uncache.rdata.exception := exceptionModule.io.rdata(wbNumRead) 267f02b5115SWilliam Wang io.uncache.rdata.fwdMask := DontCare 268f02b5115SWilliam Wang 269f02b5115SWilliam Wang // write data 270f02b5115SWilliam Wang // write port 0 -> wbNumWrite-1 2717d91f790SWilliam Wang (0 until wbNumWrite).map(i => { 272f02b5115SWilliam Wang paddrModule.io.wen(i) := false.B 273f02b5115SWilliam Wang maskModule.io.wen(i) := false.B 274f02b5115SWilliam Wang exceptionModule.io.wen(i) := false.B 275f02b5115SWilliam Wang coredataModule.io.wen(i) := false.B 276f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(i) := false.B 277f02b5115SWilliam Wang coredataModule.io.paddrWen(i) := false.B 278f02b5115SWilliam Wang 279f02b5115SWilliam Wang paddrModule.io.waddr(i) := io.wb.waddr(i) 280f02b5115SWilliam Wang maskModule.io.waddr(i) := io.wb.waddr(i) 281f02b5115SWilliam Wang exceptionModule.io.waddr(i) := io.wb.waddr(i) 282f02b5115SWilliam Wang coredataModule.io.waddr(i) := io.wb.waddr(i) 283f02b5115SWilliam Wang 284f02b5115SWilliam Wang paddrModule.io.wdata(i) := io.wb.wdata(i).paddr 285f02b5115SWilliam Wang maskModule.io.wdata(i) := io.wb.wdata(i).mask 286f02b5115SWilliam Wang exceptionModule.io.wdata(i) := io.wb.wdata(i).exception 287f02b5115SWilliam Wang coredataModule.io.wdata(i) := io.wb.wdata(i).data 288f02b5115SWilliam Wang coredataModule.io.fwdMaskWdata(i) := io.wb.wdata(i).fwdMask.asUInt 289f02b5115SWilliam Wang coredataModule.io.paddrWdata(i) := io.wb.wdata(i).paddr 290f02b5115SWilliam Wang 2917d91f790SWilliam Wang when(io.wb.wen(i)){ 292f02b5115SWilliam Wang paddrModule.io.wen(i) := true.B 293f02b5115SWilliam Wang maskModule.io.wen(i) := true.B 294f02b5115SWilliam Wang exceptionModule.io.wen(i) := true.B 295f02b5115SWilliam Wang coredataModule.io.wen(i) := true.B 296f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(i) := true.B 297f02b5115SWilliam Wang coredataModule.io.paddrWen(i) := true.B 2987057673cSWilliam Wang } 2997057673cSWilliam Wang }) 3007057673cSWilliam Wang 301f02b5115SWilliam Wang // write port wbNumWrite 302f02b5115SWilliam Wang // exceptionModule.io.wen(wbNumWrite) := false.B 303f02b5115SWilliam Wang coredataModule.io.wen(wbNumWrite) := io.uncache.wen 304f02b5115SWilliam Wang coredataModule.io.fwdMaskWen(wbNumWrite) := false.B 305f02b5115SWilliam Wang coredataModule.io.paddrWen(wbNumWrite) := false.B 306f02b5115SWilliam Wang 307f02b5115SWilliam Wang coredataModule.io.waddr(wbNumWrite) := io.uncache.waddr 308f02b5115SWilliam Wang 309f02b5115SWilliam Wang coredataModule.io.fwdMaskWdata(wbNumWrite) := DontCare 310f02b5115SWilliam Wang coredataModule.io.paddrWdata(wbNumWrite) := DontCare 311f02b5115SWilliam Wang coredataModule.io.wdata(wbNumWrite) := io.uncache.wdata 312f02b5115SWilliam Wang 313f02b5115SWilliam Wang // mem access violation check, gen violationMask 314f02b5115SWilliam Wang (0 until StorePipelineWidth).map(i => { 315f02b5115SWilliam Wang paddrModule.io.violationMdata(i) := io.violation(i).paddr 316f02b5115SWilliam Wang maskModule.io.violationMdata(i) := io.violation(i).mask 317f02b5115SWilliam Wang io.violation(i).violationMask := (paddrModule.io.violationMmask(i).asUInt & maskModule.io.violationMmask(i).asUInt).asBools 318f02b5115SWilliam Wang // VecInit((0 until size).map(j => { 319f02b5115SWilliam Wang // val addrMatch = io.violation(i).paddr(PAddrBits - 1, 3) === data(j).paddr(PAddrBits - 1, 3) 320f02b5115SWilliam Wang // val violationVec = (0 until 8).map(k => data(j).mask(k) && io.violation(i).mask(k)) 321f02b5115SWilliam Wang // Cat(violationVec).orR() && addrMatch 322f02b5115SWilliam Wang // })) 323f02b5115SWilliam Wang }) 3247057673cSWilliam Wang 3257057673cSWilliam Wang // refill missed load 3267057673cSWilliam Wang def mergeRefillData(refill: UInt, fwd: UInt, fwdMask: UInt): UInt = { 3277057673cSWilliam Wang val res = Wire(Vec(8, UInt(8.W))) 3287057673cSWilliam Wang (0 until 8).foreach(i => { 3297057673cSWilliam Wang res(i) := Mux(fwdMask(i), fwd(8 * (i + 1) - 1, 8 * i), refill(8 * (i + 1) - 1, 8 * i)) 3307057673cSWilliam Wang }) 3317057673cSWilliam Wang res.asUInt 3327057673cSWilliam Wang } 3337057673cSWilliam Wang 3347d91f790SWilliam Wang // gen paddr match mask 335f02b5115SWilliam Wang paddrModule.io.refillMdata := io.refill.paddr 3367057673cSWilliam Wang (0 until size).map(i => { 337f02b5115SWilliam Wang io.refill.matchMask := paddrModule.io.refillMmask 338f02b5115SWilliam Wang // io.refill.matchMask(i) := get_block_addr(data(i).paddr) === get_block_addr(io.refill.paddr) 3397d91f790SWilliam Wang }) 3407d91f790SWilliam Wang 3417d91f790SWilliam Wang // refill data according to matchMask, refillMask and refill.valid 342f02b5115SWilliam Wang coredataModule.io.refillData := io.refill.data 3437d91f790SWilliam Wang (0 until size).map(i => { 344f02b5115SWilliam Wang coredataModule.io.mwmask(i) := io.refill.valid && io.refill.matchMask(i) && io.refill.refillMask(i) 3457d91f790SWilliam Wang }) 3467d91f790SWilliam Wang 3477d91f790SWilliam Wang // debug data read 348f02b5115SWilliam Wang io.debug := DontCare 3497057673cSWilliam Wang} 350