xref: /XiangShan/src/main/scala/xiangshan/backend/issue/DataArray.scala (revision 8b33cd30e0034914b58520e0dc3c0c4b1aad6a03)
15c7674feSYinan Xupackage xiangshan.backend.issue
25c7674feSYinan Xu
38891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
45c7674feSYinan Xuimport chisel3._
55c7674feSYinan Xuimport chisel3.util._
6bb2f3f51STang Haojinimport utility.{AsyncRawDataModuleTemplate, XSDebug, XSError}
7730cfbc0SXuan Huimport xiangshan.XSModule
85c7674feSYinan Xu
9730cfbc0SXuan Huclass OHReadBundle[T <: Data](addrLen: Int, gen: T) extends Bundle {
10730cfbc0SXuan Hu  val addr = Input(UInt(addrLen.W))
11730cfbc0SXuan Hu  val data = Output(gen)
12730cfbc0SXuan Hu}
135c7674feSYinan Xu
14730cfbc0SXuan Huclass OHWriteBundle[T <: Data](addrLen: Int, gen: T) extends Bundle {
15730cfbc0SXuan Hu  val en = Input(Bool())
16730cfbc0SXuan Hu  val addr = Input(UInt(addrLen.W))
17730cfbc0SXuan Hu  val data = Input(gen)
18730cfbc0SXuan Hu}
19730cfbc0SXuan Hu
20730cfbc0SXuan Huclass DataArrayIO[T <: Data](gen: T, numRead: Int, numWrite: Int, numEntries: Int) extends Bundle {
21730cfbc0SXuan Hu  val read = Vec(numRead, new OHReadBundle(numEntries, gen))
22730cfbc0SXuan Hu  val write = Vec(numWrite, new OHWriteBundle(numEntries, gen))
23730cfbc0SXuan Hu}
24730cfbc0SXuan Hu
25730cfbc0SXuan Huclass DataArray[T <: Data](gen: T, numRead: Int, numWrite: Int, numEntries: Int)
26730cfbc0SXuan Hu  (implicit p: Parameters)
27730cfbc0SXuan Hu  extends XSModule {
28730cfbc0SXuan Hu
29730cfbc0SXuan Hu  val io = IO(new DataArrayIO(gen, numRead, numWrite, numEntries))
30730cfbc0SXuan Hu
31730cfbc0SXuan Hu  private val dataModule = Module(new AsyncRawDataModuleTemplate(gen, numEntries, io.read.length, io.write.length))
32730cfbc0SXuan Hu
33730cfbc0SXuan Hu  dataModule.io.rvec  := VecInit(io.read.map(_.addr))
34730cfbc0SXuan Hu  io.read.zip(dataModule.io.rdata).foreach { case (l, r) => l.data := r}
35730cfbc0SXuan Hu
36730cfbc0SXuan Hu  dataModule.io.wvec  := VecInit(io.write.map(_.addr))
37730cfbc0SXuan Hu  dataModule.io.wen   := VecInit(io.write.map(_.en))
38730cfbc0SXuan Hu  dataModule.io.wdata := VecInit(io.write.map(_.data))
39730cfbc0SXuan Hu
40730cfbc0SXuan Hu  // check if one entry wroten by multi bundles
41730cfbc0SXuan Hu  for (i <- 0 until numEntries) {
42730cfbc0SXuan Hu    val wCnt = VecInit(io.write.indices.map(j => dataModule.io.wen(j) && dataModule.io.wvec(j)(i)))
43730cfbc0SXuan Hu    XSError(RegNext(PopCount(wCnt) > 1.U), s"why not OH $i?")
44*8b33cd30Sklin02    XSDebug(PopCount(wCnt) > 1.U, "ERROR: IssueQueue DataArray write overlap!\n")
45730cfbc0SXuan Hu  }
46730cfbc0SXuan Hu}
47