GF Lint Skill

SkillDev tools

SystemVerilog lint checker with structured output for orchestration. Runs Verilator lint, categorizes errors/warnings, explains issues, and returns a parseable result block for /gf orchestration.

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 Lint Skill skill

What this skill tells your AI

The instructions your AI receives, as published by codejunkie99/gateflow-plugin in skills/gf-lint/SKILL.md and read by ahel’s review.

Lint SystemVerilog files with structured output for orchestration.

Tool Detection

Before running lint, check if Verilator is available:

which verilator

If Verilator is not available, check for Verible:

which verible-verilog-lint

If neither is available, return immediately:

---GATEFLOW-RESULT---
STATUS: ERROR
ERRORS: 0
WARNINGS: 0
FILES: []
DETAILS: No lint tool available. Install Verilator (recommended) or Verible.
  macOS: brew install verilator
  Linux: sudo apt install verilator
---END-GATEFLOW-RESULT---

Do NOT attempt to lint without a tool. Return the ERROR status and let the orchestrator handle it.


Instructions

1. Identify Files to Lint

If files specified in args: Use the provided file paths.

If no files specified: Auto-detect SV files:

ls *.sv rtl/*.sv 2>/dev/null | head -20

2. Run Verilator Lint

verilator --lint-only -Wall <files>

3. Parse and Categorize Output

Count issues by category:

  • ERRORS: %Error: lines - must be fixed
  • WARNINGS: %Warning-*: lines - should be reviewed

4. Explain Common Warnings

For each warning type found, explain:

WarningMeaningFix
UNUSEDSignal declared but not usedRemove signal or suppress with /* verilator lint_off UNUSED */
UNDRIVENSignal never assigned a valueAssign the signal or connect it
WIDTHBit width mismatch in operationAdd explicit sizing: [7:0]
CASEINCOMPLETECase statement missing itemsAdd default: branch
LATCHInferred latch from incomplete if/caseAdd default assignment at start of always_comb
BLKSEQBlocking assignment in always_ffUse <= (non-blocking) in sequential blocks
PINCONNECTEMPTYModule port left unconnectedConnect or explicitly mark as .*
IMPLICITImplicit wire declarationDeclare with logic or wire

5. Return Structured Result

ALWAYS end your response with this exact block format:

---GATEFLOW-RESULT---
STATUS: PASS|FAIL|ERROR
ERRORS: <count>
WARNINGS: <count>
FILES: <comma-separated list>
DETAILS: <one-line summary>
---END-GATEFLOW-RESULT---

Status definitions:

  • PASS: No errors, warnings OK (0-N warnings acceptable)
  • FAIL: One or more errors found
  • ERROR: Could not run lint (missing files, tool error)

6. Example Output

Running lint on: rtl/fifo.sv, rtl/uart.sv

$ verilator --lint-only -Wall rtl/fifo.sv rtl/uart.sv

%Warning-UNUSED: rtl/fifo.sv:25: Signal 'debug_flag' is not used
%Warning-WIDTH: rtl/uart.sv:42: Operator ASSIGN expects 8 bits but got 16

## Summary

**Files:** 2 | **Errors:** 0 | **Warnings:** 2

### Warnings Explained

1. **UNUSED** (rtl/fifo.sv:25): `debug_flag` is declared but never read
   - Fix: Remove if unneeded, or suppress with lint pragma

2. **WIDTH** (rtl/uart.sv:42): Assigning 16-bit value to 8-bit signal
   - Fix: Truncate explicitly `data[7:0]` or widen the target

---GATEFLOW-RESULT---
STATUS: PASS
ERRORS: 0
WARNINGS: 2
FILES: rtl/fifo.sv,rtl/uart.sv
DETAILS: Lint passed with 2 warnings
---END-GATEFLOW-RESULT---

7. Error Case Example

$ verilator --lint-only -Wall rtl/broken.sv

%Error: rtl/broken.sv:10: syntax error, unexpected IDENTIFIER

---GATEFLOW-RESULT---
STATUS: FAIL
ERRORS: 1
WARNINGS: 0
FILES: rtl/broken.sv
DETAILS: Syntax error on line 10
---END-GATEFLOW-RESULT---

Usage by /gf Orchestrator

The /gf skill uses this skill internally and parses the result block:

Parse ---GATEFLOW-RESULT--- block:
- STATUS: PASS -> proceed to next step
- STATUS: FAIL -> spawn sv-refactor agent with error context
- STATUS: ERROR -> report issue to user

Verilator v5 New Warnings

Lint Warnings (enabled by -Wall)

CodeDescription
ASSIGNEQEXPR= used inside expression (may mean ==)
ALWNEVERalways @* has empty event list
ALWCOMBORDERVariable set after use in always_comb
IMPLICITSTATICTask/function variable implicitly static
WIDTHEXPANDValue is zero-expanded
WIDTHTRUNCValue is truncated
ENUMVALUEEnum assigned incompatible type
CASEOVERLAPCase values overlap
CASTCONST$cast always succeeds or fails
CMPCONSTComparison always yields constant
MISINDENTMisleading indentation
MULTIDRIVENSignal driven by multiple always blocks
SYNCASYNCNETSignal mixed sync/async resets
INFINITELOOPLoop condition always true
SELRANGESelection index out of bounds

Style Warnings (enabled by -Wall)

CodeDescription
ASCRANGEPacked vector with ascending range [0:7]
DECLFILENAMEModule name doesn't match filename
DEFPARAMDeprecated defparam
GENUNNAMEDGenerate block unnamed
IMPORTSTARimport pkg::* in $unit scope

v5 Behavior Changes

  • WIDTH is now a meta-category: disabling WIDTH disables WIDTHEXPAND + WIDTHTRUNC
  • --assert enabled by default since v5.038
  • --lint-only now implies --timing

Warning Suppression

Inline Pragma

/* verilator lint_off WIDTH */
assign narrow = wide;
/* verilator lint_on WIDTH */

Control File

lint_off -rule WIDTH -file "*.sv" -match "Operator ASSIGN*"

Error Message Format

%Error: file.sv:42:5: syntax error, unexpected ';'
%Warning-WIDTH: file.sv:25:15: Operator ASSIGN expects 8 bits

Exit Codes

CodeMeaning
0Success (no errors or fatal warnings)
1Errors or warnings (warnings are fatal by default)

Use -Wno-fatal to make warnings non-fatal.

Machine-Readable Output

verilator --lint-only --diagnostics-sarif *.sv  # SARIF JSON output

Signals

GitHub stars
112
Forks
14
Last commit
May 2026
Advanced
Catalog kind
skill
Gateway key
gf-lint
Source
github.com/codejunkie99/gateflow-plugin