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.13.0.tar.gz (612.9 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.13.0-cp310-abi3-win_amd64.whl (1.4 MB view details)

Uploaded CPython 3.10+Windows x86-64

svling-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (1.4 MB view details)

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

svling-0.13.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (1.3 MB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

svling-0.13.0-cp310-abi3-macosx_11_0_arm64.whl (1.3 MB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

svling-0.13.0-cp310-abi3-macosx_10_12_x86_64.whl (1.4 MB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for svling-0.13.0.tar.gz
Algorithm Hash digest
SHA256 ec5d52175364201175cf1e1945204e8efb01d91671a3b74401a5b2cbe75e2d73
MD5 027257f889854ca9f33ec1e7fef62b37
BLAKE2b-256 681a79c8b320dc5caad093462c701aa1c626ac8996fe6b89b0162e94ede84bee

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.13.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.13.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: svling-0.13.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 1.4 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.13.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 0c661d812dd20d7f18ef5fc55dfa872148d5a76e998879d6ab54364bb8056af8
MD5 ec7fda8f6de6ffbbfdb49fd3b3a1c3ef
BLAKE2b-256 ce8f84d01aa8aca8565c57d2e7c8f95b5ca45666d070bda3024962567709dadb

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.13.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.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for svling-0.13.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 3f62c5ba47d58ab9a9601e9d5919e90c888dfba8be22f40650dc2bac58e6849f
MD5 bb663d7b617d57eb85ea30e4db7e4359
BLAKE2b-256 5c72becbba9f6e0bb3a194b90c55a6f566665a8d9bce52099ef864b7dc00eba2

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.13.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.13.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for svling-0.13.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 8906c35ecea091a955e17306c60731b783e5050ed9f9addcc382ea003b67db17
MD5 76f66f84b2b56681a1c78b5caa841d25
BLAKE2b-256 1f97b3237938330e9685a96c4615121e257753e65ddf1e0c927a1f95d86c5e7f

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.13.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.13.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for svling-0.13.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 33d6fe380783a388d6f491743c1e7a48287e7bb1ecc1bf1ce87b363554fb813b
MD5 9ed7ddeb17bf9d2294d87fadab6b730d
BLAKE2b-256 087724e8e30221a923bfc32765379297b5711933e3b7bd50f8b0bde0c3b91328

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.13.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.13.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for svling-0.13.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5c5dcc5e46c7cf9717efbae086708315cd4e0f70abd057a8677e429d68c615ca
MD5 f16130e2f316d7ff5e649977f256e521
BLAKE2b-256 5dca770f69edbafb4881da9f2fa55be4cfc3ab30fa4f315f7b96f09aa34b1539

See more details on using hashes here.

Provenance

The following attestation bundles were made for svling-0.13.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