1c6d43980SLemover/*************************************************************************************** 2e3da8badSTang Haojin* Copyright (c) 2024 Beijing Institute of Open Source Chip (BOSC) 3e3da8badSTang Haojin* Copyright (c) 2020-2024 Institute of Computing Technology, Chinese Academy of Sciences 4f320e0f0SYinan Xu* Copyright (c) 2020-2021 Peng Cheng Laboratory 5c6d43980SLemover* 6c6d43980SLemover* XiangShan is licensed under Mulan PSL v2. 7c6d43980SLemover* You can use this software according to the terms and conditions of the Mulan PSL v2. 8c6d43980SLemover* You may obtain a copy of Mulan PSL v2 at: 9c6d43980SLemover* http://license.coscl.org.cn/MulanPSL2 10c6d43980SLemover* 11c6d43980SLemover* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, 12c6d43980SLemover* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, 13c6d43980SLemover* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. 14c6d43980SLemover* 15c6d43980SLemover* See the Mulan PSL v2 for more details. 16c6d43980SLemover***************************************************************************************/ 17c6d43980SLemover 1845c767e3SLinJiaweipackage top 1945c767e3SLinJiawei 208891a219SYinan Xuimport org.chipsalliance.cde.config.{Config, Parameters} 2145c767e3SLinJiaweiimport system.SoCParamsKey 2234ab1ae9SJiawei Linimport xiangshan.{DebugOptionsKey, XSTileKey} 2319fbeaf4STang Haojinimport freechips.rocketchip.tile.MaxHartIdBits 24321934c7SKunlin Youimport difftest.DifftestModule 2545c767e3SLinJiawei 2645c767e3SLinJiaweiimport scala.annotation.tailrec 2745c767e3SLinJiaweiimport scala.sys.exit 2819fbeaf4STang Haojinimport chisel3.util.log2Up 29bb2f3f51STang Haojinimport utility._ 30*8cfc24b2STang Haojinimport device.IMSICBusType 3145c767e3SLinJiawei 3245c767e3SLinJiaweiobject ArgParser { 3345c767e3SLinJiawei // TODO: add more explainations 3445c767e3SLinJiawei val usage = 3545c767e3SLinJiawei """ 3645c767e3SLinJiawei |XiangShan Options 3745c767e3SLinJiawei |--xs-help print this help message 38ce34d21eSJiuyue Ma |--version print version info 3945c767e3SLinJiawei |--config <ConfigClassName> 4045c767e3SLinJiawei |--num-cores <Int> 41b628978eSTang Haojin |--hartidbits <Int> 4245c767e3SLinJiawei |--with-dramsim3 431545277aSYinan Xu |--fpga-platform 449eee369fSKamimiao |--reset-gen 451545277aSYinan Xu |--enable-difftest 461545277aSYinan Xu |--enable-log 47839e5512SZifei Zhang |--with-chiseldb 48839e5512SZifei Zhang |--with-rollingdb 4945c767e3SLinJiawei |--disable-perf 5037b8fdeeSKamimiao |--disable-alwaysdb 514b2c87baS梁森 Liang Sen |--enable-dfx 5245c767e3SLinJiawei |""".stripMargin 5345c767e3SLinJiawei 5445c767e3SLinJiawei def getConfigByName(confString: String): Parameters = { 5545c767e3SLinJiawei var prefix = "top." // default package is 'top' 5645c767e3SLinJiawei if(confString.contains('.')){ // already a full name 5745c767e3SLinJiawei prefix = "" 5845c767e3SLinJiawei } 5945c767e3SLinJiawei val c = Class.forName(prefix + confString).getConstructor(Integer.TYPE) 6045c767e3SLinJiawei c.newInstance(1.asInstanceOf[Object]).asInstanceOf[Parameters] 6145c767e3SLinJiawei } 6251e45dbbSTang Haojin def parse(args: Array[String]): (Parameters, Array[String], Array[String]) = { 6345c767e3SLinJiawei val default = new DefaultConfig(1) 6445c767e3SLinJiawei var firrtlOpts = Array[String]() 65b665b650STang Haojin var firtoolOpts = Array[String]() 6645c767e3SLinJiawei @tailrec 6745c767e3SLinJiawei def nextOption(config: Parameters, list: List[String]): Parameters = { 6845c767e3SLinJiawei list match { 6945c767e3SLinJiawei case Nil => config 7045c767e3SLinJiawei case "--xs-help" :: tail => 7145c767e3SLinJiawei println(usage) 7245c767e3SLinJiawei if(tail == Nil) exit(0) 7345c767e3SLinJiawei nextOption(config, tail) 74ce34d21eSJiuyue Ma case "--version" :: tail => 75ce34d21eSJiuyue Ma println(os.read(os.resource / "publishVersion")) 76ce34d21eSJiuyue Ma if(tail == Nil) exit(0) 77ce34d21eSJiuyue Ma nextOption(config, tail) 7845c767e3SLinJiawei case "--config" :: confString :: tail => 7945c767e3SLinJiawei nextOption(getConfigByName(confString), tail) 801fc8b877Szhanglinjuan case "--issue" :: issueString :: tail => 811fc8b877Szhanglinjuan nextOption(config.alter((site, here, up) => { 821fc8b877Szhanglinjuan case coupledL2.tl2chi.CHIIssue => issueString 831fc8b877Szhanglinjuan }), tail) 8445c767e3SLinJiawei case "--num-cores" :: value :: tail => 8545c767e3SLinJiawei nextOption(config.alter((site, here, up) => { 8634ab1ae9SJiawei Lin case XSTileKey => (0 until value.toInt) map { i => 8734ab1ae9SJiawei Lin up(XSTileKey).head.copy(HartId = i) 8834ab1ae9SJiawei Lin } 8919fbeaf4STang Haojin case MaxHartIdBits => 90b628978eSTang Haojin log2Up(value.toInt) max up(MaxHartIdBits) 91b628978eSTang Haojin }), tail) 92b628978eSTang Haojin case "--hartidbits" :: hartidbits :: tail => 93b628978eSTang Haojin nextOption(config.alter((site, here, up) => { 9496f46b96STang Haojin case MaxHartIdBits => hartidbits.toInt 9545c767e3SLinJiawei }), tail) 9645c767e3SLinJiawei case "--with-dramsim3" :: tail => 9745c767e3SLinJiawei nextOption(config.alter((site, here, up) => { 9845c767e3SLinJiawei case DebugOptionsKey => up(DebugOptionsKey).copy(UseDRAMSim = true) 9945c767e3SLinJiawei }), tail) 100b8890d17SZifei Zhang case "--with-chiseldb" :: tail => 101b8890d17SZifei Zhang nextOption(config.alter((site, here, up) => { 102b8890d17SZifei Zhang case DebugOptionsKey => up(DebugOptionsKey).copy(EnableChiselDB = true) 103b8890d17SZifei Zhang }), tail) 104839e5512SZifei Zhang case "--with-rollingdb" :: tail => 105839e5512SZifei Zhang nextOption(config.alter((site, here, up) => { 106839e5512SZifei Zhang case DebugOptionsKey => up(DebugOptionsKey).copy(EnableRollingDB = true) 107839e5512SZifei Zhang }), tail) 108047e34f9SMaxpicca-Li case "--with-constantin" :: tail => 109047e34f9SMaxpicca-Li nextOption(config.alter((site, here, up) => { 110047e34f9SMaxpicca-Li case DebugOptionsKey => up(DebugOptionsKey).copy(EnableConstantin = true) 111047e34f9SMaxpicca-Li }), tail) 1121545277aSYinan Xu case "--fpga-platform" :: tail => 11345c767e3SLinJiawei nextOption(config.alter((site, here, up) => { 1141545277aSYinan Xu case DebugOptionsKey => up(DebugOptionsKey).copy(FPGAPlatform = true) 1151545277aSYinan Xu }), tail) 1169eee369fSKamimiao case "--reset-gen" :: tail => 1179eee369fSKamimiao nextOption(config.alter((site, here, up) => { 1189eee369fSKamimiao case DebugOptionsKey => up(DebugOptionsKey).copy(ResetGen = true) 1199eee369fSKamimiao }), tail) 1201545277aSYinan Xu case "--enable-difftest" :: tail => 1211545277aSYinan Xu nextOption(config.alter((site, here, up) => { 1221545277aSYinan Xu case DebugOptionsKey => up(DebugOptionsKey).copy(EnableDifftest = true) 1231545277aSYinan Xu }), tail) 124b7d9e8d5Sxiaofeibao-xjtu case "--disable-always-basic-diff" :: tail => 125b7d9e8d5Sxiaofeibao-xjtu nextOption(config.alter((site, here, up) => { 126b7d9e8d5Sxiaofeibao-xjtu case DebugOptionsKey => up(DebugOptionsKey).copy(AlwaysBasicDiff = false) 127b7d9e8d5Sxiaofeibao-xjtu }), tail) 1281545277aSYinan Xu case "--enable-log" :: tail => 1291545277aSYinan Xu nextOption(config.alter((site, here, up) => { 1301545277aSYinan Xu case DebugOptionsKey => up(DebugOptionsKey).copy(EnableDebug = true) 13145c767e3SLinJiawei }), tail) 13245c767e3SLinJiawei case "--disable-perf" :: tail => 13345c767e3SLinJiawei nextOption(config.alter((site, here, up) => { 13445c767e3SLinJiawei case DebugOptionsKey => up(DebugOptionsKey).copy(EnablePerfDebug = false) 13545c767e3SLinJiawei }), tail) 1364ba1d457SKunlin You case "--perf-level" :: value :: tail => 1374ba1d457SKunlin You nextOption(config.alter((site, here, up) => { 1384ba1d457SKunlin You case DebugOptionsKey => up(DebugOptionsKey).copy(PerfLevel = value) 1394ba1d457SKunlin You }), tail) 14037b8fdeeSKamimiao case "--disable-alwaysdb" :: tail => 14137b8fdeeSKamimiao nextOption(config.alter((site, here, up) => { 14237b8fdeeSKamimiao case DebugOptionsKey => up(DebugOptionsKey).copy(AlwaysBasicDB = false) 14337b8fdeeSKamimiao }), tail) 144e3da8badSTang Haojin case "--xstop-prefix" :: value :: tail => 145a5b77de4STang Haojin nextOption(config.alter((site, here, up) => { 146a5b77de4STang Haojin case SoCParamsKey => up(SoCParamsKey).copy(XSTopPrefix = Some(value)) 147a5b77de4STang Haojin }), tail) 148*8cfc24b2STang Haojin case "--imsic-bus-type" :: value :: tail => 149720dd621STang Haojin nextOption(config.alter((site, here, up) => { 150*8cfc24b2STang Haojin case SoCParamsKey => up(SoCParamsKey).copy(IMSICBusType = device.IMSICBusType.withName(value)) 151720dd621STang Haojin }), tail) 152a74491fcSzhanglinjuan case "--enable-ns" :: tail => 153a74491fcSzhanglinjuan nextOption(config.alter((site, here, up) => { 154a74491fcSzhanglinjuan case coupledL2.tl2chi.NonSecureKey => true 155a74491fcSzhanglinjuan }), tail) 156b665b650STang Haojin case "--firtool-opt" :: option :: tail => 15751e45dbbSTang Haojin firtoolOpts ++= option.split(" ").filter(_.nonEmpty) 158b665b650STang Haojin nextOption(config, tail) 159414f1bf4STang Haojin case "--l2-cache-size" :: value :: tail => 160414f1bf4STang Haojin nextOption(config.alter((site, here, up) => { 161414f1bf4STang Haojin case XSTileKey => 162414f1bf4STang Haojin val tileParams = up(XSTileKey) 163414f1bf4STang Haojin val banks = tileParams.map(_.L2NBanks) 164414f1bf4STang Haojin val ways = tileParams.map(_.L2CacheParamsOpt.map(_.ways)) 165414f1bf4STang Haojin val l2sets = banks zip ways map { case (banks, ways) => 166414f1bf4STang Haojin ways.map(value.toInt * 1024 / banks / _ / 64) 167414f1bf4STang Haojin } 168414f1bf4STang Haojin val newL2Params = tileParams zip l2sets map { case (tileParam, l2sets) => 169414f1bf4STang Haojin tileParam.L2CacheParamsOpt.map(_.copy( 170414f1bf4STang Haojin sets = l2sets.get 171414f1bf4STang Haojin )) 172414f1bf4STang Haojin } 173414f1bf4STang Haojin tileParams zip newL2Params map { case (tileParam, newL2Param) => 174414f1bf4STang Haojin tileParam.copy(L2CacheParamsOpt = newL2Param) 175414f1bf4STang Haojin } 176414f1bf4STang Haojin }), tail) 177414f1bf4STang Haojin case "--l3-cache-size" :: value :: tail => 178414f1bf4STang Haojin nextOption(config.alter((site, here, up) => { 179414f1bf4STang Haojin case SoCParamsKey => 180414f1bf4STang Haojin val socParam = up(SoCParamsKey) 181414f1bf4STang Haojin val banks = socParam.L3NBanks 182414f1bf4STang Haojin val l3Ways = socParam.L3CacheParamsOpt.map(_.ways) 183414f1bf4STang Haojin val l3Sets = l3Ways.map(value.toInt * 1024 / banks / _ / 64) 184414f1bf4STang Haojin val openLLCWays = socParam.OpenLLCParamsOpt.map(_.ways) 185414f1bf4STang Haojin val openLLCSets = openLLCWays.map(value.toInt * 1024 / banks / _ / 64) 186414f1bf4STang Haojin val newL3Param = socParam.L3CacheParamsOpt.map(_.copy( 187414f1bf4STang Haojin sets = l3Sets.get 188414f1bf4STang Haojin )) 189414f1bf4STang Haojin val openLLCParam = socParam.OpenLLCParamsOpt.map(_.copy( 190414f1bf4STang Haojin sets = openLLCSets.get 191414f1bf4STang Haojin )) 192414f1bf4STang Haojin socParam.copy( 193414f1bf4STang Haojin L3CacheParamsOpt = newL3Param, 194414f1bf4STang Haojin OpenLLCParamsOpt = openLLCParam 195414f1bf4STang Haojin ) 196414f1bf4STang Haojin }), tail) 197d084f29cSTang Haojin case "--dfx" :: value :: tail => 1984b2c87baS梁森 Liang Sen nextOption(config.alter((site, here, up) => { 199d084f29cSTang Haojin case XSTileKey => up(XSTileKey).map(_.copy(hasMbist = value.toBoolean)) 2004b2c87baS梁森 Liang Sen }), tail) 201602aa9f1Scz4e case "--sram-with-ctl" :: tail => 202602aa9f1Scz4e nextOption(config.alter((site, here, up) => { 203602aa9f1Scz4e case XSTileKey => up(XSTileKey).map(_.copy(hasSramCtl = true)) 204602aa9f1Scz4e }), tail) 20516ae9ddcSTang Haojin case "--seperate-tl-bus" :: tail => 2064a699e27Szhanglinjuan nextOption(config.alter((site, here, up) => { 20716ae9ddcSTang Haojin case SoCParamsKey => up(SoCParamsKey).copy(SeperateTLBus = true) 20816ae9ddcSTang Haojin }), tail) 20916ae9ddcSTang Haojin case "--seperate-dm" :: tail => 21016ae9ddcSTang Haojin nextOption(config.alter((site, here, up) => { 21116ae9ddcSTang Haojin case SoCParamsKey => up(SoCParamsKey).copy(SeperateDM = true) 2124a699e27Szhanglinjuan }), tail) 2134c0658aeSTang Haojin case "--wfi-resume" :: value :: tail => 2144c0658aeSTang Haojin nextOption(config.alter((site, here, up) => { 2154c0658aeSTang Haojin case XSTileKey => up(XSTileKey).map(_.copy(wfiResume = value.toBoolean)) 2164c0658aeSTang Haojin }), tail) 2175bd65c56STang Haojin case "--yaml-config" :: yamlFile :: tail => 2185bd65c56STang Haojin nextOption(YamlParser.parseYaml(config, yamlFile), tail) 21945c767e3SLinJiawei case option :: tail => 22045c767e3SLinJiawei // unknown option, maybe a firrtl option, skip 22145c767e3SLinJiawei firrtlOpts :+= option 22245c767e3SLinJiawei nextOption(config, tail) 22345c767e3SLinJiawei } 22445c767e3SLinJiawei } 225321934c7SKunlin You val newArgs = DifftestModule.parseArgs(args) 226bb2f3f51STang Haojin val config = nextOption(default, newArgs.toList).alter((site, here, up) => { 227bb2f3f51STang Haojin case LogUtilsOptionsKey => LogUtilsOptions( 228bb2f3f51STang Haojin here(DebugOptionsKey).EnableDebug, 229bb2f3f51STang Haojin here(DebugOptionsKey).EnablePerfDebug, 230bb2f3f51STang Haojin here(DebugOptionsKey).FPGAPlatform 231bb2f3f51STang Haojin ) 232bb2f3f51STang Haojin case PerfCounterOptionsKey => PerfCounterOptions( 233bb2f3f51STang Haojin here(DebugOptionsKey).EnablePerfDebug && !here(DebugOptionsKey).FPGAPlatform, 234bb2f3f51STang Haojin here(DebugOptionsKey).EnableRollingDB && !here(DebugOptionsKey).FPGAPlatform, 2354ba1d457SKunlin You XSPerfLevel.withName(here(DebugOptionsKey).PerfLevel), 236bb2f3f51STang Haojin 0 237bb2f3f51STang Haojin ) 238bb2f3f51STang Haojin }) 23951e45dbbSTang Haojin (config, firrtlOpts, firtoolOpts) 24045c767e3SLinJiawei } 24145c767e3SLinJiawei} 242