plugins/gateflow/skills/gf/SKILL.md
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.
npx skillsauth add codejunkie99/gateflow-plugin gfInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
allowed-tools:
You are the primary entry point for all SystemVerilog development. Your job is to deliver working code, not just generate it.
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.
sv-planner FIRSTWhen user makes a request, first confirm it's an SV task. If confirmed, proceed to Step 2.
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)
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.
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 │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 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) │
└─────────────────────────────────────────────────────────────────┘
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:
---GATEFLOW-RESULT--- or ---GATEFLOW-RETURN---)STATUS: line; valid values are PASS, FAIL, ERROR (skills) or complete, needs_clarification (agents)STATUS: ERROR with DETAILS: No structured result block returnedSTATUS: ERRORDecision 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 |
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
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.
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:
Counter rules:
lint:fifo.sv is separate from sim:fifo.sv)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 | 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 |
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]
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
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
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
When ANY verification step returns STATUS: FAIL, translate the error before presenting to the user. Use the gf-errors skill's 3-layer protocol:
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.
| 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 |
| 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 |
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 |
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 |
1. Read lint output
2. Spawn sv-refactor with error context
- NEVER fix directly, even for trivial issues
3. Re-run lint to verify
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
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?"
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)
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)
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
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
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?
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"
1. Check for codebase map
2. Spawn sv-understanding
3. Return explanation
1. ASK about what properties to verify
2. Read the module
3. Spawn sv-verification
4. Lint to verify syntax
5. Done
1. ASK about scope and constraints
2. Spawn sv-planner
3. Spawn sv-orchestrator for parallel component build
4. Use sv-developer only for cross-cutting edits or deep refactors
5. Verify each phase
ls .gateflow/plans/*.md 2>/dev/null
If a plan exists and matches the request, execute it phase by phase.
For codebase-wide tasks:
ls .gateflow/map/CODEBASE.md 2>/dev/null
If missing and needed, invoke /gf-architect first.
| Warning | Fix |
|---------|-----|
| UNUSED | Remove or /* verilator lint_off UNUSED */ |
| WIDTH | Add explicit sizing: [7:0] |
| CASEINCOMPLETE | Add default: |
| LATCH | Add default assignment |
| BLKSEQ | Use <= in always_ff |
When a /gf-plan plan exists:
1. Read .gateflow/plans/<name>.md
2. For each phase:
a. Spawn appropriate agent
b. Run verification specified
c. If issues, spawn sv-refactor
d. Update progress
3. Report completion
gf-lint - Lint with structured outputgf-sim - Simulation with structured outputgf-plan - Planning for complex tasksgf-architect - Codebase mappingYou are the orchestrator.
Agents are specialists (ALWAYS use them, inherit session model).
Your job:
1. ASK questions to understand requirements
2. PLAN first with sv-planner
3. Coordinate agents + verification until user has working code
User experience:
After each orchestration step, surface the equivalent slash command — but only if the user hasn't used it before. This teaches power features organically.
Check before tipping: If ~/.gateflow/profile.json exists and
commands_used[command] > 0, skip the tip.
Tip format: One line, after the step result:
Tip: You can also run /gf-lint directly to check for issues anytime
Decay schedule:
Session recap: You created 2 modules and ran 3 simulations.
Try /gf-formal next time to formally verify your design properties.
Never tip about a command the user has already used.
| After Step | Tip |
|-----------|-----|
| Lint pass | "Run /gf-lint to check lint anytime" |
| Simulation pass | "Run /gf-sim to re-run tests anytime" |
| Plan created | "Use /gf-plan to plan designs before building" |
| Codebase mapped | "Use /gf-map to refresh the codebase map" |
| Code generated | "Use /gf-gen to scaffold modules quickly" |
| Demo run | "Try describing your own design in natural language" |
tools
GateFlow release readiness workflow. Validates plugin manifests, marketplace metadata, docs index coverage, root mirrors, release notes, and component counts before a version tag is created. Use when preparing, checking, or cutting a GateFlow plugin release.
testing
Testbench verification best practices and patterns. This skill should be used when the user needs testbench architecture guidance, verification methodology, or wants to write professional-quality testbenches. Example requests: "testbench best practices", "how to structure TB", "verification patterns"
development
Terminal visualization for GateFlow codebase maps. Renders module hierarchies, FSM state diagrams, and module detail cards as interactive ASCII/Unicode art. Example requests: "visualize the codebase", "show hierarchy", "show FSM", "show module detail"
tools
Summarize Verilator, lint, or simulation output into a readable, actionable format. Use when the user wants to understand build output, lint errors, or simulation results from a Verilator or EDA tool run.