Skip to main content

rvsim

PyPI crates.io ISA Tests ISA Boots Linux License

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() and cortex_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:

willmccallion.github.io/rvsim

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)

Source distribution for rvsim 2.0.1
File Size Uploaded
rvsim-2.0.1.tar.gz 913.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for rvsim 2.0.1
File
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 log

Release 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 log

Release 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 log

Release 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 log

Release 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 log

Release 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

Release history Release notifications | RSS feed

This release

2.0.1 This release

6 release files

2.0.0

6 release files

1.2.2

6 release files

1.2.1

6 release files

1.2.0

6 release files

1.1.0

6 release files

1.0.0

6 release files

0.12.0

6 release files

0.11.0

6 release files

0.10.2

6 release files

0.10.1

6 release files

0.10.0

6 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page