xref: /XiangShan/src/main/scala/xiangshan/mem/MaskedDataModule.scala (revision 2225d46ebbe2fd16b9b29963c27a7d0385a42709)
1package xiangshan.mem
2
3import chisel3._
4import chisel3.util._
5import xiangshan._
6import utils._
7import xiangshan.cache._
8
9class MaskedSyncDataModuleTemplate[T <: Data](
10  gen: T, numEntries: Int, numRead: Int, numWrite: Int, numMRead: Int = 0, numMWrite: Int = 0
11) extends Module {
12  val io = IO(new Bundle {
13    // address indexed sync read
14    val raddr = Input(Vec(numRead, UInt(log2Up(numEntries).W)))
15    val rdata = Output(Vec(numRead, gen))
16    // masked sync read (1H)
17    val mrmask = Input(Vec(numMRead, Vec(numEntries, Bool())))
18    val mrdata = Output(Vec(numMRead, gen))
19    // address indexed write
20    val wen   = Input(Vec(numWrite, Bool()))
21    val waddr = Input(Vec(numWrite, UInt(log2Up(numEntries).W)))
22    val wdata = Input(Vec(numWrite, gen))
23    // masked write
24    val mwmask = Input(Vec(numMWrite, Vec(numEntries, Bool())))
25    val mwdata = Input(Vec(numMWrite, gen))
26  })
27
28  val data = Reg(Vec(numEntries, gen))
29
30  // read ports
31  for (i <- 0 until numRead) {
32    io.rdata(i) := data(RegNext(io.raddr(i)))
33  }
34
35  // masked read ports
36  for (i <- 0 until numMRead) {
37    io.mrdata(i) := Mux1H(RegNext(io.mrmask(i)), data)
38  }
39
40  // write ports (with priorities)
41  for (i <- 0 until numWrite) {
42    when (io.wen(i)) {
43      data(io.waddr(i)) := io.wdata(i)
44    }
45  }
46
47  // masked write
48  for (j <- 0 until numEntries) {
49    val wen = VecInit((0 until numMWrite).map(i => io.mwmask(i)(j))).asUInt.orR
50    when (wen) {
51      data(j) := VecInit((0 until numMWrite).map(i => {
52        Mux(io.mwmask(i)(j), io.mwdata(i), 0.U).asUInt
53      })).reduce(_ | _)
54    }
55  }
56
57  // DataModuleTemplate should not be used when there're any write conflicts
58  for (i <- 0 until numWrite) {
59    for (j <- i+1 until numWrite) {
60      assert(!(io.wen(i) && io.wen(j) && io.waddr(i) === io.waddr(j)))
61    }
62  }
63}
64