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