1package system 2 3import chipsalliance.rocketchip.config.Parameters 4import device.{AXI4Timer, TLTimer} 5import chisel3._ 6import chisel3.util._ 7import freechips.rocketchip.diplomacy.{AddressSet, LazyModule, LazyModuleImp} 8import freechips.rocketchip.tilelink.{TLBuffer, TLFuzzer, TLIdentityNode, TLXbar} 9import utils.DebugIdentityNode 10import xiangshan.{HasXSParameter, XSCore} 11 12 13case class SoCParameters 14( 15 EnableILA: Boolean = false, 16 HasL2Cache: Boolean = false, 17 HasPrefetch: Boolean = false 18) 19 20trait HasSoCParameter extends HasXSParameter{ 21 val soc = top.Parameters.get.socParameters 22 val EnableILA = soc.EnableILA 23 val HasL2cache = soc.HasL2Cache 24 val HasPrefetch = soc.HasPrefetch 25} 26 27class ILABundle extends Bundle {} 28 29 30class DummyCore()(implicit p: Parameters) extends LazyModule { 31 val mem = TLFuzzer(nOperations = 10) 32 val mmio = TLFuzzer(nOperations = 10) 33 34 lazy val module = new LazyModuleImp(this){ 35 36 } 37} 38 39 40class XSSoc()(implicit p: Parameters) extends LazyModule with HasSoCParameter { 41 42 private val xsCore = LazyModule(new XSCore()) 43 44 // only mem and extDev visible externally 45 val mem = xsCore.mem 46 val extDev = TLIdentityNode() 47 48 private val mmioXbar = TLXbar() 49 private val clint = LazyModule(new TLTimer( 50 Seq(AddressSet(0x38000000L, 0x0000ffffL)), 51 sim = !env.FPGAPlatform 52 )) 53 54 mmioXbar := 55 TLBuffer() := 56 DebugIdentityNode() := 57 xsCore.mmio 58 59 clint.node := 60 mmioXbar 61 62 extDev := 63 mmioXbar 64 65 lazy val module = new LazyModuleImp(this){ 66 val io = IO(new Bundle{ 67 val meip = Input(Bool()) 68 val ila = if(env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 69 }) 70 val mtipSync = clint.module.io.mtip 71 val msipSync = clint.module.io.msip 72 val meipSync = RegNext(RegNext(io.meip)) 73 ExcitingUtils.addSource(mtipSync, "mtip") 74 ExcitingUtils.addSource(msipSync, "msip") 75 ExcitingUtils.addSource(meipSync, "meip") 76 } 77 78} 79 80 81//class XSSoc extends Module with HasSoCParameter { 82// val io = IO(new Bundle{ 83// val mem = new TLCached(l1BusParams) 84// val mmio = new TLCached(l1BusParams) 85// val frontend = Flipped(new AXI4) //TODO: do we need it ? 86// val meip = Input(Bool()) 87// val ila = if (env.FPGAPlatform && EnableILA) Some(Output(new ILABundle)) else None 88// }) 89// 90// val xsCore = Module(new XSCore) 91// 92// io.frontend <> DontCare 93// 94// io.mem <> xsCore.io.mem 95// 96// val addrSpace = List( 97// (0x40000000L, 0x40000000L), // external devices 98// (0x38000000L, 0x00010000L) // CLINT 99// ) 100// val mmioXbar = Module(new NaiveTL1toN(addrSpace, xsCore.io.mem.params)) 101// mmioXbar.io.in <> xsCore.io.mmio 102// 103// val extDev = mmioXbar.io.out(0) 104// val clint = Module(new AXI4Timer(sim = !env.FPGAPlatform)) 105// clint.io.in <> AXI4ToAXI4Lite(MMIOTLToAXI4(mmioXbar.io.out(1))) 106// 107// io.mmio <> extDev 108// 109// val mtipSync = clint.io.extra.get.mtip 110// val meipSync = RegNext(RegNext(io.meip)) 111// ExcitingUtils.addSource(mtipSync, "mtip") 112// ExcitingUtils.addSource(meipSync, "meip") 113//} 114