Design services
FPGA and accelerator systems engineering: RTL bring-up, SoC integration, RISC-V integration, Linux/BSP bring-up, HBM and DMA shells, benchmarking with honest numbers. Fixed-scope or day rate.
RISC-V Linux FPGA
Systolic Labs builds open, auditable RISC-V platforms, and two of them already run. A complete 64-bit CVA6 SoC — soft-core, no hardened CPU — boots Linux 6.11.11 to an interactive BusyBox shell inside a Kintex UltraScale+. A dual-core Ibex SoC runs an unmodified Zephyr SMP kernel on a €30 Artix-7 module. Every figure on this page is measured on the board.
StatusThe €30 board now boots with no host at all: FSBL in Boot ROM, FPGA configured from its own flash, verified by a real power-cycle. The configuration flash was backed up before it was written, not after. Next hardening step: a multiboot golden image.
Two platforms, one ladder. An application-class core running a real Linux userspace, and a microcontroller-class SoC running real SMP firmware. Both validated on physical hardware — and the RTL underneath both is open and auditable.
A complete 64-bit RISC-V SoC — CPU, DDR4 controller, interrupt and timer blocks, a UART and an accelerator slot — boots a real kernel to an interactive shell on a Xilinx Kintex UltraScale+ XCKU5P. Soft-core: there is no hardened CPU in the device. This is a mid-range FPGA running Linux off a core you can read.
| FPGA | XCKU5P-FFVB676-1-i · Kintex UltraScale+ |
|---|---|
| CPU core | CVA6, RV64IMAC, Sv39 MMU · 1 hart |
| Extensions | rv64imac_zicntr_zicsr_zifencei_zihpm_zca |
| SoC clock | 50 MHz, MMCM from ui_clk 300 MHz |
| DDR4 | 1 GiB MT40A512M16 · 2400 MT/s · ui_clk 300 MHz (4:1) @ 0x1_0000_0000 |
| Boot chain | OpenSBI 1.8.1 → Linux 6.11.11 → BusyBox, static initramfs |
| Peripherals | UART 16550A @ 0x10010000 · accelerator slot @ 0x10000000 · CLINT |
| Bootloader | 128 KiB BRAM |
| Tools | Vivado 2025.2 |
| Boot | complete, to a BusyBox ~ # prompt |
|---|---|
| Usable RAM | 992 / 1022 MiB · 97 % |
| Kernel reserved | 27.6 MiB |
| sched_clock | 64-bit @ 50 MHz · 20 ns resolution |
| Tick timer | 250 Hz · 4 ms |
| BogoMIPS | 100 · lpj = 200,000 |
| Local interrupts mapped | 64 |
| OpenSBI image | 275,872 B |
| Kernel image | 11,097,600 B · 10.6 MiB |
| Device tree | 1,766 B |
| UART transfer | 115,200 8N1 · 32 B / 3 ms · ≈3.6× faster than before |
| Paths meeting constraints | 99.97 % · 827,998 endpoints, 231 violated |
|---|---|
| Setup WNS | −0.178 ns |
| Setup TNS | −15.3 ns |
| Where | ui_clk 300 MHz domain only — the DDR4 bridge |
| SoC 50 MHz domain | WNS +3.69 ns · clean |
| Hold WHS | +0.012 ns · 0 violations |
| LUT, incl. distributed RAM | 161,688 / 216,960 | 74.5 % |
|---|---|---|
| — logic LUTs only | 95,501 / 216,960 | 44.0 % |
| Flip-flops | 65,057 / 433,920 | 15.0 % |
| BRAM tiles | 61.5 / 480 | 12.8 % |
| DSP48E2 | 467 / 1,824 | 25.6 % |
| MMCM / PLL | 2 / 2 | — |
Timing is not fully closed, and that is stated here on purpose. WNS is −0.178 ns with TNS −15.3 ns, confined to the 300 MHz ui_clk domain — the DDR4 bridge. The design boots and runs, but it is not a timing-clean signoff. Every other clock domain is clean and hold has zero violations. A page that only publishes its good numbers is not evidence.
devmem 0x10000000): the integration path for the NPU is in place.The gen1-ibex-a branch carries a complete SoC on a Colorlight i9+ v6.1 module (Artix-7 XC7A50T, 8 MB SDRAM, 25 MHz): two Ibex RV32IMA cores, a 64-bit AXI4 crossbar, an SDRAM controller, a CLINT, a 16550 console, a RISC-V-spec interrupt controller, a cross-core LR/SC exclusivity monitor, and free slots for an accelerator (NPU) and a DMA. Above it runs Zephyr RTOS v4.1.0 in SMP — unmodified kernel — with an interactive shell on the console.
| Cross-core atomics — LR/SC | 20,000 / 20,000 exact |
|---|---|
| Cross-core atomics — AMO | 20,000 / 20,000 exact |
| Interrupt-driven console (PLIC) | 400 / 400-byte burst, 0 FIFO overruns |
| Console throughput — interrupt | 11,697 B/s |
| Console throughput — polled | 136 B/s · ×86 slower |
| SMP stress, 6 concurrent threads | PASS · no lost IPIs |
| Timing — WNS | +9.691 ns · gate +5 ns |
| Timing — WHS | +0.042 ns |
| LUT utilisation | 56.6 % · gate 75 % |
| Commits on the branch | 272 · 494 files · +67,470 / −641 |
| Zephyr applications | 8 |
| Binaries in git history | 0 |
| Card identified | SDHC · OCR C0FF8000 CCS=1 · MBR 55 AA |
|---|---|
| Zephyr SD stack | disk init ret=0 · 7,864,320 sectors · 3.75 GiB |
| FAT32 | mounted · write + read-back 1,000/1,000 B · checksum 2726712C |
| Boot from card (Zephyr) | image validated twice · jump taken |
| FSBL, bare-metal (G1) | 2,874 B · SD init with no OS · PASS |
| Boot ROM (G3) | 4,130 B · 50 % of 8 KiB BRAM · all gates pass |
| Autonomous boot (G4) | flash written · real power-cycle · FPGA configures from its own flash |
| Configuration flash | 16 MiB Macronix MX25L12833 · backed up before writing |
| Validation before jump | magic + length + checksum |
| Dual-hart contract | hart 1 released via MSIP[1], after validation |
| Signoff | WNS +9.691 ns · WHS +0.042 ns · LUT 56.6 % |
| Bitstream | 2,192,145 B · sha256 b54ad352… |
| Gates validated | 7 · none skipped |
No FATFS in the FSBL and no OS: the payload is read at a fixed LBA by design, and the checksum is mandatory before the jump. It replaces a 74,604-byte Zephyr application with 4,130 bytes — 18× smaller. The configuration flash stays rewritable over JTAG even after a failed boot (dedicated TAP, indirect reprogramming), so the board cannot be lost. That is what turns flashing it into a routine step instead of a risk.
release callback in the SPI driver — called on the nominal path, it jumped to address 0. A hardware crash wearing the costume of a filesystem bug.Every figure has a trace in the repository: console capture, checksum, timing report. Hold margin is consolidated by constraint — 0.159 → 0.197 ns physical — behind automated validation gates. The accelerator slots are wired and validated; the NPU itself is not instantiated yet, and this page will keep saying so until it is.
mhartid, so the two cores interleave. The fix is written and not yet flashed — one dd at LBA 2048.The platform targets the buyers that closed silicon excludes or overcharges: European research groups, integrators under GDPR and AI Act pressure, and anyone who needs a datapath they can actually read.
Two things that never meet in commercial silicon are combined here. A software-recompilable RISC-V core gives an open, auditable instruction path and no vendor lock-in — and it is already proven up to a Linux userspace on a plain soft-core. A systolic-array NPU built on FPGA fabric will give a datapath that survives model changes by recompiling — instead of a silicon respin or a new part number. Underneath both sits HBM2 bandwidth that most competing small accelerators simply do not have.
The design posture is deliberate about what this is not:
What it wins on is the combination those alternatives cannot offer: an auditable open RTL path, a reconfigurable datapath, HBM-class bandwidth in a 75 W half-height card, and a provenance that stands up to a procurement filter written as "no third-country-controlled supplier".
| FPGA | XCKU5P-FFVB676-1-i · Kintex UltraScale+ |
|---|---|
| CPU | CVA6 RV64IMAC · Sv39 · 1 hart · soft-core |
| Memory | 1 GiB DDR4 (MT40A512M16) · 2400 MT/s |
| Clocks | SoC 50 MHz · ui_clk 300 MHz |
| Runtime | OpenSBI 1.8.1 → Linux 6.11.11 → BusyBox |
| Tools | Vivado 2025.2 |
| Device | Artix-7 XC7A50T |
|---|---|
| Memory | 8 MB SDRAM |
| Clock | 25 MHz |
| Cores | 2× Ibex RV32IMA · 64-bit AXI4 crossbar |
| Runtime | Zephyr RTOS v4.1.0, SMP, unmodified kernel |
| Cost | €30–50 module + JTAG dongle |
The scale-up target, chosen on price per gigabyte-per-second rather than peak spec. Purchased only when a client, a lab engagement or a grant requires local HBM hardware.
| Card | AMD Alveo U50 (A-U50-P00G-PQ-G) |
|---|---|
| Device | Virtex UltraScale+ VU35P, 16 nm |
| Memory | 8 GB HBM2 · 316 GB/s peak |
| Logic | 872 K LUTs · 5,952 DSP slices |
| On-chip | 51.8 Mb BRAM + 180 Mb UltraRAM |
| Host link | PCIe Gen3 x16 / 2× Gen4 x8 (CCIX) |
| Format | Half-height, half-length, single slot, passive · 75 W |
Portability. AMD has issued the end-of-life notice for the U50 (XCN26004): last-time-buy 30 October 2026, last-time-ship 2 April 2027. That closes the new-and-warranted channel only — the used market is unaffected. The design is kept portable at RTL level to the U55C (16 GB, 460 GB/s) and V80 (32 GB, 820 GB/s).
Working notes, dated when the work lands — or labelled by the gate it closes. Threads still running are marked open.
Four verticals scored on sales friction and willingness to pay. Conclusion: lead with academic and R&D prototyping, keep edge AI and defence behind it, do not attack the data centre. Positioning fixed as CVA6-first.
Every FPGA with on-package HBM2/HBM2e compared on bandwidth, LUT count, price and lifecycle status. Alveo U50 selected as the scale-up reference: best bandwidth per watt per euro in the 2026 market.
AWS F2 (VU47P) against a local U50 for the bring-up phase: compile, simulation and hardware-in-the-loop budgets. Result — the cloud path costs less than the electricity and cooling argument for a local card, until sustained bandwidth testing starts.
11 MB takes about 17 minutes at 115,200 baud — tolerable for bring-up, unusable for iteration. The same SD-boot approach now proven on the Ibex platform is the fix.
A 4,130-byte bare-metal FSBL lives in BRAM and boots the payload itself: BRAM → SD card → validate → jump. The host programmed the FPGA and streamed nothing. Validation is mandatory before the jump — magic, length, checksum — and hart 1 is released via MSIP[1] only once it passes.
The 16 MiB configuration flash was backed up first — full image, hash taken — then written, then verified by a real power-cycle with nothing else attached. The FPGA configures from its own flash. That closes the chain end to end: RTL → SD card → filesystem → second stage → Boot ROM → flash. Seven gates, none skipped.
An image header protects against corruption, not against a bad update. Multiboot lets the FPGA fall back to a known-good image by itself — documented, not yet implemented.
FPGA and accelerator systems engineering: RTL bring-up, SoC integration, RISC-V integration, Linux/BSP bring-up, HBM and DMA shells, benchmarking with honest numbers. Fixed-scope or day rate.
For labs and academic groups using CVA6, Ibex, Chipyard or Tiny Tapeout flows: design support, a reproducible build-and-signoff flow, and measured results you can cite.
Email camille@systolic-labs.com
I am one engineer. If the scope is real, I will tell you what I can deliver and what I cannot — that conversation takes less time than a proposal.