Design features
SoC composition
Describe peripheral registers in SystemRDL and let Tapeo generate the bus decoder, register blocks, C header, and a FuseSoC core, with every register checked through the bus.
A SoC's peripherals are reached through registers at fixed addresses on a bus. Tapeo builds that part from a description of the registers, using PeakRDL, the open-source SystemRDL tool set. Experimental.
Describe the map#
Write the registers in SystemRDL (the industry's register description language) and name the top map and the bus in soc/soc.json. The Architect can write both from a description.
{
"name": "demo_soc",
"rdl": "soc/soc.rdl",
"bus": "apb4"
}`include "gpio.rdl"
addrmap demo_soc {
external gpio gpio0 @ 0x0000; // a register block of its own
external mem { mementries = 64; memwidth = 32; sw = rw; } scratch @ 0x3000; // a port for your logic
reg { field { sw = r; hw = na; } value[32] = 32'h0001_0000; } version @ 0x4000;
};- Bus:
axi4-lite,apb4, orwishbone(pipelined). - Each
externalblock with registers becomes its own register block. Anexternalmemory or block without registers becomes a request port for your own logic. Registers placed directly in the top map live in the bus block. - The SystemRDL compiler checks the map: overlapping or misaligned blocks are rejected with the file and line.
Generate and check#
Press Generate the SoC in the Workflow tab, or run tapeo check soc (VS Code: Tapeo: Run a Check Now, then SoC). It takes about 15 seconds.
- 1PeakRDLGenerates the bus block with the address decoder, one register block per peripheral type, and the C header.
- 2The top moduleTapeo wires them into
<name>_topwith a named port for every hardware field (for examplegpio0_data_out_value), then converts the SystemVerilog to plain Verilog (generated/soc/<name>.v) so every later stage can read it. - 3Register checksA generated testbench reads every register's reset value, writes and reads back every read-write field with its own pattern, checks the hardware outputs, drives the hardware inputs, sets and clears write-1-to-clear flags, and reads every field again at the end so two registers that share storage are caught.
- 4FuseSoCA FuseSoC core (
generated/soc/<name>.core), which FuseSoC reads to confirm it, so the SoC can be built outside Tapeo.
The SoC composition panel shows the address map, the checks, and the files; readiness has a SoC registers and bus section. tapeo soc prints the same.
Connect it#
- Instantiate
<name>_topin your design. Its bus port covers addresses 0 to the map's size; a processor decodes its own upper address bits. - Software includes
generated/soc/<name>.hfor the register offsets and fields. - A project with
tapeo.jsonlistsgenerated/soc/<name>.vin its sources; without one it is picked up automatically.
What it is not#
Limits
rst. Unmapped addresses read as 0 without an error. Registers wider than 32 bits are not checked. There is no processor yet (LiteX is not integrated), no interrupt controller, DMA, or bridges between buses.