Skip to main content

YAML Formats

This page is the canonical reference for all rtl_buddy configuration files. Use it when creating or updating configs for new designs, suites, and regressions.

root_config.yaml

The root config lives at the project root. It defines platforms, builders, Verible, coverage, synthesis tools, synthesis libraries, and the default regression config path.

Required keys:

  • rtl-buddy-filetype: project_root_config
  • cfg-platforms
  • cfg-rtl-builder
  • cfg-verible
  • cfg-rtl-reg

Full example:

rtl-buddy-filetype: project_root_config

cfg-platforms:
- os: "osx"
unames: ["Darwin"]
builder: "verilator"
verible: "verible-macos"

cfg-rtl-builder:
- name: "verilator"
builder: "verilator"
builder-simv: "obj_dir/simv"
sim-rand-seed: 31310
sim-rand-seed-prefix: "+verilator+seed+"
builder-opts:
debug:
compile-time: "--binary -sv -o simv"
run-time: "+verilator+rand+reset+2"
reg:
compile-time: "--binary -sv -o simv"
run-time: "+verilator+rand+reset+2"

cfg-verible:
- name: "verible-macos"
path: "/opt/homebrew/bin"
extra_args:
lint:
- "--rules=-module-filename"

cfg-coverage:
- name: "verilator"
use-lcov: true

cfg-coverview:
- name: "verilator"
generate-tables: "line"
config:
# inline Coverview JSON configuration values

cfg-surfer:
- name: "surfer-default"
path: "surfer" # bare name → found via PATH; or relative/absolute path
wcp-port: 0 # 0 = OS auto-assigns a free port
editor-cmd: "vim +%l %f" # %f = file path, %l = line number
editor-terminal: "tmux" # tmux | iterm2 | terminal | "" (empty = run cmd directly)
editor-sock: "~/.local/share/rtl-buddy/wave-nvim.sock" # optional: nvim remote reuse
ctrl-sock: "~/.local/share/rtl-buddy/wave-ctrl.sock" # optional: nvim → Surfer

cfg-synth-tools:
- name: "yosys"
tool: "yosys"
opts:
synth-args: ""
abc-args: ""
frontend: "verilog" # "verilog" (default) | "slang"
plugin-path: "" # required if frontend: slang — path to slang.so
- name: "openroad"
tool: "openroad"
opts:
strategy: "AREA" # AREA | TIMING | TIMING_ANNEAL | TIMING_GENETIC
frontend: "verilog"
plugin-path: ""

cfg-pdks:
- name: "sky130hd"
site: "unithd"
corners:
tt: "pdk/sky130hd/lib/sky130_fd_sc_hd__tt_025C_1v80.lib"
tech-lef: "pdk/sky130hd/lef/sky130_fd_sc_hd.tlef"
macro-lef: "pdk/sky130hd/lef/sky130_fd_sc_hd_merged.lef"
cell-gds: "pdk/sky130hd/gds/sky130_fd_sc_hd.gds"
klayout-tech: "pdk/sky130hd/sky130hd.lyt"
klayout-props: "pdk/sky130hd/sky130hd.lyp"
tie-hi: "sky130_fd_sc_hd__conb_1/HI"
tie-lo: "sky130_fd_sc_hd__conb_1/LO"
fill-cells: [sky130_fd_sc_hd__fill_1, sky130_fd_sc_hd__fill_2]

cfg-synth-platforms:
- name: "sky130hd_tt"
pdk: "sky130hd"
corner: "tt"

cfg-pnr-platforms:
- name: "sky130hd_tt"
pdk: "sky130hd"
corner: "tt"
cts-buffer: "sky130_fd_sc_hd__clkbuf_4"
routing-layers:
signal: "met1-met5"
clock: "met3-met5"

cfg-synth-efforts:
- name: "quick"
yosys:
synth-args: "-flatten"
abc-args: "-fast"
openroad:
run: false # skip OpenROAD entirely → Yosys-only fast path
- name: "standard"
openroad:
run: true # current default behaviour: STA with ideal wires
- name: "accurate"
openroad:
run: true
pre-sta-tcl: |
initialize_floorplan -utilization 0.7 -aspect_ratio 1.0 \
-core_space 2.0 -site unithd
global_placement -density 0.7
estimate_parasitics -placement

cfg-pnr-tools:
- name: "openroad"
tool: "openroad" # bare name → found via PATH; or absolute path

cfg-cdc-tools:
- name: "rtl-buddy-cdc"
tool: "rtl-buddy-cdc"
opts:
sync-depth: 2 # forwarded as `--sync-depth N` (CDC-002 required depth)
extra-args: "" # appended verbatim to every invocation

cfg-fpv-tools:
- name: "sby"
tool: "sby" # bare name → found via PATH; or absolute path
opts:
timeout: 600 # per-task timeout in seconds; written to sby [options]
extra-args: "" # appended verbatim to every sby invocation
solver-versions: # optional pins; map solver name → exact version
yices: "2.6.4" # known names: yices, z3, boolector, bitwuzla,
z3: "4.13.0" # btormc, abc. Hard-fails on mismatch.
plugin-path: "tools/yosys-slang/build/slang.so" # required when an fpv.yaml verification picks `frontend: slang`

cfg-rtl-reg:
reg-cfg-path: "design/regression.yaml"

Runtime effects:

  • Platform is selected by matching uname output against cfg-platforms[].unames.
  • --builder overrides the platform-selected builder for the current run.
  • --builder-mode selects which named builder-opts entry to use for compile-time and run-time flags.
  • cfg-coverage is keyed by simulator family (e.g. verilator). use-lcov: true enables .info export and LCOV HTML generation when --coverage-html is used.
  • cfg-coverview is keyed by simulator family. generate-tables sets the coverage type for Coverview tables. config is a dict of inline Coverview JSON configuration values.
  • cfg-surfer configures the Surfer waveform viewer used by rb wave. path is a bare executable name (resolved via PATH) or a relative/absolute path to the binary. editor-cmd supports %f (file path) and %l (line number) placeholders. editor-terminal controls how the editor is launched: tmux opens a new tmux window, iterm2 and terminal use AppleScript, empty string runs the command directly (suitable for GUI editors like VS Code). editor-sock is an optional Unix socket path that enables nvim remote reuse: rtl-buddy launches nvim with --listen <sock> on first use and reconnects for subsequent events. ctrl-sock is an optional Unix socket for the wave control server, which lets nvim send signals to Surfer — press <Space>wa (or your <leader>wa) on a signal name to add it to the waveform view. Install the bundled nvim plugin first with rb wave-install-nvim.
  • cfg-synth-tools defines synthesis tool entries selected by synth.yaml tool fields. tool is the path to the executable, or a bare name if it is available on PATH. For the Yosys backend, opts.synth-args are appended to the synth command and opts.abc-args are used by the unmapped ABC step. For the OpenROAD backend, opts.strategy controls optional resynthesis (AREA = none, TIMING/TIMING_ANNEAL = resynth_annealing, TIMING_GENETIC = resynth_genetic). opts.frontend selects the SystemVerilog parser: "verilog" (default) uses Yosys's built-in read_verilog -sv -defer per source — fast, lazy elaboration, but a small SV subset. "slang" loads the yosys-slang plugin and calls read_slang instead — full SV-2017 (package imports, packed-struct typedefs, complex generates) with eager elaboration. opts.plugin-path is required when frontend: slang; absolute paths pass through and relative paths resolve against the project root. Both options accept per-block overrides via synth.yaml tool_overrides.yosys.frontend / .plugin_path (note: tool_overrides keys are snake_case Python attribute names, while cfg-synth-tools.opts uses kebab-case YAML — same field, two names, see synthesis concept doc for the convention). The override key is always yosys (the elaboration tool), regardless of whether the synth selects tool: yosys or tool: openroad. The OpenROAD backend runs Yosys for elaboration → write_verilog → OpenROAD reads the netlist, so its elaboration-stage opts come from the yosys tool config + tool_overrides.yosys block.
  • cfg-pdks defines one entry per process. Each holds all PDK-bound assets — Liberty per corner (under corners:), tech-lef / macro-lef, optional cell-gds, KLayout .lyt / .lyp for streamout, SITE, and tie-hi / tie-lo / fill-cells for P&R. Paths are resolved relative to root_config.yaml. Multiple PDKs can coexist; downstream platform blocks select which one to use.
  • cfg-synth-platforms selects a cfg-pdks entry + corner for synthesis. Each entry has name (referenced by platform: in synth.yaml), pdk (PDK entry name), and corner (optional — defaults to the first declared corner). Block-specific LEFs go on the synth.yaml entry (lef-paths:) on top of the PDK's tech/macro LEFs.
  • cfg-pnr-platforms selects a cfg-pdks entry + STA corner for place-and-route. Each entry has name (referenced by platform: in pnr.yaml), pdk, optional corner (defaults to first corner), cts-buffer (clock-tree buffer cell), and routing-layers with signal / clock layer ranges.
  • cfg-synth-efforts defines named synthesis effort levels referenced by synth.yaml effort fields or the --effort CLI flag. Each entry has optional yosys.synth-args / yosys.abc-args (merged into the Yosys stage) and an openroad block. When openroad.run: false, the runner falls back to the Yosys-only backend even if tool: openroad was selected — useful for a fast quick-look path that needs no LEF/STA. openroad.pre-sta-tcl is a raw Tcl snippet injected into synth.tcl between read_sdc and report_checks; use it to insert floorplan/placement/parasitic-estimation steps before timing analysis. When no cfg-synth-efforts entries are configured or no effort is selected, a built-in standard effort with all defaults is used. Precedence for the same knob: per-synthesis tool_overrides > cfg-synth-efforts > cfg-synth-tools.
  • cfg-pnr-tools defines P&R tool entries selected by pnr.yaml tool fields. tool is the path to the executable, or a bare name if it is available on PATH. When pnr.yaml tool does not match a cfg-pnr-tools entry, the value is used as the executable name directly (bare-name on PATH semantics).
  • cfg-power-tools defines power-analysis tool entries selected by power.yaml tool fields. Each entry has name (referenced by tool: in power.yaml) and tool (path to the executable, or a bare name if it is available on PATH). When power.yaml tool does not match a cfg-power-tools entry, the value is used as the executable name directly (bare-name on PATH semantics).
  • cfg-cdc-tools defines CDC tool entries selected by cdc.yaml tool fields. tool is the path to the executable, or a bare name if it is available on PATH. opts.sync-depth is forwarded as --sync-depth N and controls CDC-002's required synchronizer depth. opts.extra-args is appended verbatim to every analyzer invocation.
  • cfg-fpv-tools defines FPV tool entries selected by fpv.yaml tool fields. tool is the path to the executable, or a bare name if it is available on PATH. opts.timeout is written to the generated .sby [options] block as a per-task timeout in seconds. opts.extra-args is appended verbatim to every sby invocation. opts.solver-versions is an optional map of solver short name → exact version string (e.g. yices: "2.6.4"); known solvers are yices, z3, boolector, bitwuzla, btormc, abc. Each pinned solver is probed before every run and the run hard-fails with a single multi-line summary if any version does not match — protects CI reproducibility against drift in locally-installed solvers. opts.plugin-path is the path to the yosys-slang shared library; required when any fpv.yaml verification picks frontend: slang, ignored for the default verilog frontend. Absolute paths pass through; relative paths resolve against the project root (the directory containing root_config.yaml).
  • cfg-rtl-reg.reg-cfg-path is the fallback regression file for rtl-buddy regression when no ./regression.yaml exists in the cwd.
  • cfg-verible[].path is the directory containing Verible executables. Absolute paths are used as-is; relative paths are resolved from the directory containing root_config.yaml.

regression.yaml

Required keys:

  • rtl-buddy-filetype: reg_config
  • test-configs

Example:

rtl-buddy-filetype: reg_config

test-configs:
- "design/example_block_a/verif/tests.yaml"
- "design/example_block_b/verif/tests.yaml"

Runtime effects:

  • rtl-buddy regression iterates each listed suite and runs tests filtered by --start-level/--reg-level.
  • regression anchors each suite on the directory containing that suite's tests.yaml (the command root) and writes its artefacts under <that dir>/artefacts/; it does not change the process working directory (the v5 execution context model).

models.yaml

Required keys:

  • rtl-buddy-filetype: model_config
  • models

Example:

rtl-buddy-filetype: model_config

models:
- name: "my_design"
desc: "Optional human-readable description"
filelist:
- "-F my_design.f"
spec: "../../spec/my_design/specs.yaml"
cdc: "../../cdc/my_design/cdc.yaml"
synth: "../../synth/my_design/synth.yaml#fast"
tests: "../../verif/my_design/tests.yaml"

Optional fields:

FieldTypeDescription
descstringHuman-readable model description
specstringPath to the block's specs.yaml, relative to this models.yaml file. Used by rb spec check-design to link the design model to its specification.
cdcstringPath to the cdc.yaml that owns this model's CDC analysis, relative to this models.yaml. Optional #analysis_name fragment picks one analysis from a multi-analysis file (e.g. cdc.yaml#full_design). Read by rb hub to enable the clock-domain overlay; absent → overlay unavailable.
synthstringPath to the synth.yaml that owns this model's synthesis flow, relative to this models.yaml. Same #synth_name fragment semantics. Declared now for forward compatibility; no consumer reads it yet.
testsstringPath to the tests.yaml that owns this model's testbench/test suite, relative to this models.yaml. Same #test_name fragment semantics. Declared now for forward compatibility; no consumer reads it yet.

Runtime effects:

  • tests.yaml references a model by name using the model and model_path fields.
  • Model filelists are parsed by the filelist logic: -F recursion, +incdir+, +libext+, -v, -y, and plain source paths are all supported.
  • spec is not used at simulation time; it is only consumed by the rb spec traceability commands.
  • cdc / synth / tests are back-pointers — the downstream files still carry their own model: + model_path: references back to this one. The model-side entry is the source of truth for "which analysis owns this model" when there could otherwise be ambiguity (e.g. two cdc.yaml files reference the same model name).

tests.yaml

Required keys:

  • rtl-buddy-filetype: test_config
  • testbenches
  • tests

Example:

rtl-buddy-filetype: test_config

testbenches:
- name: "tb_top"
filelist:
- "+incdir+../../../verif/tb"
- "tb_top.sv"

tests:
- name: "smoke"
desc: "sanity test"
reglvl: 0
model: "my_design"
model_path: "../src/models.yaml"
testbench: "tb_top"
plusargs:
test_cycles: "50"
lvm_verbosity: 1
plusdefines:
FEATURE_X: "1"
sim_timeout: 120
uvm:
max_warns: 0
max_errors: 0

- name: "sweep_case"
desc: "expands to many tests"
reglvl:
default: 2000
vcs: 3000
model: "my_design"
model_path: "../src/models.yaml"
testbench: "tb_top"
sweep:
path: "example_sweep.py"

Field reference:

FieldTypeDescription
namestringTest identifier; used in log file names
descstringHuman-readable description
reglvlint or dictRegression level; int for all builders, dict for per-builder with default
modelstringModel name from models.yaml
model_pathstringPath to models.yaml; resolved relative to the suite directory
testbenchstringTestbench name from testbenches list
plusargsdictKEY: VALUE+KEY=VALUE at sim runtime
plusdefinesdictKEY: VALUE+define+KEY=VALUE at compile time
sim_timeoutintTimeout in seconds (default: 60)
uvm.max_warnsintUVM warning threshold; exceeding it fails the test
uvm.max_errorsintUVM error threshold; exceeding it fails the test
sweep.pathstringPath to sweep expansion script
preproc.pathstringPath to pre-processing script
postproc.pathstringPath to post-processing script (parsed but not yet fully active)
coverslist of stringsIDs of spec coverage items this test addresses (e.g. ["BLOCK-COV-01"]). Used by rb spec check-coverage; has no effect at simulation time.
assertionsboolWhen true and the builder is Verilator, compile in SVA via --assert (and --coverage-user for cover-property hits) and add an Assertions column to the rb test results table. See Assertion-Based Verification.

cocotb testbenches

Adding a cocotb: block to a testbench entry switches the runner to cocotb/VPI mode (Verilator only for now). toplevel: is required when cocotb: is present; omitting it raises a fatal error at config-load time.

Prerequisite: cocotb must be installed in the active Python environment (uv add cocotb or pip install cocotb). The runner invokes cocotb-config at compile time; a missing binary surfaces as a FatalRtlBuddyError with an actionable message.

testbenches:
- name: "tb_my_design"
filelist:
- "my_design.sv"
toplevel: my_design # DUT top-level module name — required for cocotb
cocotb:
module: test_my_design # Python module(s) containing @cocotb.test() coroutines

- name: "tb_multi"
filelist:
- "my_design.sv"
toplevel: my_design
cocotb:
module: # list form: all modules are loaded
- test_smoke
- test_corner_cases

Pass/fail detection for cocotb testbenches:

cocotb writes a JUnit XML results file (cocotb_results.xml) instead of PASS/FAIL stdout lines. rtl_buddy parses this file automatically after simulation; you do not need $display("PASS …") in cocotb tests. The desc field in the result reports the first three failure messages and a (+N more) suffix when there are more.

Testbench field reference (cocotb-specific additions):

FieldTypeRequiredDescription
toplevelstringYes (cocotb only)Top-level DUT module name passed to COCOTB_TOPLEVEL
cocotb.modulestring or listYesPython test module(s) passed to COCOTB_TEST_MODULES

Runtime effects by field:

  • testbench: selects entry from testbenches; its filelist is appended to model sources for compilation.
  • model_path: resolved relative to the tests.yaml file's directory.
  • reglvl as dict: use default as the fallback for builders not listed.
  • plusdefines: converted to +define+KEY (no value) or +define+KEY=VALUE.
  • plusargs: converted to +KEY (no value) or +KEY=VALUE.
  • sim_timeout: applies per test run, not per iteration in randtest.
  • sweep.path: Python script that expands one test entry into a list of TestConfig objects. See Plugins.
  • preproc.path: Python script executed before compile; can mutate test_cfg and root_cfg, and receives suite_dir plus artifact_dir in its execution namespace. See Plugins.

Path semantics and cwd

  • rtl_buddy.log and the convenience symlinks (test.log, test.err, test.randseed) are written to the suite root (the current working directory).
  • Per-test artifacts are written to artefacts/{test_name}/ under the suite root. Single runs write test.log, test.err, test.randseed, compile.log, run.f, and (if enabled) coverage.dat there directly. Repeated runs (randtest) write sim outputs into numbered subdirectories: artefacts/{test_name}/run-0001/, etc.
  • test and randtest do not automatically change into the suite directory. Run from the suite directory, or use --test-config with a full path.
  • regression does chdir into each suite directory before executing.
  • Preproc plusargs are passed to the simulator verbatim. Resolve suite-local input paths explicitly against suite_dir; keep output filenames artifact-relative when they should land under artefacts/{test_name}/.
  • For portable configs in multi-suite repos, make paths in tests.yaml explicit and verify they resolve correctly from the intended invocation directory.

synth.yaml

Required keys:

  • rtl-buddy-filetype: synth_config
  • syntheses

Example:

rtl-buddy-filetype: synth_config

syntheses:
- name: "smoke_synth"
desc: "Synthesize my_design with the default Yosys flow"
model: "my_design"
model_path: "../src/models.yaml"
tool: "yosys"
reglvl: 0

- name: "sky130_synth"
desc: "Technology-mapped synthesis for SKY130 (Yosys)"
model: "my_design"
model_path: "../src/models.yaml"
tool: "yosys"
constraints: "constraints.sdc"
platform: "sky130hd_tt"
params:
WIDTH: 32
defines:
TARGET_SYNTH: 1
reglvl:
default: 0
dc: 1000
tool_overrides:
yosys:
synth_args: "-flatten"

- name: "sky130_openroad"
desc: "Technology-mapped synthesis with OpenROAD timing analysis"
model: "my_design"
model_path: "../src/models.yaml"
tool: "openroad"
constraints: "constraints.sdc"
platform: "sky130hd_tt"
effort: "accurate" # references cfg-synth-efforts entry; overridable via --effort
reglvl: 0

Field reference:

FieldTypeDescription
namestringSynthesis identifier; used on the CLI and in artefacts/{name}/
descstringHuman-readable synthesis description
modelstringModel name from models.yaml; also used as the Yosys top module
model_pathstringPath to models.yaml, resolved relative to the synth.yaml file
toolstringSynthesis tool name from root_config.yaml cfg-synth-tools
constraintsstringOptional SDC file path, resolved relative to the synth.yaml file
paramsdictOptional top-level parameter overrides passed through Yosys chparam -set
definesdictOptional Verilog defines passed to read_verilog as -D KEY=VALUE
platformstringOptional cfg-synth-platforms name (which references a cfg-pdks entry); enables technology mapping
lef-pathslist of stringsOptional block-specific LEF files (paths resolved relative to the synth.yaml file); appended after the PDK's tech/macro LEFs for the OpenROAD backend
lib-pathslist of stringsOptional block-specific Liberty files (paths resolved relative to the synth.yaml file); appended after the platform's PDK Liberty for both the Yosys and OpenROAD backends
reglvlint or dictRegression level; int for all tools, dict for per-tool with default
tool_overridesdictOptional per-tool overrides for synth_args, abc_args, strategy, frontend, and plugin_path, keyed by synthesis tool name (always yosys for the elaboration stage). Keys are snake_case — see the cfg-synth-tools note above on the kebab-vs-snake naming
effortstringOptional effort name from cfg-synth-efforts; controls Yosys synth/abc args and OpenROAD pre-sta-tcl. Overridable per invocation with rtl-buddy synth --effort <name>. Omitted ⇒ built-in standard defaults.

Runtime effects:

  • rtl-buddy synth loads synth.yaml, resolves sources via models.yaml, and dispatches to the backend selected by tool.
  • Yosys backend (tool: "yosys"): writes synth.f and synth.ys, runs Yosys, captures output in synth.log. Without platform, emits RTLIL; with platform, runs dfflibmap + abc -liberty and emits synth_netlist.v. Reports Gates, Area (lib-mapped only), and WNS (lib-mapped with SDC). Passes when exit code is 0 and synth.log has no ERROR: lines.
  • OpenROAD backend (tool: "openroad"): requires platform pointing at a cfg-synth-platforms entry whose PDK has tech-lef / macro-lef set. Stage 1 runs Yosys to produce synth_netlist.v (logged to synth_yosys.log). Stage 2 runs OpenROAD with synth.tcl which calls read_lef, read_liberty, read_verilog, link_design, read_sdc (native multi-clock), and reports area/timing; output in synth.log. Reports Gates, Area, WNS (from report_checks -path_delay max), and TNS (from report_tns). Passes when both stages exit with code 0 and neither log contains errors.
  • If constraints contains create_clock entries, the Yosys backend uses the minimum period as ABC's -D constraint (multi-clock workaround). The OpenROAD backend passes the full SDC to read_sdc without modification.
  • effort selects an entry from root_config.yaml cfg-synth-efforts. If the selected effort has openroad.run: false, a synthesis with tool: openroad falls back to the Yosys-only backend (no LEF/STA required) — this is the recommended "quick" path for iteration. The --effort CLI flag on rtl-buddy synth and rtl-buddy synth-regression overrides whatever is set per-synthesis.

synth_regression.yaml

Required keys:

  • rtl-buddy-filetype: synth_reg_config
  • synth-configs

Example:

rtl-buddy-filetype: synth_reg_config

synth-configs:
- "design/example_block_a/synth/synth.yaml"
- "design/example_block_b/synth/synth.yaml"

Runtime effects:

  • rtl-buddy synth-regression iterates each listed synth.yaml file and filters syntheses by --reg-level.
  • Paths in synth-configs are resolved relative to the synth_regression.yaml file.
  • synth-regression anchors each listed synthesis suite on the directory containing its synth.yaml (the command root) and writes artefacts under <that dir>/artefacts/; it does not change the process working directory (the v5 execution context model).

pnr.yaml

Required keys:

  • rtl-buddy-filetype: pnr_config
  • runs

Example:

rtl-buddy-filetype: pnr_config

runs:
- name: "demo_pnr_nangate45"
desc: "OpenROAD P&R on Nangate45 typ corner"
tool: "openroad"
synth: "demo_synth_nangate45"
synth-path: "../../synth/demo/synth.yaml"
constraints: "../../synth/demo/constraints.sdc"
platform: "nangate45_typ"
floorplan:
utilization: 0.55
aspect: 1.0
core-margin: 2.0
reglvl: 1000

Field reference:

FieldTypeDescription
namestringP&R run identifier; used on the CLI and in artefacts/<name>/
descstringHuman-readable description
toolstringBackend tool — "openroad" is the only supported value today
synthstringName of the upstream rb synth entry that produced the netlist
synth-pathstringPath to the synth.yaml that defines synth, resolved relative to pnr.yaml
constraintsstringPath to the SDC file (required), resolved relative to pnr.yaml
platformstringcfg-pnr-platforms entry name
lef-pathslist of stringsOptional design-specific macro LEF files (e.g. SRAM macros), resolved relative to pnr.yaml; emitted as extra read_lef lines after the platform's tech/macro LEF
lib-pathslist of stringsOptional design-specific macro Liberty files, resolved relative to pnr.yaml; emitted as extra read_liberty lines
floorplan.utilizationfloatCore utilization (0–1)
floorplan.aspectfloatDie aspect ratio
floorplan.core-marginfloatMargin between core area and die edge, in microns
reglvlint or dictRegression level for filtering; same semantics as synth.yaml reglvl (int for all tools, dict for per-tool with default)
tool_overridesdictReserved for tool-specific overrides (none consumed today)

Runtime effects:

  • rb pnr loads pnr.yaml, resolves the upstream synth-path + synth to find <synth_dir>/artefacts/<synth_name>/synth_netlist.v, and dispatches to the OpenROAD backend.
  • The backend writes pnr.tcl from a bundled template, invokes openroad -no_init -exit -log artefacts/<name>/pnr.log artefacts/<name>/pnr.tcl, and produces routed DEF + post-route netlist/SDC + timing/DRC reports under artefacts/<name>/.
  • The selected cfg-pnr-platforms entry provides Liberty, tech-LEF, macro-LEF, SITE, tie cells, fill cells, CTS buffer, and routing layer ranges via its referenced cfg-pdks entry.
  • Pass when OpenROAD exits 0 and the log has no [ERROR ...] lines. SKIP when the entry's reglvl is above --reg-level or tool: is not openroad.

power.yaml

Required keys:

  • rtl-buddy-filetype: power_config
  • runs

Example:

rtl-buddy-filetype: power_config

runs:
- name: "demo_power_static"
desc: "Static power on Nangate45 typ corner"
tool: "openroad"
mode: "static"
synth: "demo_synth_nangate45"
synth-path: "../../synth/demo/synth.yaml"
constraints: "../../synth/demo/constraints.sdc"
platform: "nangate45_typ"
reglvl: 1000

- name: "demo_power_postpnr"
desc: "Post-PnR power from the routed ODB"
tool: "openroad"
mode: "dynamic"
netlist-source: "pnr"
pnr: "demo_pnr_nangate45"
pnr-path: "../../pnr/demo/pnr.yaml"
platform: "nangate45_typ"
activity:
saif: "../../verif/demo/artefacts/csr_smoke/dump.saif"
scope: "tb_top/u_dut"
reglvl: 1000

Field reference:

FieldTypeDescription
namestringRun identifier; used on the CLI and in artefacts/<name>/
descstringHuman-readable description (required — no default)
toolstringBackend tool name; default "openroad" (the only backend today)
modestring"static" (default) or "dynamic". Static skips activity; dynamic applies an activity source
netlist-sourcestring"synth" (default) or "pnr". Selects post-synth netlist vs post-PnR routed ODB
synthstringUpstream rb synth entry name — required when netlist-source: synth
synth-pathstringPath to the synth.yaml, relative to power.yaml — required when netlist-source: synth
pnrstringUpstream rb pnr entry name — required when netlist-source: pnr
pnr-pathstringPath to the pnr.yaml, relative to power.yaml — required when netlist-source: pnr
constraintsstringSDC path (required for synth source; optional for pnr source — defaults to the post-CTS <top>.routed.sdc)
platformstringcfg-pnr-platforms entry name — reused for Liberty + corner
activity.saifstringPath to a SAIF v2 file (mutually exclusive with vcd)
activity.vcdstringPath to a VCD trace (mutually exclusive with saif)
activity.scopestringHierarchical scope for OpenROAD's -scope. Only valid alongside saif/vcd; set without a trace it raises a config-load error
activity.default-toggle-ratefloatSynthetic global toggle rate (used in dynamic mode with no trace). Default 0.1
activity.default-static-probfloatSynthetic global duty cycle. Default 0.5
reglvlint or dictRegression level for filtering; same semantics as synth.yaml/pnr.yaml reglvl
tool_overridesdictReserved for tool-specific overrides; accepted but not consumed by the OpenROAD backend today (mirrors pnr.yaml)

Runtime effects:

  • rb power resolves the netlist per netlist-source: synth reads synth_netlist.v from the upstream rb synth run (read_verilog); pnr reads <top>.routed.odb from the upstream rb pnr run (read_db) and runs estimate_parasitics -global_routing for routing-derived wire-cap (no SPEF). See the Power Analysis concept page for the full activity-source matrix.
  • The resolved activity source (default / synthetic / saif / vcd) is decided at config load and surfaced in the results table.
  • Pass when openroad exits 0, the log has no [ERROR ...] lines, and the Total line in power.rpt parses. SKIP when the entry's reglvl is above --reg-level or tool: is not in the backend registry.

power_regression.yaml

Required keys:

  • rtl-buddy-filetype: power_reg_config
  • power-configs

Example:

rtl-buddy-filetype: power_reg_config

power-configs:
- "power/demo_block_a/power.yaml"
- "power/demo_block_b/power.yaml"

Runtime effects:

  • rb power-regression iterates each listed power.yaml and filters runs by --reg-level.
  • Paths in power-configs are resolved relative to the power_regression.yaml file.
  • Each listed suite is anchored on the directory containing its power.yaml (the command root); the process working directory is not changed (the v5 execution context model).

cdc.yaml

Required keys:

  • rtl-buddy-filetype: cdc_config
  • analyses

Example:

rtl-buddy-filetype: cdc_config

analyses:
- name: "ip_cdc_handshake_lint"
desc: "CDC lint of the request/ack handshake IP"
model: "ip_cdc_handshake"
model_path: "../../design/common/models.yaml"
tool: "rtl-buddy-cdc"
constraints: "ip_cdc_handshake.sdc"
waivers: "ip_cdc_handshake.waivers" # optional
reglvl: 0

- name: "alu_accel_lint"
desc: "CDC lint of the ALU accelerator"
model: "alu_accel_top"
model_path: "../../design/alu_accel/models.yaml"
tool: "rtl-buddy-cdc"
constraints: "alu_accel_top.sdc"
frontend: "slang" # opt this analysis into the slang elaboration frontend
reglvl:
default: 0
rtl-buddy-cdc: 100
tool_overrides:
rtl-buddy-cdc:
sync_depth: 3
extra_args: "--strict"

Field reference:

FieldTypeDescription
namestringAnalysis identifier; used on the CLI and in artefacts/{name}/
descstringHuman-readable analysis description
modelstringModel name from models.yaml; also used as the top module for elaboration
model_pathstringPath to models.yaml, resolved relative to the cdc.yaml file
toolstringCDC tool name from root_config.yaml cfg-cdc-tools
constraintsstringSDC file path, resolved relative to the cdc.yaml file
waiversstringOptional waiver file path, resolved relative to the cdc.yaml file
reglvlint or dictRegression level; int for all tools, dict for per-tool with default
tool_overridesdictOptional per-tool overrides for sync_depth or extra_args, keyed by CDC tool name
frontendstringOptional elaboration frontend selector forwarded as-is via --frontend <value> to the analyzer subprocess. The set of accepted values is the analyzer's, not rtl_buddy's — for the bundled rtl-buddy-cdc backend on current main it's "yosys" (built-in) or "slang" (full SV-2017 via the optional pyslang-backed [slang] extra); see the analyzer's own docs for the authoritative list. Unknown values are rejected by the analyzer, not by rtl_buddy. Omit to use the analyzer's own default.

Runtime effects:

  • rtl-buddy cdc loads cdc.yaml, resolves sources via models.yaml, and dispatches to the backend selected by tool.
  • The bundled rtl-buddy-cdc backend invokes the standalone rtl-buddy-cdc lint CLI as a subprocess. The analysis receives the model's resolved filelist, the SDC, an optional waivers file, the merged tool opts (root cfg-cdc-tools baseline plus any matching tool_overrides.<tool>), and — when set — --frontend <value> from the per-analysis frontend field.
  • frontend is per-analysis (not on cfg-cdc-tools opts) — different from the synth side, where the equivalent selector lives on cfg-synth-tools.opts.frontend. Per-analysis suits the CDC use case because slang-required and Yosys-only analyses commonly coexist in one suite, and there is no useful project-wide default.
  • Each analysis writes a text report and a machine-readable JSON report under artefacts/{name}/; the JSON summary is parsed to populate the pass/fail/skip result for the CLI table.
  • rtl-buddy cdc <name> --list lists configured analyses without running them.

cdc_regression.yaml

Required keys:

  • rtl-buddy-filetype: cdc_reg_config
  • cdc-configs

Example:

rtl-buddy-filetype: cdc_reg_config

cdc-configs:
- "design/example_block_a/lint/cdc.yaml"
- "design/example_block_b/lint/cdc.yaml"

Runtime effects:

  • rtl-buddy cdc-regression iterates each listed cdc.yaml file and filters analyses by --reg-level.
  • Paths in cdc-configs are resolved relative to the cdc_regression.yaml file.
  • cdc-regression anchors each listed CDC suite on the directory containing its cdc.yaml (the command root) and writes artefacts under <that dir>/artefacts/; it does not change the process working directory (the v5 execution context model).

fpv.yaml

Required keys:

  • rtl-buddy-filetype: fpv_config
  • verifications

Example:

rtl-buddy-filetype: fpv_config

verifications:
- name: "demo_fpv_fifo"
desc: "Bounded proof of FIFO interface assertions"
tool: "sby"
model: "demo_fifo"
model_path: "../../design/demo_fifo/models.yaml"
top: "demo_fifo"
constraints: "shared_clock_reset.sv" # optional environment assumes
properties:
- "demo_fifo_props.sv"
mode: "bmc"
depth: 32
engines:
- "smtbmc yices"
reglvl: 1000

- name: "alu_accel_fpv"
desc: "k-induction prove of ALU accelerator invariants"
tool: "sby"
model: "alu_accel_top"
model_path: "../../design/alu_accel/models.yaml"
properties:
- "alu_accel_props.sv"
mode: "prove"
depth: 16
engines:
- "smtbmc z3"
- "abc pdr"
reglvl:
default: 0
sby: 1000
tool_overrides:
sby:
timeout: 1800
extra_args: ""

Field reference:

FieldTypeDescription
namestringVerification identifier; used on the CLI and in artefacts/{name}/
descstringHuman-readable verification description
toolstringFPV tool name from root_config.yaml cfg-fpv-tools
modelstringModel name from models.yaml
model_pathstringPath to models.yaml, resolved relative to the fpv.yaml file
topstringTop module name passed to prep -top; defaults to model
propertieslistSystemVerilog files containing SVA properties / bound checkers, resolved relative to fpv.yaml. Optional when properties are in-RTL under `ifdef FORMAL guards
constraintsstringOptional path to a single .sv file with environment assume property statements (clock toggle, reset sequence, etc.). Read into the sby script before properties: so the assumes are in scope when asserts elaborate. Resolved relative to fpv.yaml. Analogous to constraints: in pnr.yaml — separates "environment" from "what to prove" and lets multiple verifications share one clock/reset boilerplate.
modestringOne of bmc, prove, cover, live; defaults to bmc
depthintCycle depth for the proof; defaults to 20
engineslistSby engine specs (e.g. smtbmc yices, abc pdr); defaults to ["smtbmc yices"]
reglvlint or dictRegression level; int for all tools, dict for per-tool with default
tool_overridesdictOptional per-tool overrides for timeout or extra_args, keyed by FPV tool name
vacuityboolOptional. When true (default for bmc / prove), run a secondary sby cover-mode pass over auto-derived covers for every |-> / |=> antecedent in the property set. Default is false for cover / live modes. See Vacuity covers.
coiboolOptional. When true (default), run a yosys cone-of-influence pass after the primary proof and report the fraction of design cells reachable from at least one assertion. See Cone-of-influence coverage.
frontendstringSystemVerilog frontend. "verilog" (default — yosys native, immediate + simple-concurrent SVA only) or "slang" (yosys-slang plugin — required for |-> / |=> and SV bind). slang requires cfg-fpv-tools[].opts.plugin-path in root_config.yaml. See Choosing a frontend.

Runtime effects:

  • rtl-buddy fpv loads fpv.yaml, resolves the model's filelist via models.yaml, and dispatches to the backend selected by tool.
  • The bundled sby backend generates a .sby config containing [options] (mode, depth, optional timeout), [engines], [script] (Yosys read + prep), and [files] (resolved source paths), then invokes sby -f -d <workdir> <config>.
  • Each verification writes the generated config, the full sby log, and the sby workdir under artefacts/{name}/; the workdir's status file is the authoritative pass/fail signal, with the process exit code as fallback.
  • Counterexample VCDs (on FAIL) land at artefacts/{name}/sby_workdir/engine_<N>/trace.vcd.
  • rtl-buddy fpv <name> --list lists configured verifications without running them.

fpv_regression.yaml

Required keys:

  • rtl-buddy-filetype: fpv_reg_config
  • fpv-configs

Example:

rtl-buddy-filetype: fpv_reg_config

fpv-configs:
- "design/example_block_a/fpv/fpv.yaml"
- "design/example_block_b/fpv/fpv.yaml"

Runtime effects:

  • rtl-buddy fpv-regression iterates each listed fpv.yaml file and filters verifications by --reg-level.
  • Paths in fpv-configs are resolved relative to the fpv_regression.yaml file.
  • fpv-regression anchors each listed FPV suite on the directory containing its fpv.yaml (the command root) and writes artefacts under <that dir>/artefacts/; it does not change the process working directory (the v5 execution context model).

mut.yaml

Unlike the other suite configs, a mut.yaml describes a single mutation campaign (one design file under test), not a list of runs. See the Mutation Testing concept page for the full workflow.

Required keys:

  • rtl-buddy-filetype: mut_config
  • model, model_path, design_file, operators, verify

Example:

rtl-buddy-filetype: mut_config

model: demo_top
model_path: "../../design/demo_top/models.yaml"
design_file: "../../design/demo_top/rtl/alu.sv"

operators:
- arith_flip
- bit_op_flip
- cond_negate

verify:
fpv_config: "../../fpv/demo/fpv.yaml"
verification: "demo_fpv_alu_safety"
test_config: "../../verif/demo/tests.yaml"
tests: ["alu_smoke"]
assertions: true

budget:
max_mutants: 100
schedule: "sequential"

Field reference:

FieldTypeDescription
modelstringModel name within the referenced models.yaml
model_pathstringPath to the models.yaml, resolved relative to mut.yaml
design_filestringThe single SystemVerilog file to mutate, relative to mut.yaml. Must live within the model directory so per-mutant isolation can copy the tree
operatorslist of stringsNon-empty list of operators: arith_flip, bit_op_flip, cond_negate, cond_const, assign_drop, port_binding_swap. Empty or unknown ⇒ fatal config error
verify.fpv_configstringPath to an fpv.yaml, relative to mut.yaml (FPV kill oracle)
verify.verificationstringVerification name in that fpv.yamlrequired when fpv_config is set
verify.test_configstringPath to a tests.yaml, relative to mut.yaml (simulation kill oracle)
verify.testslist of stringsOptional subset of test names; empty (default) runs every test in the suite
verify.assertionsboolCompile SVA in via Verilator --assert. Default true
namestringCampaign id; used in artefacts/mut/<name>/. Defaults to model
topstringTop module under test. Defaults to model
budget.max_mutantsintCap on mutants generated. Default 100
budget.per_module_capint or nullPer-module cap, or null (default) for none
budget.time_budget_minutesfloat or nullWall-clock budget in minutes, or null (default) for none
budget.schedulestring"sequential" (default) or "round_robin"
scope.include / scope.excludelist of stringsOptional include/exclude lists (no-op for single-file campaigns)

Runtime effects:

  • verify must configure at least one kill oracle (fpv_config + verification, and/or test_config); otherwise config load fails. When both are set, a mutant is killed if either oracle catches it.
  • rb mut run writes mut_report.json under <mut.yaml dir>/artefacts/mut/<campaign>/. It exits 1 only when nothing was scorable; score thresholding is not gated.
  • The mutation engine lives in the optional rtl-buddy-xeno package (pip install "rtl-buddy-xeno[verible,slang]"); rb mut raises a fatal error with this hint if it is not installed.

specs.yaml

specs.yaml lives in spec/<block>/ and defines the functional specification for one or more design blocks. It is consumed by the rb spec traceability commands and has no effect on simulation.

Required keys:

  • rtl-buddy-filetype: spec_config
  • blocks

Example:

rtl-buddy-filetype: spec_config

blocks:
- name: "my_design"
desc: "Brief description of the block"
docs:
- "README.md"
- "behavior.md"
coverage-items:
- id: "MY-COV-01"
desc: "Normal operation path"
- id: "MY-COV-02"
desc: "Error handling and recovery"

Block field reference:

FieldTypeDescription
namestringBlock identifier; matched against ModelConfig.name when resolving spec: links in models.yaml. For single-block files the name is matched unconditionally.
descstringHuman-readable block description
docslist of stringsPaths to markdown spec documents, relative to this specs.yaml file
coverage-itemslistFunctional coverage items for this block

Coverage item fields:

FieldTypeDescription
idstringUnique coverage item identifier, referenced by covers in tests.yaml
descstringHuman-readable description of what must be tested

See Spec Traceability for the end-to-end workflow.


Authoring checklist for new suites

  1. Add or verify the model entry in models.yaml.

  2. Add a testbench entry and verify the filelist paths resolve correctly.

  3. Add at least one test entry with model, model_path, and testbench.

  4. Set reglvl policy: 0 for must-run sanity tests, larger values for extended tests.

  5. Add the suite path to regression.yaml.

  6. Run a smoke pass:

    rtl-buddy --machine test <name> -c <suite>/tests.yaml
    rtl-buddy --machine regression -c <regression.yaml> -s 0 -l 0