GF-Formal -- Formal Verification Skill
SkillDev toolsFormal verification from natural language. Generates SVA properties, configures SymbiYosys, runs proofs, and explains results. Example: "formally verify the FIFO never overflows"
Available today. Use it from your connected AI after setup.
No other account needed.
Connect ahel once, and every AI you use reads what you have installed.
Then ask your AI: use the GF-Formal -- Formal Verification Skill skill
What this skill tells your AI
The instructions your AI receives, as published by codejunkie99/gateflow-plugin in skills/gf-formal/SKILL.md and read by ahel’s review.
Tool Detection
which sby
If not found:
---GATEFLOW-RESULT---
STATUS: ERROR
DETAILS: SymbiYosys not installed. Install to enable formal verification.
pip install symbiyosys
Also need: yosys, z3 (or yices2)
macOS: brew install yosys z3
Linux: sudo apt install yosys z3
---END-GATEFLOW-RESULT---
Workflow
- Parse request -- What properties to verify? Which module?
- Read the design -- Understand ports, signals, behavior
- Spawn sv-formal agent -- Generate properties + .sby config
- Run SymbiYosys:
sby -f <config>.sby - Parse results -- Read sby output for pass/fail/counterexample
- Report -- 3-layer error translation if failed, clear summary if passed
Result Format
---GATEFLOW-RESULT---
STATUS: PASS | FAIL | ERROR
PROOFS: N proved, M failed, K covers
FILES: [generated files]
DETAILS: [proof results or counterexample explanation]
---END-GATEFLOW-RESULT---
Integration with /gf Orchestrator
Formal verification is an optional enhancement step:
- After simulation passes, for safety-critical designs
- When user explicitly requests formal verification
- For CDC, FIFO, or protocol designs
.sby Configuration Templates
BMC Template
[tasks]
bmc
[options]
mode bmc
depth 20
expect pass
[engines]
smtbmc z3
[script]
read -formal design.sv
prep -top top_module
[files]
design.sv
Prove Template
[tasks]
prove
[options]
mode prove
depth 40
expect pass
[engines]
smtbmc z3
abc pdr
[script]
read -formal design.sv
prep -top top_module
[files]
design.sv
Cover Template
[tasks]
cover
[options]
mode cover
depth 30
expect pass
[engines]
smtbmc z3
[script]
read -formal design.sv
prep -top top_module
[files]
design.sv
Multi-Task (BMC + Prove + Cover)
[tasks]
bmc
prove
cover
[options]
bmc: mode bmc
bmc: depth 20
prove: mode prove
prove: depth 40
cover: mode cover
cover: depth 30
expect pass
[engines]
bmc: smtbmc z3
prove: smtbmc z3
prove: abc pdr
cover: smtbmc z3
[script]
read -formal design.sv
prep -top top_module
[files]
design.sv
.sby Options
| Option | Modes | Description |
|---|---|---|
mode | all | bmc, prove, cover, or live |
depth | bmc, cover | Cycles to check (default 20) |
timeout | all | Timeout in seconds |
multiclock | all | Multiple clocks / async |
expect | all | Expected: pass, fail, unknown |
SVA Property Patterns
No Overflow
a_no_overflow: assert property (
@(posedge clk) disable iff (rst) full |-> !wr_en);
No Underflow
a_no_underflow: assert property (
@(posedge clk) disable iff (rst) empty |-> !rd_en);
Valid/Ready Handshake
a_valid_stable: assert property (
@(posedge clk) disable iff (rst) (valid && !ready) |=> valid);
a_data_stable: assert property (
@(posedge clk) disable iff (rst) (valid && !ready) |=> $stable(data));
One-Hot
a_onehot: assert property (
@(posedge clk) disable iff (rst) $onehot(state));
Liveness
a_req_granted: assert property (
@(posedge clk) disable iff (rst) req |-> ##[1:MAX_LATENCY] grant);
Reset Behavior
a_reset: assert property (
@(posedge clk) rst |-> (data_out == '0) && (count == '0));
FIFO Count
a_count_inc: assert property (
@(posedge clk) disable iff (rst)
(wr_en && !rd_en && !full) |=> (count == $past(count) + 1));
Proof Strategy
| Property Type | Approach | Engine |
|---|---|---|
| Simple bounds | BMC then prove | smtbmc z3 |
| Protocol compliance | BMC + prove | smtbmc z3, abc pdr |
| FSM correctness | Prove | abc pdr |
| Liveness | Live mode | aiger suprove |
| Complex arithmetic | BMC | smtbmc bitwuzla |
Engines
| Engine | Modes | Strengths |
|---|---|---|
smtbmc | bmc, prove, cover | Readable traces, k-induction |
abc pdr | prove | Unbounded proofs, auto-invariants |
abc bmc3 | bmc | Fast bit-level checking |
aiger suprove | prove, live | Liveness verification |
SMT Solvers
| Solver | Best For |
|---|---|
z3 | Good default |
yices | Fast bit-vectors |
bitwuzla | Complex arithmetic |
boolector | Hardware-specialized |
Counterexample Interpretation
| Failure | Trace Location |
|---|---|
| BMC | <task>/engine_0/trace.vcd |
| Induction | <task>/engine_0/trace_induct.vcd |
| Cover | <task>/engine_0/trace<N>.vcd |
Debugging
- BMC fails: counterexample is reachable, fix design
- Prove fails but BMC passes: unreachable induction state, add invariants or use
abc pdr - Cover fails: over-constrained, relax assumptions
| Pattern | Fix |
|---|---|
| Missing initial value | Add reset logic |
| Unconstrained input | Add assume properties |
| Unreachable induction | Strengthen invariants or use abc pdr |
Formal Extensions
| Directive | Purpose |
|---|---|
assert(expr) | Must always be true |
assume(expr) | Constrain solver inputs |
cover(expr) | Reachability target |
| Attribute | Behavior |
|---|---|
(* anyconst *) | Solver picks constant |
(* anyseq *) | Solver picks per-cycle |
`ifdef FORMAL
initial assume(rst);
always @(posedge clk) begin
a_example: assert(count <= MAX);
c_reach: cover(count == MAX);
end
`endif
Signals
- GitHub stars
- 112
- Forks
- 14
- Last commit
- May 2026
Advanced
- Catalog kind
- skill
- Gateway key
gf-formal- Source
- github.com/codejunkie99/gateflow-plugin