xref: /XiangShan/src/main/scala/device/TLPMA/TLPMA.scala (revision 8891a219bbc84f568e1d134854d8d5ed86d6d560)
198c71602SJiawei Linpackage device
298c71602SJiawei Lin
398c71602SJiawei Linimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp, SimpleDevice}
4*8891a219SYinan Xuimport org.chipsalliance.cde.config.Parameters
598c71602SJiawei Linimport chisel3._
698c71602SJiawei Linimport chisel3.util._
798c71602SJiawei Linimport xiangshan._
898c71602SJiawei Linimport utils._
93c02ee8fSwakafaimport utility._
1098c71602SJiawei Linimport freechips.rocketchip.regmapper.RegFieldGroup
1198c71602SJiawei Linimport freechips.rocketchip.tilelink.TLRegisterNode
1298c71602SJiawei Linimport xiangshan.backend.fu.{MMPMAMethod, PMAConst, PMPChecker, PMPReqBundle, PMPRespBundle}
1398c71602SJiawei Lin
1498c71602SJiawei Linclass TLPMAIO(implicit val p: Parameters) extends Bundle with PMAConst {
1598c71602SJiawei Lin  val req = Vec(mmpma.num, Flipped(Valid(new PMPReqBundle(mmpma.lgMaxSize))))
1698c71602SJiawei Lin  val resp = Vec(mmpma.num, new PMPRespBundle())
1798c71602SJiawei Lin}
1898c71602SJiawei Lin
1998c71602SJiawei Linclass TLPMA(implicit p: Parameters) extends LazyModule with PMAConst with MMPMAMethod{
2098c71602SJiawei Lin  val node = TLRegisterNode(
2198c71602SJiawei Lin    address = Seq(AddressSet(mmpma.address/*pmaParam.address*/, mmpma.mask)),
2298c71602SJiawei Lin    device = new SimpleDevice("mmpma", Nil),
2398c71602SJiawei Lin    concurrency = 1,
2498c71602SJiawei Lin    beatBytes = 8
2598c71602SJiawei Lin  )
2698c71602SJiawei Lin
27935edac4STang Haojin  class TLPMAImp(wrapper: LazyModule) extends LazyModuleImp(wrapper) {
2898c71602SJiawei Lin
2998c71602SJiawei Lin    val io = IO(new TLPMAIO)
3098c71602SJiawei Lin    val req = io.req
3198c71602SJiawei Lin    val resp = io.resp
3298c71602SJiawei Lin
3398c71602SJiawei Lin    val (cfg_map, addr_map, pma) = gen_mmpma_mapping(NumPMA)
3498c71602SJiawei Lin    node.regmap(
3598c71602SJiawei Lin      0x0000 -> RegFieldGroup(
3698c71602SJiawei Lin        "MMPMA_Config_Register", desc = Some("MMPMA configuation register"),
3798c71602SJiawei Lin        regs = cfg_map
3898c71602SJiawei Lin      ),
3998c71602SJiawei Lin      // still blank space here, fix it
4098c71602SJiawei Lin      0x0100 -> RegFieldGroup(
4198c71602SJiawei Lin        "MMPMA_Address_Register", desc = Some("MMPMA Address register"),
4298c71602SJiawei Lin        regs = addr_map
4398c71602SJiawei Lin      )
4498c71602SJiawei Lin    )
4598c71602SJiawei Lin
4698c71602SJiawei Lin    val pma_check = VecInit(Seq.fill(mmpma.num)(
4798c71602SJiawei Lin      Module(new PMPChecker(
4898c71602SJiawei Lin        mmpma.lgMaxSize/*pmaParam.lgMaxSize*/,
4998c71602SJiawei Lin        mmpma.sameCycle/* pmaParam.sameCycle*/,
5098c71602SJiawei Lin        false)).io
5198c71602SJiawei Lin    ))
5298c71602SJiawei Lin    pma_check.map(_.check_env.apply(mmpma.lgMaxSize.U, pma/*placeHolder*/, pma))
5398c71602SJiawei Lin    for (i <- 0 until mmpma.num) {
5498c71602SJiawei Lin      pma_check(i).req_apply(req(i).valid, req(i).bits.addr)
5598c71602SJiawei Lin      resp(i) := pma_check(i).resp
5698c71602SJiawei Lin    }
5798c71602SJiawei Lin  }
5898c71602SJiawei Lin
59935edac4STang Haojin  lazy val module = new TLPMAImp(this)
6098c71602SJiawei Lin}
61