xref: /XiangShan/src/main/scala/device/TLPMA/TLPMA.scala (revision 98c716025d86d6220b2762171d9383f72e72cfe7)
1*98c71602SJiawei Linpackage device
2*98c71602SJiawei Lin
3*98c71602SJiawei Linimport freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp, SimpleDevice}
4*98c71602SJiawei Linimport chipsalliance.rocketchip.config.Parameters
5*98c71602SJiawei Linimport chisel3._
6*98c71602SJiawei Linimport chisel3.util._
7*98c71602SJiawei Linimport xiangshan._
8*98c71602SJiawei Linimport utils._
9*98c71602SJiawei Linimport freechips.rocketchip.regmapper.RegFieldGroup
10*98c71602SJiawei Linimport freechips.rocketchip.tilelink.TLRegisterNode
11*98c71602SJiawei Linimport xiangshan.backend.fu.{MMPMAMethod, PMAConst, PMPChecker, PMPReqBundle, PMPRespBundle}
12*98c71602SJiawei Lin
13*98c71602SJiawei Linclass TLPMAIO(implicit val p: Parameters) extends Bundle with PMAConst {
14*98c71602SJiawei Lin  val req = Vec(mmpma.num, Flipped(Valid(new PMPReqBundle(mmpma.lgMaxSize))))
15*98c71602SJiawei Lin  val resp = Vec(mmpma.num, new PMPRespBundle())
16*98c71602SJiawei Lin}
17*98c71602SJiawei Lin
18*98c71602SJiawei Linclass TLPMA(implicit p: Parameters) extends LazyModule with PMAConst with MMPMAMethod{
19*98c71602SJiawei Lin  val node = TLRegisterNode(
20*98c71602SJiawei Lin    address = Seq(AddressSet(mmpma.address/*pmaParam.address*/, mmpma.mask)),
21*98c71602SJiawei Lin    device = new SimpleDevice("mmpma", Nil),
22*98c71602SJiawei Lin    concurrency = 1,
23*98c71602SJiawei Lin    beatBytes = 8
24*98c71602SJiawei Lin  )
25*98c71602SJiawei Lin
26*98c71602SJiawei Lin  lazy val module = new LazyModuleImp(this) {
27*98c71602SJiawei Lin
28*98c71602SJiawei Lin    val io = IO(new TLPMAIO)
29*98c71602SJiawei Lin    val req = io.req
30*98c71602SJiawei Lin    val resp = io.resp
31*98c71602SJiawei Lin
32*98c71602SJiawei Lin    val (cfg_map, addr_map, pma) = gen_mmpma_mapping(NumPMA)
33*98c71602SJiawei Lin    node.regmap(
34*98c71602SJiawei Lin      0x0000 -> RegFieldGroup(
35*98c71602SJiawei Lin        "MMPMA_Config_Register", desc = Some("MMPMA configuation register"),
36*98c71602SJiawei Lin        regs = cfg_map
37*98c71602SJiawei Lin      ),
38*98c71602SJiawei Lin      // still blank space here, fix it
39*98c71602SJiawei Lin      0x0100 -> RegFieldGroup(
40*98c71602SJiawei Lin        "MMPMA_Address_Register", desc = Some("MMPMA Address register"),
41*98c71602SJiawei Lin        regs = addr_map
42*98c71602SJiawei Lin      )
43*98c71602SJiawei Lin    )
44*98c71602SJiawei Lin
45*98c71602SJiawei Lin    val pma_check = VecInit(Seq.fill(mmpma.num)(
46*98c71602SJiawei Lin      Module(new PMPChecker(
47*98c71602SJiawei Lin        mmpma.lgMaxSize/*pmaParam.lgMaxSize*/,
48*98c71602SJiawei Lin        mmpma.sameCycle/* pmaParam.sameCycle*/,
49*98c71602SJiawei Lin        false)).io
50*98c71602SJiawei Lin    ))
51*98c71602SJiawei Lin    pma_check.map(_.check_env.apply(mmpma.lgMaxSize.U, pma/*placeHolder*/, pma))
52*98c71602SJiawei Lin    for (i <- 0 until mmpma.num) {
53*98c71602SJiawei Lin      pma_check(i).req_apply(req(i).valid, req(i).bits.addr)
54*98c71602SJiawei Lin      resp(i) := pma_check(i).resp
55*98c71602SJiawei Lin    }
56*98c71602SJiawei Lin  }
57*98c71602SJiawei Lin
58*98c71602SJiawei Lin}
59