What ships

Three skills.
One agent.

Stable wrappers around the Verible CLI, plus a reviewer agent that runs lint first and cites rule IDs as evidence — so the judgment layer rests on something the user can audit.

Skills

Stable wrappers, not magic.

Each skill maps to one Verible CLI tool. The interface is small on purpose: a name, a docstring, deterministic output. Invoke them directly or let Claude pick by relevance.

sv-lint

Lint a SystemVerilog file or tree.

Runs verible-verilog-lint with the project's rule set, returns rule IDs and locations. The same data sv-reviewer consumes — exposed directly so you can call it without invoking the agent.

Wraps · verible-verilog-lint
sv-format

Format SystemVerilog deterministically.

Runs verible-verilog-format. The same binary that powers format-on-save, exposed for explicit invocation — useful when you want to reformat a tree before review or in a one-off cleanup.

Wraps · verible-verilog-format
sv-diff

Structural diff between two HDL files.

Runs verible-verilog-diff to compare two SystemVerilog files structurally — past whitespace, past trivial reformats. Useful for reviewing refactors and verifying that "just-cleanup" PRs are actually just cleanup.

Wraps · verible-verilog-diff
Agent · sv-reviewer

Lint first. Judgment second.

The agent runs verible-verilog-lint before opining, then layers HDL-specific judgment — inferred latches, blocking-vs-nonblocking in always_ff, sensitivity-list drift, X-propagation, clock-domain hygiene. Every finding cites a Verible rule ID where one exists.

sv-reviewer trace · counter.sv
tool_call
verible-verilog-lint --rules_config_search src/counter.sv
tool_result
counter.sv:9:7  [always-ff-non-blocking]
counter.sv:13:1 [module-end-label]
narration always-ff-non-blocking Line 9 assigns to q with = inside an always_ff block. Use non-blocking <= — blocking creates a race when q is read elsewhere in the same cycle.
narration module-end-label Line 13: endmodule is unlabeled. Add the label so cross-file refactors stay anchored: endmodule : counter.
done 2 findings · both cited · no judgment beyond Verible's rule set on this pass

Schematic of the agent's stream. Real traces include the full Verible rule docs and any extra HDL judgment the agent layered on.

Judgment layer

Beyond the rule set.

Verible's rule corpus is excellent at the lexical & structural layer but stops at design-intent issues. sv-reviewer picks up where the linter ends — and only after the linter has spoken.

  1. Inferred latches. Combinational always with incomplete assignments — flagged with the offending signal name and the missing branch.
  2. Blocking in always_ff. Cross-checked against the lint result; agent explains the race in plain English so a reviewer can act.
  3. Sensitivity-list drift. always @(*) recommended over hand-rolled lists; explicit lists flagged when they omit a referenced signal.
  4. X-propagation. Reset paths or initial values that leave signals undefined under realistic stimulus.
  5. Clock-domain hygiene. Cross-domain reads without a synchronizer; multi-bit CDC without a handshake.
Hooks

Quiet automations.

Hooks fire on Claude Code lifecycle events. Two ship today — both small, both opt-out per project.

SessionStart

Build the Verible filelist.

Walks the workspace once at session start and writes .fpga-lsp/verible.filelist. Verible reads it via --file_list_path for cross-file go-to-definition and reference resolution. If your repo commits a verible.filelist, the plugin respects it byte-for-byte.

PostToolUse

Format on save.

After Claude writes a SystemVerilog file, the hook runs verible-verilog-format on the changed file. Quiet, fast, opinionated. Disable per-project by removing the hook from .lsp.json.