Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support firesim distributed elaboration #872

Closed
wants to merge 9 commits into from
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
bootrom/*
docs/warnings.txt
/Makefrag.pkgs
target
Expand Down
65 changes: 62 additions & 3 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,73 @@ import Tests._
// implicit one
lazy val chipyardRoot = Project("chipyardRoot", file("."))

def filenames(tempDir: File, fs: Seq[File]): Seq[String] =
for(f <- fs) yield {
sbtassembly.AssemblyUtils.sourceOfFileForMerge(tempDir, f) match {
case (path, base, subDirPath, false) => subDirPath
case (jar, base, subJarPath, true) => jar + ":" + subJarPath
}
}

// custom sbtassemblly.MergeStrategy
// removes merge candidates that have 'rocketchip' in the name of their JAR
// hopefully leaving only a single candidate to be chosen as the member of
// our assembly JAR. If there's still multiple candidates, error.
val notRocketMergeStrategy = new sbtassembly.MergeStrategy {
val name = "notRocket"
def apply(tempDir: File, path: String, files: Seq[File]) = {
val filtered = files collect { f =>
sbtassembly.AssemblyUtils.sourceOfFileForMerge(tempDir, f) match {
case (jar, _, _, true) if !jar.toString.contains("rocketchip") => f
}
}
if (filtered.size == 1) Right(Seq(filtered.head -> path))
else Left("still have multiple files after removing rocketchip for same target path:" +
filenames(tempDir, filtered).mkString("\n", "\n", "")
)
}
}

// custom sbtassemblly.MergeStrategy
// keeps merge candidates that have 'rocketchip' in the name of their JAR
// hopefully leaving only a single candidate to be chosen as the member of
// our assembly JAR. If there's still multiple candidates, error.
val useRocketMergeStrategy = new sbtassembly.MergeStrategy {
val name = "useRocket"
def apply(tempDir: File, path: String, files: Seq[File]) = {
val filtered = files collect { f =>
sbtassembly.AssemblyUtils.sourceOfFileForMerge(tempDir, f) match {
case (jar, _, _, true) if jar.toString.contains("rocketchip") => f
}
}
if (filtered.size == 1) Right(Seq(filtered.head -> path))
else Left("multiple candidates have rocketchip in their jar name for target:" +
filenames(tempDir, filtered).mkString("\n", "\n", "")
)
}
}

lazy val commonSettings = Seq(
organization := "edu.berkeley.cs",
version := "1.3",
scalaVersion := "2.12.10",
test in assembly := {},
assemblyMergeStrategy in assembly := { _ match {
case PathList("META-INF", "MANIFEST.MF") => MergeStrategy.discard
case _ => MergeStrategy.first}},
assemblyMergeStrategy in assembly := {
case PathList("META-INF", "services", xs @ _*) => MergeStrategy.concat
// Discard Metadata, it's irrelevant
case PathList("META-INF", xs @ _*) => MergeStrategy.discard
// When any of our dependencies are different versions than those of firrtl.jar, there will be conflicts
// When this occurs, pick last one which is stuff in .ivy2 (ie. not firrtl.jar)
case PathList(xs @ _*) if xs.last.endsWith(".class") || xs.last.endsWith(".properties") => MergeStrategy.last
// Just take the last matching joda/time/tz/data resource files
case PathList("org", "joda", "time", "tz", "data", xs @ _*) => MergeStrategy.last
// Use the file that doesn't come from rocketchip because we've overridden it
case PathList(xs @ _*) if xs.last.equals("emulator.cc") => notRocketMergeStrategy
case PathList("vsrc", "SimDTM.v") => useRocketMergeStrategy
case x =>
val oldStrategy = (assemblyMergeStrategy in assembly).value
oldStrategy(x)
},
scalacOptions ++= Seq("-deprecation","-unchecked","-Xsource:2.11"),
addCompilerPlugin("org.scalamacros" % "paradise" % "2.1.1" cross CrossVersion.full),
unmanagedBase := (chipyardRoot / unmanagedBase).value,
Expand Down
4 changes: 2 additions & 2 deletions common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ SHELL=/bin/bash
ifndef RISCV
$(error RISCV is unset. You must set RISCV yourself, or through the Chipyard auto-generated env file)
else
$(info Running with RISCV=$(RISCV))
$(info #Running with RISCV=$(RISCV))
jerryz123 marked this conversation as resolved.
Show resolved Hide resolved
endif

#########################################################################################
Expand Down Expand Up @@ -60,7 +60,7 @@ include $(base_dir)/tools/dromajo/dromajo.mk
#########################################################################################
# Returns a list of files in directory $1 with file extension $2.
# If available, use 'fd' to find the list of files, which is faster than 'find'.
ifeq ($(shell which fd),)
ifeq ($(shell which fd 2>/dev/null),)
lookup_srcs = $(shell find -L $(1)/ -name target -prune -o -iname "*.$(2)" -print 2> /dev/null)
else
lookup_srcs = $(shell fd -L ".*\.$(2)" $(1))
Expand Down
3 changes: 2 additions & 1 deletion generators/chipyard/src/main/scala/ConfigFragments.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import freechips.rocketchip.rocket.{RocketCoreParams, MulDivParams, DCacheParams
import freechips.rocketchip.tilelink.{HasTLBusParams}
import freechips.rocketchip.util.{AsyncResetReg, Symmetric}
import freechips.rocketchip.prci._
import freechips.rocketchip.stage.phases.TargetDirKey

import testchipip._
import tracegen.{TraceGenSystem}
Expand All @@ -36,7 +37,7 @@ import chipyard._
// -----------------------

class WithBootROM extends Config((site, here, up) => {
case BootROMLocated(x) => up(BootROMLocated(x), site).map(_.copy(contentFileName = s"./bootrom/bootrom.rv${site(XLen)}.img"))
case BootROMLocated(x) => up(BootROMLocated(x), site).map(_.copy(contentFileName = s"${site(TargetDirKey)}/bootrom.rv${site(XLen)}.img"))
})

// DOC include start: gpio config fragment
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ private[stage] object UnderscoreDelimitedConfigsAnnotation extends HasShellOptio
longOption = "legacy-configs",
toAnnotationSeq = a => {
val split = a.split(':')
assert(split.length == 2)
assert(split.length == 2, s"'${a}' split by ':' doesn't yield two things")
val packageName = split.head
val configs = split.last.split("_")
Seq(new ConfigsAnnotation(configs map { config => if (config contains ".") s"${config}" else s"${packageName}.${config}" } ))
Expand Down
16 changes: 1 addition & 15 deletions generators/firechip/src/main/scala/TargetConfigs.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import java.io.File

import chisel3._
import chisel3.util.{log2Up}
import chipyard.config.WithBootROM
abejgonzalez marked this conversation as resolved.
Show resolved Hide resolved
import freechips.rocketchip.config.{Parameters, Config}
import freechips.rocketchip.groundtest.TraceGenParams
import freechips.rocketchip.tile._
Expand All @@ -23,19 +24,6 @@ import testchipip.WithRingSystemBus
import firesim.bridges._
import firesim.configs._

class WithBootROM extends Config((site, here, up) => {
case BootROMLocated(x) => {
val chipyardBootROM = new File(s"./generators/testchipip/bootrom/bootrom.rv${site(XLen)}.img")
val firesimBootROM = new File(s"./target-rtl/chipyard/generators/testchipip/bootrom/bootrom.rv${site(XLen)}.img")

val bootROMPath = if (chipyardBootROM.exists()) {
chipyardBootROM.getAbsolutePath()
} else {
firesimBootROM.getAbsolutePath()
}
up(BootROMLocated(x), site).map(_.copy(contentFileName = bootROMPath))
}
})

// Disables clock-gating; doesn't play nice with our FAME-1 pass
class WithoutClockGating extends Config((site, here, up) => {
Expand Down Expand Up @@ -65,8 +53,6 @@ class WithFireSimDesignTweaks extends Config(
new WithDefaultMemModel ++
// Required*: Uses FireSim ClockBridge and PeekPokeBridge to drive the system with a single clock/reset
new WithFireSimSimpleClocks ++
// Required*: When using FireSim-as-top to provide a correct path to the target bootrom source
new WithBootROM ++
// Required: Existing FAME-1 transform cannot handle black-box clock gates
new WithoutClockGating ++
// Required*: Removes thousands of assertions that would be synthesized (* pending PriorityMux bugfix)
Expand Down
12 changes: 6 additions & 6 deletions generators/utilities/src/main/scala/Simulator.scala
Original file line number Diff line number Diff line change
Expand Up @@ -122,15 +122,15 @@ object GenerateSimFiles extends App with HasGenerateSimConfig {
case None => Seq()
})

def writeBootrom(): Unit = {
firrtl.FileUtils.makeDirectory("./bootrom/")
writeResource("/testchipip/bootrom/bootrom.rv64.img", "./bootrom/")
writeResource("/testchipip/bootrom/bootrom.rv32.img", "./bootrom/")
writeResource("/bootrom/bootrom.img", "./bootrom/")
def writeBootrom(cfg: GenerateSimConfig): Unit = {
timsnyder-siv marked this conversation as resolved.
Show resolved Hide resolved
firrtl.FileUtils.makeDirectory(cfg.targetDir)
writeResource("/testchipip/bootrom/bootrom.rv64.img", cfg.targetDir)
writeResource("/testchipip/bootrom/bootrom.rv32.img", cfg.targetDir)
writeResource("/bootrom/bootrom.img", cfg.targetDir)
}

def writeFiles(cfg: GenerateSimConfig): Unit = {
writeBootrom()
writeBootrom(cfg)
firrtl.FileUtils.makeDirectory(cfg.targetDir)
val files = resources(cfg.simulator).map { writeResource(_, cfg.targetDir) }
writeDotF(files.map(addOption(_, cfg)), cfg)
Expand Down
2 changes: 1 addition & 1 deletion sims/firesim
Submodule firesim updated 84 files
+2 −0 .circleci/Dockerfile
+12 −0 .circleci/build-and-push-docker-image.sh
+1 −1 .circleci/config.yml
+31 −0 .github/PULL_REQUEST_TEMPLATE.md
+50 −0 CHANGELOG.md
+165 −51 deploy/buildtools/buildafi.py
+6 −1 deploy/buildtools/buildconfig.py
+27 −3 deploy/firesim
+1 −0 deploy/sample-backup-configs/sample_config_build.ini
+9 −9 deploy/sample-backup-configs/sample_config_build_recipes.ini
+6 −6 deploy/sample-backup-configs/sample_config_hwdb.ini
+11 −2 deploy/ssh-setup.sh
+6 −4 docs/Advanced-Usage/Debugging-and-Profiling-on-FPGA/AutoCounter.rst
+6 −7 docs/Advanced-Usage/Debugging-and-Profiling-on-FPGA/Debugging-Hardware-Using-ILA.rst
+2 −4 docs/Advanced-Usage/Debugging-and-Profiling-on-FPGA/Dromajo.rst
+9 −2 docs/Advanced-Usage/Debugging-in-Software/RTL-Simulation.rst
+1 −1 docs/Advanced-Usage/Generating-Different-Targets.rst
+8 −0 docs/Advanced-Usage/Manager/Manager-Command-Line-Args.rst
+10 −0 docs/Advanced-Usage/Manager/Manager-Configuration-Files.rst
+19 −0 docs/Advanced-Usage/Manager/Manager-Tasks.rst
+1 −1 docs/Advanced-Usage/Workloads/FireMarshal.rst
+9 −0 docs/Golden-Gate/Triggers.rst
+1 −0 docs/Initial-Setup/Configuring-Required-Infrastructure-in-Your-AWS-Account.rst
+1 −1 docs/Initial-Setup/Setting-up-your-Manager-Instance.rst
+1 −1 platforms/f1/aws-fpga
+3 −1 scripts/machine-launch-script.sh
+31 −1 sim/Makefile
+86 −4 sim/build.sbt
+1 −1 sim/firesim-lib/src/main/scala/bridges/UARTBridge.scala
+5 −0 sim/firesim-lib/src/main/scala/configs/CompilerConfigs.scala
+4 −2 sim/firesim-lib/src/main/scala/passes/ILATopWiring.scala
+8 −2 sim/firesim-lib/src/main/scala/util/Configs.scala
+6 −0 sim/midas/src/main/cc/Makefile
+1 −1 sim/midas/src/main/cc/bridges/synthesized_prints.cc
+1 −1 sim/midas/src/main/cc/rtlsim/Makefrag-vcs
+48 −2 sim/midas/src/main/cc/simif.cc
+8 −1 sim/midas/src/main/cc/simif.h
+8 −0 sim/midas/src/main/cc/simif_f1.cc
+1 −0 sim/midas/src/main/cc/unittest/Makefrag
+3 −0 sim/midas/src/main/scala/midas/Config.scala
+0 −2 sim/midas/src/main/scala/midas/core/Channel.scala
+2 −2 sim/midas/src/main/scala/midas/core/FPGATop.scala
+0 −4 sim/midas/src/main/scala/midas/core/LIBDNUnitTest.scala
+138 −61 sim/midas/src/main/scala/midas/core/SimWrapper.scala
+10 −9 sim/midas/src/main/scala/midas/models/dram/BankConflictModel.scala
+15 −13 sim/midas/src/main/scala/midas/models/dram/TransactionSchedulers.scala
+20 −15 sim/midas/src/main/scala/midas/passes/AutoCounterTransform.scala
+5 −0 sim/midas/src/main/scala/midas/passes/MidasTransforms.scala
+40 −0 sim/midas/src/main/scala/midas/passes/fame/AddRemainingFanoutAnnotations.scala
+10 −0 sim/midas/src/main/scala/midas/passes/fame/Annotations.scala
+90 −13 sim/midas/src/main/scala/midas/passes/fame/ChannelExcision.scala
+13 −5 sim/midas/src/main/scala/midas/passes/fame/FAMEDefaults.scala
+44 −15 sim/midas/src/main/scala/midas/passes/fame/FAMETransform.scala
+177 −46 sim/midas/src/main/scala/midas/passes/fame/FAMEUtils.scala
+78 −24 sim/midas/src/main/scala/midas/passes/fame/FindDefaultClocks.scala
+136 −0 sim/midas/src/main/scala/midas/passes/fame/PromotePassthroughConnections.scala
+1 −5 sim/midas/src/main/scala/midas/platform/PlatformShim.scala
+1 −1 sim/midas/src/main/scala/midas/stage/GoldenGateCompilerPhase.scala
+20 −9 sim/midas/src/main/scala/midas/widgets/AutoCounterBridge.scala
+37 −0 sim/midas/src/main/scala/midas/widgets/FuzzingUIntSource.scala
+0 −4 sim/midas/src/main/scala/midas/widgets/PeekPokeIO.scala
+0 −0 sim/midas/src/main/scala/midas/widgets/PrintBridge.scala
+27 −5 sim/midas/targetutils/src/main/scala/midas/annotations.scala
+1 −1 sim/src/main/cc/firesim/firesim_f1.cc
+13 −22 sim/src/main/cc/firesim/firesim_top.cc
+2 −1 sim/src/main/cc/firesim/firesim_top.h
+12 −0 sim/src/main/cc/midasexamples/Driver.cc
+18 −0 sim/src/main/cc/midasexamples/MultiRegfileFMR.h
+7 −0 sim/src/main/cc/midasexamples/MultiSRAMFMR.h
+30 −0 sim/src/main/cc/midasexamples/PassthroughModels.h
+16 −2 sim/src/main/cc/midasexamples/PrintfModule.h
+48 −6 sim/src/main/makefrag/fasedtests/Makefrag
+82 −25 sim/src/main/makefrag/firesim/Makefrag
+53 −8 sim/src/main/makefrag/midasexamples/Makefrag
+34 −0 sim/src/main/scala/midasexamples/AutoCounterModule.scala
+38 −8 sim/src/main/scala/midasexamples/MultiRegfile.scala
+30 −4 sim/src/main/scala/midasexamples/MultiSRAM.scala
+78 −0 sim/src/main/scala/midasexamples/PassthroughModels.scala
+16 −2 sim/src/main/scala/midasexamples/PrintfModule.scala
+68 −0 sim/src/main/scala/midasexamples/TriggerPredicatedPrintf.scala
+0 −3 sim/src/main/scala/midasexamples/TriggerWiringModule.scala
+77 −2 sim/src/test/scala/midasexamples/TutorialSuite.scala
+64 −24 sim/target-agnostic.mk
+1 −1 target-design/chipyard