From oh-my-fpga
Drive a Xilinx FPGA design end-to-end through the complete build flow: RTL -> simulation -> synthesis -> implementation -> bitstream, with a verification gate after every stage so a downstream stage never runs on an upstream stage that silently regressed. Invoke this skill when the user says "rtl to bitstream", "end to end", "full flow", "run everything", "build the whole thing", "take this design all the way to a .bit", "complete build", or asks to drive a project from source files to a programmed/exportable bitstream in one orchestrated pass. Requires the SynthPilot MCP server connected to an open Vivado session with the Tcl server (tcl_server.tcl on TCP:9999) running. This is the ORCHESTRATION playbook: it sequences the real flow tools, gates each stage on fresh tool evidence, stops on the first real failure, and hands off to the specialist skills (timing-closure, cdc-analysis, lint, simulation-debug) instead of trying to fix violations itself.
How this skill is triggered — by the user, by Claude, or both
Slash command
/oh-my-fpga:full-flow-demoThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are orchestrating a complete FPGA build. Your job is **sequencing and
You are orchestrating a complete FPGA build. Your job is sequencing and gating, not problem-solving. You run each stage, then prove with a fresh tool report that the stage actually passed before unlocking the next stage. The flow is a pipeline of gates: a green stage opens the next gate; a red stage stops the flow and hands the specific failure to the right specialist skill.
The single most important rule: a bitstream is not "done" because
generate_bitstream returned. The implemented design must pass post-route
signoff — setup AND hold timing met, DRC clean, route status fully routed,
methodology clean — and that signoff must run on the open implemented design
before you write the bitstream. Synthesis numbers are necessary but never
sufficient.
.bit (or
.xsa / .mcs) in one orchestrated pass: "rtl to bitstream", "full flow",
"run everything", "end to end".run_full_flow call.bd_validate_design -> bd_generate_output_and_wrapper ->
set_top_module <wrapper>), then return here for synth -> bitstream.run_full_flow as a fast path, but you must still run
the post-route signoff gate (Stage 5) before claiming success. Never skip
that gate.Run these before touching the flow. Do not assume; confirm with tool output.
test_connection. If it fails, stop and
tell the user to open Vivado and start tcl_server.tcl (TCP:9999). Nothing
below works without this.get_project_info. Confirm
project name, part number, and current top module are what the user
expects. If no project is open: open_project (existing) or create_project
add_source_file / add_constraint_file (new).get_project_info; fix with
set_top_module if wrong. A wrong top silently synthesizes the wrong thing.list_source_files,
list_constraint_files. A flow with zero constraint files will "pass"
timing vacuously (no clocks defined) — treat "0 constraints" as a hard
stop, not a pass. If compile order is suspect, check_compile_order.get_license_status. Async runs,
advanced reports, and some IP/BD tools are PRO/MAX. If FREE, fall back to the
synchronous basic path and tell the user which gates you cannot run.Record the baseline: part, top, clock constraints present (get_all_clocks
after a design is open), and intended target frequency. You will measure the
final result against this.
Run stages in order. After each stage, the gate must pass on fresh tool output or you STOP and route to the specialist. One stage at a time so cause -> effect stays attributable.
Stage ordering is signoff-before-bitstream. The post-route signoff gate
(Stage 5) runs on the open implemented design and proves setup/hold timing,
routing, DRC, and methodology are all clean before generate_bitstream is
ever called (Stage 6). You never write a bitstream on an unverified implemented
design. After the bitstream is written, a short re-confirmation read (Stage 6's
gate) checks the write itself and that signoff still holds.
Fast path note:
run_full_flowruns synthesis -> implementation -> bitstream in one call with per-stage timing and early-stop-on-failure. It is acceptable when the user wants speed AND the design has already passed lint/sim. It does not replace the post-route signoff gate. Becauserun_full_flowwrites the bitstream inside the same call, if you use it you must immediatelyopen_implemented_designand run the full Stage 5 signoff evidence gate afterward; only a green Stage 5 result licenses a PASS verdict.
Catch dumb errors before burning minutes on synthesis.
check_syntax (or check_syntax_file per file) — must be clean.run_quick_lint for a fast structural pass; escalate to run_full_lint_check
if the user wants thoroughness. Triage with get_lint_violations.check_latches (unintended latches),
check_async_reset, check_fsm, check_port_width_mismatch,
check_unconnected_ports, check_black_box.GATE 0: No syntax errors. No error-severity lint/structural findings (unintended latch, width mismatch, missing module / black box, broken compile order). Warnings may pass with a noted assumption.
waive_lint_violation
or disable_lint_rule to make the count go green — see Safety rails.Synthesizing functionally-broken RTL wastes an hour. Simulate first when a testbench exists.
list_simulation_files; set the sim top with
set_simulation_top if needed.sim_compile (pass top_module). On failure read
sim_get_compile_log.sim_run_async, then poll
sim_get_sim_status until COMPLETED (or sim_stop to abort). Short sims:
sim_run.sim_get_report. Inspect waveforms/values via
sim_list_signals + sim_probe if the pass/fail is ambiguous.GATE 1: Testbench reports PASS (self-checking TB, expected $finish, no
assertion/$error/mismatch). If there is no testbench, state that explicitly
as a risk ("proceeding to synthesis without functional verification") and ask the
user whether to continue.
Clock-domain-crossing bugs do not show up in timing or DRC and survive to silicon.
check_cdc_lint as an early RTL-level pass. A fuller report_cdc needs an
elaborated/synthesized design and is run again — and gated — in Stage 3.GATE 2: No critical (unsynchronized / glitch-prone) CDC findings at the RTL level.
set_false_path across a crossing to silence it unless you can state the
assumption that it is genuinely async-safe and the user agrees — silencing a
real CDC is a fake-pass.set_synthesis_strategy — default is fine for
a first pass; smallest change first.run_synthesis_async, poll get_run_status
until the synth run STATUS shows complete (watch PROGRESS reach 100%). Short:
run_synthesis.open_synthesized_design.get_synthesis_report, get_synthesis_warnings,
check_synthesis_issues (needs the design open). Confirm clocks exist:
get_all_clocks. Sanity-check report_utilization (a synth util that already
exceeds 100% of any resource means impl cannot succeed — stop early).report_cdc now that there is a real netlist — synthesis can
introduce or expose crossings the RTL-level check_cdc_lint did not see.GATE 3: All of the following on fresh output:
get_all_clocks non-empty).report_utilization under 100% on every
resource).report_cdc shows no critical / unsafe
(unsynchronized, glitch-prone, fan-out) crossings. A crossing introduced or
revealed by synthesis is a STOP, not a warning to skip.Post-synth timing is indicative only — do not claim "timing met" here.
set_implementation_strategy (e.g., a Performance/Explore strategy)
only if a first default pass missed timing — smallest change first, so do the
default first.run_implementation_async, poll
get_run_status until impl_1 STATUS shows route_design Complete. Short
designs: run_implementation.open_implemented_design so the Stage 5 signoff reports read the routed design.GATE 4: Impl run COMPLETE (route_design did not error or abort).
get_implementation_warnings
and report_congestion; route placement/congestion/timing-driven-routing
failures to the timing-closure skill (it owns strategy/floorplan/RTL
remediation). Do not blindly bump strategies in a loop.This gate must pass on the open implemented design BEFORE any bitstream is
written. A failure here means the design is not signoff-clean; writing a
bitstream is pointless (and generate_bitstream would re-run DRC and refuse
anyway). Run on the open implemented design (open_implemented_design) with
fresh reports:
extract_timing_metrics (WNS/TNS/WHS/THS, failing endpoints) — you
need both setup (WNS/TNS) and hold (WHS/THS) numbers across all clock
groups. check_timing to confirm there are no unconstrained paths or
missing-clock issues hiding the real picture.report_route_status — design must be 100% routed, zero
unrouted nets.report_drc — zero error/critical violations. (DRC must be clean
here, before the bitstream, because generate_bitstream reruns DRC and will
refuse to write on errors.)report_methodology — no critical methodology warnings
(these flag CDC/timing-exception abuse the other reports miss).report_power for a thermal/budget sanity number.GATE 5 (signoff): ALL of the following must be true simultaneously on fresh post-route output, or you STOP:
Only when every one of these is green on fresh output may you proceed to write the bitstream.
extract_timing_metrics / analyze_critical_paths evidence.
Do not set_false_path / set_multicycle_path to clear a real violation.Reach this stage only after Stage 5's signoff gate is fully green. The design is already proven signoff-clean; this stage writes the artifact and re-confirms nothing regressed in the write.
generate_bitstream (synchronous; it launches impl_1 -to_step write_bitstream and waits). If you took the run_full_flow fast path, the
bitstream was written inside that call — in which case you ran Stage 5's
signoff gate after the call; treat that signoff result as Stage 5 and this
stage's re-confirmation together.GATE 6 (write + re-confirm):
.bit path is returned.report_route_status (still 100% routed) and report_drc (still 0 errors)
on the open implemented design. (generate_bitstream runs its own DRC; a
successful write plus these reads is the final proof.)Produce what the user actually asked for:
open_hardware_manager -> connect_hardware_server
-> open_hardware_target -> program_device.export_hardware
(include_bitstream=True) -> .xsa.generate_mcs / program_flash / add_flash_configuration.| Failed gate | Likely cause | Smallest safe action | Hand off to |
|---|---|---|---|
| 0 syntax/lint | Typo, latch, width/port mismatch, black box, compile order | Report violations; recommend RTL/file-order fix (do not waive) | lint skill |
| 1 simulation | Functional RTL bug | Report failing TB checks via sim_get_report/sim_probe | simulation-debug skill |
| 2 CDC (RTL) | Unsynchronized async crossing | Report check_cdc_lint findings; recommend synchronizer | cdc-analysis skill |
| 3 synth error | Unsupported construct, missing file/param | get_synthesis_warnings, check_synthesis_issues; recommend RTL fix | synthesis-debug skill |
| 3 CDC (netlist) | Crossing introduced/exposed by synthesis | Report report_cdc findings; recommend synchronizer | cdc-analysis skill |
| 3 util overflow | Design too big for part | Report report_utilization; this is architectural, not a constraint | user (part/arch decision) |
| 3 no clocks | Missing/empty XDC | Add real create_clock_constraint; never proceed with 0 clocks | user / constraints author |
| 4 route fail / congestion | Routing/placement pressure | report_congestion; try ONE stronger impl strategy, else escalate | timing-closure skill |
| 5 timing (WNS or WHS < 0) | Real setup or hold failure | extract_timing_metrics+analyze_critical_paths; constraints/strategy before RTL | timing-closure skill |
| 5 route not 100% | Unrouted nets | report_route_status; congestion/strategy via timing-closure | timing-closure skill |
| 5 DRC | Real rule violation (IO, config, etc.) | Report rule IDs from report_drc; fix root cause | user (confirm before any waiver) |
| 5 methodology | Exception/CDC abuse | Report report_methodology; remove improper exceptions | cdc-analysis / timing-closure |
| 6 bitstream write blocked | DRC regression at write | Report report_drc rule IDs; fix root cause (return to Stage 5) | user (confirm before any waiver) |
for stage in [0:static, 1:sim, 2:cdc, 3:synth, 4:impl, 5:signoff, 6:bitstream+reconfirm]:
run stage
pull FRESH evidence with the gate's tools
if gate PASS:
continue
else:
STOP. Do not advance. Hand the specific evidence to the owner skill.
Note the ordering: signoff (Stage 5) gates the implemented design before the
bitstream is written (Stage 6). You never advance to generate_bitstream
until setup AND hold timing, routing, DRC, and methodology are all green.
Hard STOP conditions (do not advance, do not retry blindly):
get_run_status /
sim_get_sim_status.Do not thrash: at most one safe remediation attempt per stage within this skill (e.g., default impl strategy missed timing -> try one Performance strategy). Beyond that, present options + costs and hand to the specialist. Constraint/strategy changes come before any RTL change, and RTL changes are recommended to the user, never silently applied.
extract_timing_metrics, report_route_status, report_drc,
report_methodology). A returned generate_bitstream or a green
run_full_flow line is not proof of signoff. Synthesis numbers never
prove signoff.generate_bitstream. Never write a
bitstream on an unverified design; never reorder these.set_false_path, set_multicycle_path,
set_max_delay, waive_lint_violation, disable_lint_rule, or
set_clock_groups to make a violation disappear. Exceptions are legal only
when the path is genuinely exempt — state the assumption explicitly, and if
the item could be real (a CDC, an actual long path), ask the user first.read_file/read_file_lines to cite the issue; propose the edit; let the
user (or an explicit instruction) approve update_file/replace_in_file.*_async + get_run_status / sim_get_sim_status,
never a blocking call that risks a timeout mid-build.open_synthesized_design /
open_implemented_design reopen a run for analysis — you do not need (and
must not invent) a separate checkpoint-write tool.Report the flow as a gate table, then a verdict. Show before/after where a remediation was attempted.
=== FULL-FLOW DEMO — <project> @ <part>, top=<top> ===
Prereqs: connection OK | project OK | top OK | constraints=<N clocks> | tier=<...>
Stage gates (fresh evidence):
[PASS] 0 Static syntax clean; lint: 0 err / <w> warn
[PASS] 1 Sim TB PASS (<runtime>, self-checking)
[PASS] 2 CDC (RTL) 0 critical crossings (check_cdc_lint)
[PASS] 3 Synth COMPLETE; clocks=<list>; util fits (LUT x%/FF y%); report_cdc 0 critical
[PASS] 4 Impl route_design COMPLETE
[PASS] 5 SIGNOFF WNS=<+ns> AND WHS=<+ns> (all clocks) | 100% routed | DRC 0 err | methodology clean
[PASS] 6 Bitstream written -> <path/to.bit>; re-confirm: 100% routed, DRC 0 err
Artifacts: <.bit> [, <.xsa> / <.mcs> / programmed device]
VERDICT: PASS — signoff gate (Stage 5) met on fresh post-route evidence; bitstream written and re-confirmed.
(or) STOPPED at Stage <n>: <one-line failure> -> handed to <skill> with <evidence>.
Rules for the report:
[PASS] must cite the tool that proved it; an unproven stage is
[UNVERIFIED], never [PASS].extract_timing_metrics + report_route_status + report_drc +
report_methodology output, and Gate 6 confirms the bitstream was written
with signoff still holding. Otherwise report exactly which gate stopped the
flow and which specialist skill now owns it.npx claudepluginhub lnc0831/oh-my-fpga --plugin oh-my-fpgaGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.