xref: /XiangShan/src/main/scala/xiangshan/mem/lsqueue/LoadQueueData.scala (revision ef3b5b96e697fe1e66444958bec608e8b259fb5b)
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._
279aca92b9SYinan Xuimport xiangshan.backend.rob.RobPtr
287057673cSWilliam Wang
292225d46eSJiawei Linclass LQDataEntry(implicit p: Parameters) extends XSBundle {
307057673cSWilliam Wang  val paddr = UInt(PAddrBits.W)
317057673cSWilliam Wang  val mask = UInt(8.W)
327057673cSWilliam Wang  val data = UInt(XLEN.W)
337057673cSWilliam Wang  val fwdMask = Vec(8, Bool())
347057673cSWilliam Wang}
357057673cSWilliam Wang
36bf6b6e21SWilliam Wang// Data module define
37bf6b6e21SWilliam Wang// These data modules are like SyncDataModuleTemplate, but support cam-like ops
3896b1e495SWilliam Wang
3996b1e495SWilliam Wang// load queue paddr module
4096b1e495SWilliam Wang//
4196b1e495SWilliam Wang// It supports 3 cam sources:
4296b1e495SWilliam Wang// * st-ld violation addr cam
4396b1e495SWilliam Wang// * data release addr cam
4496b1e495SWilliam Wang// * data refill addr cam
452225d46eSJiawei Linclass LQPaddrModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters {
46bf6b6e21SWilliam Wang  val io = IO(new Bundle {
4796b1e495SWilliam Wang    // normal read/write ports
48f02b5115SWilliam Wang    val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W)))
49f02b5115SWilliam Wang    val rdata = Output(Vec(numRead, UInt((PAddrBits).W)))
50f02b5115SWilliam Wang    val wen   = Input(Vec(numWrite, Bool()))
51f02b5115SWilliam Wang    val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W)))
52f02b5115SWilliam Wang    val wdata = Input(Vec(numWrite, UInt((PAddrBits).W)))
5396b1e495SWilliam Wang    // violation cam: hit if addr is in the same word
5496b1e495SWilliam Wang    val violationMdata = Input(Vec(StorePipelineWidth, UInt((PAddrBits).W))) // addr
5596b1e495SWilliam Wang    val violationMmask = Output(Vec(StorePipelineWidth, Vec(numEntries, Bool()))) // cam result mask
5696b1e495SWilliam Wang    // release cam: hit if addr is in the same cacheline
5767682d05SWilliam Wang    val releaseMdata = Input(Vec(LoadPipelineWidth, UInt((PAddrBits).W)))
5867682d05SWilliam Wang    val releaseMmask = Output(Vec(LoadPipelineWidth, Vec(numEntries, Bool())))
5996b1e495SWilliam Wang    // refill cam: hit if addr is in the same cacheline
60f02b5115SWilliam Wang    val refillMdata = Input(UInt((PAddrBits).W))
61f02b5115SWilliam Wang    val refillMmask = Output(Vec(numEntries, Bool()))
62bf6b6e21SWilliam Wang  })
63bf6b6e21SWilliam Wang
64f02b5115SWilliam Wang  val data = Reg(Vec(numEntries, UInt((PAddrBits).W)))
65bf6b6e21SWilliam Wang
66bf6b6e21SWilliam Wang  // read ports
67bf6b6e21SWilliam Wang  for (i <- 0 until numRead) {
6859a7acd8SWilliam Wang    io.rdata(i) := data(RegNext(io.raddr(i)))
69bf6b6e21SWilliam Wang  }
70bf6b6e21SWilliam Wang
71bf6b6e21SWilliam Wang  // below is the write ports (with priorities)
72bf6b6e21SWilliam Wang  for (i <- 0 until numWrite) {
73bf6b6e21SWilliam Wang    when (io.wen(i)) {
74bf6b6e21SWilliam Wang      data(io.waddr(i)) := io.wdata(i)
75bf6b6e21SWilliam Wang    }
76bf6b6e21SWilliam Wang  }
77bf6b6e21SWilliam Wang
78bf6b6e21SWilliam Wang  // content addressed match
7967682d05SWilliam Wang  for (i <- 0 until StorePipelineWidth) {
80bf6b6e21SWilliam Wang    for (j <- 0 until numEntries) {
81*ef3b5b96SWilliam Wang      io.violationMmask(i)(j) := io.violationMdata(i)(PAddrBits-1, DCacheWordOffset) === data(j)(PAddrBits-1, DCacheWordOffset)
8267682d05SWilliam Wang    }
8367682d05SWilliam Wang  }
8467682d05SWilliam Wang  for (i <- 0 until LoadPipelineWidth) {
8567682d05SWilliam Wang    for (j <- 0 until numEntries) {
86*ef3b5b96SWilliam Wang      io.releaseMmask(i)(j) := io.releaseMdata(i)(PAddrBits-1, DCacheLineOffset) === data(j)(PAddrBits-1, DCacheLineOffset)
87bf6b6e21SWilliam Wang    }
88bf6b6e21SWilliam Wang  }
89f02b5115SWilliam Wang
90f02b5115SWilliam Wang  for (j <- 0 until numEntries) {
91594ba8acSWilliam Wang    io.refillMmask(j) := get_refill_addr(io.refillMdata) === get_refill_addr(data(j))
92bf6b6e21SWilliam Wang  }
93bf6b6e21SWilliam Wang
94bf6b6e21SWilliam Wang  // DataModuleTemplate should not be used when there're any write conflicts
95bf6b6e21SWilliam Wang  for (i <- 0 until numWrite) {
96bf6b6e21SWilliam Wang    for (j <- i+1 until numWrite) {
97bf6b6e21SWilliam Wang      assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j)))
98bf6b6e21SWilliam Wang    }
99bf6b6e21SWilliam Wang  }
100bf6b6e21SWilliam Wang}
101bf6b6e21SWilliam Wang
10296b1e495SWilliam Wang// load queue load mask module
10396b1e495SWilliam Wangclass LQMaskModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule {
104bf6b6e21SWilliam Wang  val io = IO(new Bundle {
105f02b5115SWilliam Wang    val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W)))
106f02b5115SWilliam Wang    val rdata = Output(Vec(numRead, UInt(8.W)))
107f02b5115SWilliam Wang    val wen   = Input(Vec(numWrite, Bool()))
108f02b5115SWilliam Wang    val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W)))
109f02b5115SWilliam Wang    val wdata = Input(Vec(numWrite, UInt(8.W)))
11096b1e495SWilliam Wang    // st-ld violation check wmask compare
11196b1e495SWilliam Wang    val violationMdata = Input(Vec(StorePipelineWidth, UInt(8.W))) // input 8-bit wmask
11296b1e495SWilliam Wang    val violationMmask = Output(Vec(StorePipelineWidth, Vec(numEntries, Bool()))) // output wmask overlap vector
113bf6b6e21SWilliam Wang  })
114bf6b6e21SWilliam Wang
115f02b5115SWilliam Wang  val data = Reg(Vec(numEntries, UInt(8.W)))
116bf6b6e21SWilliam Wang
117bf6b6e21SWilliam Wang  // read ports
118bf6b6e21SWilliam Wang  for (i <- 0 until numRead) {
11959a7acd8SWilliam Wang    io.rdata(i) := data(RegNext(io.raddr(i)))
120bf6b6e21SWilliam Wang  }
121bf6b6e21SWilliam Wang
122bf6b6e21SWilliam Wang  // below is the write ports (with priorities)
123bf6b6e21SWilliam Wang  for (i <- 0 until numWrite) {
124bf6b6e21SWilliam Wang    when (io.wen(i)) {
125bf6b6e21SWilliam Wang      data(io.waddr(i)) := io.wdata(i)
126bf6b6e21SWilliam Wang    }
127bf6b6e21SWilliam Wang  }
128bf6b6e21SWilliam Wang
12996b1e495SWilliam Wang  // st-ld violation check wmask compare
13067682d05SWilliam Wang  for (i <- 0 until StorePipelineWidth) {
131bf6b6e21SWilliam Wang    for (j <- 0 until numEntries) {
132f02b5115SWilliam Wang      io.violationMmask(i)(j) := (io.violationMdata(i) & data(j)).orR
133bf6b6e21SWilliam Wang    }
134bf6b6e21SWilliam Wang  }
135bf6b6e21SWilliam Wang
136bf6b6e21SWilliam Wang  // DataModuleTemplate should not be used when there're any write conflicts
137bf6b6e21SWilliam Wang  for (i <- 0 until numWrite) {
138bf6b6e21SWilliam Wang    for (j <- i+1 until numWrite) {
139bf6b6e21SWilliam Wang      assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j)))
140bf6b6e21SWilliam Wang    }
141bf6b6e21SWilliam Wang  }
142bf6b6e21SWilliam Wang}
143bf6b6e21SWilliam Wang
14496b1e495SWilliam Wang// SQDataModule is a wrapper of 8 bit MaskedSyncDataModuleTemplates
14596b1e495SWilliam Wang//
14696b1e495SWilliam Wang// It also contains:
14796b1e495SWilliam Wang// * fwdMask, which is used to merge refill data and forwarded data
14896b1e495SWilliam Wang// * word index extracted from paddr, which is used to select data from refill data (a cacheline)
14996b1e495SWilliam Wangclass LQDataModule(numEntries: Int, numRead: Int, numWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters {
150bf6b6e21SWilliam Wang  val io = IO(new Bundle {
15196b1e495SWilliam Wang    // sync read
152f02b5115SWilliam Wang    val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W)))
153f02b5115SWilliam Wang    val rdata = Output(Vec(numRead, UInt(XLEN.W)))
15496b1e495SWilliam Wang
155bf6b6e21SWilliam Wang    // address indexed write
156f02b5115SWilliam Wang    val wen   = Input(Vec(numWrite, Bool()))
157f02b5115SWilliam Wang    val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W)))
158f02b5115SWilliam Wang    val wdata = Input(Vec(numWrite, UInt(XLEN.W)))
15996b1e495SWilliam Wang    // forward mask needs to be recorded to merge data
16096b1e495SWilliam Wang    val fwdMaskWdata = Input(Vec(numWrite, UInt(8.W)))
16196b1e495SWilliam Wang    // refillOffBits - wordOffBits bits in paddr need to be stored in LQDataModule for refilling
16296b1e495SWilliam Wang    val paddrWdata = Input(Vec(numWrite, UInt((PAddrBits).W)))
16396b1e495SWilliam Wang
164bf6b6e21SWilliam Wang    // masked write
165bf6b6e21SWilliam Wang    val mwmask = Input(Vec(numEntries, Bool()))
166594ba8acSWilliam Wang    val refillData = Input(UInt(l1BusDataWidth.W))
167bf6b6e21SWilliam Wang  })
168bf6b6e21SWilliam Wang
169594ba8acSWilliam Wang  val data8 = Seq.fill(8)(Module(new MaskedSyncDataModuleTemplate(UInt(8.W), numEntries, numRead, numWrite, numMWrite = refillWords)))
170f02b5115SWilliam Wang  val fwdMask = Reg(Vec(numEntries, UInt(8.W)))
171594ba8acSWilliam Wang  val wordIndex = Reg(Vec(numEntries, UInt((refillOffBits - wordOffBits).W)))
172bf6b6e21SWilliam Wang
173bf6b6e21SWilliam Wang  // read ports
174bf6b6e21SWilliam Wang  for (i <- 0 until numRead) {
1751c2ecc42SWilliam Wang    for (j <- 0 until 8) {
1761c2ecc42SWilliam Wang      data8(j).io.raddr(i) := io.raddr(i)
1771c2ecc42SWilliam Wang    }
1781c2ecc42SWilliam Wang    io.rdata(i) := VecInit((0 until 8).map(j => data8(j).io.rdata(i))).asUInt
179bf6b6e21SWilliam Wang  }
180bf6b6e21SWilliam Wang
181bf6b6e21SWilliam Wang  // below is the write ports (with priorities)
182bf6b6e21SWilliam Wang  for (i <- 0 until numWrite) {
1831c2ecc42SWilliam Wang    // write to data8
1841c2ecc42SWilliam Wang    for (j <- 0 until 8) {
1851c2ecc42SWilliam Wang      data8(j).io.waddr(i) := io.waddr(i)
1861c2ecc42SWilliam Wang      data8(j).io.wdata(i) := io.wdata(i)(8*(j+1)-1, 8*j)
1871c2ecc42SWilliam Wang      data8(j).io.wen(i) := io.wen(i)
188bf6b6e21SWilliam Wang    }
1891c2ecc42SWilliam Wang
1901c2ecc42SWilliam Wang    // write ctrl info
19196b1e495SWilliam Wang    when (io.wen(i)) {
192f02b5115SWilliam Wang      fwdMask(io.waddr(i)) := io.fwdMaskWdata(i)
193bf6b6e21SWilliam Wang    }
19496b1e495SWilliam Wang    when (io.wen(i)) {
195f02b5115SWilliam Wang      wordIndex(io.waddr(i)) := get_word(io.paddrWdata(i))
196f02b5115SWilliam Wang    }
197f02b5115SWilliam Wang  }
198f02b5115SWilliam Wang
1991c2ecc42SWilliam Wang  // write refilled data to data8
200bf6b6e21SWilliam Wang
2011c2ecc42SWilliam Wang  // select refill data
202f02b5115SWilliam Wang  // split dcache result into words
203594ba8acSWilliam Wang  val words = VecInit((0 until refillWords) map { i => io.refillData(DataBits * (i + 1) - 1, DataBits * i)})
2041c2ecc42SWilliam Wang  // select refill data according to wordIndex (paddr)
2051c2ecc42SWilliam Wang  for (i <- 0 until 8) {
206594ba8acSWilliam Wang    for (j <- 0 until refillWords) {
2076251d905SWilliam Wang      data8(i).io.mwdata(j) := words(j)(8*(i+1)-1, 8*i)
2081c2ecc42SWilliam Wang    }
2091c2ecc42SWilliam Wang  }
2106251d905SWilliam Wang
2111c2ecc42SWilliam Wang  // gen refill wmask
212594ba8acSWilliam Wang  for (j <- 0 until refillWords) {
2136251d905SWilliam Wang    for (k <- 0 until numEntries) {
2146251d905SWilliam Wang      val wordMatch = wordIndex(k) === j.U
2151c2ecc42SWilliam Wang      for (i <- 0 until 8) {
2166251d905SWilliam Wang        data8(i).io.mwmask(j)(k) := wordMatch && io.mwmask(k) && !fwdMask(k)(i)
2176251d905SWilliam Wang      }
218bf6b6e21SWilliam Wang    }
219bf6b6e21SWilliam Wang  }
220bf6b6e21SWilliam Wang
221bf6b6e21SWilliam Wang  // DataModuleTemplate should not be used when there're any write conflicts
222bf6b6e21SWilliam Wang  for (i <- 0 until numWrite) {
223bf6b6e21SWilliam Wang    for (j <- i+1 until numWrite) {
224bf6b6e21SWilliam Wang      assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j)))
225bf6b6e21SWilliam Wang    }
226bf6b6e21SWilliam Wang  }
227bf6b6e21SWilliam Wang}
2287057673cSWilliam Wang
22996b1e495SWilliam Wang// LoadQueueDataWrapper wraps:
23096b1e495SWilliam Wang// * load queue paddrModule
23196b1e495SWilliam Wang// * load queue maskModule
23296b1e495SWilliam Wang// * load queue dataModule
23396b1e495SWilliam Wang// and their interconnect
23496b1e495SWilliam Wangclass LoadQueueDataWrapper(size: Int, wbNumRead: Int, wbNumWrite: Int)(implicit p: Parameters) extends XSModule with HasDCacheParameters with HasCircularQueuePtrHelper {
2357057673cSWilliam Wang  val io = IO(new Bundle() {
2367d91f790SWilliam Wang    val wb = new Bundle() {
2377d91f790SWilliam Wang      val wen = Vec(wbNumWrite, Input(Bool()))
2387d91f790SWilliam Wang      val waddr = Input(Vec(wbNumWrite, UInt(log2Up(size).W)))
2397d91f790SWilliam Wang      val wdata = Input(Vec(wbNumWrite, new LQDataEntry))
2407d91f790SWilliam Wang      val raddr = Input(Vec(wbNumRead, UInt(log2Up(size).W)))
2417d91f790SWilliam Wang      val rdata = Output(Vec(wbNumRead, new LQDataEntry))
2427d91f790SWilliam Wang    }
2437057673cSWilliam Wang    val uncache = new Bundle() {
2447057673cSWilliam Wang      val wen = Input(Bool())
2457d91f790SWilliam Wang      val waddr = Input(UInt(log2Up(size).W))
2467d91f790SWilliam Wang      val wdata = Input(UInt(XLEN.W)) // only write back uncache data
2477d91f790SWilliam Wang      val raddr = Input(UInt(log2Up(size).W))
2487d91f790SWilliam Wang      val rdata = Output(new LQDataEntry)
2497057673cSWilliam Wang    }
2507057673cSWilliam Wang    val refill = new Bundle() {
2517d91f790SWilliam Wang      val valid = Input(Bool())
2527d91f790SWilliam Wang      val paddr = Input(UInt(PAddrBits.W))
253594ba8acSWilliam Wang      val data = Input(UInt(l1BusDataWidth.W))
2547d91f790SWilliam Wang      val refillMask = Input(Vec(size, Bool()))
2557d91f790SWilliam Wang      val matchMask = Output(Vec(size, Bool()))
2567057673cSWilliam Wang    }
25767682d05SWilliam Wang    // st-ld violation query, word level cam
2587d91f790SWilliam Wang    val violation = Vec(StorePipelineWidth, new Bundle() {
2597d91f790SWilliam Wang      val paddr = Input(UInt(PAddrBits.W))
2607d91f790SWilliam Wang      val mask = Input(UInt(8.W))
2617d91f790SWilliam Wang      val violationMask = Output(Vec(size, Bool()))
2627d91f790SWilliam Wang    })
26367682d05SWilliam Wang    // ld-ld violation query, cache line level cam
26467682d05SWilliam Wang    val release_violation = Vec(LoadPipelineWidth, new Bundle() {
26567682d05SWilliam Wang      val paddr = Input(UInt(PAddrBits.W))
26667682d05SWilliam Wang      val match_mask = Output(Vec(size, Bool()))
26767682d05SWilliam Wang      // if ld-ld violation does happened, we replay from the elder load
26867682d05SWilliam Wang    })
2697d91f790SWilliam Wang    val debug = Output(Vec(size, new LQDataEntry))
2707057673cSWilliam Wang
2717d91f790SWilliam Wang    def wbWrite(channel: Int, waddr: UInt, wdata: LQDataEntry): Unit = {
2727d91f790SWilliam Wang      require(channel < wbNumWrite && wbNumWrite >= 0)
2737057673cSWilliam Wang      // need extra "this.wb(channel).wen := true.B"
2747d91f790SWilliam Wang      this.wb.waddr(channel) := waddr
2757d91f790SWilliam Wang      this.wb.wdata(channel) := wdata
2767057673cSWilliam Wang    }
2777057673cSWilliam Wang
2787d91f790SWilliam Wang    def uncacheWrite(waddr: UInt, wdata: UInt): Unit = {
2797057673cSWilliam Wang      // need extra "this.uncache.wen := true.B"
2807d91f790SWilliam Wang      this.uncache.waddr := waddr
2817057673cSWilliam Wang      this.uncache.wdata := wdata
2827057673cSWilliam Wang    }
2837057673cSWilliam Wang  })
2847057673cSWilliam Wang
285f02b5115SWilliam Wang  // data module
28667682d05SWilliam Wang  val paddrModule = Module(new LQPaddrModule(size, numRead = LoadPipelineWidth+1, numWrite = LoadPipelineWidth))
28796b1e495SWilliam Wang  val maskModule = Module(new LQMaskModule(size, numRead = LoadPipelineWidth+1, numWrite = LoadPipelineWidth))
28896b1e495SWilliam Wang  val dataModule = Module(new LQDataModule(size, numRead = LoadPipelineWidth+1, numWrite = LoadPipelineWidth+1))
2897057673cSWilliam Wang
290a266fd76SWilliam Wang  // read data
291f02b5115SWilliam Wang  // read port 0 -> wbNumRead-1
292a266fd76SWilliam Wang  (0 until wbNumRead).map(i => {
293f02b5115SWilliam Wang    paddrModule.io.raddr(i) := io.wb.raddr(i)
294f02b5115SWilliam Wang    maskModule.io.raddr(i) := io.wb.raddr(i)
29596b1e495SWilliam Wang    dataModule.io.raddr(i) := io.wb.raddr(i)
296f02b5115SWilliam Wang
297f02b5115SWilliam Wang    io.wb.rdata(i).paddr := paddrModule.io.rdata(i)
298f02b5115SWilliam Wang    io.wb.rdata(i).mask := maskModule.io.rdata(i)
29996b1e495SWilliam Wang    io.wb.rdata(i).data := dataModule.io.rdata(i)
300f02b5115SWilliam Wang    io.wb.rdata(i).fwdMask := DontCare
301a266fd76SWilliam Wang  })
302a266fd76SWilliam Wang
303f02b5115SWilliam Wang  // read port wbNumRead
304f02b5115SWilliam Wang  paddrModule.io.raddr(wbNumRead) := io.uncache.raddr
305f02b5115SWilliam Wang  maskModule.io.raddr(wbNumRead) := io.uncache.raddr
30696b1e495SWilliam Wang  dataModule.io.raddr(wbNumRead) := io.uncache.raddr
307a266fd76SWilliam Wang
308f02b5115SWilliam Wang  io.uncache.rdata.paddr := paddrModule.io.rdata(wbNumRead)
309f02b5115SWilliam Wang  io.uncache.rdata.mask := maskModule.io.rdata(wbNumRead)
31096b1e495SWilliam Wang  io.uncache.rdata.data := dataModule.io.rdata(wbNumRead)
311f02b5115SWilliam Wang  io.uncache.rdata.fwdMask := DontCare
312f02b5115SWilliam Wang
313f02b5115SWilliam Wang  // write data
314f02b5115SWilliam Wang  // write port 0 -> wbNumWrite-1
3157d91f790SWilliam Wang  (0 until wbNumWrite).map(i => {
316f02b5115SWilliam Wang    paddrModule.io.wen(i) := false.B
317f02b5115SWilliam Wang    maskModule.io.wen(i) := false.B
31896b1e495SWilliam Wang    dataModule.io.wen(i) := false.B
319f02b5115SWilliam Wang
320f02b5115SWilliam Wang    paddrModule.io.waddr(i) := io.wb.waddr(i)
321f02b5115SWilliam Wang    maskModule.io.waddr(i) := io.wb.waddr(i)
32296b1e495SWilliam Wang    dataModule.io.waddr(i) := io.wb.waddr(i)
323f02b5115SWilliam Wang
324f02b5115SWilliam Wang    paddrModule.io.wdata(i) := io.wb.wdata(i).paddr
325f02b5115SWilliam Wang    maskModule.io.wdata(i) := io.wb.wdata(i).mask
32696b1e495SWilliam Wang    dataModule.io.wdata(i) := io.wb.wdata(i).data
32796b1e495SWilliam Wang    dataModule.io.fwdMaskWdata(i) := io.wb.wdata(i).fwdMask.asUInt
32896b1e495SWilliam Wang    dataModule.io.paddrWdata(i) := io.wb.wdata(i).paddr
329f02b5115SWilliam Wang
3307d91f790SWilliam Wang    when(io.wb.wen(i)){
331f02b5115SWilliam Wang      paddrModule.io.wen(i) := true.B
332f02b5115SWilliam Wang      maskModule.io.wen(i) := true.B
33396b1e495SWilliam Wang      dataModule.io.wen(i) := true.B
3347057673cSWilliam Wang    }
3357057673cSWilliam Wang  })
3367057673cSWilliam Wang
337f02b5115SWilliam Wang  // write port wbNumWrite
33896b1e495SWilliam Wang  dataModule.io.wen(wbNumWrite) := io.uncache.wen
33996b1e495SWilliam Wang  // dataModule.io.fwdMaskWen(wbNumWrite) := false.B
34096b1e495SWilliam Wang  // dataModule.io.paddrWen(wbNumWrite) := false.B
341f02b5115SWilliam Wang
34296b1e495SWilliam Wang  dataModule.io.waddr(wbNumWrite) := io.uncache.waddr
343f02b5115SWilliam Wang
34496b1e495SWilliam Wang  dataModule.io.fwdMaskWdata(wbNumWrite) := DontCare
34596b1e495SWilliam Wang  dataModule.io.paddrWdata(wbNumWrite) := DontCare
34696b1e495SWilliam Wang  dataModule.io.wdata(wbNumWrite) := io.uncache.wdata
347f02b5115SWilliam Wang
34867682d05SWilliam Wang  // st-ld mem access violation check, gen violationMask
349f02b5115SWilliam Wang  (0 until StorePipelineWidth).map(i => {
350f02b5115SWilliam Wang    paddrModule.io.violationMdata(i) := io.violation(i).paddr
351f02b5115SWilliam Wang    maskModule.io.violationMdata(i) := io.violation(i).mask
352f02b5115SWilliam Wang    io.violation(i).violationMask := (paddrModule.io.violationMmask(i).asUInt & maskModule.io.violationMmask(i).asUInt).asBools
35367682d05SWilliam Wang  })
35467682d05SWilliam Wang
35567682d05SWilliam Wang  // ld-ld mem access violation check, gen violationMask (cam match mask)
35667682d05SWilliam Wang  (0 until LoadPipelineWidth).map(i => {
35767682d05SWilliam Wang    paddrModule.io.releaseMdata(i) := io.release_violation(i).paddr
35867682d05SWilliam Wang    io.release_violation(i).match_mask := paddrModule.io.releaseMmask(i)
359f02b5115SWilliam Wang  })
3607057673cSWilliam Wang
3617d91f790SWilliam Wang  // gen paddr match mask
362f02b5115SWilliam Wang  paddrModule.io.refillMdata := io.refill.paddr
3637057673cSWilliam Wang  (0 until size).map(i => {
364f02b5115SWilliam Wang    io.refill.matchMask := paddrModule.io.refillMmask
365f02b5115SWilliam Wang    // io.refill.matchMask(i) := get_block_addr(data(i).paddr) === get_block_addr(io.refill.paddr)
3667d91f790SWilliam Wang  })
3677d91f790SWilliam Wang
3687d91f790SWilliam Wang  // refill data according to matchMask, refillMask and refill.valid
36996b1e495SWilliam Wang  dataModule.io.refillData := io.refill.data
3707d91f790SWilliam Wang  (0 until size).map(i => {
37196b1e495SWilliam Wang    dataModule.io.mwmask(i) := io.refill.valid && io.refill.matchMask(i) && io.refill.refillMask(i)
3727d91f790SWilliam Wang  })
3737d91f790SWilliam Wang
3747d91f790SWilliam Wang  // debug data read
375f02b5115SWilliam Wang  io.debug := DontCare
3767057673cSWilliam Wang}
377