The RVVTS Framework is a modular, open-source framework designed for comprehensive testing of RISC-V Vector (RVV) implementations. It addresses the complexity of RVV's 600+ configurable instructions by supporting both positive and negative testing scenarios. The framework introduces a novel Single Instruction Isolation with Code Minimization technique, which drastically reduces manual effort required to analyze failing test cases.
RVVTS automates the entire verification process, from test generation and execution to coverage measurement and failure analysis. By isolating failing instructions and minimizing the associated code, it streamlines debugging and helps detect bugs more efficiently. The included pre-generated test sets achieve functional coverage of over 94% and have uncovered new bugs in RVV implementations of RISC-V VP++ and QEMU.
The framework is implemented in Python and is highly flexible. It is suitable for both automated and interactive debugging workflows through its integration with Jupyter notebooks.
More information on RVVTS can be found in the publications linked in the last section.
├── README.md ... This file
├── config_host.py ... Host-related configurations (see Installation/Setup section!)
├── config_base.py ... Internal configurations (modify only if you know what you are doing!)
├── FuzzCodeErrMinRunnerTests.ipynb ... Jupyter notebook demonstrating interactive and
semi-automated testing -> Good starting point for experiments!
├── CovGuidedFuzzerGenRunnerTests.ipynb ... Jupyter notebook demonstrating test set generation
├── CovGuidedTestsetGenerator.ipynb ... Jupyter notebook demonstrating parallelized test-set generation
(e.g. directory "Testsets")
├── TestsetCodeErrMinRunnerTests.ipynb ... Jupyter notebook demonstrating execution of pre-generated
test sets
├── LICENSE ... BSD 3-clause "New" or "Revised" License
├── DUTS ... Additional material for specific DUTs (patches, ...)
└── rvvts ... The core rvvts Python framework
It is recommended to install the following packages. However, you can also follow the individual installation instructions of Spike, RISC-V VP++, QEMU, and PULP Ara.
On Debian/Ubuntu:
sudo apt install cmake autoconf automake autotools-dev clang-format-19 curl libmpc-dev libmpfr-dev libgmp-dev gawk build-essential bison flex texinfo libgoogle-perftools-dev libtool patchutils bc zlib1g-dev libexpat-dev libboost-iostreams-dev libboost-program-options-dev libboost-log-dev qtbase5-dev qt5-qmake libvncserver-dev device-tree-compiler nlohmann-json3-dev help2man libfl-dev perlRVVTS needs at least Python version 3.11.
Example setup for a new Python 3.11 Conda environment:
- Install Miniconda
- See https://engineeringfordatascience.com/posts/install_miniconda_from_the_command_line/
- Restart the terminal after installation
- Set up the environment
conda create --name python_rvvts python=3.11 - Activate the environment
conda activate python_rvvts
The Python packages required by RVVTS can be installed with:
pip install numpy jsonpickle jupyter
The riscv-gnu-toolchain is used by RVVTS (i) to translate generated or loaded code fragments into executable RISC-V programs (GCC), and (ii) to control execution and extract machine states (GDB).
- Clone the RISC-V GNU Toolchain and enter the directory
git clone https://github.com/riscv-collab/riscv-gnu-toolchain.git cd riscv-gnu-toolchain - Select a specific toolchain version (e.g., 2026.06.06)
git checkout 2026.06.06 - Build (in local directory)
You should now have the executable files
./configure --prefix=$(pwd) make newlib -j$(nproc)riscv64-unknown-elf-gccandriscv64-unknown-elf-gdbin directorybin. - Update
gcc_binandgdb_bininconfig_host.py. Use the absolute paths to the createdriscv64-unknown-elf-gccandriscv64-unknown-elf-gdbexecutables
More detailed build instructions can be found in the documentation of the RISC-V GNU toolchain.
The riscvOVPsim simulator is optionally used by RVVTS to obtain functional coverage values.
riscvOVPsim is free but not open source. Binaries are distributed via GitHub: https://github.com/riscv-ovpsim/imperas-riscv-tests.
Note: At the time of writing, there are no working versions of riscvOVPsim available!
The distributed binaries are locked via a date check and the repository has not been updated with new versions for some time now.
- Clone riscvOVPsim
You should now have the executable file
git clone https://github.com/riscv-ovpsim/imperas-riscv-tests.git cd imperas-riscv-testsriscvOVPsim.exein directoryriscv-ovpsim/bin/Linux64. - Update
riscvovpsim_bininconfig_host.py. Use the absolute path to theriscvOVPsim.exeexecutable
The Spike simulator is used as a golden model for execution comparison by RVVTS and is therefore mandatory.
- Clone the Spike repository and enter the directory
git clone https://github.com/riscv-software-src/riscv-isa-sim.git cd riscv-isa-sim - Optional: Select a specific Spike version
git checkout ... - Build
You should now have an executable file
./configure make -j$(nproc)spikein this directory. - Update
spike_bininconfig_host.py. Use the absolute path to the createdspikeexecutable
More detailed build instructions can be found in the documentation of the Spike simulator.
SAIL-RISC-V is an open-source executable formal model of the RISC-V ISA. RVVTS can use its C emulator as a reference model or as one of the DUTs currently supported by RVVTS.
- Clone SAIL-RISC-V and enter the directory
git clone https://github.com/riscv/sail-riscv.git cd sail-riscv - Select the tested SAIL-RISC-V version
Tested with a33475aeb80090127433b5a8b30e717edaa19e71 (tag 2026-02-16-a33475a / 0.10)
git checkout a33475aeb80090127433b5a8b30e717edaa19e71 - Apply the RVVTS DUT Patch located in
DUTS/SAIL-RISC-V/sailrv_rvvts_dut_v1.patch(v1 compatible with a33475aeb80090127433b5a8b30e717edaa19e71)git am <rvvts>/DUTS/SAIL-RISC-V/sailrv_rvvts_dut_v1.patch - Build the C emulator
You should now have the executable file
./build_simulator.shsail_riscv_simin directorybuild/c_emulator. - Update
sail_riscv_bininconfig_host.py. Use the absolute path tobuild/c_emulator/sail_riscv_sim
RISC-V VP++ is an open-source, SystemC-based RISC-V virtual prototype with support for RISC-V Vector, and is one of the DUTs currently supported by RVVTS.
- Clone RISC-V VP++ and enter the directory
git clone https://github.com/ics-jku/riscv-vp-plusplus.git cd riscv-vp-plusplus - Optional: Select a specific version
git checkout ... - Build
You should now have the executable files
make vps -j$(nproc)tiny32-vpandtiny64-vpin directoryvp/build/bin. - Update
vp_pathinconfig_host.py. Use the absolute path tovp/build/bin
More detailed build instructions can be found in the documentation of RISC-V VP++.
QEMU is an open-source emulator with support for RISC-V and RISC-V Vector, and is one of the DUTs currently supported by RVVTS.
- Clone QEMU and enter the directory
git clone https://github.com/qemu/qemu.git cd qemu - Optional: Select a specific QEMU version
git checkout ... - Build (in local directory)
You should now have the executable files
./configure --target-list=riscv32-softmmu,riscv64-softmmu make -j$(nproc)qemu-system-riscv32andqemu-system-riscv64in directorybuild. - Update
qemu_pathinconfig_host.py. Use the absolute path tobuild
PULP Ara is an open-source, 64-bit RTL implementation of a RISC-V vector unit. Developed as part of the PULP platform, it operates as a coprocessor for the CVA6 scalar core and supports version 1.0 of the RISC-V Vector Extension.
- Clone Ara and enter the directory
git clone https://github.com/pulp-platform/ara.git cd ara - Optional: Select a specific Ara version
Tested with a6436df6ad and ab4158aeeb
git checkout ab4158aeeb - Apply the RVVTS DUT Patch located in
DUTS/PULP_ARA/ara_rvvts_dut_v1.patch(v1 compatible with a6436df6ad and ab4158aeeb)git am <rvvts>/DUTS/PULP_ARA/ara_rvvts_dut_v1.patch - Build the verilated Ara model following the original build instructions (README.md)
Result:
<ara>/hardware/build/verilator/Vara_tb_verilator - Update
ara_tb_bininconfig_host.pyaccordingly.
After installation/setup:
- Switch to the RVVTS top-level directory
- If necessary, activate your virtual Python environment
e.g. condaconda activate python_rvvts - Start Jupyter Lab
jupyter lab
Your browser should now be open and display Jupyter Lab and the project structure as presented in the Project Structure section.
A good starting point for experiments is FuzzCodeErrMinRunnerTests.ipynb:
- Select your preferred
dutandxlenin the config cell - Run the notebook cell-by-cell
- "First Test": Generates a single random program, executes it on the reference simulator and DUT and shows a machine state difference report.
- If a deviation in the machine state is detected (potential failure) you can examine the minimized program causing the deviation by uncommenting the lines in the following cell.
- "Manual Experiments": Enter your own program to be executed and compared.
- "Automated Experiments": Automated runs of "First Test". Detailed statistics and failing instructions are shown live while the execution is running.
- "First Test": Generates a single random program, executes it on the reference simulator and DUT and shows a machine state difference report.
You can now investigate the other Jupyter notebooks as presented in the Project Structure section.
The initial paper on RVVTS was presented at ICCAD 2024 and is available as a .pdf.
The state of RVVTS from the initial paper (RVVTS version 1), including the pre-generated test sets, is available under the tag RVVTSv1_ICCAD_2024.
If you use RVVTS or find it useful, you can cite our paper as follows:
@inproceedings{SG:2024b,
author = {Manfred Schl{\"{a}}gl and Daniel Gro{\ss}e},
booktitle = {International Conference on Computer-Aided Design},
title = {Single Instruction Isolation for {RISC-V} Vector Test Failures},
year = {2024},
}
-
GLSVLSI 2026
Manfred Schlägl, Jonas Reichhardt, and Daniel Große. From generation to failure categorization: An open-source automated RTL verification framework for RVV. In ACM Great Lakes Symposium on VLSI (GLSVLSI), 2026.
Extends RVVTS with RTL support and an Automated Failure Categorization stage. Applied to the RTL implementation of Ara, the framework achieves more than 96% functional coverage, minimizes about 97% of the detected deviations, and groups failures into 16 categories.
-
RISC-V Summit Europe 2026
Manfred Schlägl, Katharina Ruep, and Daniel Große. Sail-RISC-V and Spike for RISC-V vector: Toward consistent golden reference behavior. In RISC-V Summit Europe, 2026.
Uses RVVTS to compare the RVV behavior of Sail-RISC-V and Spike. Positive tests show only 0.23% deviations, whereas negative tests reveal 3.73%, highlighting issues in Sail-RISC-V instruction-validity checks under dynamic configurations.
-
DATE 2026
Katharina Ruep, Manfred Schlägl, and Daniel Große. Late breaking results: Float fight – verifying floating-point behavior in RISC-V simulators. In Design, Automation and Test in Europe Conference (DATE), pages 1–3, 2026.
Introduces FP-RVVTS, an RVVTS extension for floating-point verification. It adds support for the RISC-V F, D, and Zfh extensions, improves failure isolation, achieves more than 95% functional coverage, and exposes bugs in several simulators and floating-point libraries.
[bib | DOI | base RVVTS material | .pdf]
-
MBMV 2025
Manfred Schlägl and Daniel Große. RVVTS: A modular, open-source framework for positive and negative testing of the RISC-V “V” vector extension (RVV). In ITG/GI/GMM-Workshop “Methoden und Beschreibungssprachen zur Modellierung und Verifikation von Schaltungen und Systemen” (MBMV), 2025.
Summarizes the RVVTS framework: grammar-based and coverage-guided test generation, positive and negative testing, automated execution, and Single Instruction Isolation with Code Minimization. The case studies confirm bugs in RISC-V VP++ and QEMU.
-
ICCAD 2024
Manfred Schlägl and Daniel Große. Single instruction isolation for RISC-V vector test failures. In IEEE/ACM International Conference on Computer-Aided Design (ICCAD), pages 156:1–156:9, 2024.
Introduces RVVTS as a modular open-source framework for positive and negative RVV testing. Its Single Instruction Isolation with Code Minimization technique reduces large sets of detected deviations to compact debugging cases while achieving more than 94% functional coverage.
-
RISC-V Summit Europe 2024
Manfred Schlägl and Daniel Große. Bounded load/stores in grammar-based code generation for testing the RISC-V vector extension. In RISC-V Summit Europe, 2024.
Presents a precursor to RVVTS: a grammar-based fuzzing approach for RVV testing. The paper focuses on generating valid vector load/store sequences by extending a context-free grammar with functions that add context-sensitive behavior.