From 5fe971efe5cdc84cd3ce184183a449da55c18c69 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 09:29:31 -0700 Subject: [PATCH 01/32] Rocket core vs Rocket Chip --- docs/Generators/Rocket.rst | 7 ++++--- docs/Generators/RocketChip.rst | 16 ++++++++-------- docs/Generators/index.rst | 6 +++--- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/docs/Generators/Rocket.rst b/docs/Generators/Rocket.rst index 401b9e36..53ff0575 100644 --- a/docs/Generators/Rocket.rst +++ b/docs/Generators/Rocket.rst @@ -1,8 +1,9 @@ -Rocket +Rocket Core ==================================== -`Rocket `__ is a 5-stage in-order scalar core generator that is supported by `SiFive `__. -It supports the open source RV64GC RISC-V instruction set and is written in the Chisel hardware construction language. +`Rocket `__ is a 5-stage in-order scalar processor core generator, originally developed at UC Berkeley an currently supported by `SiFive `__. The Rocket core is used as a component (a `tile`) within the Rocket Chip SoC generator. + +The Rocket core supports the open source RV64GC RISC-V instruction set and is written in the Chisel hardware construction language. It has an MMU that supports page-based virtual memory, a non-blocking data cache, and a front-end with branch prediction. Branch prediction is configurable and provided by a branch target buffer (BTB), branch history table (BHT), and a return address stack (RAS). For floating-point, Rocket makes use of Berkeley’s Chisel implementations of floating-point units. diff --git a/docs/Generators/RocketChip.rst b/docs/Generators/RocketChip.rst index b6050534..8ef12746 100644 --- a/docs/Generators/RocketChip.rst +++ b/docs/Generators/RocketChip.rst @@ -1,15 +1,15 @@ -RocketChip -========== +Rocket Chip +=========== -RocketChip is an SoC generator developed at Berkeley and now supported by -SiFive. Chipyard uses RocketChip as the basis for producing a RISC-V SoC. +Rocket Chip generator is an SoC generator developed at Berkeley and now supported by +SiFive. Chipyard uses the Rocket Chip generator as the basis for producing a RISC-V SoC. -RocketChip is distinct from Rocket, the in-order RISC-V CPU generator. -RocketChip includes many parts of the SoC besides the CPU. Though RocketChip -uses Rocket CPUs by default, it can also be configured to use the BOOM +`Rocket Chip` is distinct from `Rocket core`, the in-order RISC-V CPU generator. +Rocket Chip includes many parts of the SoC besides the CPU. Though Rocket Chip +uses Rocket core CPUs by default, it can also be configured to use the BOOM out-of-order core generator or some other custom CPU generator instead. -A detailed diagram of a typical RocketChip system is shown below. +A detailed diagram of a typical Rocket Chip system is shown below. .. image:: ../_static/images/rocketchip-diagram.png diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index a147ffeb..cd7d55ec 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -11,7 +11,7 @@ The following pages introduce the generators integrated with the Chipyard framew :maxdepth: 2 :caption: Generators: - Rocket - BOOM + Rocket Chip + Rocket Core + BOOM Core Hwacha - RocketChip From d04661194320e21291a080123bdd74e70fe18eb5 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 10:20:03 -0700 Subject: [PATCH 02/32] hwacha update --- docs/Generators/Hwacha.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/docs/Generators/Hwacha.rst b/docs/Generators/Hwacha.rst index d040d35d..cf31d1b4 100644 --- a/docs/Generators/Hwacha.rst +++ b/docs/Generators/Hwacha.rst @@ -2,7 +2,12 @@ Hwacha ==================================== The Hwacha project is developing a new vector architecture for future computer systems that are constrained in their power and energy consumption. -Inspired by traditional vector machines from the 70s and 80s, and lessons learned from our previous vector-thread architectures Scale and Maven, we are bringing back elegant, performant, and energy-efficient aspects of vector processing to modern data-parallel architectures. -We propose a new vector-fetch architectural paradigm, which focuses on the following aspects for higher performance, better energy efficiency, and lower complexity. +The Hwacha project is inspired by traditional vector machines from the 70s and 80s, and lessons learned from our previous vector-thread architectures such as Scale and Maven +The Hwacha project includes the Hwacha microarchitecture generator, as well as the Hwacha non-standard RISC-V extension. Hwacha does not implement the RISC-V standard vector extension proposal. -For more information, please visit the `Hwacha website `__. +For more information on the Hwacha project, please visit the `Hwacha website `__. + +To add the Hwacha vector unit to an SoC, you should add the ``hwacha.DefaultHwachaConfig`` config mixin to the SoC configurations. + +Since Hwacha implements a non-standard RISC-V extension, it requires a unique software toolchain to be able to compile and asseble its vector instructions. +To install the Hwacha toolchain, run the ``./scripts/build-toolchains.sh esp-tools`` command within the root Chipyard directory. This may take a while, and it will install the ``esp-tools-install`` directory within your Chipyard root directory. ``esp-tools`` are a fork of ``riscv-tools`` (formelty a collection of relevant software RISC-V tools) that were enhanced with the additional non-standard vector instructions. However, due to the upstreaming of the equivalent RISC-V toolchains, esp-tools may not be up-to-date with the latest mainline version of the tools included in it. From 8b61a9d51a3deb395c7ebf9e2405538cedcc5368 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 25 Sep 2019 10:38:54 -0700 Subject: [PATCH 03/32] [docs] SHA3 docs. Copypasta'd from old SHA3 content --- docs/Generators/SHA3.rst | 70 +++++++++++++++++++++++++++++++++++ docs/Generators/index.rst | 1 + docs/_static/images/sha3.png | Bin 0 -> 158008 bytes 3 files changed, 71 insertions(+) create mode 100644 docs/Generators/SHA3.rst create mode 100644 docs/_static/images/sha3.png diff --git a/docs/Generators/SHA3.rst b/docs/Generators/SHA3.rst new file mode 100644 index 00000000..ca3d1b03 --- /dev/null +++ b/docs/Generators/SHA3.rst @@ -0,0 +1,70 @@ +SHA3 RoCC Accelerator +=================================== + +Introduction +----------------------------------- +Secure hashing algorithms represent a class of hashing functions that provide four attributes: ease +of hash computation, inability to generate the message from the hash (one-way property), inability +to change the message and not the hash (weakly collision free property), and inability to find +two messages with the same hash (strongly collision free property). The National Institute of +Standards and Technology (NIST) recently held a competition for a new algorithm to be added to +its set of Secure Hashing Algorithms (SHA). In 2012 the winner was determined to be the Keccak +hashing function and a rough specification for SHA3 was established. The algorithm operates on +variable length messages with a sponge function, and thus alternates between absorbing chunks of +the message into a set of state bits and permuting the state. The absorbing is a simple bitwise +XOR while the permutation is a more complex function composed of several operations, χ, θ, ρ, +π, ι, that all perform various bitwise operations, including rotations, parity calculations, XORs, +etc. The Keccak hashing function is parameterized for different sizes of state and message chunks +but for this lab we will only support the Keccak-256 variant with 1600 bits of state and 1088 bit +message chunks. In addition, for this lab we will ignore the variable length portion to avoid one +of the most complicated parts of Keccak the padding. Our interface, which is discussed further +below, assume a single chunk of message is ready to be absorbed and hashed. A diagram of the SHA3 +accelerator is shown below. + +.. image:: ../_static/images/sha3.png + +Technical Details +------------------------------------ +The accelerator is designed around three sub-systems, an +interface with the processor, an interface with memory, and +the actual hashing computation system. The interface +with the processor is designed using the ROCC interface for +coprocessors integrating with the RISC-V Rocket/BOOM +processor. It includes the ability to transfer two 64 bit +words to the co-processor, the request for a return value, +and a small field for the function requested. The accelerator +receives these requests using a ready/valid interface. The +ROCC instruction is parsed and the needed information is +stored into one of the T execution contexts, only if there is +one available. These execution contexts contain the memory +address of the message being hashed, the memory address +to store the resulting hash in, the length of the message, and +several other control fields. + +Once the execution context is valid the memory subsystem +then begins to fetch chunks of the message. The memory +subsystem is fully decoupled from the other subsystems +and maintains either T or 4 memory buffers, whichever is +smaller. The accelerators memory interface can provide a +maximum of one 64 bit word per cycle which corresponds +to 17 requests needed to fill a buffer (the size is dictated by +the SHA3 algorithm). Memory requests to fill these buffers +are sent out as rapidly as the memory interface can handle, +with a tag field set to allow the different memory buffers +requests to be distinguished, as they may be returned out of +order. Once the memory subsystem has filled a buffer the +control unit absorbs the buffer into the appropriate execution +context, at which point the execution context is free to +begin permutation, and the memory buffer is free to send +more memory requests. + +After the buffer is absorbed, the hashing computation +subsystem begins the permutation operations. Because the +hashing subsystem has a parameterized number of execution +units in parallel, D, as well as a parameterized number +of round execution units, N, it requires a dynamic scheduler +to determine which execution context are ready to run and +on which available execution unit they should be run. Once +the message is fully hashed, the hash is written to memory +with a simple state machine. + diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index a147ffeb..6c27eedb 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -15,3 +15,4 @@ The following pages introduce the generators integrated with the Chipyard framew BOOM Hwacha RocketChip + SHA3 diff --git a/docs/_static/images/sha3.png b/docs/_static/images/sha3.png new file mode 100644 index 0000000000000000000000000000000000000000..def952944045f9432a25c2ca13b379181fdd38e3 GIT binary patch literal 158008 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 z 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 Q-K`?Epgb$qZy)32+hr>X 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
    hb9r-z3StpMvL>Y32Kb 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 literal 0 HcmV?d00001 From eae76451594a8d7aca9f4079ace11a9ae87ac8ca Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 11:56:26 -0700 Subject: [PATCH 04/32] sifive generators --- docs/Customization/Memory-Hierarchy.rst | 2 + docs/Generators/SiFive-Generators.rst | 43 +++++++++++++++++++ .../example/src/main/scala/ConfigMixins.scala | 4 ++ .../src/main/scala/RocketConfigs.scala | 2 + 4 files changed, 51 insertions(+) create mode 100644 docs/Generators/SiFive-Generators.rst diff --git a/docs/Customization/Memory-Hierarchy.rst b/docs/Customization/Memory-Hierarchy.rst index 39955310..207e0775 100644 --- a/docs/Customization/Memory-Hierarchy.rst +++ b/docs/Customization/Memory-Hierarchy.rst @@ -1,3 +1,5 @@ +.. _memory-hierarchy: + Memory Hierarchy =============================== diff --git a/docs/Generators/SiFive-Generators.rst b/docs/Generators/SiFive-Generators.rst new file mode 100644 index 00000000..1ddab4f2 --- /dev/null +++ b/docs/Generators/SiFive-Generators.rst @@ -0,0 +1,43 @@ +SiFive Generators +================== + +Chipyard includes several open-source generators developed and maintained by `SiFive `__. +These are currently organized within two submodules named ``sifive-blocks`` and ``sifive-cache``. + +L2 Cache +--------- + +``sifive-cache`` includes an L2 cache geneator. To use this L2 cache, you should add the ``freechips.rocketchip.subsystem.WithInclusiveCache`` mixin to your SoC configuration. +To learn more about configuring this L2, please refer to the :ref:`memory-hierarchy` section. + + +Perihperal Devices +------------------- +``sifive-blocks`` includes multiple peripheral device generators. These include UART, SPI, PWM, JTAG, GPIO and more. + +These peripheral devices usually affect the memory map of the SoC, and its top-level IO as well. +To integrate one of these devices in your SoC, you will need to define a custom mixin with the approriate address for the device using the Rocket Chip parameter system. As an example, for a GPIO device you could add the following mixin to set the GPIO address to ``0x10012000``. + +.. literalinclude:: ../../generators/example/src/main/scala/ConfigMixins.scala + :language: scala + :start-after: DOC include start: WithGPIO + :end-before: DOC include end: WithGPIO + +Additionally, if the device requires top-level IOs, you will need to define a mixin to change the top-level configuration of your SoC. +When adding a top-level IO, you should also be aware of whether it interacts with the test-harness. +For example, a GPIO device would require a GPIO pin, and therefore we would write a mixin to augment the top level as follows: + +.. literalinclude:: ../../generators/example/src/main/scala/ConfigMixins.scala + :language: scala + :start-after: DOC include start: WithGPIOTop + :end-before: DOC include end: WithGPIOTop + + +Finally, you add the relevant config mixin to the SoC config. For example: + +.. literalinclude:: ../../generators/example/src/main/scala/RocketConfigs.scala + :language: scala + :start-after: DOC include start: GPIORocketConfig + :end-before: DOC include end: GPIORocketConfig + +Some of the devices in ``sifive-blocks`` (such as GPIO) may already have pre-defined mixins within the Chipyard example project. You may be able to use these config mixin directly, but you should be aware of their addresses within the SoC address map. diff --git a/generators/example/src/main/scala/ConfigMixins.scala b/generators/example/src/main/scala/ConfigMixins.scala index a829db22..9d92d896 100644 --- a/generators/example/src/main/scala/ConfigMixins.scala +++ b/generators/example/src/main/scala/ConfigMixins.scala @@ -37,6 +37,7 @@ class WithBootROM extends Config((site, here, up) => { contentFileName = s"./bootrom/bootrom.rv${site(XLen)}.img") }) +// DOC include start: WithGPIO /** * Class to add in GPIO */ @@ -44,6 +45,7 @@ class WithGPIO extends Config((site, here, up) => { case PeripheryGPIOKey => List( GPIOParams(address = 0x10012000, width = 4, includeIOF = false)) }) +// DOC include end: WithGPIO // ----------------------------------------------- // BOOM and/or Rocket Top Level System Parameter Mixins @@ -107,6 +109,7 @@ class WithSimBlockDeviceTop extends Config((site, here, up) => { } }) +// DOC include start: WithGPIOTop /** * Class to specify a top level BOOM and/or Rocket system with GPIO */ @@ -121,6 +124,7 @@ class WithGPIOTop extends Config((site, here, up) => { top } }) +// DOC include end: WithGPIOTop // ------------------ // Multi-RoCC Support diff --git a/generators/example/src/main/scala/RocketConfigs.scala b/generators/example/src/main/scala/RocketConfigs.scala index 2275549f..a50ad4a7 100644 --- a/generators/example/src/main/scala/RocketConfigs.scala +++ b/generators/example/src/main/scala/RocketConfigs.scala @@ -73,6 +73,7 @@ class BlockDeviceModelRocketConfig extends Config( new freechips.rocketchip.subsystem.WithNBigCores(1) ++ new freechips.rocketchip.system.BaseConfig) +// DOC include start: GPIORocketConfig class GPIORocketConfig extends Config( new WithGPIO ++ // add GPIOs to the peripherybus new WithGPIOTop ++ // use top with GPIOs @@ -80,6 +81,7 @@ class GPIORocketConfig extends Config( new freechips.rocketchip.subsystem.WithInclusiveCache ++ new freechips.rocketchip.subsystem.WithNBigCores(1) ++ new freechips.rocketchip.system.BaseConfig) +// DOC include end: GPIORocketConfig class DualCoreRocketConfig extends Config( new WithTop ++ From 9af3391f87b7890e4819351e24f7ffb818556c9c Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 11:56:34 -0700 Subject: [PATCH 05/32] fix index --- docs/Generators/index.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index cd7d55ec..a08d6bb2 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -11,7 +11,8 @@ The following pages introduce the generators integrated with the Chipyard framew :maxdepth: 2 :caption: Generators: - Rocket Chip - Rocket Core + RocketChip + Rocket BOOM Core Hwacha + SiFive-Generators From 8fbf02c8fe703da109be194e5409ccf56816ba92 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 11:58:50 -0700 Subject: [PATCH 06/32] fix index --- docs/Generators/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index a08d6bb2..1b9f56c8 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -13,6 +13,6 @@ The following pages introduce the generators integrated with the Chipyard framew RocketChip Rocket - BOOM Core + BOOM Hwacha SiFive-Generators From 80328d0c4da4784dbd638b397aeed6c347e04450 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 12:08:08 -0700 Subject: [PATCH 07/32] clarify GPIO top example --- docs/Generators/SiFive-Generators.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Generators/SiFive-Generators.rst b/docs/Generators/SiFive-Generators.rst index 1ddab4f2..7777a766 100644 --- a/docs/Generators/SiFive-Generators.rst +++ b/docs/Generators/SiFive-Generators.rst @@ -32,6 +32,8 @@ For example, a GPIO device would require a GPIO pin, and therefore we would writ :start-after: DOC include start: WithGPIOTop :end-before: DOC include end: WithGPIOTop +This example instantiates a top-level module with include GPIO ports (``TopWithGPIO``), and then ties-off the GPIO port inputs to 0 (``false.B``). + Finally, you add the relevant config mixin to the SoC config. For example: From c6f57559002b1d41fe3360ca3e03f88414272ccf Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 12:18:56 -0700 Subject: [PATCH 08/32] some more hwacha info --- docs/Generators/Hwacha.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/Generators/Hwacha.rst b/docs/Generators/Hwacha.rst index cf31d1b4..60549ddb 100644 --- a/docs/Generators/Hwacha.rst +++ b/docs/Generators/Hwacha.rst @@ -7,7 +7,9 @@ The Hwacha project includes the Hwacha microarchitecture generator, as well as t For more information on the Hwacha project, please visit the `Hwacha website `__. -To add the Hwacha vector unit to an SoC, you should add the ``hwacha.DefaultHwachaConfig`` config mixin to the SoC configurations. +To add the Hwacha vector unit to an SoC, you should add the ``hwacha.DefaultHwachaConfig`` config mixin to the SoC configurations. The Hwacha vector unit uses the RoCC port of a `Rocket Chip tile`, and by default connects to the memory system through the `System Bus` (i.e., directly to the L2 cache). + +To change to configuration of the Hwacha vector unit, you can write a custom configuration to replace the ``DefaultHwachaConfig``. You can view the ``DefaultHwachaConfig`` under ``generators/hwacha/src/main/scala/configs.scala`` to see the possible configuration parameters. Since Hwacha implements a non-standard RISC-V extension, it requires a unique software toolchain to be able to compile and asseble its vector instructions. To install the Hwacha toolchain, run the ``./scripts/build-toolchains.sh esp-tools`` command within the root Chipyard directory. This may take a while, and it will install the ``esp-tools-install`` directory within your Chipyard root directory. ``esp-tools`` are a fork of ``riscv-tools`` (formelty a collection of relevant software RISC-V tools) that were enhanced with the additional non-standard vector instructions. However, due to the upstreaming of the equivalent RISC-V toolchains, esp-tools may not be up-to-date with the latest mainline version of the tools included in it. From b858c76f0952ac72bf1d57246ee7f6debfe3b9f9 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 12:28:39 -0700 Subject: [PATCH 09/32] fix rocket core ref --- docs/Chipyard-Basics/Chipyard-Components.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/Chipyard-Basics/Chipyard-Components.rst b/docs/Chipyard-Basics/Chipyard-Components.rst index 250beb85..6d54ad94 100644 --- a/docs/Chipyard-Basics/Chipyard-Components.rst +++ b/docs/Chipyard-Basics/Chipyard-Components.rst @@ -8,12 +8,13 @@ Generators The Chipyard Framework currently consists of the following RTL generators: + Processor Cores ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -**Rocket** +**Rocket Core** An in-order RISC-V core. - See :ref:`Rocket` for more information. + See :ref:`Rocket Core` for more information. **BOOM (Berkeley Out-of-Order Machine)** An out-of-order RISC-V core. From f7138a8d715420777a04aeba4135d50662e1a229 Mon Sep 17 00:00:00 2001 From: Brendan Sweeney Date: Wed, 25 Sep 2019 12:53:08 -0700 Subject: [PATCH 10/32] Notes on building with macOS doesn't really work --- docs/Chipyard-Basics/Initial-Repo-Setup.rst | 17 ++++++++++++++++- docs/Quick-Start.rst | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/docs/Chipyard-Basics/Initial-Repo-Setup.rst b/docs/Chipyard-Basics/Initial-Repo-Setup.rst index 7b7042ee..5375a604 100644 --- a/docs/Chipyard-Basics/Initial-Repo-Setup.rst +++ b/docs/Chipyard-Basics/Initial-Repo-Setup.rst @@ -1,6 +1,21 @@ Initial Repository Setup ======================================================== +Requirements +------------------------------------------- + +Using Linux is recommended. +The provided scripts will not work on macOS out of the box, but they may be able to be modified to support it. +Working under Windows is not recommended. + +* dtc (design-tree-compiler) + +* GNU awk + +* GNU sed + +* GNU make + Checking out the sources ------------------------ @@ -28,6 +43,6 @@ But to get a basic installation, just the following steps are necessary. ./scripts/build-toolchains.sh esp-tools # for a modified risc-v toolchain with Hwacha vector instructions -Once the script is run, a ``env.sh`` file is emitted at sets the ``PATH``, ``RISCV``, and ``LD_LIBRARY_PATH`` environment variables. +Once the script is run, a ``env.sh`` file is emitted that sets the ``PATH``, ``RISCV``, and ``LD_LIBRARY_PATH`` environment variables. You can put this in your ``.bashrc`` or equivalent environment setup file to get the proper variables. These variables need to be set for the make system to work properly. diff --git a/docs/Quick-Start.rst b/docs/Quick-Start.rst index 86d62b11..65b854b9 100644 --- a/docs/Quick-Start.rst +++ b/docs/Quick-Start.rst @@ -1,6 +1,21 @@ Quick Start =============================== +Requirements +------------------------------------------- + +Using Linux is recommended. +The provided scripts will not work on macOS out of the box, but they may be able to be modified to support it. +Working under Windows is not recommended. + +* dtc (design-tree-compiler) + +* GNU awk + +* GNU sed + +* GNU make + Setting up the Chipyard Repo ------------------------------------------- From fc0e86d74417d73e713a7846b381d7464ddf8f4f Mon Sep 17 00:00:00 2001 From: Albert Magyar Date: Wed, 25 Sep 2019 13:37:59 -0700 Subject: [PATCH 11/32] Fix typo in tutorial config --- generators/example/src/main/scala/RocketConfigs.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generators/example/src/main/scala/RocketConfigs.scala b/generators/example/src/main/scala/RocketConfigs.scala index 2275549f..dcd2d01c 100644 --- a/generators/example/src/main/scala/RocketConfigs.scala +++ b/generators/example/src/main/scala/RocketConfigs.scala @@ -50,7 +50,7 @@ class PWMRocketConfig extends Config( new freechips.rocketchip.system.BaseConfig) // DOC include end: PWMRocketConfig -class PWMRAXI4ocketConfig extends Config( +class PWMAXI4RocketConfig extends Config( new WithPWMAXI4Top ++ // use top with axi4-controlled PWM new WithBootROM ++ new freechips.rocketchip.subsystem.WithInclusiveCache ++ From a3a05ec9881144ba3535adb06ea81de04109f8d2 Mon Sep 17 00:00:00 2001 From: Brendan Sweeney Date: Wed, 25 Sep 2019 13:45:21 -0700 Subject: [PATCH 12/32] [docs] [ci skip] Update generators and quick start so it is clear how to edit the generators to get changed outputs (You just edit the source) --- docs/Generators/index.rst | 8 +++++++- docs/Quick-Start.rst | 2 ++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index a01b5adc..8bd17024 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -1,12 +1,18 @@ +.. _generator-index: + Generators ============================ -Generator can be thought of as a generalized RTL design, written using a mix of meta-programming and standard RTL. +A Generator can be thought of as a generalized RTL design, written using a mix of meta-programming and standard RTL. This type of meta-programming is enabled by the Chisel hardware description language (see :ref:`Chisel`). A standard RTL design is essentially just a single instance of a design coming from a generator. However, by using meta-programming and parameter systems, generators can allow for integration of complex hardware designs in automated ways. The following pages introduce the generators integrated with the Chipyard framework. +Chipyard bundles the source code for the generators, under the ``generators`` directory. +It builds them from source each time (although ``sbt`` will cache results if they have not changed), +so changes to the generators themselves will automatically be used when building with Chipyard. + .. toctree:: :maxdepth: 2 :caption: Generators: diff --git a/docs/Quick-Start.rst b/docs/Quick-Start.rst index 86d62b11..8d45e436 100644 --- a/docs/Quick-Start.rst +++ b/docs/Quick-Start.rst @@ -52,3 +52,5 @@ This depends on what you are planning to do with Chipyard. * To run a FPGA-accelerated simulation using FireSim, see :ref:`firesim-sim-intro`. * To run a VLSI flow using one of the vanilla Chipyard examples, see <>. + +* To change the generators (BOOM, Rocket, &c) themselves, see :ref:`generator-index`. From 38fef1782f48f8870c27594431294990ca792a5f Mon Sep 17 00:00:00 2001 From: abejgonzalez Date: Wed, 25 Sep 2019 13:50:22 -0700 Subject: [PATCH 13/32] add firrtl interpreter to the docs [ci skip] --- docs/Tools/Treadle.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/Tools/Treadle.rst b/docs/Tools/Treadle.rst index 19df75de..9e3d6154 100644 --- a/docs/Tools/Treadle.rst +++ b/docs/Tools/Treadle.rst @@ -1,5 +1,7 @@ -Treadle +Treadle and FIRRTL Interpreter ============================== -`Treadle `__ is a circuit simulator that directly executes FIRRTL. -It is especially useful for interactive debugging and small unit tests that benefit from a low-overhead simulator. +`Treadle `__ and `FIRRTL Interpreter `__ +are circuit simulators that directly execute FIRRTL (specifically low-firrtl IR). +They are especially useful for interactive debugging and many of projects within Chipyard +use them for a low-overhead simulator. From 318cccd541136da0c58885745b311162198683e4 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 14:03:54 -0700 Subject: [PATCH 14/32] docs reorg --- docs/Chipyard-Basics/index.rst | 2 - docs/Quick-Start.rst | 16 +-- .../Running-A-Simulation.rst | 8 ++ docs/Simulation/Software-RTL-Simulation.rst | 134 ++++++++++++++++++ docs/Simulation/Software-RTL-Simulators.rst | 75 ---------- docs/Simulation/index.rst | 8 +- .../Building-A-Chip.rst | 0 docs/VLSI/index.rst | 1 + 8 files changed, 156 insertions(+), 88 deletions(-) rename docs/{Chipyard-Basics => Simulation}/Running-A-Simulation.rst (99%) create mode 100644 docs/Simulation/Software-RTL-Simulation.rst delete mode 100644 docs/Simulation/Software-RTL-Simulators.rst rename docs/{Chipyard-Basics => VLSI}/Building-A-Chip.rst (100%) diff --git a/docs/Chipyard-Basics/index.rst b/docs/Chipyard-Basics/index.rst index be46c627..3c05c864 100644 --- a/docs/Chipyard-Basics/index.rst +++ b/docs/Chipyard-Basics/index.rst @@ -20,5 +20,3 @@ Hit next to get started! Chipyard-Components Configs-Parameters-Mixins Initial-Repo-Setup - Running-A-Simulation - Building-A-Chip diff --git a/docs/Quick-Start.rst b/docs/Quick-Start.rst index 936597e6..0c76f369 100644 --- a/docs/Quick-Start.rst +++ b/docs/Quick-Start.rst @@ -34,16 +34,16 @@ What's Next? This depends on what you are planning to do with Chipyard. +* If you intend to run a simulation of one of the vanilla Chipyard examples, go to :ref:`sw-rtl-sim-intro` and follow the instructions. + +* If you intend to run a simulation of a custom Chipyard SoC Configuration, go to :ref:`sw-sim-custom` and follow the instructions. + +* If you intend to run a full-system FireSim simulation, go to :ref:`firesim-sim-intro` and follow the instructions. + +* If you intend to add a new accelerator, go to :ref:`adding-an-accelerator` and follow the instructions. + * If you want to learn about the structure of Chipyard, go to :ref:`chipyard-components`. * If you intend to build one of the vanilla Chipyard examples, go to :ref:`build-a-chip` and follow the instructions. -* If you intend to add a new accelerator, go to :ref:`adding-an-accelerator` and follow the instructions. - -* If you intend to run a simulation of one of the vanilla Chipyard examples, go to :ref:`sw-rtl-sim-intro` and follow the instructions. - -* If you intend to run a simulation of a custom Chipyard SoC Configuration, go to <> and follow the instructions. - -* If you intend to run a full-system FireSim simulation, go to :ref:`firesim-sim-intro` and follow the instructions. - * If you intend to run a VLSI flow using one of the vanilla Chipyard examples, go to <> and follow the instructions. diff --git a/docs/Chipyard-Basics/Running-A-Simulation.rst b/docs/Simulation/Running-A-Simulation.rst similarity index 99% rename from docs/Chipyard-Basics/Running-A-Simulation.rst rename to docs/Simulation/Running-A-Simulation.rst index 76eb0acb..a4346ed5 100644 --- a/docs/Chipyard-Basics/Running-A-Simulation.rst +++ b/docs/Simulation/Running-A-Simulation.rst @@ -39,13 +39,21 @@ In order to construct the simulator with our custom design, we run the following make SBT_PROJECT=... MODEL=... VLOG_MODEL=... MODEL_PACKAGE=... CONFIG=... CONFIG_PACKAGE=... GENERATOR_PACKAGE=... TB=... TOP=... Each of these make variables correspond to a particular part of the design/codebase and are needed so that the make system can correctly build and make a RTL simulation. + The ``SBT_PROJECT`` is the ``build.sbt`` project that holds all of the source files and that will be run during the RTL build. + The ``MODEL`` and ``VLOG_MODEL`` are the top-level class names of the design. + Normally, these are the same, but in some cases these can differ (if the Chisel class differs than what is emitted in the Verilog). + The ``MODEL_PACKAGE`` is the Scala package (in the Scala code that says ``package ...``) that holds the ``MODEL`` class. + The ``CONFIG`` is the name of the class used for the parameter Config while the ``CONFIG_PACKAGE`` is the Scala package it resides in. + The ``GENERATOR_PACKAGE`` is the Scala package that holds the Generator class that elaborates the design. + The ``TB`` is the name of the Verilog wrapper that connects the ``TestHarness`` to VCS/Verilator for simulation. + Finally, the ``TOP`` variable is used to distinguish between the top-level of the design and the ``TestHarness`` in our system. For example, in the normal case, the ``MODEL`` variable specifies the ``TestHarness`` as the top-level of the design. However, the true top-level design, the SoC being simulated, is pointed to by the ``TOP`` variable. diff --git a/docs/Simulation/Software-RTL-Simulation.rst b/docs/Simulation/Software-RTL-Simulation.rst new file mode 100644 index 00000000..490fece4 --- /dev/null +++ b/docs/Simulation/Software-RTL-Simulation.rst @@ -0,0 +1,134 @@ +.. _sw-rtl-sim-intro: + +Software RTL Simulation +=================================== + +Verilator (Open-Source) +----------------------- + +`Verilator `__ is an open-source LGPL-Licensed simulator maintained by `Veripool `__. +The Chipyard framework can download, build, and execute simulations using Verilator. + + +Synopsys VCS (License Required) +-------------------------------- + +`VCS `__ is a commercial RTL simulator developed by Synopsys. +It requires commercial licenses. +The Chipyard framework can compile and execute simulations using VCS. +VCS simulation will generally compile faster than Verilator simulations. + +To run a VCS simulation, make sure that the VCS simulator is on your ``PATH``. + + +Choice of Simulator +------------------------------- + +First, we will start by entering the Verilator or VCS directory: + +For an open-source Verilator simulation, enter the ``sims/verilator`` directory +.. code-block:: shell + + # Enter Verilator directory + cd sims/verilator + +For a proprietry VCS simulation, enter the ``sims/vcs`` directory + +.. code-block:: shell + + # Enter VCS directory + cd sims/vcs + + +.. _sim-default: +Simulating The Default Example +------------------------------- + +To compile the example design, run ``make`` in the selected verilator or VCS directory. +This will elaborate the ``RocketConfig`` in the example project. + +An executable called ``simulator-example-RocketConfig`` will be produced. +This executable is a simulator that has been compiled based on the design that was built. +You can then use this executable to run any compatible RV64 code. +For instance, to run one of the riscv-tools assembly tests. + +.. code-block:: shell + + ./simulator-example-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple + +Alternatively, we can run a pre-packaged suite of RISC-V assembly or benchmark tests, by adding the make target ``run-asm-tests`` or ``run-bmark-tests``. +For example: + +.. code-block:: shell + + make run-asm-tests + make run-bmark-tests + + +.. _sw-sim-custom: +Simulating A Custom Project +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +If you later create your own project, you can use environment variables to build an alternate configuration. + +In order to construct the simulator with our custom design, we run the following command within the simulator directory: + +.. code-block:: shell + + make SBT_PROJECT=... MODEL=... VLOG_MODEL=... MODEL_PACKAGE=... CONFIG=... CONFIG_PACKAGE=... GENERATOR_PACKAGE=... TB=... TOP=... + +Each of these make variables correspond to a particular part of the design/codebase and are needed so that the make system can correctly build and make a RTL simulation. + +The ``SBT_PROJECT`` is the ``build.sbt`` project that holds all of the source files and that will be run during the RTL build. + +The ``MODEL`` and ``VLOG_MODEL`` are the top-level class names of the design. + +Normally, these are the same, but in some cases these can differ (if the Chisel class differs than what is emitted in the Verilog). + +The ``MODEL_PACKAGE`` is the Scala package (in the Scala code that says ``package ...``) that holds the ``MODEL`` class. + +The ``CONFIG`` is the name of the class used for the parameter Config while the ``CONFIG_PACKAGE`` is the Scala package it resides in. + +The ``GENERATOR_PACKAGE`` is the Scala package that holds the Generator class that elaborates the design. + +The ``TB`` is the name of the Verilog wrapper that connects the ``TestHarness`` to VCS/Verilator for simulation. + +Finally, the ``TOP`` variable is used to distinguish between the top-level of the design and the ``TestHarness`` in our system. +For example, in the normal case, the ``MODEL`` variable specifies the ``TestHarness`` as the top-level of the design. +However, the true top-level design, the SoC being simulated, is pointed to by the ``TOP`` variable. +This separation allows the infrastructure to separate files based on the harness or the SoC top level. + +Common configurations of all these variables are packaged using a ``SUB_PROJECT`` make variable. +Therefore, in order to simulate a simple Rocket-based example system we can use: + + +.. code-block:: shell + + make SUB_PROJECT=yourproject + ./simulator-- ... + + +All `Make` targets that can be applied to the default example, can also be applied to custom project using the custom environment variables. For example, the following code example will run the RISC-V assembly benchmark suite on the BOOM subproject: + +.. code-block:: shell + + make SUB_PROJECT=boom run-asm-tests + + +Finally, in the ``generated-src/<...>--/`` directory resides all of the collateral and Verilog source files for the build/simulation. +Specifically, the SoC top-level (``TOP``) Verilog file is denoted with ``*.top.v`` while the ``TestHarness`` file is denoted with ``*.harness.v``. + + +Generating Waveforms +----------------------- + +If you would like to extract waveforms from the simulation, run the command ``make debug`` instead of just ``make``. + + +For a Verilator simulation, this will generate a vcd file (vcd is a standard waveform representation file format) that can be loaded to any common waveform viewer. +An open-source vcd-capable waveform viewer is `GTKWave `__. + + +For a VCS simulation, this will generate a vpd file (this is a proprietary waveform representation format used by Synopsys) that can be loaded to vpd-supported waveform viewers. +If you have Synopsys licenses, we recommend using the DVE waveform viewer. + diff --git a/docs/Simulation/Software-RTL-Simulators.rst b/docs/Simulation/Software-RTL-Simulators.rst deleted file mode 100644 index 5dd4e527..00000000 --- a/docs/Simulation/Software-RTL-Simulators.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. _sw-rtl-sim-intro: - -Software RTL Simulators -=================================== - -Verilator (Open-Source) ------------------------ - -`Verilator `__ is an open-source LGPL-Licensed simulator maintained by `Veripool `__. -The Chipyard framework can download, build, and execute simulations using Verilator. - -To run a simulation using Verilator, perform the following steps: - -To compile the example design, run ``make`` in the ``sims/verilator`` directory. -This will elaborate the ``RocketConfig`` in the example project. - -An executable called ``simulator-example-RocketConfig`` will be produced. -This executable is a simulator that has been compiled based on the design that was built. -You can then use this executable to run any compatible RV64 code. -For instance, to run one of the riscv-tools assembly tests. - -.. code-block:: shell - - ./simulator-example-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple - -If you later create your own project, you can use environment variables to build an alternate configuration. - -.. code-block:: shell - - make SUB_PROJECT=yourproject - ./simulator-- ... - -If you would like to extract waveforms from the simulation, run the command ``make debug`` instead of just ``make``. -This will generate a vcd file (vcd is a standard waveform representation file format) that can be loaded to any common waveform viewer. -An open-source vcd-capable waveform viewer is `GTKWave `__. - -Please refer to :ref:`Running A Simulation` for a step by step tutorial on how to get a simulator up and running. -Commercial Software RTL Simulators - -Synopsys VCS (License Required) --------------------------------- - -`VCS `__ is a commercial RTL simulator developed by Synopsys. -It requires commercial licenses. -The Chipyard framework can compile and execute simulations using VCS. -VCS simulation will generally compile faster than Verilator simulations. - -To run a simulation using VCS, perform the following steps: - -Make sure that the VCS simulator is on your ``PATH``. - -To compile the example design, run make in the ``sims/vcs`` directory. -This will elaborate the ``RocketConfig`` in the example project. - -An executable called ``simulator-example-RocketConfig`` will be produced. -This executable is a simulator that has been compiled based on the design that was built. -You can then use this executable to run any compatible RV64 code. -For instance, to run one of the riscv-tools assembly tests. - -.. code-block:: shell - - ./simulator-example-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple - -If you later create your own project, you can use environment variables to build an alternate configuration. - -.. code-block:: shell - - make SUB_PROJECT=yourproject - ./simulator-- ... - -If you would like to extract waveforms from the simulation, run the command ``make debug`` instead of just ``make``. -This will generate a vpd file (this is a proprietary waveform representation format used by Synopsys) that can be loaded to vpd-supported waveform viewers. -If you have Synopsys licenses, we recommend using the DVE waveform viewer. - -Please refer to :ref:`Running A Simulation` for a step by step tutorial on how to get a simulator up and running. diff --git a/docs/Simulation/index.rst b/docs/Simulation/index.rst index 50dbb57e..fe0fa161 100644 --- a/docs/Simulation/index.rst +++ b/docs/Simulation/index.rst @@ -1,4 +1,4 @@ -Simulators +Simulation ======================= Chipyard supports two classes of simulation: @@ -12,9 +12,11 @@ at O(100 MHz), making them appropriate for booting an operating system and running a complete workload, but have multi-hour compile times and poorer debug visability. +Click next to see how to run a simulation. + .. toctree:: :maxdepth: 2 - :caption: Simulators: + :caption: Simulation: - Software-RTL-Simulators + Software-RTL-Simulation FPGA-Accelerated-Simulators diff --git a/docs/Chipyard-Basics/Building-A-Chip.rst b/docs/VLSI/Building-A-Chip.rst similarity index 100% rename from docs/Chipyard-Basics/Building-A-Chip.rst rename to docs/VLSI/Building-A-Chip.rst diff --git a/docs/VLSI/index.rst b/docs/VLSI/index.rst index f8bdb7a8..44303769 100644 --- a/docs/VLSI/index.rst +++ b/docs/VLSI/index.rst @@ -8,4 +8,5 @@ In particular, we aim to support the HAMMER physical design generator flow. :maxdepth: 2 :caption: VLSI Flow: + Building-A-Chip HAMMER From 7ee395468dadb5724e28e243a6f440f044b5ef05 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 25 Sep 2019 14:06:04 -0700 Subject: [PATCH 15/32] [docs][ci skip] Add docs on SHA3 mixin --- docs/Generators/SHA3.rst | 15 +++++++++++++++ .../example/src/main/scala/RocketConfigs.scala | 2 ++ 2 files changed, 17 insertions(+) diff --git a/docs/Generators/SHA3.rst b/docs/Generators/SHA3.rst index ca3d1b03..cfd4be7e 100644 --- a/docs/Generators/SHA3.rst +++ b/docs/Generators/SHA3.rst @@ -68,3 +68,18 @@ on which available execution unit they should be run. Once the message is fully hashed, the hash is written to memory with a simple state machine. + +Using a SHA3 Accelerator +------------------------ +Since the SHA3 accelerator is designed as a RoCC accelerator, +it can be mised into a Rocket or BOOM core by overriding the +BuildRoCC key. The configuration mixin is defined in the SHA3 +generator. An example configuration highlighting the use of +this mixin is shown here: + +.. literalinclude:: ../../generators/example/src/main/scala/RocketConfigs.scala + :language: scala + :start-after: DOC include start: Sha3Rocket + :end-before: DOC include end: Sha3Rocket + + diff --git a/generators/example/src/main/scala/RocketConfigs.scala b/generators/example/src/main/scala/RocketConfigs.scala index 2275549f..803aaa08 100644 --- a/generators/example/src/main/scala/RocketConfigs.scala +++ b/generators/example/src/main/scala/RocketConfigs.scala @@ -104,6 +104,7 @@ class GB1MemoryRocketConfig extends Config( new freechips.rocketchip.subsystem.WithNBigCores(1) ++ new freechips.rocketchip.system.BaseConfig) +// DOC include start: Sha3Rocket class Sha3RocketConfig extends Config( new WithTop ++ new WithBootROM ++ @@ -111,6 +112,7 @@ class Sha3RocketConfig extends Config( new sha3.WithSha3Accel ++ // add SHA3 rocc accelerator new freechips.rocketchip.subsystem.WithNBigCores(1) ++ new freechips.rocketchip.system.BaseConfig) +// DOC include end: Sha3Rocket // DOC include start: InitZeroRocketConfig class InitZeroRocketConfig extends Config( From beae2cfcf9de642a1d8ed58254c6157f41855780 Mon Sep 17 00:00:00 2001 From: abejgonzalez Date: Wed, 25 Sep 2019 16:38:09 -0700 Subject: [PATCH 16/32] emphasize that firrtl-interpreter is deprecated | mention smaller modules [ci skip] --- docs/Tools/Treadle.rst | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/docs/Tools/Treadle.rst b/docs/Tools/Treadle.rst index 9e3d6154..4c6d016c 100644 --- a/docs/Tools/Treadle.rst +++ b/docs/Tools/Treadle.rst @@ -1,7 +1,9 @@ Treadle and FIRRTL Interpreter ============================== -`Treadle `__ and `FIRRTL Interpreter `__ +`Treadle `__ and +`FIRRTL Interpreter `__ are circuit simulators that directly execute FIRRTL (specifically low-firrtl IR). -They are especially useful for interactive debugging and many of projects within Chipyard -use them for a low-overhead simulator. +Treadle is the replacement for FIRRTL Interpreter but FIRRTL Interpreter is still used within some +projects. Treadle is useful for simulating modules in a larger SoC design. Many projects +use Treadle for interactive debugging and a low-overhead simulator. From 2524b02806bc6657caaecf8b5c6a32dcbcd47a08 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 16:52:54 -0700 Subject: [PATCH 17/32] PR comments --- docs/Generators/Hwacha.rst | 8 ++++---- docs/Generators/{RocketChip.rst => Rocket-Chip.rst} | 0 docs/Generators/Rocket.rst | 2 +- docs/Generators/SiFive-Generators.rst | 12 ++++++------ docs/Generators/index.rst | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) rename docs/Generators/{RocketChip.rst => Rocket-Chip.rst} (100%) diff --git a/docs/Generators/Hwacha.rst b/docs/Generators/Hwacha.rst index 60549ddb..5d3e7e4f 100644 --- a/docs/Generators/Hwacha.rst +++ b/docs/Generators/Hwacha.rst @@ -3,13 +3,13 @@ Hwacha The Hwacha project is developing a new vector architecture for future computer systems that are constrained in their power and energy consumption. The Hwacha project is inspired by traditional vector machines from the 70s and 80s, and lessons learned from our previous vector-thread architectures such as Scale and Maven -The Hwacha project includes the Hwacha microarchitecture generator, as well as the Hwacha non-standard RISC-V extension. Hwacha does not implement the RISC-V standard vector extension proposal. +The Hwacha project includes the Hwacha microarchitecture generator, as well as the ``XHwacha`` non-standard RISC-V extension. Hwacha does not implement the RISC-V standard vector extension proposal. For more information on the Hwacha project, please visit the `Hwacha website `__. -To add the Hwacha vector unit to an SoC, you should add the ``hwacha.DefaultHwachaConfig`` config mixin to the SoC configurations. The Hwacha vector unit uses the RoCC port of a `Rocket Chip tile`, and by default connects to the memory system through the `System Bus` (i.e., directly to the L2 cache). +To add the Hwacha vector unit to an SoC, you should add the ``hwacha.DefaultHwachaConfig`` config mixin to the SoC configurations. The Hwacha vector unit uses the RoCC port of a Rocket or BOOM `tile`, and by default connects to the memory system through the `System Bus` (i.e., directly to the L2 cache). -To change to configuration of the Hwacha vector unit, you can write a custom configuration to replace the ``DefaultHwachaConfig``. You can view the ``DefaultHwachaConfig`` under ``generators/hwacha/src/main/scala/configs.scala`` to see the possible configuration parameters. +To change the configuration of the Hwacha vector unit, you can write a custom configuration to replace the ``DefaultHwachaConfig``. You can view the ``DefaultHwachaConfig`` under ``generators/hwacha/src/main/scala/configs.scala`` to see the possible configuration parameters. Since Hwacha implements a non-standard RISC-V extension, it requires a unique software toolchain to be able to compile and asseble its vector instructions. -To install the Hwacha toolchain, run the ``./scripts/build-toolchains.sh esp-tools`` command within the root Chipyard directory. This may take a while, and it will install the ``esp-tools-install`` directory within your Chipyard root directory. ``esp-tools`` are a fork of ``riscv-tools`` (formelty a collection of relevant software RISC-V tools) that were enhanced with the additional non-standard vector instructions. However, due to the upstreaming of the equivalent RISC-V toolchains, esp-tools may not be up-to-date with the latest mainline version of the tools included in it. +To install the Hwacha toolchain, run the ``./scripts/build-toolchains.sh esp-tools`` command within the root Chipyard directory. This may take a while, and it will install the ``esp-tools-install`` directory within your Chipyard root directory. ``esp-tools`` is a fork of ``riscv-tools`` (formerly a collection of relevant software RISC-V tools) that was enhanced with additional non-standard vector instructions. However, due to the upstreaming of the equivalent RISC-V toolchains, ``esp-tools`` may not be up-to-date with the latest mainline version of the tools included in it. diff --git a/docs/Generators/RocketChip.rst b/docs/Generators/Rocket-Chip.rst similarity index 100% rename from docs/Generators/RocketChip.rst rename to docs/Generators/Rocket-Chip.rst diff --git a/docs/Generators/Rocket.rst b/docs/Generators/Rocket.rst index 53ff0575..50da2777 100644 --- a/docs/Generators/Rocket.rst +++ b/docs/Generators/Rocket.rst @@ -1,7 +1,7 @@ Rocket Core ==================================== -`Rocket `__ is a 5-stage in-order scalar processor core generator, originally developed at UC Berkeley an currently supported by `SiFive `__. The Rocket core is used as a component (a `tile`) within the Rocket Chip SoC generator. +`Rocket `__ is a 5-stage in-order scalar processor core generator, originally developed at UC Berkeley an currently supported by `SiFive `__. The `Rocket core` is used as a component within the `Rocket Chip SoC generator`. A Rocket core combined with L1 caches (data and instruction caches) form a `Rocket tile`. The `Rocket tile` is the replicable component of the `Rocket Chip SoC generator`. The Rocket core supports the open source RV64GC RISC-V instruction set and is written in the Chisel hardware construction language. It has an MMU that supports page-based virtual memory, a non-blocking data cache, and a front-end with branch prediction. diff --git a/docs/Generators/SiFive-Generators.rst b/docs/Generators/SiFive-Generators.rst index 7777a766..bed61769 100644 --- a/docs/Generators/SiFive-Generators.rst +++ b/docs/Generators/SiFive-Generators.rst @@ -4,16 +4,16 @@ SiFive Generators Chipyard includes several open-source generators developed and maintained by `SiFive `__. These are currently organized within two submodules named ``sifive-blocks`` and ``sifive-cache``. -L2 Cache ---------- +Last-Level Cache Generator +----------------------------- -``sifive-cache`` includes an L2 cache geneator. To use this L2 cache, you should add the ``freechips.rocketchip.subsystem.WithInclusiveCache`` mixin to your SoC configuration. -To learn more about configuring this L2, please refer to the :ref:`memory-hierarchy` section. +``sifive-cache`` includes last-level cache geneator. The Chipyard framework uses this last-level cache as an L2 cache. To use this L2 cache, you should add the ``freechips.rocketchip.subsystem.WithInclusiveCache`` mixin to your SoC configuration. +To learn more about configuring this L2 cache, please refer to the :ref:`memory-hierarchy` section. Perihperal Devices ------------------- -``sifive-blocks`` includes multiple peripheral device generators. These include UART, SPI, PWM, JTAG, GPIO and more. +``sifive-blocks`` includes multiple peripheral device generators, such as UART, SPI, PWM, JTAG, GPIO and more. These peripheral devices usually affect the memory map of the SoC, and its top-level IO as well. To integrate one of these devices in your SoC, you will need to define a custom mixin with the approriate address for the device using the Rocket Chip parameter system. As an example, for a GPIO device you could add the following mixin to set the GPIO address to ``0x10012000``. @@ -42,4 +42,4 @@ Finally, you add the relevant config mixin to the SoC config. For example: :start-after: DOC include start: GPIORocketConfig :end-before: DOC include end: GPIORocketConfig -Some of the devices in ``sifive-blocks`` (such as GPIO) may already have pre-defined mixins within the Chipyard example project. You may be able to use these config mixin directly, but you should be aware of their addresses within the SoC address map. +Some of the devices in ``sifive-blocks`` (such as GPIO) may already have pre-defined mixins within the Chipyard example project. You may be able to use these config mixins directly, but you should be aware of their addresses within the SoC address map. diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index 1b9f56c8..32d799d7 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -11,7 +11,7 @@ The following pages introduce the generators integrated with the Chipyard framew :maxdepth: 2 :caption: Generators: - RocketChip + Rocket-Chip Rocket BOOM Hwacha From bb819cfbbf93552722ee172978b7d8e9e882dd7e Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 16:56:32 -0700 Subject: [PATCH 18/32] hwacha link --- docs/Generators/Hwacha.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/Hwacha.rst b/docs/Generators/Hwacha.rst index 5d3e7e4f..240d6fc9 100644 --- a/docs/Generators/Hwacha.rst +++ b/docs/Generators/Hwacha.rst @@ -9,7 +9,7 @@ For more information on the Hwacha project, please visit the `Hwacha website `__ to see the possible configuration parameters. Since Hwacha implements a non-standard RISC-V extension, it requires a unique software toolchain to be able to compile and asseble its vector instructions. To install the Hwacha toolchain, run the ``./scripts/build-toolchains.sh esp-tools`` command within the root Chipyard directory. This may take a while, and it will install the ``esp-tools-install`` directory within your Chipyard root directory. ``esp-tools`` is a fork of ``riscv-tools`` (formerly a collection of relevant software RISC-V tools) that was enhanced with additional non-standard vector instructions. However, due to the upstreaming of the equivalent RISC-V toolchains, ``esp-tools`` may not be up-to-date with the latest mainline version of the tools included in it. From 0f793bfb0777431d52f453000dd8b216d424f51d Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 17:16:38 -0700 Subject: [PATCH 19/32] add makefile asm-tests note --- docs/Simulation/Software-RTL-Simulation.rst | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/Simulation/Software-RTL-Simulation.rst b/docs/Simulation/Software-RTL-Simulation.rst index 490fece4..becd9ce8 100644 --- a/docs/Simulation/Software-RTL-Simulation.rst +++ b/docs/Simulation/Software-RTL-Simulation.rst @@ -65,6 +65,9 @@ For example: make run-bmark-tests +.. Note:: Before running the pre-packaged suites, you must run the plain ``make`` command, since the elaboration command generates a Makefile fragment that contains the target for the pre-packaged test suites. Otherwise, you will likely encounter a Makefile target error. + + .. _sw-sim-custom: Simulating A Custom Project ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ From e8a197d8a85f8d9e43b451b5c37c6c1e7eda619b Mon Sep 17 00:00:00 2001 From: Brendan Sweeney Date: Wed, 25 Sep 2019 17:18:27 -0700 Subject: [PATCH 20/32] [docs] [ci skip] --- docs/Generators/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index 8bd17024..0e120e45 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -10,7 +10,7 @@ However, by using meta-programming and parameter systems, generators can allow f The following pages introduce the generators integrated with the Chipyard framework. Chipyard bundles the source code for the generators, under the ``generators`` directory. -It builds them from source each time (although ``sbt`` will cache results if they have not changed), +It builds them from source each time (although the build system will cache results if they have not changed), so changes to the generators themselves will automatically be used when building with Chipyard. .. toctree:: From 824c3177d8a96ccf147eb30ca26e87e05f746c26 Mon Sep 17 00:00:00 2001 From: Nathan Pemberton Date: Wed, 25 Sep 2019 17:22:18 -0700 Subject: [PATCH 21/32] Added software section. Marshal is populated (mostly points to Marshal's own readthedocs). Spike is a stub. --- docs/Software/FireMarshal.rst | 23 +++++++++++++++++++++++ docs/Software/Spike.rst | 4 ++++ docs/Software/index.rst | 21 +++++++++++++++++++++ docs/index.rst | 2 ++ 4 files changed, 50 insertions(+) create mode 100644 docs/Software/FireMarshal.rst create mode 100644 docs/Software/Spike.rst create mode 100644 docs/Software/index.rst diff --git a/docs/Software/FireMarshal.rst b/docs/Software/FireMarshal.rst new file mode 100644 index 00000000..cbece68d --- /dev/null +++ b/docs/Software/FireMarshal.rst @@ -0,0 +1,23 @@ +FireMarshal +================= + +FireMarshal is a workload generation tool for RISC-V based systems. It +currently only supports the FireSim FPGA-accelerated simulation platform. + +**Workloads** in FireMarshal consist of a series of **Jobs** that are assigned +to logical nodes in the target system. If no jobs are specified, then the +workload is considered ``uniform`` and only a single image will be produced for +all nodes in the system. Workloads are described by a json file and a +corresponding workload directory and can inherit their definitions from +existing workloads. Typically, workload configurations are kept in +``workloads/`` although you can use any directory you like. We provide a few +basic workloads to start with including buildroot or Fedora-based linux +distributions and bare-metal. + +Once you define a workload, the ``marshal`` command will produce a +corresponding boot-binary and rootfs for each job in the workload. This binary +and rootfs can then be launched on qemu or spike (for functional simulation), or +installed to a platform for running on real RTL (currently only FireSim is +automated). + +To get started, checkout the full `FireMarshal documentation `_. diff --git a/docs/Software/Spike.rst b/docs/Software/Spike.rst new file mode 100644 index 00000000..015ec5b2 --- /dev/null +++ b/docs/Software/Spike.rst @@ -0,0 +1,4 @@ +The RISC-V ISA Simulator (Spike) +================================= + +.. attention:: This article is a stub. Fill it out! diff --git a/docs/Software/index.rst b/docs/Software/index.rst new file mode 100644 index 00000000..e7fe9925 --- /dev/null +++ b/docs/Software/index.rst @@ -0,0 +1,21 @@ +Target Software +================================== + +Chipyard includes tools for developing target software workloads. The primary +tool is FireMarshal, which manages workload descriptions and generates binaries +and disk images to run on your target designs. Workloads can be bare-metal, or +be based on standard Linux distributions. Users can customize every part of the +build process, including providing custom kernels (if needed by the hardware). + +FireMarshal can also run your workloads on high-performance functional +simulators like Spike and Qemu. Spike is easily customized and serves as the +official RISC-V ISA reference implementation. Qemu is a high-performance +functional simulator that can run nearly as fast as native code, but can be +challenging to modify. + +.. toctree:: + :maxdepth: 2 + :caption: Contents: + + FireMarshal + Spike diff --git a/docs/index.rst b/docs/index.rst index 61acfae3..75c3714e 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -38,6 +38,8 @@ Table of Contents Customization/index + Software/index + Advanced-Usage/index TileLink-Diplomacy-Reference/index From 438bb8c785f84b5e0aceddb55dd7163012d28ffb Mon Sep 17 00:00:00 2001 From: Brendan Sweeney Date: Wed, 25 Sep 2019 17:26:44 -0700 Subject: [PATCH 22/32] [docs] [skip ci] Change based on Abe's comments --- docs/Chipyard-Basics/Initial-Repo-Setup.rst | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/Chipyard-Basics/Initial-Repo-Setup.rst b/docs/Chipyard-Basics/Initial-Repo-Setup.rst index 5375a604..499939f4 100644 --- a/docs/Chipyard-Basics/Initial-Repo-Setup.rst +++ b/docs/Chipyard-Basics/Initial-Repo-Setup.rst @@ -4,18 +4,10 @@ Initial Repository Setup Requirements ------------------------------------------- -Using Linux is recommended. -The provided scripts will not work on macOS out of the box, but they may be able to be modified to support it. +Chipyard is developed and tested on Linux-based systems. +It is possible to use this on macOS or other BSD-based systems, although GNU tools will need to be installed; it is also recommended to install the RISC-V toolchain from ``brew``. Working under Windows is not recommended. -* dtc (design-tree-compiler) - -* GNU awk - -* GNU sed - -* GNU make - Checking out the sources ------------------------ From 23b667ad765f345fc3a4a787d79197ce161bb31e Mon Sep 17 00:00:00 2001 From: Brendan Sweeney Date: Wed, 25 Sep 2019 17:27:10 -0700 Subject: [PATCH 23/32] [ci skip] [docs] Abe's comments 2 --- docs/Quick-Start.rst | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/docs/Quick-Start.rst b/docs/Quick-Start.rst index 65b854b9..da2e2abc 100644 --- a/docs/Quick-Start.rst +++ b/docs/Quick-Start.rst @@ -4,18 +4,10 @@ Quick Start Requirements ------------------------------------------- -Using Linux is recommended. -The provided scripts will not work on macOS out of the box, but they may be able to be modified to support it. +Chipyard is developed and tested on Linux-based systems. +It is possible to use this on macOS or other BSD-based systems, although GNU tools will need to be installed; it is also recommended to install the RISC-V toolchain from ``brew``. Working under Windows is not recommended. -* dtc (design-tree-compiler) - -* GNU awk - -* GNU sed - -* GNU make - Setting up the Chipyard Repo ------------------------------------------- From c6df870912b112f7a2a20407ff5116f509759ca8 Mon Sep 17 00:00:00 2001 From: Jerry Zhao Date: Wed, 25 Sep 2019 17:38:42 -0700 Subject: [PATCH 24/32] [docs][ci skip] Update SHA3 description to reflect current RTL --- docs/Generators/SHA3.rst | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/docs/Generators/SHA3.rst b/docs/Generators/SHA3.rst index cfd4be7e..d48b3017 100644 --- a/docs/Generators/SHA3.rst +++ b/docs/Generators/SHA3.rst @@ -1,5 +1,9 @@ SHA3 RoCC Accelerator =================================== +The SHA3 accelerator is a basic RoCC accelerator for the SHA3 hashing algorithm. +We like using SHA3 in Chipyard tutorial content because it is a self-contained, simple +example of integrating a custom accelerator into Chipyard. + Introduction ----------------------------------- @@ -15,11 +19,8 @@ the message into a set of state bits and permuting the state. The absorbing is a XOR while the permutation is a more complex function composed of several operations, χ, θ, ρ, π, ι, that all perform various bitwise operations, including rotations, parity calculations, XORs, etc. The Keccak hashing function is parameterized for different sizes of state and message chunks -but for this lab we will only support the Keccak-256 variant with 1600 bits of state and 1088 bit -message chunks. In addition, for this lab we will ignore the variable length portion to avoid one -of the most complicated parts of Keccak the padding. Our interface, which is discussed further -below, assume a single chunk of message is ready to be absorbed and hashed. A diagram of the SHA3 -accelerator is shown below. +but for this accelerator we will only support the Keccak-256 variant with 1600 bits of state and +1088 bit message chunks. A diagram of the SHA3 accelerator is shown below. .. image:: ../_static/images/sha3.png @@ -35,17 +36,16 @@ words to the co-processor, the request for a return value, and a small field for the function requested. The accelerator receives these requests using a ready/valid interface. The ROCC instruction is parsed and the needed information is -stored into one of the T execution contexts, only if there is -one available. These execution contexts contain the memory -address of the message being hashed, the memory address +stored into a execution context. The execution context contains +the memory address of the message being hashed, the memory address to store the resulting hash in, the length of the message, and several other control fields. Once the execution context is valid the memory subsystem then begins to fetch chunks of the message. The memory subsystem is fully decoupled from the other subsystems -and maintains either T or 4 memory buffers, whichever is -smaller. The accelerators memory interface can provide a +and maintains a single full round memory buffers. +The accelerators memory interface can provide a maximum of one 64 bit word per cycle which corresponds to 17 requests needed to fill a buffer (the size is dictated by the SHA3 algorithm). Memory requests to fill these buffers @@ -53,18 +53,13 @@ are sent out as rapidly as the memory interface can handle, with a tag field set to allow the different memory buffers requests to be distinguished, as they may be returned out of order. Once the memory subsystem has filled a buffer the -control unit absorbs the buffer into the appropriate execution +control unit absorbs the buffer into the execution context, at which point the execution context is free to begin permutation, and the memory buffer is free to send more memory requests. After the buffer is absorbed, the hashing computation -subsystem begins the permutation operations. Because the -hashing subsystem has a parameterized number of execution -units in parallel, D, as well as a parameterized number -of round execution units, N, it requires a dynamic scheduler -to determine which execution context are ready to run and -on which available execution unit they should be run. Once +subsystem begins the permutation operations. Once the message is fully hashed, the hash is written to memory with a simple state machine. @@ -72,7 +67,7 @@ with a simple state machine. Using a SHA3 Accelerator ------------------------ Since the SHA3 accelerator is designed as a RoCC accelerator, -it can be mised into a Rocket or BOOM core by overriding the +it can be mixed into a Rocket or BOOM core by overriding the BuildRoCC key. The configuration mixin is defined in the SHA3 generator. An example configuration highlighting the use of this mixin is shown here: From c4c8cc65afb5bb68d8ab8a28a8949191c4c10151 Mon Sep 17 00:00:00 2001 From: Brendan Sweeney Date: Wed, 25 Sep 2019 17:56:16 -0700 Subject: [PATCH 25/32] [docs] [ci skip] Alon's comments --- docs/Generators/index.rst | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/Generators/index.rst b/docs/Generators/index.rst index 0e120e45..b93a3681 100644 --- a/docs/Generators/index.rst +++ b/docs/Generators/index.rst @@ -11,7 +11,8 @@ The following pages introduce the generators integrated with the Chipyard framew Chipyard bundles the source code for the generators, under the ``generators`` directory. It builds them from source each time (although the build system will cache results if they have not changed), -so changes to the generators themselves will automatically be used when building with Chipyard. +so changes to the generators themselves will automatically be used when building with Chipyard and propagate to software simulation, FPGA-accelerated simulation, and VLSI flows. + .. toctree:: :maxdepth: 2 From db1d84d9f8e52878c47f29a89cfbf871d08dda4f Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 17:57:49 -0700 Subject: [PATCH 26/32] typo --- docs/Generators/Rocket.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/Rocket.rst b/docs/Generators/Rocket.rst index 50da2777..96796738 100644 --- a/docs/Generators/Rocket.rst +++ b/docs/Generators/Rocket.rst @@ -1,7 +1,7 @@ Rocket Core ==================================== -`Rocket `__ is a 5-stage in-order scalar processor core generator, originally developed at UC Berkeley an currently supported by `SiFive `__. The `Rocket core` is used as a component within the `Rocket Chip SoC generator`. A Rocket core combined with L1 caches (data and instruction caches) form a `Rocket tile`. The `Rocket tile` is the replicable component of the `Rocket Chip SoC generator`. +`Rocket `__ is a 5-stage in-order scalar processor core generator, originally developed at UC Berkeley and currently supported by `SiFive `__. The `Rocket core` is used as a component within the `Rocket Chip SoC generator`. A Rocket core combined with L1 caches (data and instruction caches) form a `Rocket tile`. The `Rocket tile` is the replicable component of the `Rocket Chip SoC generator`. The Rocket core supports the open source RV64GC RISC-V instruction set and is written in the Chisel hardware construction language. It has an MMU that supports page-based virtual memory, a non-blocking data cache, and a front-end with branch prediction. From d908192bde1f8188d316c7577b314e8e4379827b Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 17:59:18 -0700 Subject: [PATCH 27/32] typo --- docs/Generators/Rocket.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/Rocket.rst b/docs/Generators/Rocket.rst index 96796738..6c55b761 100644 --- a/docs/Generators/Rocket.rst +++ b/docs/Generators/Rocket.rst @@ -3,7 +3,7 @@ Rocket Core `Rocket `__ is a 5-stage in-order scalar processor core generator, originally developed at UC Berkeley and currently supported by `SiFive `__. The `Rocket core` is used as a component within the `Rocket Chip SoC generator`. A Rocket core combined with L1 caches (data and instruction caches) form a `Rocket tile`. The `Rocket tile` is the replicable component of the `Rocket Chip SoC generator`. -The Rocket core supports the open source RV64GC RISC-V instruction set and is written in the Chisel hardware construction language. +The Rocket core supports the open-source RV64GC RISC-V instruction set and is written in the Chisel hardware construction language. It has an MMU that supports page-based virtual memory, a non-blocking data cache, and a front-end with branch prediction. Branch prediction is configurable and provided by a branch target buffer (BTB), branch history table (BHT), and a return address stack (RAS). For floating-point, Rocket makes use of Berkeley’s Chisel implementations of floating-point units. From 90bafa64099ff5cb41d070f232edce968c564e69 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 18:01:38 -0700 Subject: [PATCH 28/32] GPIO clarification --- docs/Generators/SiFive-Generators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/SiFive-Generators.rst b/docs/Generators/SiFive-Generators.rst index bed61769..17776b6e 100644 --- a/docs/Generators/SiFive-Generators.rst +++ b/docs/Generators/SiFive-Generators.rst @@ -16,7 +16,7 @@ Perihperal Devices ``sifive-blocks`` includes multiple peripheral device generators, such as UART, SPI, PWM, JTAG, GPIO and more. These peripheral devices usually affect the memory map of the SoC, and its top-level IO as well. -To integrate one of these devices in your SoC, you will need to define a custom mixin with the approriate address for the device using the Rocket Chip parameter system. As an example, for a GPIO device you could add the following mixin to set the GPIO address to ``0x10012000``. +To integrate one of these devices in your SoC, you will need to define a custom mixin with the approriate address for the device using the Rocket Chip parameter system. As an example, for a GPIO device you could add the following mixin to set the GPIO address to ``0x10012000``. This address is the start address for the GPIO configuration registers. .. literalinclude:: ../../generators/example/src/main/scala/ConfigMixins.scala :language: scala From a33b716504b0b86caf571d4ab6ae64429683052c Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 18:07:44 -0700 Subject: [PATCH 29/32] typo --- docs/Generators/SiFive-Generators.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Generators/SiFive-Generators.rst b/docs/Generators/SiFive-Generators.rst index 17776b6e..8f2202b0 100644 --- a/docs/Generators/SiFive-Generators.rst +++ b/docs/Generators/SiFive-Generators.rst @@ -11,7 +11,7 @@ Last-Level Cache Generator To learn more about configuring this L2 cache, please refer to the :ref:`memory-hierarchy` section. -Perihperal Devices +Peripheral Devices ------------------- ``sifive-blocks`` includes multiple peripheral device generators, such as UART, SPI, PWM, JTAG, GPIO and more. From 4443f72f378516c66e2e5c5d0fbf2c97f4ae09e7 Mon Sep 17 00:00:00 2001 From: alonamid Date: Wed, 25 Sep 2019 18:12:25 -0700 Subject: [PATCH 30/32] simulator name update --- docs/Simulation/Software-RTL-Simulation.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/Simulation/Software-RTL-Simulation.rst b/docs/Simulation/Software-RTL-Simulation.rst index becd9ce8..fcae121b 100644 --- a/docs/Simulation/Software-RTL-Simulation.rst +++ b/docs/Simulation/Software-RTL-Simulation.rst @@ -56,6 +56,8 @@ For instance, to run one of the riscv-tools assembly tests. ./simulator-example-RocketConfig $RISCV/riscv64-unknown-elf/share/riscv-tests/isa/rv64ui-p-simple +.. Note:: in a VCS simulator, the simulator name will be ``simv-example-RocketConfig`` ``instead of simulator-example-RocketConfig``. + Alternatively, we can run a pre-packaged suite of RISC-V assembly or benchmark tests, by adding the make target ``run-asm-tests`` or ``run-bmark-tests``. For example: From 4bbc1f8b0630b64a2718d4c0338e771b1726b7ec Mon Sep 17 00:00:00 2001 From: abejgonzalez Date: Wed, 25 Sep 2019 18:45:51 -0700 Subject: [PATCH 31/32] change example subproject to hwacha [ci skip] --- docs/Simulation/Software-RTL-Simulation.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/Simulation/Software-RTL-Simulation.rst b/docs/Simulation/Software-RTL-Simulation.rst index fcae121b..b9da8e3d 100644 --- a/docs/Simulation/Software-RTL-Simulation.rst +++ b/docs/Simulation/Software-RTL-Simulation.rst @@ -67,7 +67,7 @@ For example: make run-bmark-tests -.. Note:: Before running the pre-packaged suites, you must run the plain ``make`` command, since the elaboration command generates a Makefile fragment that contains the target for the pre-packaged test suites. Otherwise, you will likely encounter a Makefile target error. +.. Note:: Before running the pre-packaged suites, you must run the plain ``make`` command, since the elaboration command generates a Makefile fragment that contains the target for the pre-packaged test suites. Otherwise, you will likely encounter a Makefile target error. .. _sw-sim-custom: @@ -113,11 +113,11 @@ Therefore, in order to simulate a simple Rocket-based example system we can use: ./simulator-- ... -All `Make` targets that can be applied to the default example, can also be applied to custom project using the custom environment variables. For example, the following code example will run the RISC-V assembly benchmark suite on the BOOM subproject: +All `Make` targets that can be applied to the default example, can also be applied to custom project using the custom environment variables. For example, the following code example will run the RISC-V assembly benchmark suite on the Hwacha subproject: .. code-block:: shell - make SUB_PROJECT=boom run-asm-tests + make SUB_PROJECT=hwacha run-asm-tests Finally, in the ``generated-src/<...>--/`` directory resides all of the collateral and Verilog source files for the build/simulation. From eb7fbec624777dc4d60f6f97938b3484cdbf87b9 Mon Sep 17 00:00:00 2001 From: Abraham Gonzalez Date: Wed, 25 Sep 2019 20:06:58 -0700 Subject: [PATCH 32/32] Update docs/Software/FireMarshal.rst [skip ci] --- docs/Software/FireMarshal.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Software/FireMarshal.rst b/docs/Software/FireMarshal.rst index cbece68d..ecc23736 100644 --- a/docs/Software/FireMarshal.rst +++ b/docs/Software/FireMarshal.rst @@ -7,7 +7,7 @@ currently only supports the FireSim FPGA-accelerated simulation platform. **Workloads** in FireMarshal consist of a series of **Jobs** that are assigned to logical nodes in the target system. If no jobs are specified, then the workload is considered ``uniform`` and only a single image will be produced for -all nodes in the system. Workloads are described by a json file and a +all nodes in the system. Workloads are described by a ``json`` file and a corresponding workload directory and can inherit their definitions from existing workloads. Typically, workload configurations are kept in ``workloads/`` although you can use any directory you like. We provide a few