xref: /XiangShan/src/main/scala/xiangshan/backend/GPAMem.scala (revision 6f483f869fd8890d0d70769e468fcb69b37a956e)
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