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