Skip to main content

Parse, analyze, simulate, and generate Verilog/SystemVerilog from Python.

Project description

veriforge

CI Changelog License

A Python library for parsing, analyzing, generating, and simulating Verilog/SystemVerilog designs, built on the Lark parser.

Features

  • Parse Verilog 2005 (with SystemVerilog extensions) into a semantic model
  • Preprocess source files (`define, `ifdef, `include, `timescale, etc.)
  • Multi-file project support — parse directories, link cross-module instances
  • Analyze designs — width inference, constant folding, clock/reset extraction, lint checks
  • Emit formatted Verilog from the model (round-trip, configurable style)
  • Python DSL — build hardware with operator-overloaded Python, emit to Verilog or simulate directly
  • Component library — FIFO, CDC, codec, AXI-Stream, AXI4-Lite, DSP, RAM, Xilinx inference
  • Auto-generate testbenches from any module
  • Convert parsed Verilog to DSL code (Verilog → Python translation)
  • Simulate — event-driven 4-state simulator with three engines (reference, bytecode VM, compiled Cython)
  • VCD output — IEEE 1364-2001 waveform dumps, cross-simulator validation
  • Inspect semantic models through lookup helpers and JSON serialization
  • Language Serververiforge-lsp provides editor diagnostics, symbols, navigation, hover, and custom hierarchy/trace commands (install Verible for fast between-save diagnostics; the server falls back to the built-in Lark parser when Verible is absent)

Documentation

Quick Start

Parse a Verilog file

from veriforge.project import parse_file
from veriforge.codegen import emit_module

design = parse_file("rtl/counter.v", preprocess=True)
for mod in design.modules:
    print(emit_module(mod))

Build hardware with the Python DSL

from veriforge.dsl import Module, posedge
from veriforge.codegen import emit_module

with Module("counter") as m:
    clk = m.input("clk")
    rst = m.input("rst")
    count = m.output_reg("count", width=8)

    with m.always(posedge(clk)):
        with m.if_(rst):
            count <<= 0
        with m.else_():
            count <<= count + 1

print(emit_module(m.build()))

Simulate directly from Python

from veriforge.sim import Simulator, Clock

sim = Simulator(m.build())
sim.fork(Clock(sim.signal("clk"), period=10))

def test(s):
    s.drive("rst", 1)

sim.run(test, max_time=200)
print(sim.read("count"))

Analyze a project

from veriforge.project import parse_directory
from veriforge.analysis import analyze_design, lint_design

design = parse_directory("rtl/", preprocess=True)
analyze_design(design)
for w in lint_design(design):
    print(f"[{w.code.name}] {w.message}")

Installation

Prerequisites

Dependencies

  • Lark
  • Rich
  • treelib
  • pygls (LSP server)
  • intervaltree (LSP server)

PyPy Support (Optional — ~4x Simulation Speedup)

The full test suite passes under PyPy. Running the simulator under PyPy gives approximately 4x faster simulation compared to CPython thanks to JIT compilation, with zero code changes required.

  1. Install PyPy 3.10+ from https://www.pypy.org/download.html
  2. Install dependencies: pypy3 -m pip install lark rich treelib pygls intervaltree
  3. Run: pypy3 -m veriforge ...

Install with uv (recommended)

git clone https://github.com/chiplukes/veriforge
cd veriforge
uv sync --extra test

Install with pip

git clone https://github.com/chiplukes/veriforge
cd veriforge
python -m venv .venv
# Activate:
#   Linux/macOS:       source .venv/bin/activate
#   Windows PowerShell: .venv\Scripts\activate
pip install -e .[test]

CLI Usage

The CLI is subcommand-based (legacy -f/-t/-r flags remain supported):

# Parse a file and print the syntax tree
uv run veriforge tree -f path/to/file.v

# Reconstruct Verilog text from the parsed tree
uv run veriforge reconstruct -f path/to/file.v

# Parse summaries (support --json for automation)
uv run veriforge parse-file -f rtl/top.v
uv run veriforge parse-directory rtl/

# Generate a Python testbench skeleton
uv run veriforge generate-python-testbench --file rtl/top.v

# Export a parsed project to Python DSL files
uv run veriforge export-dsl rtl/ out_dsl/

# Inspect hierarchy / wrapper candidates (--format text|dot|mermaid)
uv run veriforge hierarchy graph rtl/

# Grammar tree visualization
uv run python -m veriforge.lark_file.gen_tree --all --depth 5

See veriforge <command> --help for full flag listings and notes/cli_json_schema.md for the --json output contract.

Running Tests

# Same representative fast slice used by push/PR CI
uv run --extra test pytest tests/test_verilog_parser/test_all.py tests/test_model/test_module.py tests/test_model/test_instances.py tests/test_model/test_roundtrip.py tests/test_model/test_tree_to_model_characterization.py tests/test_analysis/test_width_inference.py tests/test_analysis/test_const_fold.py tests/test_preprocessor/test_preprocessor.py tests/test_formatter/test_formatter.py --tb=no -q

# Full local suite
uv run --extra test pytest tests/ --tb=no -q

Examples

Runnable examples are in the examples/ directory. See examples/README.md for prerequisites and category guidance.

  • examples/basics/ — counter, shift register, FSM, ALU, testbench
  • examples/library/ — FIFO, CDC, codec, DSP, Xilinx components
  • examples/axi/ — AXI-Stream and AXI4-Lite usage
  • examples/composability/ — pipeline generators, design exploration, register banks
  • examples/darkriscv/ — real-world RISC-V SoC integration target
  • examples/femtorv/ — compact RISC-V processor integration target
  • examples/picorv32/ — PicoRV32 processor integration target
  • examples/serv/ — SERV bit-serial RISC-V processor integration target
  • examples/ibex/ — Ibex-related validation assets
  • examples/pulp/ — imported validation targets based on pulp-platform designs

Current Limitations

veriforge targets RTL-level behavioral simulation and analysis. Before using it, it is worth knowing where the current boundaries are:

Simulation scope

  • This is a behavioral RTL simulator, not a replacement for Icarus Verilog, Verilator, or commercial tools for full-chip verification. It is well-suited for unit-level testbenches, design exploration, and cross-validating specific behaviors.
  • X/Z propagation is modeled but corner cases in complex expressions may not match the IEEE spec in all situations. For designs where X-propagation correctness is critical, cross-validate with IcarusCosim.
  • Specify blocks (timing annotations) and gate-level / UDP primitives are parsed and emitted but not executed.
  • The compiled Cython engine falls back to reference coroutines for #delay / @(posedge) inside initial/always blocks; a warnings.warn is emitted when this happens. The workaround is to move timing control into the Python testbench layer.

SystemVerilog subset

  • The SystemVerilog verification layer is out of scope: classes, SVA assertions, covergroups, randomize/constraints, dynamic arrays, queues, bind, and program blocks are not simulated.
  • Packed structs, interfaces, and parameterized interfaces work for common RTL patterns but may require flat wrapper modules for complex cases. The support matrix has the per-construct breakdown.
  • Functions and tasks cover the common RTL patterns used by the validation examples; unusual calling conventions or recursive functions may fail.

Verilog-to-DSL conversion

  • The converter (export-dsl) is intentionally conservative. Control-flow-heavy constructs, complex always blocks, and module-level generate blocks often require manual rewriting. See notes/dsl/dsl_conversion_coverage.md for the detailed gap list.

Hierarchy refactor tooling

  • Structural, behavioral, parameterized, and generate-containing wrappers are detected and classified but collapse is intentionally blocked pending safer transforms. Extract and boundary-move operations cover common direct-wiring cases; complex connectivity patterns fail closed with a diagnostic. See notes/roadmap.md for the backlog.

Performance

  • Even with the compiled Cython engine, throughput is lower than C-based simulators. For simple sequential testbenches on medium-sized designs, performance is practical. For very large designs or workloads requiring millions of cycles, prefer a dedicated simulator and use veriforge for the analysis and testbench-generation layers.

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

veriforge-0.0.6.tar.gz (1.3 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

veriforge-0.0.6-py3-none-any.whl (2.2 MB view details)

Uploaded Python 3

File details

Details for the file veriforge-0.0.6.tar.gz.

File metadata

  • Download URL: veriforge-0.0.6.tar.gz
  • Upload date:
  • Size: 1.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for veriforge-0.0.6.tar.gz
Algorithm Hash digest
SHA256 7144af20d874d72382d9ba2a2fb2883f3784c8e2347e2fb99fddb9b46ee6a832
MD5 2ea0ec6337947bf05a6e1585626d93e6
BLAKE2b-256 2edae43eeae27755ec7fe1b483aabd74f8958574c8c4f3ce9663582b9e71afe3

See more details on using hashes here.

Provenance

The following attestation bundles were made for veriforge-0.0.6.tar.gz:

Publisher: publish.yml on chiplukes/veriforge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file veriforge-0.0.6-py3-none-any.whl.

File metadata

  • Download URL: veriforge-0.0.6-py3-none-any.whl
  • Upload date:
  • Size: 2.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for veriforge-0.0.6-py3-none-any.whl
Algorithm Hash digest
SHA256 05404ecbad8f284de534bebaee09b79d820c399974696a50b57c32a480e2d5e9
MD5 457a76f298dbb36a682881fcf4bf4410
BLAKE2b-256 9ef7139b75b1db220aefc93c0e350f76969c2151a74cbfe93e28d52cc5400542

See more details on using hashes here.

Provenance

The following attestation bundles were made for veriforge-0.0.6-py3-none-any.whl:

Publisher: publish.yml on chiplukes/veriforge

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page