rtl-intent-checker
MIT LICENSED · PYTHON

Catch RTL bugs before synthesis catches you

A semantic linter for Verilog, built on pyverilog's AST. It looks for where the RTL you wrote diverges from what you meant — latch inference, blocking/non-blocking misuse, multi-driver conflicts — the bugs that pass simulation clean and only show up after synthesis.

Windows executable, no Python required. Still needs Icarus Verilog installed separately.

terminal
$one-time system dependency
$sudo apt install iverilog
$git clone https://github.com/abhinav-kumar-ece/rtl-intent-checker.git
$cd rtl-intent-checker && pip install .
$rtl-intent-checker your_design.v

What it actually flags

Run against a Verilog file with seven deliberately planted bugs — one of every rule the checker knows.

Seven checks, chosen for what actually bites

Not a syntax linter — a semantic one. Every rule here targets a class of bug that iverilog or a testbench will happily let through.

rulewhat it catches
if-without-elseCombinational if with no else — classic latch inference risk.
missing-default-caseCombinational case/casex/casez with no default branch.
blocking-in-seqBlocking (=) assignment inside a posedge/negedge block — race condition risk.
nonblocking-in-combNon-blocking (<=) assignment inside combinational logic.
unused-signalDeclared but never read anywhere in the module.
undriven-signalRead somewhere, but never assigned within the module.
multi-driverSame signal driven by more than one always block.

Tested on real RTL, not just fixtures

Getting a trustworthy pass took real debugging against real designs — including a taped-out RISC-V core and open-source Verilog the author didn't write. That process is documented in full in the repo.

0
findings on a taped-out RV32I RISC-V core (sky130A)
7 / 7
planted bugs caught in the synthetic test suite
3
independent open-source Verilog files tested clean
MIT
licensed — free to use, fork, and extend