1*6f483f86SXuan Hupackage xiangshan.backend 2*6f483f86SXuan Hu 3*6f483f86SXuan Huimport chisel3._ 4*6f483f86SXuan Huimport chisel3.util._ 5*6f483f86SXuan Huimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 6*6f483f86SXuan Huimport org.chipsalliance.cde.config.Parameters 7*6f483f86SXuan Huimport utility.SyncDataModuleTemplate 8*6f483f86SXuan Huimport xiangshan.HasXSParameter 9*6f483f86SXuan Huimport xiangshan.frontend.{FtqPtr, IfuToBackendIO} 10*6f483f86SXuan Hu 11*6f483f86SXuan Huclass GPAMem(implicit p: Parameters) extends LazyModule { 12*6f483f86SXuan Hu override def shouldBeInlined: Boolean = false 13*6f483f86SXuan Hu 14*6f483f86SXuan Hu lazy val module = new GPAMemImp(this) 15*6f483f86SXuan Hu} 16*6f483f86SXuan Hu 17*6f483f86SXuan Huclass GPAMemImp(override val wrapper: GPAMem)(implicit p: Parameters) extends LazyModuleImp(wrapper) with HasXSParameter { 18*6f483f86SXuan Hu val io = IO(new GPAMemIO) 19*6f483f86SXuan Hu 20*6f483f86SXuan Hu private val PageOffsetWidth = 12 21*6f483f86SXuan Hu 22*6f483f86SXuan Hu private val mem = Module (new SyncDataModuleTemplate(Vec(2, UInt(GPAddrBits.W)), FtqSize, numRead = 1, numWrite = 1, hasRen = true)) 23*6f483f86SXuan Hu 24*6f483f86SXuan Hu mem.io.wen.head := io.fromIFU.gpaddrMem_wen 25*6f483f86SXuan Hu mem.io.waddr.head := io.fromIFU.gpaddrMem_waddr 26*6f483f86SXuan Hu mem.io.wdata.head := io.fromIFU.gpaddrMem_wdata 27*6f483f86SXuan Hu 28*6f483f86SXuan Hu mem.io.ren.get.head := io.exceptionReadAddr.valid 29*6f483f86SXuan Hu mem.io.raddr.head := io.exceptionReadAddr.bits.ftqPtr.value 30*6f483f86SXuan Hu 31*6f483f86SXuan Hu private val ftqOffset = RegEnable(io.exceptionReadAddr.bits.ftqOffset, io.exceptionReadAddr.valid) 32*6f483f86SXuan Hu 33*6f483f86SXuan Hu private val gpa0base = mem.io.rdata.head.head 34*6f483f86SXuan Hu private val gpa1base = mem.io.rdata.head.last 35*6f483f86SXuan Hu private val gpa0 = gpa0base + Cat(ftqOffset, 0.U(instOffsetBits)) 36*6f483f86SXuan Hu private val gpa1 = gpa1base + Cat(ftqOffset, 0.U(instOffsetBits)) 37*6f483f86SXuan Hu 38*6f483f86SXuan Hu private val gpa0basePage = getGPAPage(gpa0base) 39*6f483f86SXuan Hu private val gpa0page = getGPAPage(gpa0) 40*6f483f86SXuan Hu private val gpa = Mux(gpa0basePage === gpa0page, gpa0, gpa1) 41*6f483f86SXuan Hu 42*6f483f86SXuan Hu io.exceptionReadData := gpa 43*6f483f86SXuan Hu 44*6f483f86SXuan Hu def getGPAPage(vaddr: UInt): UInt = { 45*6f483f86SXuan Hu require(vaddr.getWidth == GPAddrBits, s"The width of gpa should be $GPAddrBits") 46*6f483f86SXuan Hu vaddr(GPAddrBits - 1, PageOffsetWidth) 47*6f483f86SXuan Hu } 48*6f483f86SXuan Hu} 49*6f483f86SXuan Hu 50*6f483f86SXuan Huclass GPAMemIO(implicit val p: Parameters) extends Bundle with HasXSParameter { 51*6f483f86SXuan Hu val fromIFU = Flipped(new IfuToBackendIO()) 52*6f483f86SXuan Hu 53*6f483f86SXuan Hu val exceptionReadAddr = Input(ValidIO(new Bundle { 54*6f483f86SXuan Hu val ftqPtr = new FtqPtr() 55*6f483f86SXuan Hu val ftqOffset = UInt(log2Up(PredictWidth).W) 56*6f483f86SXuan Hu })) 57*6f483f86SXuan Hu 58*6f483f86SXuan Hu val exceptionReadData = Output(UInt(GPAddrBits.W)) 59*6f483f86SXuan Hu} 60