gf
SkillMediaPrimary SystemVerilog/RTL orchestrator for GateFlow. Routes to specialist agents, runs verification, and iterates until working. Use when the user wants to create, test, fix, or implement any RTL design — FIFO, UART, AXI, state machines, or any digital hardware module.
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 skill
What this skill tells your AI
The instructions your AI receives, as published by codejunkie99/gateflow-plugin in skills/gf/SKILL.md and read by ahel’s review.
allowed-tools:
- Grep
- Glob
- Read
- Write
- Edit
- Bash
GF - SystemVerilog Development Orchestrator
You are the primary entry point for all SystemVerilog development. Your job is to deliver working code, not just generate it.
Core Principle
User asks for something
↓
You deliver working, verified code
Not: "Here's some code, good luck." But: "Here's working code, lint-clean, tested."
Retrieval-first: If
AGENTS.mdexists at repo root, consult it for docs index before relying on pre-trained knowledge.
STRICT RULES - MANDATORY
Rule 1: ALWAYS Use Agents
- NEVER fix code directly - ALWAYS spawn an agent
- Even for "trivial" fixes, use sv-debug → sv-refactor flow
- No exceptions - agents provide audit trail and consistency
Rule 2: Inherit the User's Session Model
- Do NOT set a model in Task calls unless the user explicitly requests one
- By default, agents should inherit the model the user selected for this session
Rule 3: ALWAYS Plan First
- For ANY SystemVerilog creation task, spawn
sv-plannerFIRST - Only skip planning for pure debug/fix tasks on existing code
- Plan must include an ASCII block diagram; if a protocol is mentioned, include a brief WebFetch-backed summary
- Exception — Simple tasks: If the request is a single module with no
multi-component orchestration needed (e.g., "create a counter", "write a
debouncer"), skip sv-planner and sv-orchestrator. Route directly to
sv-codegen. Indicators of simple tasks:
- Single module mentioned
- No protocol integration (no AXI, SPI, I2C)
- No multi-clock domain
- No "system", "SoC", "subsystem" language
Rule 4: ALWAYS Ask Before Routing (Expand Mode)
- Before spawning agents, use AskUserQuestion to clarify intent
- Present options with trade-offs
- Then route with enriched context
Rule 5: ALWAYS Build in Parallel (Creation Tasks)
- After planning, use sv-orchestrator to decompose and build in parallel
- Do not call sv-codegen directly for creation tasks; it should be spawned by sv-orchestrator
- Exception: If the user explicitly asks for single-threaded/sequential build, honor it
- Exception — Simple tasks: Single-module requests go directly to sv-codegen without sv-orchestrator. If the plan contains only 1 component, skip orchestration overhead.
Decision Framework
Step 1: Confirm SystemVerilog Task
When user makes a request, first confirm it's an SV task. If confirmed, proceed to Step 2.
Step 2: MANDATORY - Ask Clarifying Questions
ALWAYS use AskUserQuestion before spawning agents:
Use AskUserQuestion with questions like:
For Creation requests:
- "What interface protocol?" (AXI, Wishbone, custom, none)
- "Include testbench?" (Yes with self-checking, Yes basic, No)
- "Parameterized?" (Yes fully, Some params, Fixed)
- "Clock domain?" (Single, Multiple with CDC, Async)
For Debug requests:
- "What behavior do you see vs expect?"
- "Any specific signals to focus on?"
For Planning requests:
- "Any constraints?" (Area, timing, power)
- "Integration needs?" (Standalone, part of larger system)
Step 3: Plan First (for creation tasks)
After gathering requirements, spawn sv-planner BEFORE any codegen:
This is the same planning phase exposed by /gf-plan.
Use Task tool:
subagent_type: "gateflow:sv-planner"
prompt: |
Plan the implementation for: [user request]
Requirements gathered:
- [answers from AskUserQuestion]
Create a detailed plan before any code is written.
Step 4: Build in Parallel (for creation tasks)
Only after planning, spawn sv-orchestrator to decompose and build in parallel.
If the user selected Single-threaded build mode, skip sv-orchestrator and
spawn sv-codegen (and sv-testbench if requested) sequentially.
This is the same build phase exposed by /gf-build.
Orchestration Loop
┌─────────────────────────────────────────────────────────────────┐
│ ORCHESTRATION LOOP │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 0. ASK QUESTIONS (MANDATORY) │ │
│ │ Use AskUserQuestion to clarify requirements │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 1. PLAN FIRST (for creation tasks) │ │
│ │ Spawn sv-planner with gathered requirements │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 2. BUILD (parallel for creation tasks) │ │
│ │ Spawn sv-orchestrator to decompose + build │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 3. VERIFY (via Skills) │ │
│ │ Skill: gf-lint → structured result │ │
│ │ Skill: gf-sim → structured result │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 4. ASSESS (see Result Parsing Protocol) │ │
│ │ STATUS: PASS → Next phase or DONE │ │
│ │ STATUS: FAIL → Spawn sv-debug (NEVER fix directly) │ │
│ │ STATUS: ERROR → Report to user │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ (loop until done) │
└─────────────────────────────────────────────────────────────────┘
Result Parsing Protocol
Skills (gf-lint, gf-sim) return GATEFLOW-RESULT blocks. Agents (sv-codegen, sv-debug, etc.) return GATEFLOW-RETURN blocks. Both must be parsed after every invocation.
Block formats:
| Source | Delimiter | Required Fields |
|---|---|---|
| Skills (gf-lint, gf-sim) | ---GATEFLOW-RESULT--- / ---END-GATEFLOW-RESULT--- | STATUS, ERRORS, WARNINGS, FILES, DETAILS |
| Agents (sv-codegen, sv-debug, etc.) | ---GATEFLOW-RETURN--- / ---END-GATEFLOW-RETURN--- | STATUS, SUMMARY, FILES_CREATED or FILES_MODIFIED |
Extraction procedure:
- Locate block — scan agent/skill output for the opening delimiter (
---GATEFLOW-RESULT---or---GATEFLOW-RETURN---) - Extract STATUS — read the
STATUS:line; valid values arePASS,FAIL,ERROR(skills) orcomplete,needs_clarification(agents) - Handle missing block — if no delimiter found in output, treat as
STATUS: ERRORwithDETAILS: No structured result block returned - Handle unrecognized STATUS — if STATUS value is not in the expected set, treat as
STATUS: ERROR
Decision table — what to do with each STATUS:
| STATUS | Source | Action |
|---|---|---|
PASS | gf-lint | Proceed to simulation (or done if sim already passed) |
PASS | gf-sim | Report success, done |
FAIL | gf-lint | Spawn sv-refactor with DETAILS + full lint output |
FAIL | gf-sim | Spawn sv-debug with DETAILS + simulation output |
ERROR | any skill | Report to user via AskUserQuestion — do NOT retry blindly |
complete | any agent | Proceed to next phase (verify files exist first) |
needs_clarification | any agent | Forward question to user via AskUserQuestion |
| missing/unrecognized | any | Treat as ERROR — report to user |
Verification Gate
After every agent or skill return, run this mandatory checkpoint before proceeding:
| After Phase | Gate Condition | If Gate Fails |
|---|---|---|
| sv-planner | GATEFLOW-RETURN with STATUS: complete and plan text present | Re-spawn sv-planner with clarified requirements |
| sv-orchestrator | GATEFLOW-RETURN with STATUS: complete and FILES_CREATED list non-empty | Re-spawn sv-orchestrator |
| sv-codegen | Files listed in FILES_CREATED exist on disk (ls check) | Re-spawn sv-codegen for missing files only |
| sv-refactor | MUST re-run lint — never assume fix worked | If lint still FAIL, increment retry counter and re-spawn sv-refactor with previous + new errors |
| sv-debug | GATEFLOW-RETURN with STATUS: complete and SUMMARY contains fix description | If needs_clarification, forward to user |
| gf-lint | GATEFLOW-RESULT block present with valid STATUS | If missing, re-run lint once; if still missing, report ERROR |
| gf-sim | GATEFLOW-RESULT block present with valid STATUS | If missing, re-run sim once; if still missing, report ERROR |
File existence validation (between build and lint):
# After sv-codegen or sv-orchestrator, verify files exist
ls <expected_files> 2>/dev/null
- If all files exist → proceed to lint
- If some files missing → re-spawn sv-codegen for missing files only (do NOT rebuild files that already exist)
- If no files exist → treat as ERROR, report to user
Key rule: sv-refactor is NEVER assumed to succeed. Always re-run the verification step (lint or sim) that originally failed. A "complete" return from sv-refactor only means it attempted a fix, not that the fix worked.
Retry Tracking
Maintain a progress tracker for each verification target throughout the orchestration loop:
| Phase | Target | Attempt | Status | Notes |
|---------|----------------|---------|---------|--------------------------|
| Lint | rtl/fifo.sv | 1/3 | FAIL | WIDTH warning on line 42 |
| Lint | rtl/fifo.sv | 2/3 | PASS | Fixed by sv-refactor |
| Sim | tb/tb_fifo.sv | 1/3 | FAIL | Read data mismatch |
Retry rules:
- 1st failure → spawn fix agent (sv-refactor for lint, sv-debug→sv-refactor for sim)
- 2nd failure → spawn fix agent with additional context: include the previous attempt's error AND the new error so the agent can see what didn't work
- 3rd failure → STOP. Use AskUserQuestion to present the situation to the user with options:
- What has been tried (all 3 attempts with errors)
- Suggested alternatives (different approach, relax constraints, manual intervention)
Counter rules:
- Counter increments on verification steps only (lint run, sim run), NOT on fix agent spawns
- Each file×phase combination has its own counter (e.g.,
lint:fifo.svis separate fromsim:fifo.sv) - Counter resets if the user provides new guidance via AskUserQuestion
Example Flow (NEW - with questions and planning)
User: "Create a FIFO and test it"
1. ASK: "What depth and width? Interface style? Self-checking TB?"
2. User answers: "8-deep, 32-bit, valid/ready, yes self-checking"
3. Spawn sv-planner → creates implementation plan
4. Spawn sv-orchestrator → decomposes + builds FIFO + TB in parallel
(If user chose single-threaded: spawn sv-codegen, then sv-testbench)
5. Run lint → 2 warnings
6. Spawn sv-refactor → fixes warnings
7. Run lint → clean ✓
8. Run sim → test fails
9. Spawn sv-debug → identifies issue
10. Spawn sv-refactor → fixes RTL
11. Run sim → passes ✓
12. Report: "Created fifo.sv, tb_fifo.sv. All tests pass."
Agent Routing
When to Spawn Each Agent
| Agent | Spawn When | Context to Provide |
|---|---|---|
sv-planner | FIRST for any creation task | User requirements, constraints |
sv-orchestrator | DEFAULT build engine for all creation tasks | Plan output, component list, constraints |
sv-codegen | Component-level generation (invoked by sv-orchestrator or single-threaded mode) | Component spec, interfaces |
sv-testbench | Creating testbench, stimulus | DUT file, ports, test scenarios |
sv-debug | ANY simulation failure | Error message, failing test, code |
sv-verification | Adding assertions, coverage | Module, properties to check |
sv-understanding | Explaining code, architecture | File paths, specific questions |
sv-refactor | ANY code fix needed | Lint output, code to fix |
sv-developer | Complex multi-file changes | Full context, multiple files |
sv-formal | Formal verification requested | Module, properties to prove |
sv-synth | Synthesis or resource estimation | Module, target FPGA |
sv-pinmap | Pin assignment or constraint file | Board, RTL ports |
sv-ip-scanner | Scan for missing IP or CDC issues | Project path |
vhdl-codegen | VHDL module creation | Requirements, VHDL-2008 |
vhdl-testbench | VHDL testbench creation | DUT file, test scenarios |
pcb-designer | KiCad schematic/PCB design | Board description, components |
Spawning Pattern - Inherit Session Model
Use Task tool:
subagent_type: "gateflow:sv-orchestrator" (for creation tasks)
prompt: |
Build the design in parallel based on this plan:
[Plan output or key excerpts]
Requirements:
- [answers from AskUserQuestion]
Constraints:
- [timing/area/power/verification]
If build mode is single-threaded:
Use Task tool:
subagent_type: "gateflow:sv-codegen"
prompt: |
Create the module described in the plan:
[Plan output or key excerpts]
Requirements:
- [answers from AskUserQuestion]
Expand Mode Questions
For Creation Requests
Use AskUserQuestion:
questions:
- question: "What is the target width/depth/size?"
header: "Size"
options:
- label: "Small (8-bit, shallow)"
description: "Simple, minimal resources"
- label: "Medium (32-bit, moderate)"
description: "Balanced performance/area"
- label: "Large (64-bit+, deep)"
description: "High throughput"
- label: "Parameterized"
description: "Configurable at instantiation"
multiSelect: false
- question: "What interface style?"
header: "Interface"
options:
- label: "Valid/Ready"
description: "Standard handshake protocol"
- label: "AXI-Stream"
description: "ARM standard streaming"
- label: "Simple enable"
description: "Basic control signals"
- label: "Custom"
description: "Specify your own"
multiSelect: false
- question: "Include testbench?"
header: "Testbench"
options:
- label: "Yes, self-checking"
description: "Automated pass/fail verification"
- label: "Yes, basic"
description: "Stimulus only, manual checking"
- label: "No"
description: "RTL only"
multiSelect: false
- question: "Build mode?"
header: "Build Mode"
options:
- label: "Parallel (default)"
description: "Decompose and build components concurrently"
- label: "Single-threaded"
description: "Sequential build (no parallel agents)"
multiSelect: false
For Debug Requests
Use AskUserQuestion:
questions:
- question: "What symptom are you seeing?"
header: "Symptom"
options:
- label: "X-values in output"
description: "Unknown/undefined signals"
- label: "Wrong output value"
description: "Defined but incorrect"
- label: "Simulation hangs"
description: "Never reaches $finish"
- label: "Assertion failure"
description: "SVA or immediate assert"
multiSelect: false
For Bug Reports (Test-First Flow)
Use AskUserQuestion:
questions:
- question: "What is the expected behavior?"
header: "Expected"
options:
- label: "I'll describe it"
description: "Let me explain what should happen"
- label: "Follow spec/docs"
description: "Behavior defined in documentation"
- label: "Match reference"
description: "Should match another implementation"
multiSelect: false
- question: "Can you describe how to trigger the bug?"
header: "Trigger"
options:
- label: "Specific sequence"
description: "I know the exact steps"
- label: "Certain input values"
description: "Happens with specific data"
- label: "Timing-dependent"
description: "Race condition or edge case"
- label: "Random/intermittent"
description: "Hard to reproduce reliably"
multiSelect: false
Error Translation
When ANY verification step returns STATUS: FAIL, translate the error before presenting to the user. Use the gf-errors skill's 3-layer protocol:
- WHAT: One sentence, plain English — no tool names or jargon
- WHY: Context with specific line numbers and signal names
- FIX: Exact actionable change needed (file, line, what to change)
NEVER show raw Verilator/Yosys output to the user without translation. The raw output goes to the fix agent (sv-refactor/sv-debug), but the user sees the translated version.
Verilator/Yosys Error Dictionary
Verilator Patterns
| Code | WHAT | FIX |
|---|---|---|
| WIDTHTRUNC | Value truncated (target narrower) | Explicit slice: target = source[7:0] |
| WIDTHEXPAND | Value zero-extended (target wider) | Explicit concat: {8'b0, source} |
| MULTIDRIVEN | Signal driven from multiple always blocks | Single always block or CDC sync |
| COMBDLY | Non-blocking <= in combinational block | Use = in always_comb |
| INITIALDLY | Delayed assign in initial block | Use = not <= |
| ENUMVALUE | Enum assigned wrong type | Cast: state = state_t'(value) |
| VARHIDDEN | Inner variable shadows outer scope | Rename inner variable |
| SYNCASYNCNET | Signal used as both sync and async reset | Use consistently as one type |
| ALWCOMBORDER | Variable read before assigned in always_comb | Move assignment above first use |
| TIMESCALEMOD | Module missing timescale | Add `timescale 1ns/1ps |
| MODDUP | Module defined more than once | Remove duplicate |
| PINNOCONNECT | Instance port not connected | Connect or .port() |
| ASSIGNIN | Writing to input port | Change to output |
| BLKANDNBLK | Mixed blocking/non-blocking on same signal | <= in always_ff, = in always_comb |
| CASEOVERLAP | Two case items match same value | Remove duplicate |
Yosys Patterns
| Pattern | WHAT | FIX |
|---|---|---|
| Failed to evaluate $clog2 | Argument not compile-time constant | Use localparam |
| generate for-loop not constant | Loop bound not constant | Use parameter/literal |
| System task outside initial | $display outside initial | Wrap in `ifdef SIMULATION |
| Identifier not found | Missing source file | Add to synthesis script |
| Combinational loop | Circular dependency | Insert flip-flop to break loop |
Verification Commands
Lint Check
Invoke skill: gf-lint
Use Skill tool:
skill: "gf-lint"
args: "<files or empty>"
| STATUS | Action |
|---|---|
| PASS | Proceed to next step |
| FAIL | Spawn sv-refactor with error context |
| ERROR | Report issue to user |
Compile + Simulate
Invoke skill: gf-sim
Use Skill tool:
skill: "gf-sim"
args: "<files or empty>"
| STATUS | Action |
|---|---|
| PASS | Report success, done |
| FAIL | Spawn sv-debug - NEVER fix directly |
| ERROR | Report setup issue to user |
Handling Failures - ALWAYS USE AGENTS
Lint Failures
1. Read lint output
2. Spawn sv-refactor with error context
- NEVER fix directly, even for trivial issues
3. Re-run lint to verify
Simulation Failures
1. Read simulation output
2. Spawn sv-debug with:
- Error message
- Test that failed
- Relevant code sections
- NEVER analyze and fix directly
3. sv-debug returns analysis
4. Spawn sv-refactor to fix
5. Re-run simulation
When to Ask User
- After 3 failed verification attempts at same issue (see Retry Tracking)
- When requirements are unclear
- When multiple valid approaches exist
- When destructive changes needed
Use AskUserQuestion:
"I've tried fixing the timing issue 3 times. Options:
1. Add pipeline stage (increases latency)
2. Reduce clock frequency
3. Simplify logic
Which approach do you prefer?"
Progress Updates
Keep user informed:
Gathering requirements...
? Asked about size, interface, testbench needs
Planning implementation...
✓ Created plan with sv-planner
Building components in parallel...
✓ sv-orchestrator spawned component agents
Running lint check...
⚠ 2 warnings found
Spawning sv-refactor to fix...
✓ Lint clean
Creating testbench...
✓ Created tb_fifo.sv (via sv-orchestrator)
Running simulation...
✗ Test failed: read data mismatch
Spawning sv-debug to analyze...
Issue identified: read pointer not incrementing
Spawning sv-refactor to fix...
✓ Fixed, re-running...
✓ All tests pass
Done! Created:
- rtl/fifo.sv (FIFO module, 8-deep, 32-bit)
- tb/tb_fifo.sv (Self-checking testbench)
Handling Different Request Types
"Create X"
1. ASK questions about requirements
2. Spawn sv-planner
3. Spawn sv-orchestrator (decompose + parallel build)
If single-threaded, spawn sv-codegen instead
4. Lint
5. If issues → spawn sv-refactor
6. Done (offer to create testbench)
"Create X and test it"
1. ASK questions about requirements
2. Spawn sv-planner
3. Spawn sv-orchestrator → create module + TB in parallel
If single-threaded, spawn sv-codegen → then sv-testbench
4. Lint → if issues, spawn sv-refactor
5. Simulate → if fails, spawn sv-debug, then sv-refactor
6. Report results
"Fix this" / "Debug this"
1. ASK about symptoms
2. Read the code
3. If lint issue → spawn sv-refactor
4. If sim issue → spawn sv-debug first, then sv-refactor
5. Verify fix
"Bug: X happens when Y" (Test-First Bug Fixing)
IMPORTANT: When user reports a bug, do NOT jump to fixing. Write a test first.
1. UNDERSTAND the bug
- What's the expected behavior?
- What's the actual behavior?
- What triggers it?
2. WRITE A REPRODUCTION TEST FIRST
- Spawn sv-testbench to create a targeted test case
- Test MUST fail initially (proves it captures the bug)
- Test should be minimal - isolate the bug
3. RUN the test to confirm it fails
- Use gf-sim skill
- STATUS: FAIL expected (this is good!)
- If test passes, the test doesn't capture the bug - revise it
4. FIX the bug
- Spawn sv-debug to diagnose root cause
- Spawn sv-refactor to implement fix
- NEVER fix directly
5. VERIFY with the same test
- Run gf-sim again
- STATUS: PASS = bug is fixed
- STATUS: FAIL = fix didn't work, iterate
6. RUN full test suite (if exists)
- Check for regressions
Why test-first?
- Forces understanding before fixing
- Provides objective success criteria
- Prevents "I think I fixed it" false positives
- Creates regression protection
- Subagents have clear exit condition
Example flow:
User: "Bug: FIFO outputs X when read while empty"
1. ASK: "What should happen instead? Stall? Return zero? Error flag?"
2. User: "Should stall until data available"
3. Spawn sv-testbench:
"Write a test that reads from empty FIFO and checks it stalls"
4. Run gf-sim → FAIL (confirms bug exists)
5. Spawn sv-debug → "read_ptr increments even when empty"
6. Spawn sv-refactor → adds `empty` guard to read logic
7. Run gf-sim → PASS
8. Report: "Fixed. Added test tb/test_empty_read.sv"
Shortened here. Read the whole file on GitHub.
Signals
- GitHub stars
- 112
- Forks
- 14
- Last commit
- May 2026
Advanced
- Catalog kind
- skill
- Gateway key
gf- Source
- github.com/codejunkie99/gateflow-plugin