Skip to main content

SystemVerilog simulator: pyslang frontend + Rust runtime + time-travel + RTL-as-Python-callable + compiled-Python monitors + semantic waveform search + cocotb adapter

Project description

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.

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

svling-0.6.0.tar.gz (576.8 kB view details)

Uploaded Source

Built Distributions

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

svling-0.6.0-cp310-abi3-win_amd64.whl (1.2 MB view details)

Uploaded CPython 3.10+Windows x86-64

svling-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

svling-0.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.2 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

svling-0.6.0-cp310-abi3-macosx_11_0_arm64.whl (1.2 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

svling-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl (1.3 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file svling-0.6.0.tar.gz.

File metadata

  • Download URL: svling-0.6.0.tar.gz
  • Upload date:
  • Size: 576.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for svling-0.6.0.tar.gz
Algorithm Hash digest
SHA256 b0304e8b06d52766c9827d8e72092049f8313c424d32669c599599f47266a0fb
MD5 e429cc08cfa58c118918b510fe779361
BLAKE2b-256 20634da108424e097d6ff8ff01c9454344c33a935fc47860e6480a469b223f18

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.6.0.tar.gz:

Publisher: svling-publish.yml on CheeksTheGeek/svling

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

File details

Details for the file svling-0.6.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: svling-0.6.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for svling-0.6.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 fcb2e3fc2d80df4a78dc136c7f0f84e5786e42a8e335682c7c0051570b649cf6
MD5 348423a53033f83918d714ea8d6ebd36
BLAKE2b-256 37f33a63e8c707e97066a871b91c86a73771b180e7e0c873bbdf9206a9ac4e6d

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.6.0-cp310-abi3-win_amd64.whl:

Publisher: svling-publish.yml on CheeksTheGeek/svling

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

File details

Details for the file svling-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for svling-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d2be6a4571a36fb12f8428cd1e33a4e9c390ed9d6893374c1af29ad8e08b50ea
MD5 48693284a42a8ba1275b2d908af48ed6
BLAKE2b-256 71cb93fb4eaae713a01cefd6bcf7cb102dd75b569d6f45db31c8afd777fca384

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.6.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: svling-publish.yml on CheeksTheGeek/svling

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

File details

Details for the file svling-0.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for svling-0.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 bd1d5d353712db1b4f2f6cc00157cc768b5cb4530084557c312b4db8169574c9
MD5 c26d27ddc3d0b07a8d3968f14d2e20ed
BLAKE2b-256 24e2fc9e4806608d3c481ba45d0849967b4c7407238b93897b2618b4d45a37da

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.6.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: svling-publish.yml on CheeksTheGeek/svling

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

File details

Details for the file svling-0.6.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for svling-0.6.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 cb14cf4206c94427d0d37a1a39e03e9335b55998139470fa2c7b268a484f2359
MD5 a9ba84c7b82a1fe8f39078f22e53db3c
BLAKE2b-256 3709b7aa8f54bf644bcd03b55b8585bccfa2ef61a76716bde83bd88e01d0dc75

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.6.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: svling-publish.yml on CheeksTheGeek/svling

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

File details

Details for the file svling-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for svling-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6917e10216f3fc519f4fb0086b159bbcc6d5b44ce42a510a11876e06b5cce8c0
MD5 6488b9f14f133eccf0647e0db872f2db
BLAKE2b-256 86075e996b1d6a716d4a3190aa60de54fbfe0193169b1574a94ece79ec492cc8

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.6.0-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: svling-publish.yml on CheeksTheGeek/svling

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