gf

SkillMedia

Primary 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.

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.md exists 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-planner FIRST
  • 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:

SourceDelimiterRequired 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:

  1. Locate block — scan agent/skill output for the opening delimiter (---GATEFLOW-RESULT--- or ---GATEFLOW-RETURN---)
  2. Extract STATUS — read the STATUS: line; valid values are PASS, FAIL, ERROR (skills) or complete, needs_clarification (agents)
  3. Handle missing block — if no delimiter found in output, treat as STATUS: ERROR with DETAILS: No structured result block returned
  4. Handle unrecognized STATUS — if STATUS value is not in the expected set, treat as STATUS: ERROR

Decision table — what to do with each STATUS:

STATUSSourceAction
PASSgf-lintProceed to simulation (or done if sim already passed)
PASSgf-simReport success, done
FAILgf-lintSpawn sv-refactor with DETAILS + full lint output
FAILgf-simSpawn sv-debug with DETAILS + simulation output
ERRORany skillReport to user via AskUserQuestion — do NOT retry blindly
completeany agentProceed to next phase (verify files exist first)
needs_clarificationany agentForward question to user via AskUserQuestion
missing/unrecognizedanyTreat as ERROR — report to user

Verification Gate

After every agent or skill return, run this mandatory checkpoint before proceeding:

After PhaseGate ConditionIf Gate Fails
sv-plannerGATEFLOW-RETURN with STATUS: complete and plan text presentRe-spawn sv-planner with clarified requirements
sv-orchestratorGATEFLOW-RETURN with STATUS: complete and FILES_CREATED list non-emptyRe-spawn sv-orchestrator
sv-codegenFiles listed in FILES_CREATED exist on disk (ls check)Re-spawn sv-codegen for missing files only
sv-refactorMUST re-run lint — never assume fix workedIf lint still FAIL, increment retry counter and re-spawn sv-refactor with previous + new errors
sv-debugGATEFLOW-RETURN with STATUS: complete and SUMMARY contains fix descriptionIf needs_clarification, forward to user
gf-lintGATEFLOW-RESULT block present with valid STATUSIf missing, re-run lint once; if still missing, report ERROR
gf-simGATEFLOW-RESULT block present with valid STATUSIf 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 failureSTOP. 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.sv is separate from sim: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

AgentSpawn WhenContext to Provide
sv-plannerFIRST for any creation taskUser requirements, constraints
sv-orchestratorDEFAULT build engine for all creation tasksPlan output, component list, constraints
sv-codegenComponent-level generation (invoked by sv-orchestrator or single-threaded mode)Component spec, interfaces
sv-testbenchCreating testbench, stimulusDUT file, ports, test scenarios
sv-debugANY simulation failureError message, failing test, code
sv-verificationAdding assertions, coverageModule, properties to check
sv-understandingExplaining code, architectureFile paths, specific questions
sv-refactorANY code fix neededLint output, code to fix
sv-developerComplex multi-file changesFull context, multiple files
sv-formalFormal verification requestedModule, properties to prove
sv-synthSynthesis or resource estimationModule, target FPGA
sv-pinmapPin assignment or constraint fileBoard, RTL ports
sv-ip-scannerScan for missing IP or CDC issuesProject path
vhdl-codegenVHDL module creationRequirements, VHDL-2008
vhdl-testbenchVHDL testbench creationDUT file, test scenarios
pcb-designerKiCad schematic/PCB designBoard 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:

  1. WHAT: One sentence, plain English — no tool names or jargon
  2. WHY: Context with specific line numbers and signal names
  3. 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

CodeWHATFIX
WIDTHTRUNCValue truncated (target narrower)Explicit slice: target = source[7:0]
WIDTHEXPANDValue zero-extended (target wider)Explicit concat: {8'b0, source}
MULTIDRIVENSignal driven from multiple always blocksSingle always block or CDC sync
COMBDLYNon-blocking <= in combinational blockUse = in always_comb
INITIALDLYDelayed assign in initial blockUse = not <=
ENUMVALUEEnum assigned wrong typeCast: state = state_t'(value)
VARHIDDENInner variable shadows outer scopeRename inner variable
SYNCASYNCNETSignal used as both sync and async resetUse consistently as one type
ALWCOMBORDERVariable read before assigned in always_combMove assignment above first use
TIMESCALEMODModule missing timescaleAdd `timescale 1ns/1ps
MODDUPModule defined more than onceRemove duplicate
PINNOCONNECTInstance port not connectedConnect or .port()
ASSIGNINWriting to input portChange to output
BLKANDNBLKMixed blocking/non-blocking on same signal<= in always_ff, = in always_comb
CASEOVERLAPTwo case items match same valueRemove duplicate

Yosys Patterns

PatternWHATFIX
Failed to evaluate $clog2Argument not compile-time constantUse localparam
generate for-loop not constantLoop bound not constantUse parameter/literal
System task outside initial$display outside initialWrap in `ifdef SIMULATION
Identifier not foundMissing source fileAdd to synthesis script
Combinational loopCircular dependencyInsert flip-flop to break loop

Verification Commands

Lint Check

Invoke skill: gf-lint

Use Skill tool:
  skill: "gf-lint"
  args: "<files or empty>"
STATUSAction
PASSProceed to next step
FAILSpawn sv-refactor with error context
ERRORReport issue to user

Compile + Simulate

Invoke skill: gf-sim

Use Skill tool:
  skill: "gf-sim"
  args: "<files or empty>"
STATUSAction
PASSReport success, done
FAILSpawn sv-debug - NEVER fix directly
ERRORReport 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