A defined methodology
Ten steps, from linting to property checking and coverage collection, so you always know what to run next and why.
Version 1.0.0 now available
A Formal Verification Methodology for ASIC and FPGA designs
The first publicly available, general-purpose, open-source formal verification methodology for VHDL designs.
Get started Read the documentation
Universidad de Sevilla · Funded by ESA · Apache 2.0
FVM 1.0.0 Summary: uart_tx
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ status ┃ step ┃ results ┃
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
│ pass │ lint │ ok │
│ pass │ friendliness │ 98.14% │
│ pass │ rulecheck │ ok │
│ pass │ xverify │ 5I │
│ pass │ reachability │ 100.0% │
│ pass │ resets │ ok │
│ pass │ clocks │ ok │
│ pass │ prove │ │
│ │ Assumes │ 3 │
│ │ Asserts │ 5 │
│ │ └ Proven │ 5/5 │
│ │ Covers │ 8 │
│ │ └ Covered │ 8/8 │
│ │ └ Covered with Warning │ 8/8 │
│ pass │ prove.formalcover │ 100.0% │
│ pass │ prove.simcover │ 94.5% │
└────────┴───────────────────────────────┴─────────┘
What is FVM
FVM is the first publicly available, general-purpose, open-source formal verification methodology for VHDL designs. It combines a defined methodology, a helper tool to ease property writing, a build and test framework, and a repository of example designs. All fully documented!
Ten steps, from linting to property checking and coverage collection, so you always know what to run next and why.
Turns WaveDrom timing diagrams into reusable PSL sequences, so properties are built from the test plan you already wrote.
Six lines of Python run every tool, collect the results and generate reports for CI, the terminal and the browser.
Twelve designs of increasing complexity, plus documented techniques for reducing proof complexity when designs grow.
Who it is for
If you design or verify VHDL and want to use formal verification to increase the confidence in your designs, without duplicating your simulation effort, FVM is built for you. No prior formal experience is assumed: the examples start trivial and gradually grow in complexity.
Methodology
The automated tools run first, so you start finding issues while you are still writing properties. Property checking and coverage collection follow. The framework runs every step, in order, and reports the results.
No properties needed. You can optionally specify clock and reset domains.
lint
Static checks for potential issues
Questa Lintfriendliness
Estimate suitability for formal verification
Questa AutoCheckrulecheck
Find deadlocks, overflows and similar issues
Questa AutoCheckxverify
Study how unknown values propagate
Questa X-Checkreachability
Detect uncoverable elements
Questa CoverCheckresets
Find reset domain crossing issues
Questa RDCclocks
Find clock domain crossing issues
Questa CDCWritten as assert, assume and cover directives.
prove
Prove or disprove your properties
Questa PropCheckprove.formalcover
Compute formal code coverage
Questa PropCheckprove.simcover
Simulation coverage from reached covers
Questa SimulatorThe framework sits between you and the tools. Add your
sources, set the toplevel, call run(). It generates the
tool scripts, runs them, and produces reports: for the terminal, for CI systems,
and for the browser.
from fvm import FvmFramework
fvm = FvmFramework()
fvm.add_vhdl_sources("examples/uart_tx/*.vhd")
fvm.add_psl_sources("examples/uart_tx/*.psl")
fvm.set_toplevel("uart_tx")
fvm.run()
Results
A number of examples of increasing complexity, each one verified with the methodology. Formal verification found real bugs in designs that had already passed simulation.
With a specific frequency relation between read and write clocks, a reset on the write side could underflow the FIFO.
Some IPv6 headers carried incorrect values, caused by a problem in the top-level glue logic.
Returns correct data but signals an error in the last cycle of a timeout period, likely an off-by-one in the timeout counter or condition.
For real industry designs
Apart from the repository of examples, FVM has been successfully applied to real industrial cases.
SpaceFibre Port with Interface Layer, Lane Layer, Data Link Layer, Broadcast Layer, and Virtual Channel Layer.
Level-2 cache controller from the GRLIB IP Library.
Getting started
The framework is a Python package. Install it into a virtual environment, then follow the documentation to set up your first design.
pip3 install fvm-formal
You will also need the Questa formal tools with a valid license, and Java for the HTML reports
Publications
@article{FVM_methodology,
author = {Hipólito {Guzmán-Miranda} and Marcos {López García} and Alberto {Urbón Aguado}},
title = {{FVM}: {A} {F}ormal {V}erification {M}ethodology for {VHDL} designs},
journal = {IEEE Open Journal of the Computer Society},
url = {https://ieeexplore.ieee.org/document/11217165},
year = {2025},
volume = {6},
number = {},
pages = {1920-1933},
keywords = {Formal verification;Field programmable gate arrays;VHDL;Complexity theory;Market research;European Space Agency;Europe;Computer bugs;Codes;Clocks;Formal verification;verification methodology;VHDL;PSL;ASIC;FPGA},
doi = {10.1109/OJCS.2025.3625468}
}
See the full list of publications in the documentation
Repository
Development happens on GitLab. The GitHub repository is a mirror, so issues and merge requests belong on GitLab.
git clone https://gitlab.com/fvmformal/fvm.git
Also published on
PyPI as
fvm-formal.
Team
FVM is developed and maintained by:
Universidad de Sevilla
hguzman@us.es
Universidad de Sevilla
marlopgar40@alum.us.es
European Space Agency
Technical Officer