03 Building Custom Socs
03 Building Custom Socs
03 Building Custom Socs
SoCs in
Jerry Zhao
[email protected]
1
UC Berkeley
Tutorial Outline
1. Generate RTL for a simple SoC
2. Compile simple RISC-V baremetal software
3. Simulate Simple SoC running bare-metal software
4. Generate RTL for a large complex SoC
5. Simulate Complex SoC running bare-metal software
2
Chipyard Directory Structure
chipyard-morning/
generators/ Our library of Chisel generators
chipyard/
sha3/
sims/ Utilities for simulating SoCs
verilator/
firesim/
fpga/ Utilities for FPGA prototyping
3
> ls $MCYDIR
4
> tmux new –s buildrtl
5
> cd $MCYDIR/generators/chipyard
> cd src/main/scala/config
> vim TutorialConfigs.scala
6
Designing a SoC Config
• Look for TutorialLeanGemminiConfig (line 121)
• A Config is composed of Config “fragments”
• “fragments” set/override/adjust/clear keys in the Config
object
• Generators query this “Config” object at runtime to figure
out what to do
• Try it yourself –
• Set use_dedicated_tl_port=false
• Change the number of BOOM/Rocket cores
• Change the number of L2 banks (try 1/2/4)
7
Config Fragments In Depth
8
Config Fragments In Depth
...
> ls generated-src
> cd generated-src/ … LeanGemminiConfig/
> ls
10
Looking at what is generated
• <CONFIG>.dts
• Device tree string - describes to
software what’s on the SoC
• <CONFIG>.fir
• FIRRTL intermediate
representation
• gen-collateral/
• Directory containing output
verilog files, harness files, etc.
11
> cd gen-collateral/
> ls *.cc
> ls *.sv
> less ChipTop.sv
> less TestHarness.sv
12
ChipTop and TestHarness
ChipTop.sv TestHarness.sv
• Contains definition of the • Contains definition of the
ChipTop TestHarness
• ChipTop defines a single die • TestHarness instantiates a
and its top-level IO ChipTop
• This would get passed to VLSI • Also instantiates simulation
tools as the target module models of I/O devices
• This is the DUT for FireSim as • Ex: model of off-chip DRAM
well
13
Compiling Software
Three common approaches
• bare-metal
• No virtual memory
• No system calls
• Fast … minimal overhead before your main starts
• proxy-kernel
• Compile RISC-V application as you would for Linux
• PK “proxies” syscalls to the x86 host
• Virtual memory
• Slow, and only supports a subset of OS capabilities
• linux
• User binary run as a normal program under OS
14 • Run on FPGA prototypes or FireSim
> cd $MCYDIR/tests
> make
> spike hello.riscv
> spike mt-hello.riscv
> spike –p4 mt-hello.riscv
15
RoCC Software
• RoCC instructions are typically inserted as inline-
assembly in a C program
• For Gemmini, the gemmini.h header encapsulates all
the inline-assembly, and presents a simple C interface to
higher-level software
• Spike ISA simulator extensions can add functional
models for new RoCC instructions to spike
16
RoCC Accelerators
• Send necessary information to the accelerator
• Source(s), Destination, and what function to run
• Accelerator accesses memory, performs SHA3
cmd.valid
cmd.ready
cmd.bits.inst.funct[1:0]
cmd.bits.rs1[63:0]
BOOM/Rocket Gemmini Ctrl
cmd.bits.rs2[63:0]
cmd.bits.inst.rd[4:0]
busy
18
Running tests on RTL simulators
• Chipyard uses make targets to invoke RTL simulators
• run-binary - Runs a binary
• run-binary-debug - Runs a binary with waveforms
• run-binary-hex - Runs a binary with fast loadmem
• run-binary-hex-debug - Runs a binary with fast loadmem + waves
• Make variables specify simulation options
• CONFIG - What config to build
• BINARY - Run this binary
• timeout_cycles - Terminate simulation after this many cycles
19
> cd $MCYDIR/sims/xcelium
> make CONFIG=TutorialLeanGemminiConfig \
BINARY=$MCYDIR/tests/hello.riscv \
run-binary-hex
21
> cd $MCYDIR/generators/chipyard
> cd src/main/scala/config
> vim TutorialConfigs.scala
22
TutorialManyCoreNoCConfig
• 6 x 4 mesh NoC
Sonic DRAM DRAM DRAM DRAM Sonic
BOOM Channel Channel Channel Channel BOOM • 4 x Rocket + Gemmini
Accelerator Tiles
• 16 x Rocket Cores
Rocket Rocket Rocket Rocket • 8 x 10-wide SonicBoom
Sonic Rocket Rocket Rocket Rocket Sonic Tiles
BOOM BOOM
L2 Bank L2 Bank L2 Bank L2 Bank • 8 x Banks of L2 cache
23
> cd $MCYDIR/sims/xcelium
> make CONFIG=TutorialManyCoreNoCConfig
24
Configuring the NoC Topology
Request that
the System Bus
(SBus) should
be a NoC
25
Configuring the NoC Topology
Map agents
onto physical
on the NoC
26
Configuring the NoC Topology
Specify topology/routing
of NoC
27
> cd $MCYDIR/sims/xcelium
> make CONFIG=TutorialManyCoreNoCConfig
28
Lots more to try in Chipyard as well
• Chipyard reduces the complexity of SoC design-space-
exploration
• Try different core/accelerator/memory-system/configurations
• New in Chipyard 1.9.0: Config discovery
• Lists most of the available Config options across all Chipyard
packages
• make find-config-fragments
29
> cd $MCYDIR/sims/xcelium
> make find-config-fragments
30