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