Supported EDA tools¶
Read this first¶
This doc assumes a few Booley terms: Booley Flow (Booley's deterministic
end-to-end orchestration), Target (a named FuseSoC .core build target),
and EDA provisioning (where an approved tool installation comes from). If any are new, consult the
glossary in GLOSSARY.md; the README and
SETUP.md give the wider picture. Everything below is the detail
layer on top of that vocabulary.
The single source of truth for which EDA tools Booley drives, with which provisioning source, trace support, and requirements. When README, SETUP, or ROADMAP need to state "what's supported," they link here rather than keeping their own drifting lists.
Source language: SystemVerilog/Verilog only. VHDL is not supported in any flow — there is no GHDL/NVC Booley Flow, no VHDL lint or synthesis path, and a mixed repo's VHDL files simply have no Booley Target to point at. If your design is VHDL-first, Booley has nothing to offer it today; a repo that ships both an SV and a VHDL implementation (a common pattern) onboards fine — you wire the SV half and leave the VHDL half alone.
Two axes govern every flow:
- EDA tool: the concrete external program a Flow executes. The Target's
flow_options.tool(ordefault_tool) normally selects it and always participates in FuseSoC resolution. FPGA implementation is the fixed-backend exception: its Target-name axis declares intent, and Booley always executes Vivado after rebuilding the resolved inputs into a Vivado EDAM. - Provisioning decides where the installation files originate, never where
the command runs.
imagemeans the Sandbox Image supplies the tool.hostmeans a built-in policy mounts one administrator-registered installation read-only into the Sandbox under an exact Project Grant. Every EDA process still executes inside that Sandbox; Project configuration cannot select a host command, path, arbitrary mount, license destination, or execution location.
For every host-provisioned EDA tool, the built-in policy owns one canonical container path. The administrator may register different host installation paths, but every approved installation of a given tool is mounted at that same read-only destination inside the Sandbox. Neither the Project nor the Installation Registration can configure the destination. This gives wrappers, Flows, Doctor checks, and future image changes one stable tool layout instead of making container paths part of Project configuration.
Built-in flows¶
| Booley Flow | EDA tool | Provisioning | Trace | Requirements |
|---|---|---|---|---|
sim (including --mode elab-only) |
Verilator | image | waveform (enabling/disabling trace forces a Verilator recompile) | ships in the standard image; cocotb testbenches supported |
sim (including --mode elab-only) |
Icarus Verilog | image | waveform | ships in the standard image; cocotb testbenches supported |
lint |
Verilator | image | none | ships in the standard image |
lint |
Verible (verible-verilog-lint, style/naming rules) |
image | none | ships in the standard image |
synth |
Yosys (+ OpenROAD in physical mode) | image + setup cache | none | tools ship in the standard image; booley bootstrap fetches the pinned Nangate45 liberty/PDK into a host cache mounted read-only at /opt/pdk |
fpga |
AMD Vivado 2025.2 | host | none | supported on Linux x86-64 under an exact registration and Project Grant; floating FlexNet relay is experimental |
Vivado host-provisioning policy¶
Vivado 2025.2 on Linux x86-64 is the first supported host-provisioned EDA
policy. An administrator registers its release root, and Booley mounts that
root read-only at the fixed target /opt/booley-eda/vivado inside the Sandbox. The wrapper,
compatibility libraries, locale, image identity, mount, and environment are
host-issued policy rather than Project settings. Vivado itself executes inside
the Sandbox.
The FPGA Flow's portable compact, balanced, and max_frequency profiles
were characterized on this exact lane. They map to supported Vivado run
strategies; balanced preserves the vendor defaults without patching generated
Tcl. The reproducible compatibility results are preserved in the checked-in
Vivado characterization fixture.
These names express optimization intent, not guaranteed QoR, and FPGA power is
not currently a normalized metric.
The Project requests host provisioning under [eda.vivado]; the administrator
selects the exact Installation Registration in the Grant for one canonical
Project Root with booley eda. booley projects lists each remembered root and
its Grants, including roots that have since been deleted. Host-provisioned
Vivado is unavailable on Windows, macOS, and non-x86-64 Linux. Windows remains
supported for Booley and EDA tools already provisioned in its Linux Docker
image; a native Windows EDA installation cannot be mounted into a Linux
container and executed there.
The optional fixed-destination FlexNet relay is experimental. Its synthetic forwarding, isolation, failure, and cleanup tests pass, but an administrator-approved paid-seat checkout, accounting, concurrency, and return matrix was not available. Do not treat floating-license behavior or its SLA as validated until that site evidence exists.
The base sandbox image pins cocotb 2.x, but the cocotb run-half — the run
stage of the simulate flow that Booley drives after FuseSoC builds the sim —
also speaks the cocotb 1.x selection dialect (TESTCASE instead of
COCOTB_TEST_FILTER, auto-detected via cocotb-config --version). So a project
that pins a 1.x stack still routes sim through the built-in flow.
Dialect compatibility does not guarantee that every historical cocotb release works with the image's current simulator. If simulation stalls at time zero, see TROUBLESHOOTING.md.
A test that needs a non-RTL build step before it can run (a per-case
firmware compile, vector staging) declares it as
[flows.sim].pre_run_commands
(FLOW-SIM.md) —
the project's own Makefile runs inside the Sandbox, and Booley keeps the
same Flow contract above it. A simulator outside this matrix is out of scope
for Goal Mode; widening the matrix is the sanctioned extension axis.
synthis a PPA estimate, not tape-out. It's a fast power/performance/area estimate to optimize RTL against, whatever engine backs it (today Yosys + OpenROAD, deliberately pre-layout, ideal-clock, setup-only; Genus / Design Compiler may follow). Real tape-out sign-off (physical impl, CTS, routing, DRC/LVS, multi-corner STA on a foundry PDK) is out of scope for Booley.
synth RTL frontend (sv2v vs slang)¶
Yosys reads the design through one of two frontends, selected by the synthesis
Target's flow_options.frontend (or the --frontend override):
| frontend | how RTL enters Yosys | requires |
|---|---|---|
sv2v (default) |
sv2v transpiles SystemVerilog → Verilog, then read_verilog |
sv2v + any Yosys |
slang |
Yosys reads SystemVerilog natively via read_slang (no transpile); params pass as -G NAME=VALUE, defines as -D, include dirs as -I |
Yosys ≥ 0.67 sandbox image (vendored slang/sv-elab frontend) |
sv2v is the default and works on every sandbox image. slang skips the
transpile step and handles SystemVerilog constructs sv2v can choke on (complex
interfaces/modports, some casts), but needs a Yosys-0.67-or-newer image; on an
older image synth fails fast with a message telling you to switch
frontend or upgrade the image. Both frontends feed the same tech-mapping tail
(dfflibmap → ABC → stat) and the same optional OpenROAD physical path, so the
choice affects only RTL frontend processing, not the PPA methodology.
Which to pick. Stay on sv2v unless it fails. Reach for slang when the
design puts parameterized interfaces on module port lists, or reads their
parameters hierarchically (localparam KEEP_W = s_axis_tx.KEEP_W). sv2v
cannot transpile either, and for such a design slang is not a preference but
a requirement.
Neither frontend is strictly more capable, so "try the other one" is a real
move in both directions. Before concluding that a design cannot be synthesized,
check the known slang
and sv2v
failure signatures and workarounds.
Assertion behavior differs by frontend. sv2v drops SVA, so a design full
of assert property reaches Yosys assertion-free. slang instead lowers SVA
into $check cells; the flow strips those cells before tech mapping, so they
neither reach ABC nor corrupt the netlist handed to OpenROAD. If your design
guards its assertions behind a define (NO_ASSERTIONS and friends), setting it
on the ASIC Target is still the cleanest option because it keeps RTL frontend
processing cheap.
Versions in the sandbox image¶
Everything below is pinned in src/booley/data/docker/Dockerfile.base (the
image digest and ARG lines are the source of truth). This table is what a
fresh booley-sandbox build gives you; a project image may add to it, and [sandbox].pip_requirements
may override the Python rows (see
SANDBOX.md).
| Component | Version |
|---|---|
| Base image | ubuntu:26.04 |
| Python | 3.14 (Ubuntu) |
| Verilator | v5.052, source commit ea338be98e1e838d3518809ce8899f85a009963c |
| Icarus Verilog | v13_0 |
| Yosys | v0.69, built with its bundled read_slang frontend (povik/sv-elab on MikePopoloski/slang — a Yosys submodule, so it has no version of its own) |
| sv2v | v0.0.13 |
| OpenROAD | 26Q4 source commit c4d317e4fa2398b9880920a1411c20258a2175a9 (the exact upstream OCI binary reports 26Q3-2927-gc4d317e4fa) |
| Verible | v0.0-4296-g0f262651 |
| FuseSoC / Edalize | 2.4.7 / 0.6.8 |
| cocotb | 2.1.0, with cocotbext-axi 0.1.28, cocotbext-uart 0.1.4, numpy 2.5.3 |
| Liberty / PDK | NangateOpenCellLibrary (typical CCS), fetched and SHA-256 verified by booley bootstrap, mounted read-only at /opt/pdk/cell/lib |
Verilator 5.052 includes the nested-shift compiler fix required for native coverage. The image includes LZ4 development headers for native FST model builds and retains the system allocator.
Check what your image actually has rather than trusting the table after an upgrade:
booley doctor -v # prints each EDA tool's version line
booley session enter -- verilator --version # or any other EDA tool
booley session enter -- python -m pip list # the Python side
The RISC-V variant (booley-sandbox-riscv) adds xPack RISC-V GCC 15.2.0-1
and a tested official-master Spike snapshot at
609dbe0b9994154833039209fa37151e7c05e9d4 (1.1.1-dev) on top of these.
Upstream has no maintained stable release suitable for Ubuntu 26.04, so Booley
refreshes this exact official-master pin once per Booley release, after its
image and RISC-V acceptance gates pass; see
ADR 0069. This is
upstream Spike, not lowRISC's ibex-cosim fork that Ibex's UVM co-simulation
needs. See also SANDBOX.md.
Future commercial EDA integrations require their own built-in provisioning, licensing, Doctor, security, and full-Flow evidence before they can join this matrix. Planned integrations live in ROADMAP.md.
Native coverage capabilities¶
Coverage requires stable Verilator v5.052, full commit
ea338be98e1e838d3518809ce8899f85a009963c; 5.050 is excluded. Explicit collection
selecting any Icarus Target is an atomic all-Target Preflight error.
| Native record | V1 treatment |
|---|---|
| Line/basic block, branch, expression | Scored for points in the Target RTL closure. |
| Toggle | Directional per-bit points, scored independently. |
| User-authored cover property | Scored native evidence. |
| FSM and covergroup | Retained as unscored evidence when parsed; no V1 threshold. |
| Unknown record class | Retained capability/findings evidence; never silently scored. |
| Incompatible native format | No normalized points; collection error and gated evaluation blocked. |
Capabilities distinguish reported (parsed and retained), absent (no records),
and unsupported (cannot produce or safely interpret). Unscored does not mean
unsupported. Generated-main, declared custom-main, HDL-testbench, and Cocotb
harnesses are supported; every selected test owns its native database and process.
Source: docs/user/SUPPORTED-EDA-TOOLS.md on GitHub