The repository or configuration that created this release differ from a previous release. View details.
vunit-yavs
The yavs simulator for VUnit, as a VUnit package. Add it in the run script before anything else,
then select yavs with VUNIT_SIMULATOR=yavs:
from vunit import VUnit
vu = VUnit.from_argv()
vu.add_package("vunit-yavs", allow_setup=True) # first: it provides the simulator
vu.add_vhdl_builtins()
vu.add_library("lib").add_source_files("*.vhd")
vu.main()
pip install vunit-yavs
VUNIT_SIMULATOR=yavs python run.py
The guide goes from installing to running, debugging and
coverage, and the debugger tutorial debugs a failing test with --yavs-debug, --yavs-surfer and --yavs-interactive. yavs is found on PATH, or in the directory named by VUNIT_YAVS_PATH. It needs VUnit 5.0.0.dev16
or later (pip install vunit-yavs installs it, a pre-release) and yavs 0.12.0 or later.
Options
| Sim or compile option | Passed to |
|---|---|
yavs.global_flags |
yavs analyze, run and elab |
yavs.a_flags |
yavs analyze |
yavs.elab_flags |
yavs run and elab |
yavs.sim_flags |
yavs run, such as --assert-summary, --activity, --hang-report, --wave-include: they pass through to the run |
yavs.max_threads (integer, at least 1) |
yavs run --threads=N, the most threads of one simulation |
enable_coverage (VUnit's option) |
yavs run --cov-file=<test output>/yavs/coverage.ycov --cov-test=<test name> with the kinds below (coverage, below) |
yavs.cov_kind (list of strings) |
yavs run --cov-kind=LIST: statement, branch, toggle, condition, assert, expression, combination, fsm. No kind is on by default |
yavs.init_files.after_load |
Console command files sourced after each vunit_load |
yavs.init_files.before_run |
Console command files sourced before each vunit_run |
yavs.init_file.gui |
A console command file sourced by vunit_user_init and at the start of --yavs-interactive |
| Command line | What it does |
|---|---|
--yavs-debug[=PORT] |
Runs the selected test under yavs run --dap=PORT (default 4711, 0 picks a free port) and prints where to attach; write the port as --yavs-debug=PORT |
--yavs-interactive |
Runs the selected test at the yavs console: a yavs> prompt at time 0 (below). Not with --yavs-debug: one of them drives the run |
--yavs-surfer[=HOST:PORT] |
Shows the waves of the one selected test in Surfer 0.6.0 or later while it runs (yavs run --surfer); strictly opt-in. Combines with --yavs-debug and --yavs-interactive, where the cursor follows the stops |
--yavs-max-threads N |
yavs.max_threads for every test that does not set it (environment variable VUNIT_YAVS_MAX_THREADS for run scripts with a command line of their own) |
--yavs-lint |
After compiling, runs yavs lint on every library of the project that is not external; a finding of severity error fails the compile step. To leave out VUnit's own libraries, put exclude: ['**/vunit/vhdl/**'] in yavs-lint.yaml. file_list in that file is not read: the project says which files a library has. Unknown keys in that file are warned about once, for the first library |
--yavs-cov=LETTERS |
Collects coverage in every simulation, as enable_coverage does for the tests it is set for, of the kinds the letters name: s statement, b branch, c condition, e expression, t toggle, f fsm, a assert, m combination (--yavs-cov=sbt). No kind is on by default; coverage without a kind fails the simulation, naming this flag, --yavs-cov-kind and yavs.cov_kind. Write the letters with = |
--yavs-cov-directives MODE |
apply or ignore: what yavs analyze, elab and run do with the -- yavs coverage exclude comments in the sources (--coverage-directives); without it yavs's default, apply, which checks them when compiling |
--yavs-cov-html DIR |
results.merge_coverage() also writes the HTML coverage report into DIR |
--yavs-cov-fail-under PCT |
results.merge_coverage() prints the coverage report and the run exits with status 1 when the total is below PCT percent; per kind with statement:90,branch:80 |
--yavs-cov-cobertura FILE, --yavs-cov-json FILE, --yavs-cov-lcov FILE, --yavs-cov-sonarqube FILE |
results.merge_coverage() also writes that export; in a script merge_coverage("coverage", args=["--lcov", "c.info"]) and so on |
--yavs-cov-embed-sources |
Passes --cov-embed-sources, as the sim option yavs.cov_embed_sources does for the tests it is set for: the HTML report then needs no checkout, and the source text travels with the database |
--yavs-cov-below PCT |
The report of results.merge_coverage() limits its table of instances to those below PCT percent, worst first |
--yavs-cov-detailed |
That report also lists what never ran, under each instance. In a script both go through merge_coverage("coverage", args=["--below=100", "--detailed"]) |
--yavs-cov-exclude FILE |
results.merge_coverage() reports without the items this exclusion file lists (yavs cov report --exclude); repeatable. A run script passes the same in merge_coverage("coverage", args=["--exclude", file]) |
--yavs-cov-config FILE |
results.merge_coverage() reads exclusion files, root and kinds from this file (yavs cov report --config). A run script passes args=["--config", file] |
--yavs-jobserver |
Lends the CPU slots of -p N that no test uses to the running simulations through a token server (below) |
Compiling: consecutive files of one library, standard and flags go to yavs analyze in one call. With a VUnit that has
--batch-compile and --parallel-compile (5.0.0.dev16 does not have them), those flags work with yavs too (several files per call, several calls at once).
Without yavs.max_threads or --yavs-max-threads no thread count is passed, and yavs runs with
its default, unless the token server runs (--threads=min(N, 4) for -p N, below). An explicit --threads in yavs.sim_flags comes after the cap and wins.
Coverage
vu.set_sim_option("enable_coverage", True) # or run with --yavs-cov=sb
vu.set_sim_option("yavs.cov_kind", ["statement", "branch"]) # the kinds; none is on by default
vu.main(post_run=lambda results: results.merge_coverage("coverage"))
Each simulation writes a yavs coverage database named after its test (yavs run --cov-file). The kinds come from the yavs.cov_kind sim option, else --yavs-cov-kind, else the letters of --yavs-cov=LETTERS; the letters and --yavs-cov-kind are not given together. results.merge_coverage("coverage")
merges them into coverage.ycov (yavs cov merge); with --yavs-cov-html DIR or
--yavs-cov-fail-under PCT, or arguments in merge_coverage("coverage", args=["--cobertura", "c.xml"]), it
then runs yavs cov report on the merged database. A total below the threshold makes the run exit with status 1
after VUnit has written its reports (a JUnit file included). For a CI gate:
VUNIT_SIMULATOR=yavs python run.py --yavs-cov=sbt --yavs-cov-html cov-html --yavs-cov-fail-under 85
Coverage cannot be combined with --yavs-debug. Reports, exclusions and the numbers are in the yavs
documentation page on coverage. The coverage options need the yavs release that has yavs cov report --fail-under.
Native libraries of VUnit packages
A VUnit package that loads a native library can ask the simulator interface how: YavsInterface
has foreign_language_interface = "VHPIDIRECT" (the VHDL calls the library through foreign
subprograms with a "VHPIDIRECT ..." attribute) and native_library_hooks(library_file), which
returns the simulator hooks that pass --load=<library_file> to every yavs elab and yavs run (so --elaborate works for a design that calls the library while it is elaborated); native_library_hooks(library_file, args="fat-pointer")
selects that argument layout for the library (a run.py without a package gives --load=LIB:args=fat-pointer in yavs.elab_flags). A package registers them with
context.register_simulator_hooks("yavs", **YavsInterface.native_library_hooks(library)). The repository's
tests/project_foreign is a package that builds a C library, with Python embedded where the host allows it, and a
testbench that calls Python from VHDL. A VHDL string reaches the library as one byte per character, and yavs reads a
UTF-8 source file as Latin-1 characters: give --encoding=latin1 to yavs.a_flags and (as a sim option) to
yavs.global_flags when the library needs the UTF-8 bytes of an accented literal.
Debugging one test
VUNIT_SIMULATOR=yavs python run.py lib.tb.test_name --yavs-debug
yavs waits for a Debug Adapter Protocol client on 127.0.0.1:4711 before the simulation starts;
press F5 or run "yavs: Attach" in VS Code with the yavs extension: no launch configuration is needed. Set breakpoints
in your own files: with location or check preprocessing on, the debugger maps the rewritten copies to them. When the
session ends, the test is reported as usual.
--yavs-debug runs one simulation. A second simulation of the run (a second test, or the same
test in another configuration) is an error before yavs starts, naming both tests. --yavs-debug
together with --elaborate or -p above 1 is an error at the start. A bare
--yavs-debug reads a following test name as its port: put test names first, or write
--yavs-debug=4711.
Every simulation (not --yavs-interactive) is started with --exit-on-stdin-close: it ends when the pipe the
runner keeps to its standard input closes, so killing only python run.py, even with SIGKILL, does not leave yavs
waiting for a debugger on the port. The waves and coverage files of such a run are not finished.
Token server
With -p N --yavs-jobserver (Linux and Windows) the run script starts a token server on
127.0.0.1 and lends the CPU slots of -p N that no test uses to the running simulations. Every
simulation runs with --threads=N (at most 4 unless yavs.max_threads or --yavs-max-threads says more) and gets
YAVS_TOKENS=<port>:<secret>, a secret of its own; yavs runs its extra threads only on tokens the
server lends, and asks for them only while it has work for them. One CPU slot per running test is
free, the other N - k (for k running tests) are lent: breadth first (every test gets one extra
before any gets a second) and newest test first within a round, at most yavs.max_threads - 1 per
test. A token in use is never taken back, so a test that starts while every token is out runs at
once: the total is N in the steady state, not at every instant. A simulation gives its tokens
back when it stops using them and when it ends in any way, also when it is killed. The tail of a
regression, a few long tests on a machine of idle slots, gets faster on designs whose processes
run in parallel well. If the server cannot start (a blocked local socket) the run warns and every
simulation uses one thread.
The console
VUNIT_SIMULATOR=yavs python run.py lib.tb.test_name --yavs-interactive
The test stops at time 0 at a yavs> prompt. All commands of the yavs console work (run, step,
examine, force, break, restart, source, help, quit), and this package adds VUnit's own,
which behave as in VUnit's other simulator interfaces. They are also in the Debug Console under
--yavs-debug.
| Command | What it does | Fails (an error at the console, the end of a script) when |
|---|---|---|
vunit_help |
Lists these commands | |
vunit_load [flags] |
Loads the test at time 0, with extra yavs run flags if given, and sources yavs.init_files.after_load |
The design does not elaborate, a flag is unknown or an init file fails |
vunit_user_init |
Sources yavs.init_file.gui |
The file fails |
vunit_run |
Sources yavs.init_files.before_run, runs, and prints Test Run Passed! |
The test suite did not finish, also when a breakpoint stops the run: Test Run Failed! |
vunit_compile |
Runs run.py --compile with your arguments, without --clean |
The compile fails |
vunit_restart |
vunit_compile, and if that worked: the new design at time 0, breakpoints kept, and vunit_run |
As vunit_compile, then vunit_run |
The yavs restart goes back to time 0 with the design as loaded; vunit_restart compiles first. Init files are
files of console commands; $vunit_tb_path and $vunit_tb_name are replaced as VUnit defines them. When you quit,
the test is reported as usual. A session that compiled at vunit_compile and failed keeps the old design loaded.
Licence
Mozilla Public License 2.0 (https://mozilla.org/MPL/2.0/), see the header of each file.
Metadata
Release files for vunit-yavs 0.12.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Change of provenance
The repository or configuration that created these release files differ from that of a previous release.
We recommend inspecting the repository and configuration before proceeding. View details.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| vunit_yavs-0.12.0.tar.gz | 57.8 kB | With provenance | Details for vunit_yavs-0.12.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| vunit_yavs-0.12.0-py3-none-any.whl | Python 3 | none | any | Details for vunit_yavs-0.12.0-py3-none-any.whl |
Total release size: 82.6 kB
Release files / vunit_yavs-0.12.0.tar.gz
Change of provenance
This file belongs to a release with changed provenance: the repository or configuration that created the release files differ from that of a previous release.
We recommend inspecting the repository and configuration before proceeding. View details.
| Download URL | vunit_yavs-0.12.0.tar.gz |
|---|---|
| Size | 57.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a4fa6794e0311be56d7270c1888b8141e0844d2f335913d8cd1224eeaf298463
|
|
BLAKE2b-256 checksum How to use checksums |
ee560f4e85f5a2a3678ca8de53cbe1281e4cfb972027d0d0aff00749b7c0d21d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 1, 2026.
Transparency logRelease files / vunit_yavs-0.12.0-py3-none-any.whl
Change of provenance
This file belongs to a release with changed provenance: the repository or configuration that created the release files differ from that of a previous release.
We recommend inspecting the repository and configuration before proceeding. View details.
| Download URL | vunit_yavs-0.12.0-py3-none-any.whl |
|---|---|
| Size | 24.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
570190776a7046fff8694c53ae9e7f9afdc9b255f2fc4e492179211bb8c48a6f
|
|
BLAKE2b-256 checksum How to use checksums |
67615589e2e5f8f1808b9ef47fda09e33c1e77f16d70062e15401963ecff9306
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
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 Nov 1, 2026.
Transparency logSecurity for vunit-yavs 0.12.0
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.
Change of provenance
The configuration that created this release differs from a previous release.
While this could reflect a routine change by the project maintainers, it may also indicate that the release files have been compromised.
Attestation for vunit_yavs-0.12.0.tar.gz
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 Nov 1, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.