1*2225d46eSJiawei Linpackage top 2*2225d46eSJiawei Lin 3*2225d46eSJiawei Linimport chipsalliance.rocketchip.config.{Config, Parameters} 4*2225d46eSJiawei Linimport chisel3.stage.ChiselGeneratorAnnotation 5*2225d46eSJiawei Linimport chisel3._ 6*2225d46eSJiawei Linimport device.{AXI4RAMWrapper, UARTIO} 7*2225d46eSJiawei Linimport freechips.rocketchip.diplomacy.{LazyModule, LazyModuleImp} 8*2225d46eSJiawei Linimport utils.GTimer 9*2225d46eSJiawei Linimport xiangshan.{DebugOptions, DebugOptionsKey, PerfInfoIO} 10*2225d46eSJiawei Lin 11*2225d46eSJiawei Linclass LogCtrlIO extends Bundle { 12*2225d46eSJiawei Lin val log_begin, log_end = Input(UInt(64.W)) 13*2225d46eSJiawei Lin val log_level = Input(UInt(64.W)) // a cpp uint 14*2225d46eSJiawei Lin} 15*2225d46eSJiawei Lin 16*2225d46eSJiawei Linclass SimTop(implicit p: Parameters) extends Module { 17*2225d46eSJiawei Lin val debugOpts = p(DebugOptionsKey) 18*2225d46eSJiawei Lin val useDRAMSim = debugOpts.UseDRAMSim 19*2225d46eSJiawei Lin 20*2225d46eSJiawei Lin val l_soc = LazyModule(new XSTopWithoutDMA()) 21*2225d46eSJiawei Lin val soc = Module(l_soc.module) 22*2225d46eSJiawei Lin 23*2225d46eSJiawei Lin val l_simMMIO = LazyModule(new SimMMIO(l_soc.peripheralNode.in.head._2)) 24*2225d46eSJiawei Lin val simMMIO = Module(l_simMMIO.module) 25*2225d46eSJiawei Lin l_simMMIO.connectToSoC(l_soc) 26*2225d46eSJiawei Lin 27*2225d46eSJiawei Lin if(!useDRAMSim){ 28*2225d46eSJiawei Lin val l_simAXIMem = LazyModule(new AXI4RAMWrapper( 29*2225d46eSJiawei Lin l_soc.memAXI4SlaveNode, 8L * 1024 * 1024 * 1024, useBlackBox = true 30*2225d46eSJiawei Lin )) 31*2225d46eSJiawei Lin val simAXIMem = Module(l_simAXIMem.module) 32*2225d46eSJiawei Lin l_simAXIMem.connectToSoC(l_soc) 33*2225d46eSJiawei Lin } 34*2225d46eSJiawei Lin 35*2225d46eSJiawei Lin soc.io.clock := clock.asBool() 36*2225d46eSJiawei Lin soc.io.reset := reset.asBool() 37*2225d46eSJiawei Lin soc.io.extIntrs := 0.U 38*2225d46eSJiawei Lin 39*2225d46eSJiawei Lin val io = IO(new Bundle(){ 40*2225d46eSJiawei Lin val logCtrl = new LogCtrlIO 41*2225d46eSJiawei Lin val perfInfo = new PerfInfoIO 42*2225d46eSJiawei Lin val uart = new UARTIO 43*2225d46eSJiawei Lin val memAXI = if(useDRAMSim) l_soc.memory.cloneType else null 44*2225d46eSJiawei Lin }) 45*2225d46eSJiawei Lin 46*2225d46eSJiawei Lin simMMIO.io.uart <> io.uart 47*2225d46eSJiawei Lin 48*2225d46eSJiawei Lin if(useDRAMSim){ 49*2225d46eSJiawei Lin io.memAXI <> l_soc.memory 50*2225d46eSJiawei Lin } 51*2225d46eSJiawei Lin 52*2225d46eSJiawei Lin if (debugOpts.EnableDebug || debugOpts.EnablePerfDebug) { 53*2225d46eSJiawei Lin val timer = GTimer() 54*2225d46eSJiawei Lin val logEnable = (timer >= io.logCtrl.log_begin) && (timer < io.logCtrl.log_end) 55*2225d46eSJiawei Lin ExcitingUtils.addSource(logEnable, "DISPLAY_LOG_ENABLE") 56*2225d46eSJiawei Lin ExcitingUtils.addSource(timer, "logTimestamp") 57*2225d46eSJiawei Lin } 58*2225d46eSJiawei Lin 59*2225d46eSJiawei Lin if (debugOpts.EnablePerfDebug) { 60*2225d46eSJiawei Lin val clean = io.perfInfo.clean 61*2225d46eSJiawei Lin val dump = io.perfInfo.dump 62*2225d46eSJiawei Lin ExcitingUtils.addSource(clean, "XSPERF_CLEAN") 63*2225d46eSJiawei Lin ExcitingUtils.addSource(dump, "XSPERF_DUMP") 64*2225d46eSJiawei Lin } 65*2225d46eSJiawei Lin 66*2225d46eSJiawei Lin // Check and dispaly all source and sink connections 67*2225d46eSJiawei Lin ExcitingUtils.fixConnections() 68*2225d46eSJiawei Lin ExcitingUtils.checkAndDisplay() 69*2225d46eSJiawei Lin} 70*2225d46eSJiawei Lin 71*2225d46eSJiawei Linobject SimTop extends App { 72*2225d46eSJiawei Lin 73*2225d46eSJiawei Lin override def main(args: Array[String]): Unit = { 74*2225d46eSJiawei Lin val useDRAMSim = args.contains("--with-dramsim3") 75*2225d46eSJiawei Lin val numCores = if(args.contains("--dual-core")) 2 else 1 76*2225d46eSJiawei Lin val disableLog = args.contains("--disable-log") 77*2225d46eSJiawei Lin val disablePerf = args.contains("--disable-perf") 78*2225d46eSJiawei Lin 79*2225d46eSJiawei Lin val firrtlArgs = args. 80*2225d46eSJiawei Lin filterNot(_ == "--with-dramsim3"). 81*2225d46eSJiawei Lin filterNot(_ == "--dual-core"). 82*2225d46eSJiawei Lin filterNot(_ == "--disable-log"). 83*2225d46eSJiawei Lin filterNot(_ == "--disable-perf") 84*2225d46eSJiawei Lin 85*2225d46eSJiawei Lin val config = new DefaultConfig(numCores).alter((site, here, up) => { 86*2225d46eSJiawei Lin case DebugOptionsKey => 87*2225d46eSJiawei Lin val default = up(DebugOptionsKey) 88*2225d46eSJiawei Lin DebugOptions( 89*2225d46eSJiawei Lin FPGAPlatform = false, 90*2225d46eSJiawei Lin EnableDebug = if(disableLog) false else default.EnableDebug, 91*2225d46eSJiawei Lin EnablePerfDebug = if(disablePerf) false else default.EnablePerfDebug, 92*2225d46eSJiawei Lin UseDRAMSim = if(useDRAMSim) true else default.UseDRAMSim 93*2225d46eSJiawei Lin ) 94*2225d46eSJiawei Lin }) 95*2225d46eSJiawei Lin 96*2225d46eSJiawei Lin // generate verilog 97*2225d46eSJiawei Lin XiangShanStage.execute( 98*2225d46eSJiawei Lin firrtlArgs, 99*2225d46eSJiawei Lin Seq( 100*2225d46eSJiawei Lin ChiselGeneratorAnnotation(() => new SimTop()(config)) 101*2225d46eSJiawei Lin ) 102*2225d46eSJiawei Lin ) 103*2225d46eSJiawei Lin } 104*2225d46eSJiawei Lin} 105