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.1.0.tar.gz (421.3 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.1.0-cp310-abi3-win_amd64.whl (781.9 kB view details)

Uploaded CPython 3.10+Windows x86-64

rvsim-1.1.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (892.4 kB view details)

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

rvsim-1.1.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (843.2 kB view details)

Uploaded CPython 3.10+manylinux: glibc 2.17+ ARM64

rvsim-1.1.0-cp310-abi3-macosx_11_0_arm64.whl (791.6 kB view details)

Uploaded CPython 3.10+macOS 11.0+ ARM64

rvsim-1.1.0-cp310-abi3-macosx_10_12_x86_64.whl (852.2 kB view details)

Uploaded CPython 3.10+macOS 10.12+ x86-64

File details

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

File metadata

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

File hashes

Hashes for rvsim-1.1.0.tar.gz
Algorithm Hash digest
SHA256 34ab4d5d96bd8afc13c50b49b9cd6027045a424e588efb256866241ced96e44c
MD5 9f46df8025cd114da692dd3c9cb3681f
BLAKE2b-256 c985e93793ea5764d469e4977fbbd025dacf6dac06c74ff45adc3c68b4fbbce1

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.1.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.1.0-cp310-abi3-win_amd64.whl.

File metadata

  • Download URL: rvsim-1.1.0-cp310-abi3-win_amd64.whl
  • Upload date:
  • Size: 781.9 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.1.0-cp310-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 1350260dc50aad110c60537bc256bfcec52bb2cebcd2202901be4adb5211760e
MD5 faa74f0a5a3f49bb0f724dd6116e7749
BLAKE2b-256 e9029f86bcbffba4ceb19ba9be3a76fb88cd343950c850f72f0c95d9a5169f10

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.1.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.1.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for rvsim-1.1.0-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 d905c804736ebb80163e0bf68a2ed0aa0cf734f6df0f0b0bf2c8683452edd31b
MD5 bfc1e33b9ed6d2227396299cd33c6834
BLAKE2b-256 1075aafd6a31b300d0fdcadd27dbc56404fea7df1fc61db9cf278aa817102d32

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.1.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.1.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for rvsim-1.1.0-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 0fc46901fbb69c43d20d9442224fe5ae271398f9dd91b70249acb2169e615674
MD5 50519ca233b3403017fc06ed3b3862a6
BLAKE2b-256 560556db5f70e7b4068f6f29cd85694b1b429157c75795269f86319be916baaa

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.1.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.1.0-cp310-abi3-macosx_11_0_arm64.whl.

File metadata

  • Download URL: rvsim-1.1.0-cp310-abi3-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 791.6 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.1.0-cp310-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 80a5e419cc252ec38841944c958cbad6bbc855f17ada5ce19cc2a9c5cca40cb4
MD5 c86691a74a12506e2eb33efbdf88e6a8
BLAKE2b-256 7101ec1e05de8f7575e72f6c8eb6aa15d1da3626af42bcc563bb7d3bb9ba0569

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.1.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.1.0-cp310-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rvsim-1.1.0-cp310-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 5d50bdea145037ba2be5ca5dd82612bbdb6cc6a564d0042c75596b4776086bd9
MD5 796ccd9f9cd7e7b6a2fa037c41ccff66
BLAKE2b-256 b989e5ed53dfdc872e0ae0abb3464dad679bb227d0988b1b49d0b0408e3451ec

See more details on using hashes here.

Provenance

The following attestation bundles were made for rvsim-1.1.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