Skip to main content

High-performance RISC-V cycle-accurate system simulator

Project description

rvsim

PyPI crates.io ISA Tests ISA Boots Linux License

Cycle-accurate 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 at cycle granularity. 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.

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="program.elf", config=config).run()
print(result.stats.query("ipc|branch|miss"))
  ipc                          0.9256
  branch_accuracy_pct         83.3474
  branch_mispredictions       497,026
  dcache_misses                79,488
  l2_misses                    21,374

Features

Two Pipeline Backends

Out-of-order superscalar — Physical register file with dual rename maps (speculative + committed), CAM-style issue queue with wakeup/select and oldest-first priority, reorder buffer for in-order commit with precise exceptions, load queue for memory ordering violation detection, store buffer with forwarding, and a configurable functional unit pool (per-type counts and latencies).

In-order scalar — Scoreboard-based operand tracking, FIFO issue queue with head-of-queue blocking, 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 virtual memory — separate iTLB/dTLB, shared L2 TLB, full hardware page table walker with A/D bit management
  • L1i / L1d / L2 / L3 caches — independently configurable size, associativity, latency, and replacement policy (LRU, PLRU, FIFO, Random, MRU)
  • Non-blocking L1D via MSHRs with request coalescing
  • Hardware prefetchers per cache level: next-line, stride, stream, tagged
  • Inclusion policies: non-inclusive, inclusive (back-invalidation), exclusive (L1-L2 swap)
  • DRAM controller — row-buffer aware timing (tCAS, tRAS, tPRE, row-miss, bank interleaving, refresh)

Branch Prediction

Five 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 length with loop predictor

RAS recognizes both x1 and x5 as link registers per RISC-V spec Table 2.1, including coroutine swap detection.

ISA & Privileged Architecture

RV64IMAFDC — base integer, multiply/divide, atomics (LR/SC + AMO), single/double float with IEEE 754 NaN-boxing, compressed instructions. M/S/U privilege modes, full CSR set, trap delegation, MRET/SRET, WFI, SFENCE.VMA, FENCE/FENCE.I, PMP (16 regions).

Passes all 134/134 tests in riscv-software-src/riscv-tests.

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", "dcache_misses"], baseline="L1=8KB")

Low-Level Control

from rvsim import Simulator, Config, reg, csr

cpu = Simulator().config(Config(width=4)).binary("program.elf").build()

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 scripts/analysis/:

Script Description
branch_predict.py Accuracy comparison across all 5 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 cycle attribution (memory, control, data)
top_down.py Top-down microarchitecture analysis
inst_mix.py Instruction class breakdown
rvsim scripts/analysis/branch_predict.py
rvsim scripts/analysis/cache_sweep.py --sizes 4KB 8KB 16KB 32KB 64KB
rvsim scripts/analysis/o3_inorder.py --widths 1 2 4

Building from Source

Requires Rust (2024 edition), Python 3.10+, and riscv64-unknown-elf-gcc.

git clone https://github.com/willmccallion/rvsim
cd rvsim
python3 -m venv .venv && source .venv/bin/activate
pip install maturin
maturin develop --release
make -C software

Linux Boot

Boots Linux 6.6 through OpenSBI to a BusyBox shell on both backends.

make -C software linux              # Build kernel + rootfs via Buildroot
rvsim scripts/setup/boot_linux.py   # Boot (login: root, no password)

Documentation

Full documentation including architecture deep-dives, API reference, and examples:

willmccallion.github.io/rvsim

License

Licensed under either of MIT or Apache-2.0, at your option.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rvsim-1.2.0.tar.gz (434.5 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rvsim-1.2.0-cp310-abi3-win_amd64.whl (795.6 kB view details)

Uploaded CPython 3.10+Windows x86-64

rvsim-1.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (928.6 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ x86-64

rvsim-1.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (856.7 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

rvsim-1.2.0-cp310-abi3-macosx_11_0_arm64.whl (805.3 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

rvsim-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl (865.4 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

Details for the file rvsim-1.2.0.tar.gz.

File metadata

  • Download URL: rvsim-1.2.0.tar.gz
  • Upload date:
  • Size: 434.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rvsim-1.2.0.tar.gz
Algorithm Hash digest
SHA256 a05f231bbe6e01dba614965a7abb8c2a119bdab1e110a0730a4d42c66bb04ec7
MD5 d908dc5bcd244ea5552bdeb7b4a2806a
BLAKE2b-256 0c8cb7cd0e8fcc2554b2c23c46292a68332c28fa28d9fd8bf54426047de9abe7

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.2.0.tar.gz:

Publisher: release.yml on willmccallion/rvsim

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rvsim-1.2.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: rvsim-1.2.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 795.6 kB
  • Tags: CPython 3.10+, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rvsim-1.2.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 cff5baf60dcb37e3e308643be82dc8d853373ef75998ce5e741978dea29143fc
MD5 68b517c60cba3ecaa12dc16694fc9edd
BLAKE2b-256 5014d67fe4f1dd5d0337b8ccbbea63b4c8d0becc64d418199b1c1e81598273ed

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.2.0-cp310-abi3-win_amd64.whl:

Publisher: release.yml on willmccallion/rvsim

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rvsim-1.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rvsim-1.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 950adb8a3a06022a9527c592185c0379bc2107bcf6761516f17db63ed559ba6e
MD5 464dd8fdd2c65211a2048f4258f8e832
BLAKE2b-256 7a27f5a528cacde5c0401bc49a3057eaee2e9dd158c7c2ae4133b123c75747e6

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.2.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: release.yml on willmccallion/rvsim

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rvsim-1.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rvsim-1.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 14fc9f8c4a88d670597101d3c3d51b54987369f0ba8e351c2aa4ab6880cc1d85
MD5 e9b3bfbad07266464cfc755220664761
BLAKE2b-256 12c1f252c4d6e2c7c026508d386e0158856a82af38f3ba8d3f0149f724223d5a

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.2.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:

Publisher: release.yml on willmccallion/rvsim

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rvsim-1.2.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: rvsim-1.2.0-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 805.3 kB
  • Tags: CPython 3.10+, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for rvsim-1.2.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d38236af374206ae8b14ac87dcec1fd7720de966ed3b824dbcb926a756d46af7
MD5 441fb4f6a61a841c532c2973c9be0e1b
BLAKE2b-256 5bb4b2179f9a1626c564874bd7eb3d9e732982886117455e09426d20c877f61c

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.2.0-cp310-abi3-macosx_11_0_arm64.whl:

Publisher: release.yml on willmccallion/rvsim

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file rvsim-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rvsim-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d80ce0351b700ee227c924d37304300f56118d7b325ac959355ad34003173b10
MD5 68145f4a7fd039f13ccb96455107ef3e
BLAKE2b-256 67636d1d64805c9765c8042b6e549c50f41d83a44dd42118c7b6c7aae697b7eb

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.2.0-cp310-abi3-macosx_10_12_x86_64.whl:

Publisher: release.yml on willmccallion/rvsim

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page