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