Skip to main content

svling

SystemVerilog compiler + runtime + time-travel debugger + RTL-as-Python-callable — in one package.

svling bundles:

  • sling — a SystemVerilog → VVP compiler frontend built on pyslang (full IEEE 1800-2023 LRM coverage).
  • evvp — a Rust reimplementation of Icarus Verilog's vvp runtime, exposed to Python via pyo3 and invoked in-process.
  • sling.Simulator — time-travel-capable Python wrapper: .checkpoint() / .restore() / .fork() for parallel-universe debugging.
  • sling.Design — pyslang AST access, .compile_as_function() to turn combinational modules into Python callables, .compile_as_object() for stateful ones, auto-generated Python IntEnum / dataclass from RTL typedefs.
  • sling.features — protocol detection (AXI4-Lite, APB, etc.), FSM identification, auto-assertion synthesis, mutation testing, coverage, recorder→pandas/numpy, counterfactual sim, invariant discovery, differential testing, git-bisect-RTL, design space sweep, and more.

The whole stack ships as a single wheel containing the Python compiler sources and one sling/_native.abi3.so carrying the entire runtime.

Highlights

Time-travel debugging

import sling

sim = sling.Simulator.from_sv("counter.sv")
sim.step_cycles(50)
cp = sim.checkpoint()             # O(N) deep clone

sim.step_cycles(50)
print(sim.read_int("tb.count"))   # value at t=100

sim.restore(cp)                   # rewind
print(sim.read_int("tb.count"))   # value at t=50

fork = sim.fork(cp)               # independent timeline

RTL module as a Python callable

d = sling.Design.from_sv("alu.sv")
alu = d.compile_as_function("alu")
print(alu(a=42, b=17, op=0))      # → {'result': 59}

counter = d.compile_as_object("counter", clock="clk", reset="rst_n")
counter.reset()
print(counter.cycle(en=1))        # → {'count': 1}

Auto-generated Python types from RTL

d = sling.Design.from_string("""
    typedef enum logic [1:0] {IDLE, RUN, DONE} state_t;
    typedef struct packed { logic [7:0] addr; logic [3:0] cmd; } pkt_t;
    module top (output state_t s, output pkt_t p);  ...  endmodule
""")
State = d.py_enums()["state_t"]
Pkt   = d.py_structs()["pkt_t"]
print(State.RUN.value)            # → 1
print(Pkt(addr=0xAB, cmd=0x3).to_bits())

Verification features

f = sling.features
f.find_state_machines(d)          # AST-detected FSMs
f.detect_protocols(d, "axi_dut")  # AXI4-Lite/APB/SPI/I2C/UART/...
f.synthesize_assertions(d)        # enum-legality SVA strings
f.counterfactual(sim, until=100, overrides={"signal": 0xFF})
f.discover_invariants(recorder)
f.bisect_regression("rtl/alu.sv", test_fn, ...)
f.mutate(sv_source, test_fn)      # mutation testing

Compiled Python monitors (spec §53)

Write monitors as Python lambdas; sling compiles them to a typed IR and runs them at every sim time-step. Python is only called when the predicate transitions.

import sling
from sling.monitors import compiled_trigger, compiled_monitor, until, capture

sim = sling.Simulator.from_sv("design.sv")

# Single-cycle predicate. The decorator returns the Monitor itself.
@compiled_trigger(sim, dut="top", edge="rising")
def overflow(dut):
    return (dut.cnt > 250) & (dut.enable == 1)

# Multi-cycle sequence monitor.
@compiled_monitor(sim, dut="top")
def axi_write(dut):
    yield until(lambda d: d.awvalid == 1)
    yield capture(lambda d: d.awaddr)
    yield until(lambda d: d.awready == 1)

sim.run_until(10_000)

print(f"overflow fired {overflow.fire_count}x, last at t={overflow.last_fire_time}")
for h in axi_write.history[:5]:
    print(f"  AXI write at t={h.time} addr={h.captures['awaddr']:#x}")

Supported Python subset in predicates: comparisons (==, !=, <, <=, >, >=), bitwise (&, |, ^, ~, <<, >>), arithmetic (+, -, *), boolean (and, or, not), ternary (X if C else Y), attribute chains rooted at the DUT parameter, integer/boolean literals. Function calls are rejected with a helpful diagnostic.

Time-travel workflows (built on Simulator.checkpoint/fork)

Higher-level helpers in sling.timetravel:

from sling.timetravel import run_universes, diff_timelines, AutoCheckpointer

sim.run_until(1000)
cp = sim.checkpoint()

results = run_universes(
    cp, sim_template=sim, until_time=2000,
    sample_signals=["top.result", "top.error"], sample_period=50,
    stimulus_callbacks={
        "normal": lambda u: u.write("top.in", 0x42),
        "fuzzed": lambda u: u.write("top.in", 0xFF),
    },
)
for d in diff_timelines(results["normal"], results["fuzzed"])[:5]:
    print(f"t={d.time}: {d.signal} normal={d.value_a} fuzzed={d.value_b}")

# Ring-buffer of periodic checkpoints — rewind past an unknown failure.
with AutoCheckpointer(sim, period=100, keep=20) as auto:
    for cycle in range(5000):
        sim.run_until((cycle + 1) * 10)
        auto.tick()
        if sim.read_int("top.error_flag"):
            sim.restore(auto.rewind(steps_back=5))
            break

Semantic waveform search (spec §44)

Beyond name-grep — search by structure (AST), behavior (recorded samples), or both:

from sling import features as f
from sling.wavesearch import WaveformSearch, Pattern

rec = f.Recorder(sim, ["top.valid", "top.ready", "top.state"])
for _ in range(2000):
    sim.run_until(sim.now + 5)
    rec.sample()

ws = WaveformSearch(sim, design=design, recorder=rec)

# Behavior: handshakes on a valid/ready pair.
hs = ws.find_handshake("top.valid", "top.ready")

# Structure × behavior: state-machine transitions by enum name.
errs = ws.find_transition("top.state", from_val="IDLE", to_val="ERROR")

# Custom temporal pattern.
pulses = ws.find_pattern("top.req", Pattern.pulse(min_width=3))

Install

pip install svling
# or
uv tool install svling

Use

# Compile and run in one go:
svling design.sv tb.sv

# Compile only (write a .vvp file):
sling -o design.vvp design.sv

# Run a pre-compiled .vvp through the Rust runtime in-process:
python -c "from sling._native import run_cli; run_cli(['evvp', '-N', 'design.vvp'])"

Anything that starts with + on the svling command line is forwarded to the runtime as a Verilog plusarg (e.g. +verbose, +seed=42). Use -- to forward arbitrary extra flags to the runtime.

Layout

svling/
├── sling/          Python frontend (pyslang → VVP)
├── evvp/           Rust crate: VVP runtime; produces both a standalone
│                   `evvp` binary and a pyo3 cdylib for the wheel
├── tests/          Sample SystemVerilog used by the docs
└── pyproject.toml  maturin build, project metadata, console scripts

License

GPL-2.0-or-later. evvp is a clean-room reimplementation of Icarus Verilog's vvp, which is GPL-2.0; this package keeps the same license.

Metadata

Release files for svling 0.13.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for svling 0.13.0
File Size Uploaded
svling-0.13.0.tar.gz 612.9 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for svling 0.13.0
File
svling-0.13.0-cp310-abi3-win_amd64.whl CPython 3.10 abi3 Windows x86-64 Details
svling-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl CPython 3.10 abi3 Linux glibc 2.17+ x86-64 Details
svling-0.13.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl CPython 3.10 abi3 Linux glibc 2.17+ ARM64 Details
svling-0.13.0-cp310-abi3-macosx_11_0_arm64.whl CPython 3.10 abi3 macOS 11.0+ ARM64 Details
svling-0.13.0-cp310-abi3-macosx_10_12_x86_64.whl CPython 3.10 abi3 macOS 10.12+ x86-64 Details

Total release size: 7.4 MB

Release files / svling-0.13.0.tar.gz

Download URL svling-0.13.0.tar.gz
Size 612.9 kB
Tags Source
SHA-256 checksum
How to use checksums
ec5d52175364201175cf1e1945204e8efb01d91671a3b74401a5b2cbe75e2d73
BLAKE2b-256 checksum
How to use checksums
681a79c8b320dc5caad093462c701aa1c626ac8996fe6b89b0162e94ede84bee
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.

Transparency log

Release files / svling-0.13.0-cp310-abi3-win_amd64.whl

Download URL svling-0.13.0-cp310-abi3-win_amd64.whl
Size 1.4 MB
Tags CPython 3.10 Windows x86-64 abi3
SHA-256 checksum
How to use checksums
0c661d812dd20d7f18ef5fc55dfa872148d5a76e998879d6ab54364bb8056af8
BLAKE2b-256 checksum
How to use checksums
ce8f84d01aa8aca8565c57d2e7c8f95b5ca45666d070bda3024962567709dadb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.

Transparency log

Release files / svling-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

Download URL svling-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Size 1.4 MB
Tags CPython 3.10 Linux glibc 2.17+ x86-64 abi3
SHA-256 checksum
How to use checksums
3f62c5ba47d58ab9a9601e9d5919e90c888dfba8be22f40650dc2bac58e6849f
BLAKE2b-256 checksum
How to use checksums
5c72becbba9f6e0bb3a194b90c55a6f566665a8d9bce52099ef864b7dc00eba2
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.

Transparency log

Release files / svling-0.13.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

Download URL svling-0.13.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Size 1.3 MB
Tags CPython 3.10 Linux glibc 2.17+ ARM64 abi3
SHA-256 checksum
How to use checksums
8906c35ecea091a955e17306c60731b783e5050ed9f9addcc382ea003b67db17
BLAKE2b-256 checksum
How to use checksums
1f97b3237938330e9685a96c4615121e257753e65ddf1e0c927a1f95d86c5e7f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.

Transparency log

Release files / svling-0.13.0-cp310-abi3-macosx_11_0_arm64.whl

Download URL svling-0.13.0-cp310-abi3-macosx_11_0_arm64.whl
Size 1.3 MB
Tags CPython 3.10 abi3 macOS 11.0+ ARM64
SHA-256 checksum
How to use checksums
33d6fe380783a388d6f491743c1e7a48287e7bb1ecc1bf1ce87b363554fb813b
BLAKE2b-256 checksum
How to use checksums
087724e8e30221a923bfc32765379297b5711933e3b7bd50f8b0bde0c3b91328
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.

Transparency log

Release files / svling-0.13.0-cp310-abi3-macosx_10_12_x86_64.whl

Download URL svling-0.13.0-cp310-abi3-macosx_10_12_x86_64.whl
Size 1.4 MB
Tags CPython 3.10 abi3 macOS 10.12+ x86-64
SHA-256 checksum
How to use checksums
5c5dcc5e46c7cf9717efbae086708315cd4e0f70abd057a8677e429d68c615ca
BLAKE2b-256 checksum
How to use checksums
5dca770f69edbafb4881da9f2fa55be4cfc3ab30fa4f315f7b96f09aa34b1539
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jun 4, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.13.0 This release

6 release files

0.9.0

6 release files

0.8.0

6 release files

0.7.0

6 release files

0.6.0

6 release files

0.5.0

6 release files

0.4.0

6 release files

0.2.1

6 release files

0.2.0

6 release files

0.1.0

6 release files

0.0.2

6 release files

0.0.1

5 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page