Skip to main content

Python Bindings of Spike RISC-V ISA Simulator

Project description

Python Bindings of Spike RISC-V ISA Simulator

LIU Yu <liuy@huimtlab.org>
2026/3/1 (v0.0.5)

Introduction

This project provides Python bindings for the Spike RISC-V ISA Simulator. The Pythonic Spike (or PySpike) opens up Spike's C++ internals (such as RISC-V disassembler, processors, controllers, peripherals, etc.) for interoperation with Python scripts. It enables users to write ISA / RoCC extensions and MMIO device models in Python, and plug them into vanilla Spike for (co-)simulating complex hardware systems. Through integrating Spike more seamlessly into the Python ecosystem, PySpike aims to boost the agility of Python-based hardware verification tools and workflows.

PyPI package: spike

Getting Started

PySpike requires: Python 3.8+.

Install the wheel package with pip.

$ pip install --pre spike

PySpike ships the original command-line tool spike, a.k.a vanilla Spike, within its wheel package. You can confirm its availability using,

$ spike --help
Spike RISC-V ISA Simulator 0.0.5...
...

There is also a 100%-compatible command-line wrapper called pyspike, with additional support for Python-based ISA / MMIO / RoCC extensions via --extlib=<name>.

$ pyspike \
    --isa=rv32imc_xmyisa --priv=m \
    --pc=0x90000000 \
    -m0x90000000:0x4000000 \
    --extlib=myisa.py \
    --extlib=mydev.py \
    --device=mydev,0x20000000 \
    tests/data/libc-printf_hello.elf
Hello, World!

Quick ISA Extension

An ISA extension implements one or more custom instructions and / or control-state registers (CSRs) for Spike's RISC-V processor models. With PySpike, an ISA extension is a Python class that inherits riscv.isa.ISA. It should implement a minimum of two methods: get_instructions and get_disasms. The former provides functional models of one or more custom instructions, and the latter provides their disassemblers. Other optional methods include get_csrs and reset, for providing custom CSRs and resetting extension states, respectively. Use decorator @isa.register("myisa") to register the extension under the name myisa.

from typing import List
from riscv import isa
from riscv.csrs import csr_t
from riscv.disasm import disasm_insn_t
from riscv.processor import insn_desc_t, processor_t

@isa.register("myisa")
class MyISA(isa.ISA):
    def __init__(self): ...
    def get_instructions(self, proc: processor_t) -> List[insn_desc_t]: ...
    def get_disasms(self, proc: processor_t) -> List[disasm_insn_t]: ...
    def get_csrs(self, proc: processor_t) -> List[csr_t]: ...
    def reset(self, proc: processor_t) -> None: ...

Quick Device Model

Likewise to the ISA extension, a device model implements a custom memory-mapped input/output (MMIO) peripheral for Spike's simulated system bus. With PySpike, a device model is a Python class that inherits riscv.dev.MMIO. It should implement a minimum of three methods: __init__, load, and store. The former initializes the model, the latter two handle memory read and write operations. Other optional methods include size and tick, for obtaining the size of memory-mapped address space, and shifting device states, respectively. Use decorator @dev.register("mydev") to register the model under the name mydev.

from typing import Optional
from riscv import dev
from riscv.sim import sim_t

@dev.register("mydev")
class MyDEV(dev.MMIO):
    def __init__(self, sim: sim_t, args: Optional[str] = None): ...
    def load(self, addr: int, size: int) -> bytes: ...
    def store(self, addr: int, data: bytes) -> None: ...
    def size(self) -> int: ...
    def tick(self, rtc_ticks: int) -> None:

Development

Getting Source Code

$ git clone --recurse-submodules https://github.com/huimtlab/pyspike
$ cd pyspike

Setting Up Develop Environment

Install with pip in editable mode. This will setup development dependencies as well.

$ python -m venv .venv
$ source .venv/bin/activate
(.venv) $ python -m pip install -e '.[dev]'

Running Tests

Run the built-in test suite with pytest.

(.venv) $ python -m pytest -v

Running Tests with Coverage

To enable coverage report, rebuild the extension module with --cov option, then re-run the test suite also with --cov option. You should see the coverage report by the end of the test output.

Note, if leaving out the first step, the C++ code will not show up in the coverage report.

(.venv) $ python setup.py build_ext --inplace --cov
(.venv) $ python -m pytest -v --cov

Optionally, you can generate HTML coverage report from the lcov data files.

(.venv) $ genhtml -o coverage --substitute "s#^#$PWD/#g" *.lcov

Packaging

(.venv) $ python -m build

Download files

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

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

spike-0.0.5.dev20-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (208.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

spike-0.0.5.dev20-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (208.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

spike-0.0.5.dev20-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (208.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

spike-0.0.5.dev20-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (208.8 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

spike-0.0.5.dev20-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (208.8 MB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

File details

Details for the file spike-0.0.5.dev20-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for spike-0.0.5.dev20-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 0378395edde36b4409372ee7b7fb5de567e82fbfc64b6005dde1cc43d0d8057e
MD5 3d30242fba60b49d339ad1b90fb349fe
BLAKE2b-256 72a9a97ff022e03172e5d6a107f0f14075a0ec7799d14ea2d8e6ef25b80518ea

See more details on using hashes here.

File details

Details for the file spike-0.0.5.dev20-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for spike-0.0.5.dev20-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 4f83f2efbf1c28b751dded81e83189efca86571a61ebefc3ddd5d9471b897bbf
MD5 6adf13ad0e654e822794b324a1097772
BLAKE2b-256 46e26353639d575c56f051198daa5197912c76276928a202ec564308a8171a3f

See more details on using hashes here.

File details

Details for the file spike-0.0.5.dev20-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for spike-0.0.5.dev20-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 79296c00ed6707f138b69bc3a8cb5745a4c6d1bd0fd0ca531228f4824e79bdfe
MD5 4a21a7753415d17fde205dc8bb9ae30d
BLAKE2b-256 3d0917fcb930e84862c6c8bddfd3c9808c6cc1f53d3278517886f2f40b568e99

See more details on using hashes here.

File details

Details for the file spike-0.0.5.dev20-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for spike-0.0.5.dev20-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 30c8ab9ddd8b2ebfccd2b894a68c6a327bd5a923117a1598629c071b8f4b3ae6
MD5 ce4dc3ae4d8818ca92d7969615b966f3
BLAKE2b-256 83e7a8e49d2cf929e0c40426b045d8c7f62aabde857a147fc1b9f86c5bfeca54

See more details on using hashes here.

File details

Details for the file spike-0.0.5.dev20-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for spike-0.0.5.dev20-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 c3ac9b8f37539ce26fb06a3f662115995f5789bd2b15d24598ad439f39da4778
MD5 7ab1694e6bf029c56d7020ef12e296ef
BLAKE2b-256 8ba491adb7565057a2b5a1f3858c4a669f2dbe905b7592ea7b81e9ef5cd0b06d

See more details on using hashes here.

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