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