EVAS — Event-driven Verilog-A Simulator
A lightweight behavioral simulator for digital/mixed-signal Verilog-A models. EVAS runs supported event-driven designs through the fail-closed EVAS2/Rust backend. No ngspice, no KCL/KVL solver.
Docs: evas.tokenzhang.com
What EVAS does
EVAS simulates voltage-mode, event-driven Verilog-A behavioral models. You provide:
- A
.vafile — your behavioral model (comparator, DAC, SAR logic, DWA controller, …) - A
.scstestbench netlist — voltage sources,ahdl_include, and atranstatement - Run
evas simulate— gettran.csvwaveforms and optional plots
The main simulator is transient-first. Compiled models also expose lightweight
behavioral helpers for analysis("ac"), ac_stim(), and Verilog-A noise source
functions so source-style models can run AC/noise sweeps from Python without
claiming SPICE-style linearized circuit analysis.
The bundled examples are a compact smoke-test set. For your own design, copy the
closest example directory, swap in your .va, adjust the stimulus sources and
save list, and run. The larger verification example library belongs with the
agent workflow in veriloga-skills/evas-sim.
Installation
pip install evas-sim
evas list # verify install — prints bundled example groups
If evas is not on PATH, use python -m evas.
The production engine is EVAS2/Rust. Compatible Linux wheels include the
evas-rust shared library, and source installs build it with cargo. A missing,
unloadable, or ABI-incompatible Rust core is a hard error; EVAS never falls back
to the Python simulation engine. The legacy evas2 and rust2 selectors remain
accepted as time-bounded input aliases and are recorded as canonical
evas-rust in run metadata.
Verify an installation and capture its machine-readable build identity:
evas --version
evas --version --format json > evas-identity.json
The JSON includes the package/CLI version, Rust core version and ABI, build
revision when available, and whether the native core is present and loadable.
Benchmark images should capture this output alongside the image digest. Every
simulation also writes the same provenance to <output>/evas_identity.json.
Simulating your own design
evas simulate path/to/tb.scs -o output/mydesign
evas simulate path/to/tb.scs -o output/mydesign --ahdllint
evas simulate path/to/tb.scs -o output/mydesign --spectre-strict
Output in -o dir: tran.csv (waveforms), strobe.txt (log messages),
evas_identity.json (build provenance), and .png plots.
--ahdllint runs EVAS lint as a non-blocking simulation preflight and writes
diagnostics into the simulation log before model compilation. Netlists may also
request this with simulatorOptions options ahdllint=true.
--spectre-strict runs the same lint preflight in blocking strict standalone
Spectre mode, rejecting EVAS extension syntax before compilation. Netlists may
also request this with simulatorOptions options spectre_strict=true; CI and
benchmark wrappers can enable the same behavior globally with
EVAS_SPECTRE_STRICT=1.
Before a full simulation, you can run a Spectre/AHDL-style static lint pass:
evas lint path/to/model.va
evas lint path/to/tb.scs --format json
evas lint path/to/model.va --spectre-strict
evas lint follows ahdl_include statements in .scs files and reports two
classes of issues: compat-error for EVAS/Spectre subset problems that should
block a candidate, and warning diagnostics for AHDL-style modeling risks such as
discrete signals directly driving analog contributions or suspicious transition
usage. Lint warnings do not change simulation pass/fail status.
Current warning coverage includes a Cadence AHDL-inspired subset for
transition timing and simple continuous-input dataflow, conditional potential
contributions, case defaults, exact branch equality tests, floor/ceil
contribution discontinuities, gnd node portability, discrete function
arguments, implicit integer casts, and simulator-stop tasks inside loops.
Each lint diagnostic is backed by a small rule registry that records its code,
severity, canonical rule name, phase, source category, and related
Cadence/Spectre identifiers when known.
Diagnostics produced from parsed Verilog-A nodes include source line and column
coordinates when available, so repair tools can point users back to the
triggering statement or expression.
Compatibility diagnostics include Cadence/Spectre-aligned cases such as
conditionally executed analog operators (transition, slew, idt) and
discipline vector ranges that depend on runtime variables instead of numeric or
parameter constant expressions.
Strict Spectre mode additionally rejects EVAS extension syntax that standalone
Spectre rejects in the current compatibility target, including AMS bridge
constructs (logic, wreal, continuous assign, always), task/do-while
extensions, runtime electrical-node indexing, selected version-gated random
distributions, seeded $rdist_* distributions whose Spectre PRNG sequence
parity is not certified, integer bit/part-select concatenation gaps,
generate, specify, connectmodule, and connectrules.
The lint regression suite also keeps a small set of public oracle fixtures under
tests/fixtures/lint_oracle_cases. These cases record distilled expected EVAS
diagnostic codes only; raw Cadence/Spectre logs and generated certification
reports are not committed.
Minimal testbench template (.scs):
simulator lang=spectre
global 0
ahdl_include "my_module.va"
Vvdd (vdd 0) vsource type=dc dc=1.8
Vclk (clk 0) vsource type=pulse val0=0 val1=1.8 period=10n rise=0.1n fall=0.1n width=4.9n
IDUT (clk vdd out) my_module vdd=1.8
tran tran stop=200n maxstep=0.1n
save clk:2e out:6f
Testbench structure reference
The bundled examples contain five small groups and their testbenches. They are the in-package reference for common wiring patterns:
| Pattern needed | Look at |
|---|---|
| Clocked digital logic | clk_div, digital_basics |
| Comparator with feedback | comparator/cmp_offset_search |
| ADC + sample-hold | adc_dac_ideal_4b |
| Noise / random stimulus | noise_gen |
| Multi-cycle edge timing | comparator/cmp_delay, edge_interval_timer |
Supported Verilog-A
Support tiers
EVAS reports unsupported-feature diagnostics with a stable
[support-tier: <name>] suffix in text output and a support_tier field in
JSON lint output. Benchmark reports should use these tiers instead of treating
all Verilog-A/AMS failures as one flat simulator target.
| Tier | Boundary | Benchmark interpretation |
|---|---|---|
behavioral-event |
Voltage-domain behavioral transient models: V(...) reads/drives, cross/above/timer/initial_step/final_step, transition, state machines, control logic, table/random/file helpers. This is the current EVAS core strength. |
A valid failure here is a supported EVAS bug unless a narrower diagnostic says otherwise. |
behavioral-continuous-time |
Legal voltage-domain ddt, idt, idtmod, laplace_*, zi_*, and limexp style models. EVAS has behavioral transient approximations for selected forms, but this is not a claim of Spectre-equivalent continuous-time transfer-function solving. |
Treat unsupported or inaccurate rows as planned/limited continuous-time work, not as AMS/KCL coverage. |
ams-digital |
wreal, logic, always, continuous assign, packed logic vectors, specify/specparam, connectmodule, and connectrules. EVAS supports only small behavioral bridge subsets where documented; a full AMS/digital event kernel is outside the certified core. |
Full AMS/digital failures are outside current benchmark certification unless the row is explicitly documented as a supported bridge subset. |
conservative-current-kcl |
I(...) <+ ..., branch currents, current probes, indirect branch equations, charge/current branch contributions, and KCL/MNA topology solving. |
Architectural roadmap item, not a parser bug and not part of current certified EVAS support. |
Certification boundary: current EVAS benchmark PASS claims apply to
behavioral-event designs, plus explicitly documented behavioral helper subsets.
Rows that require full ams-digital or conservative-current-kcl semantics must
be reported separately from supported EVAS bugs.
Continuous-time policy: ddt(), idt(), idtmod(), laplace_nd(),
laplace_np(), laplace_zd(), laplace_zp(), zi_nd(), zi_np(),
zi_zd(), zi_zp(), and limexp() are supported as voltage-domain
behavioral transient approximations in ordinary analog statements. EVAS rejects
Spectre-illegal conditional/event-body placements through lint or compile-time
diagnostics. Unsupported continuous-time operators such as absdelay() are
reported as behavioral-continuous-time, not as generic parser gaps.
Noise and stochastic policy: in ordinary transient analysis,
white_noise(), flicker_noise(), and noise_table() contribute zero
instantaneous random voltage and expose their PSD through evaluate_noise(),
noise_spectrum(), and integrated_noise(). Explicit $random, $dist_*(),
and $rdist_*() calls produce deterministic fixed-seed behavioral draws; the
same seed and draw order reproduce the same sequence. Supported distribution
helpers include uniform, normal, exponential, poisson, chi-square, t, and
erlang forms. Unsupported distribution names produce an
EVAS-COMP-EUNSUPPORTED diagnostic in the behavioral-event tier.
Subprogram policy: EVAS supports Spectre-style old-form functions/tasks
(input x; real x;), ANSI-style task/function arguments, local variables,
multi-argument calls, bounded recursion, and task/function calls from event
bodies with normal state-update ordering.
Vector and indexing policy: pure expression bit-select, part-select,
concatenation, replication, reduction, packed logic vectors, and integer/real
state arrays are separate from electrical topology. Static generate/genvar
elaboration is supported for a limited behavioral/continuous-assign subset.
Runtime voltage-domain electrical indexing such as V(bus[i]) and
V(bus[i]) <+ ... is supported by dynamic node resolution; dynamic current
indexing remains part of the unsupported conservative-current-kcl tier.
| Feature | Status |
|---|---|
V(node) <+, V(a,b) differential |
✅ |
@(cross(...)), @(above(...)), @(initial_step) |
✅ |
cross(expr, dir, time_tol, expr_tol) event tolerances |
✅ (behavioral approximation) |
@(timer(period)), @(final_step) |
✅ |
transition() with delay / rise / fall |
✅ |
slew(x, maxrise, maxfall) transient limiter |
✅ (behavioral approximation) |
for, repeat, while, do while, if/else, case/endcase, begin/end |
✅ |
| arrays, including integer/real 1-D and 2-D state arrays | ✅ |
| bit/part select, concat, replication, reduction, packed logic vectors | ✅ |
runtime voltage electrical indexing such as V(bus[i]) |
✅ |
branch (p,n) br; V(br) named branch voltage probes |
✅ |
$analog_node_alias() and string OOMR voltage probes such as V(sigpath) |
✅ |
$table_model() 1-D file tables and simple 2-D array-backed surfaces |
✅ |
| parameters and variables (real / integer / string) | ✅ |
| user-defined functions/tasks, including bounded recursive functions | ✅ |
module, connectmodule, simple behavioral hierarchy |
✅ |
logic, wreal, simple continuous assign, simple always @(posedge/negedge ...) |
limited ams-digital bridge subset |
simple specify / specparam path delay on behavioral assignments |
limited ams-digital bridge subset |
`include, `define, `default_transition |
✅ |
SI suffixes, math: sin cos exp ln log pow floor ceil … |
✅ |
$temperature, $vt, $abstime |
✅ |
$bound_step() |
✅ |
$fopen(), $fclose(), $fscanf(), $fstrobe(), $fwrite(), $fdisplay() |
✅ |
$display, $strobe, $sformat(), $swrite() |
✅ |
$random, $dist_*(), $rdist_*() behavioral random helpers |
✅ |
last_crossing(expr, dir, time_tol, expr_tol) |
✅ (most-recent event-time approximation) |
analysis("ac"), ac_stim() |
✅ (behavioral Python sweep helper) |
white_noise(), flicker_noise(), noise_table() |
✅ (behavioral PSD / integrated-noise helper) |
ddt(), idt(), laplace_*(), zi_*(), limexp() |
limited behavioral-continuous-time approximation |
generate / genvar |
limited static-elaboration subset |
connectrules |
unsupported ams-digital scope |
custom nature / discipline semantics beyond the bundled VAMS stubs |
not supported by design |
analog primitive instances such as resistor / isource |
not supported by design |
I() <+, q() <+, branch charge/current contributions, current probes |
unsupported conservative-current-kcl scope |
| SPICE-style AC/DC matrix solving, transistors | unsupported conservative-current-kcl scope |
Spectre subckt hierarchy |
not yet implemented |
Accuracy Profiles
You can set simulatorOptions options evas_profile=<mode> in .scs:
fast: lower refinement (refine_factor=8,refine_steps=4) for faster runtimebalanced: default EVAS behavior (16,8)precision: higher refinement (32,16) for tighter event/cross timing
errpreset=conservative/liberal is still respected; evas_profile applies an explicit EVAS-side override when set.
Practical correspondence: fast ≈ liberal, balanced ≈ moderate, precision ≈ conservative (guidance only, not solver-equivalence claim).
CSV output format
The save statement accepts per-signal format hints:
save vin:10e vout:6f clk:2e dout:d
| Suffix | Example |
|---|---|
:6e (default) |
4.500000e-01 |
:Nf |
fixed-point, N decimal places |
:d |
integer (for digital buses) |
Bundled examples (reference only)
Five groups ship with the PyPI package for install verification, CLI sanity
checks, and small starting templates. The full workflow-oriented example set is
maintained outside this simulator package in veriloga-skills/evas-sim.
| Group | Verilog-A modules | Notes |
|---|---|---|
clk_div |
clk_div |
|
digital_basics |
and_gate, or_gate, not_gate, dff_rst, inverter |
|
noise_gen |
noise_gen |
|
adc_dac_ideal_4b |
adc_ideal_4b, dac_ideal_4b, sh_ideal |
3 stimuli: ramp / sine / 1000-pt sine |
comparator |
cmp_ideal, cmp_strongarm, cmp_offset_search, cmp_delay, edge_interval_timer |
4 sub-examples |
Contributing
git clone https://github.com/Arcadia-1/EVAS.git
cd EVAS
pip install -e ".[dev]"
pytest tests/ -v
License
MIT — see LICENSE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file evas_sim-0.8.7.tar.gz.
File metadata
- Download URL: evas_sim-0.8.7.tar.gz
- Upload date:
- Size: 624.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
658f4c054532c1ad9a07e8a146b25a29f186998c9d0e35c768c5c20d8dd0ccf2
|
|
| MD5 |
48f6de147cb8a337dce04ccd8e644650
|
|
| BLAKE2b-256 |
9597effa17a88b80ff20a11a8f663f02fc4a4d392bb569c588043f1d8417cde5
|
Provenance
The following attestation bundles were made for evas_sim-0.8.7.tar.gz:
Publisher:
publish.yml on Arcadia-1/EVAS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evas_sim-0.8.7.tar.gz -
Subject digest:
658f4c054532c1ad9a07e8a146b25a29f186998c9d0e35c768c5c20d8dd0ccf2 - Sigstore transparency entry: 2271024198
- Sigstore integration time:
-
Permalink:
Arcadia-1/EVAS@6cb6fa7a7dac70fc0d4120126d8cf74258e6637b -
Branch / Tag:
refs/tags/v0.8.7 - Owner: https://github.com/Arcadia-1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6cb6fa7a7dac70fc0d4120126d8cf74258e6637b -
Trigger Event:
push
-
Statement type:
File details
Details for the file evas_sim-0.8.7-py3-none-manylinux2014_x86_64.whl.
File metadata
- Download URL: evas_sim-0.8.7-py3-none-manylinux2014_x86_64.whl
- Upload date:
- Size: 815.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4086e12a55fa4a13910711b98d1f019369dccf609daf2e14cb744ba5a0e7416d
|
|
| MD5 |
290d3da1518818e6531846a73a5baf91
|
|
| BLAKE2b-256 |
06e2b5029cc61824b4130804f3c9431876aaa75287a294f0bbff49c20a4a6787
|
Provenance
The following attestation bundles were made for evas_sim-0.8.7-py3-none-manylinux2014_x86_64.whl:
Publisher:
publish.yml on Arcadia-1/EVAS
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
evas_sim-0.8.7-py3-none-manylinux2014_x86_64.whl -
Subject digest:
4086e12a55fa4a13910711b98d1f019369dccf609daf2e14cb744ba5a0e7416d - Sigstore transparency entry: 2271024211
- Sigstore integration time:
-
Permalink:
Arcadia-1/EVAS@6cb6fa7a7dac70fc0d4120126d8cf74258e6637b -
Branch / Tag:
refs/tags/v0.8.7 - Owner: https://github.com/Arcadia-1
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@6cb6fa7a7dac70fc0d4120126d8cf74258e6637b -
Trigger Event:
push
-
Statement type: