xref: /XiangShan/src/main/scala/xiangshan/mem/lsqueue/LoadQueueData.scala (revision baf8def67baa5d65df39a90251aafa72f2d85760)
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