rvsim
Cycle-level RISC-V 64-bit system simulator with a composable Python API for architecture research and design-space exploration.
Documentation · PyPI · Rust Core (crates.io) · Changelog
rvsim models a complete superscalar processor cycle by cycle. It implements two pluggable microarchitectural backends — out-of-order and in-order — sharing a common frontend, memory hierarchy, and SoC device layer. It boots Linux 6.6 through OpenSBI to a BusyBox shell and passes all 134/134 riscv-tests. The chipsalliance riscv-vector-tests suite is cross-checked against spike.
Accuracy. rvsim simulates every cycle, but it is not cycle-accurate to any one machine yet. It models how real cores behave and measures itself two ways: against gem5's O3 CPU, where compute- and branch-bound kernels are within a few percent and memory- and vector-bound ones are still 10 to 60% apart (Error against gem5), and against hardware, where the
p550()andcortex_a72()presets reproduce their measured cache and memory latencies and the A72 preset runs CoreMark within 6% of a Raspberry Pi 4 (Linux Benchmarks). We are working to close the remaining gaps.
Install
pip install rvsim
Requires Python 3.10+. Ships pre-built wheels for Linux x86_64.
Quick Start
from rvsim import Config, BranchPredictor, Cache, Environment
config = Config(
width=4,
branch_predictor=BranchPredictor.TAGE(),
l1d=Cache("32KB", ways=8, latency=1, mshr_count=8),
l2=Cache("256KB", ways=8, latency=10),
)
result = Environment(binary="software/bin/programs/qsort.elf", config=config).run()
print(result.stats.query(r"^ipc$|bp\.committed\.(accuracy|mispredicts)|(l1d|l2)\.miss_rate"))
core0.bp.committed.accuracy 0.8750
core0.bp.committed.mispredicts 386,904
core0.cache.l1d.miss_rate 0.0914
core0.cache.l2.miss_rate 0.5149
ipc 1.1588
Stats are keyed by path (core0.cache.l1d.misses, hart0.retired_insts);
see Stats & Observability.
Features
Two Pipeline Backends
Out-of-order superscalar — Physical register files with speculative and committed rename maps and branch checkpoints, CAM-style issue queue with wakeup/select and oldest-first priority, stores that issue their address and data separately, reorder buffer for in-order commit with precise exceptions, load queue with store-set memory-dependence prediction, store buffer with forwarding, and a configurable functional unit pool (per-type counts and latencies).
In-order — Configurable width, scoreboard-based operand tracking, program-order issue onto the same functional unit pool, backpressure gating. Shares the same frontend and commit/memory/writeback stages as the O3 backend, making both modes directly comparable on identical workloads.
Both backends enforce identical serialization semantics: system/CSR instructions wait for all older completions, FENCE respects predecessor/successor ordering bits, loads wait for older store address resolution.
Memory Hierarchy
- SV39 / SV48 / SV57 virtual memory — separate iTLB/dTLB, an optional shared L2 TLB, a hardware page table walker whose PTE reads go through the L1D, and Svade or Svadu A/D handling
- L1i / L1d / L2 / L3 caches — independently configurable size, associativity, latency, and replacement policy (LRU, PLRU, FIFO, Random, MRU)
- Non-blocking caches at every level via MSHRs with request coalescing and writeback buffers; caches hold tags only and every access takes effect where it is served
- Hardware prefetchers per cache level: next-line, stride, stream, tagged
- Inclusion policies: non-inclusive, inclusive (back-invalidation), exclusive (L1-L2 swap)
- Memory controllers — fixed latency, a row-buffer DRAM model, or a JEDEC DDR5 controller with command timing, refresh and power-down
Branch Prediction
Six pluggable predictors with shared BTB, RAS, and global history register:
| Predictor | Description |
|---|---|
| Static | Always not-taken (baseline) |
| GShare | PC XOR global history, 2-bit counters |
| Tournament | Local + global two-level adaptive with meta-predictor |
| Perceptron | Neural predictor with weight vectors |
| TAGE | Tagged geometric history lengths |
| ScLTage | TAGE-SC-L (TAGE, loop predictor, statistical corrector) with ITTAGE for indirect targets; defaults to Seznec's 64KB CBP-5 configuration |
RAS recognizes both x1 and x5 as link registers per RISC-V spec Table 2.1, including coroutine swap detection.
ISA & Privileged Architecture
RV64IMAFDC + V — base integer, multiply/divide, atomics (LR/SC + AMO), single/double float with IEEE 754 NaN-boxing, compressed instructions, and the V vector extension (RVV 1.0), with Zba, Zbb, Zbc, Zbs, Zbkb, Zbkx and Zfh. M/S/U privilege modes, trap delegation, MRET/SRET, WFI, SFENCE.VMA, FENCE/FENCE.I, PMP (16 regions), Sstc, Svadu and Sdtrig triggers. Cache management ops via Zicbom and Zicboz.
Multi-core systems (Config(hart_count=N)) give every hart its own core and private caches behind a MESI coherence fabric: a broadcast or snoop-filter home agent at the LLC and a crossbar, ring, mesh, torus or hypercube interconnect, with per-hart CLINT and PLIC contexts and a device tree that enumerates every hart.
The vector extension supports configurable VLEN (default 128) and ELEN=64. Implemented sub-extensions: Zvfh (half-precision FP), Zvbb / Zvbc (bit-manip and carryless multiply), Zvkn (AES, SHA-256 and SHA-512), Zvks (SM4 and SM3), Zvkg (GHASH). Vector ops are cross-checked against spike.
Passes all 134/134 tests in riscv-software-src/riscv-tests and the chipsalliance riscv-vector-tests suite.
SoC Devices
CLINT timer, PLIC interrupt controller, 16550A UART, VirtIO MMIO block device, Goldfish RTC, SYSCON (poweroff/reboot), HTIF. Auto-generated device tree blob.
Python API
Comparing Configurations
from rvsim import BranchPredictor, Config, Environment, Stats
rows = {}
for name, bp in [("GShare", BranchPredictor.GShare()), ("TAGE", BranchPredictor.TAGE())]:
r = Environment("program.elf", Config(branch_predictor=bp)).run()
rows[name] = r.stats
print(Stats.tabulate(rows, title="Branch Predictor Comparison"))
Parallel Sweeps
Sweep distributes all (binary, config) combinations across CPU cores:
from rvsim import Sweep, Config, Cache
results = Sweep(
binaries=["qsort.elf", "mandelbrot.elf", "maze.elf"],
configs={
f"L1={s}": Config(l1d=Cache(s, ways=8, mshr_count=8), uart_quiet=True)
for s in ["8KB", "16KB", "32KB", "64KB"]
},
).run(parallel=True)
results.compare(metrics=["ipc", "core0.cache.l1d.misses"], baseline="L1=8KB")
Low-Level Control
from rvsim import Simulator, Config, reg, csr
cpu = Simulator(Config(width=4), binary="program.elf")
for _ in range(1000):
cpu.tick()
cpu.pipeline_snapshot().visualize()
cpu.run_until(pc=0x80001234)
cpu.run_until(privilege="U")
print(hex(cpu.regs[reg.A0]))
print(hex(cpu.csrs[csr.MSTATUS]))
print(cpu.mem64[0x80001000])
cpu.save("checkpoint.bin")
Analysis Scripts
Ready-to-run design-space exploration in examples/analysis/:
| Script | Description |
|---|---|
branch_predict.py |
Accuracy comparison across all six predictors |
cache_sweep.py |
L1D size vs miss rate and IPC impact |
design_space.py |
Multi-dimensional width x cache size sweep |
o3_inorder.py |
Out-of-order vs in-order backend comparison |
width_scaling.py |
IPC vs superscalar width |
stall_breakdown.py |
Stall cycles by cause |
top_down.py |
Top-down microarchitecture analysis |
inst_mix.py |
Instruction class breakdown |
rvsim examples/analysis/branch_predict.py
rvsim examples/analysis/cache_sweep.py --sizes 4KB 8KB 16KB 32KB 64KB
rvsim examples/analysis/o3_inorder.py --widths 1 2 4
Building from Source
Requires Rust (the version in rust-toolchain.toml), Python 3.10+, and a bare-metal RISC-V GCC (riscv64-elf-gcc by default; TARGET= overrides the prefix). nix develop provides all three.
git clone https://github.com/willmccallion/rvsim
cd rvsim
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements-dev.txt
maturin develop --release
make -C software
Linux Boot
Boots Linux 6.6 through OpenSBI to a BusyBox shell on both backends. The
default boot is eight out-of-order cores from the fast preset (64KB
TAGE-SC-L) with coherent private caches over a mesh and four channels of
DDR5-5600.
make -C software linux # Build kernel + rootfs via Buildroot
make run-linux # Boot 8 SMP cores (login: root, no password)
rvsim tools/boot_linux.py --harts 1 # Single core
Documentation
Full documentation including architecture deep-dives, API reference, and examples:
Contributing
See CONTRIBUTING.md for the repository layout, the checks a change must pass, and the policy on AI-assisted contributions.
License
Licensed under either of MIT or Apache-2.0, at your option.
Metadata
Release files for rvsim 2.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| rvsim-2.0.1.tar.gz | 913.1 kB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| rvsim-2.0.1-cp310-abi3-win_amd64.whl | CPython 3.10 | abi3 | Windows x86-64 | Details |
| rvsim-2.0.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ x86-64 | Details |
| rvsim-2.0.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl | CPython 3.10 | abi3 | Linux glibc 2.17+ ARM64 | Details |
| rvsim-2.0.1-cp310-abi3-macosx_11_0_arm64.whl | CPython 3.10 | abi3 | macOS 11.0+ ARM64 | Details |
| rvsim-2.0.1-cp310-abi3-macosx_10_12_x86_64.whl | CPython 3.10 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 9.0 MB
Release files / rvsim-2.0.1.tar.gz
| Download URL | rvsim-2.0.1.tar.gz |
|---|---|
| Size | 913.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
38e0585b23e10d5dc65715e904c6fcf7c5114879b4ad81b47df01d08f2fecb9b
|
|
BLAKE2b-256 checksum How to use checksums |
1034eb6f7a84073b5aef1ecf1ff08de4b1c73c5dc12dad7d995b118edad2fb7c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 7, 2026.
Transparency logRelease files / rvsim-2.0.1-cp310-abi3-win_amd64.whl
| Download URL | rvsim-2.0.1-cp310-abi3-win_amd64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 Windows x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
1eb84a48ef26edc61000b4f205a1446bedc924e8cdcdd7d5ccd7661e54f4c14f
|
|
BLAKE2b-256 checksum How to use checksums |
371778d0e7141286bcf67b617381ba55af453a269375c1f8e2a6b888ee3a80a7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 7, 2026.
Transparency logRelease files / rvsim-2.0.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
| Download URL | rvsim-2.0.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl |
|---|---|
| Size | 1.7 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
036e79547af8610780eee4f38c04c9e2934e4ba29badb0817907124f210a0415
|
|
BLAKE2b-256 checksum How to use checksums |
6bb6de62110018d791bfaa1382dc377469ca5a47b41b51ea39852336d5d9b0f2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 7, 2026.
Transparency logRelease files / rvsim-2.0.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
| Download URL | rvsim-2.0.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 Linux glibc 2.17+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
af87a98e3136bbb90f203044c80d9eedb282f7bfbe71f38423910dcec27f2a46
|
|
BLAKE2b-256 checksum How to use checksums |
1bbb92490adb0cc1fc3ce30685c631b6e92e32f011042b2132e5219314913ea3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 7, 2026.
Transparency logRelease files / rvsim-2.0.1-cp310-abi3-macosx_11_0_arm64.whl
| Download URL | rvsim-2.0.1-cp310-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 1.5 MB |
| Tags | CPython 3.10 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c8215ce165714072958bc866f6fde3b24095fda373656439b619845892e42b23
|
|
BLAKE2b-256 checksum How to use checksums |
a8bad29745ae37488054144d53bcf4560e6c443ca617eae986b8da6936a16554
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 7, 2026.
Transparency logRelease files / rvsim-2.0.1-cp310-abi3-macosx_10_12_x86_64.whl
| Download URL | rvsim-2.0.1-cp310-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 1.6 MB |
| Tags | CPython 3.10 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
07709623eff8e990fc20fa1af57d592ae55f11975a8b9d2857aff65db9ae7bd1
|
|
BLAKE2b-256 checksum How to use checksums |
011ed176ff47ee7302ef755516bd3933f93444ff811d7b56bb2b8e4be61f72cf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
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 Oct 7, 2026.
Transparency log