
Funktionaler RISC-V-ISA-Simulator, der mehrere Erweiterungen (RV32/64, V, Kryptografie) mit interaktivem Debug-Modus, GDB-Integration und instruktionsgenauer Modellierung für die Hardware-Software-Koentwicklung und Architekturforschung unterstützt.
Spike, der RISC-V ISA Simulator, implementiert ein funktionales Modell eines oder mehrerer RISC-V Harts. Er ist nach dem goldenen Nagel benannt, der zur Feier der Fertigstellung der US-amerikanischen transkontinentalen Eisenbahn verwendet wurde.
Spike unterstützt die folgenden RISC-V ISA-Funktionen:
Projekte werden in erster Linie versioniert, um anzuzeigen, wann die API erweitert oder inkompatibel gemacht wurde. In diesem Sinne strebt Spike an, dem SemVer Versionierungsschema zu folgen, bei dem Hauptversionsnummern erhöht werden, wenn rückwärtsinkompatible API-Änderungen vorgenommen werden; Nebenversionsnummern werden erhöht, wenn neue APIs hinzugefügt werden; und Patch-Versionsnummern werden erhöht, wenn Fehler auf rückwärtskompatible Weise behoben werden.
Spikes wichtigste öffentliche API ist die RISC-V ISA. Die C++-Schnittstelle zu Spikes Interna wird derzeit nicht als öffentliche API betrachtet, und rückwärtsinkompatible Änderungen an dieser Schnittstelle werden ohne Erhöhung der Hauptversionsnummer vorgenommen.
Wir gehen davon aus, dass die Umgebungsvariable RISCV auf den RISC-V-Tools- Installationspfad gesetzt ist.
$ apt-get install device-tree-compiler
$ apt-get install libboost-regex-dev libboost-system-dev
$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ make
$ [sudo] make install
Wenn Ihr System den yum-Paketmanager verwendet, können Sie
yum install dtc für den ersten Schritt einsetzen.
Sie können den zweiten Schritt überspringen, wenn Sie die Befehls-I/O über Socket für den interaktiven Debug-Modus nicht benötigen.
Installieren Sie bash, gmake, dtc und verwenden Sie clang.
$ pkg_add bash gmake dtc
$ exec bash
$ export CC=cc; export CXX=c++
$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ gmake
$ [doas] make install
Installieren Sie spike (siehe Build-Schritte), riscv-gnu-toolchain und riscv-pk.
Schreiben Sie ein kurzes C-Programm und nennen Sie es hello.c. Kompilieren Sie es dann in eine RISC-V- ELF-Binärdatei namens hello:
$ riscv64-unknown-elf-gcc -o hello hello.c
Jetzt können Sie das Programm auf dem Proxy-Kernel simulieren:
$ spike pk hello
Das Hinzufügen einer Instruktion zum Simulator erfordert zwei Schritte:
Beschreiben Sie das funktionale Verhalten der Instruktion in der Datei riscv/insns/<new_instruction_name>.h. Untersuchen Sie andere Instruktionen in diesem Verzeichnis als Ausgangspunkt.
Fügen Sie den Opcode und die Opcode-Maske zu riscv/opcodes.h hinzu. Alternativ können Sie es zum riscv-opcodes-Paket hinzufügen, und es wird dies für Sie tun:
$ cd ../riscv-opcodes
$ vi opcodes // add a line for the new instruction
$ make install
Fügen Sie die Instruktion zu riscv/riscv.mk.in hinzu. Andernfalls wird die Instruktion nicht in den Build aufgenommen und als illegale Instruktion behandelt.
Erstellen Sie den Simulator neu.
Um den interaktiven Debug-Modus aufzurufen, starten Sie spike mit -d:
$ spike -d pk hello
Um den Inhalt eines Ganzzahlregisters zu sehen (0 steht für Core 0):
: reg 0 a0
Um den Inhalt eines Gleitkommaregisters zu sehen:
: fregs 0 ft0
oder:
: fregd 0 ft0
je nachdem, ob Sie das Register als einfach- oder doppeltpräzise ausgeben möchten.
Um den Inhalt einer Speicherstelle zu sehen (physische Adresse in Hex):
: mem 2020
Um den Inhalt des Speichers mit einer virtuellen Adresse zu sehen (0 für Core 0):
: mem 0 2020
Sie können um eine Instruktion vorrücken, indem Sie die Eingabetaste drücken. Sie können auch bis zum Erreichen einer gewünschten Gleichheit ausführen:
: until pc 0 2020 (stop when pc=2020)
: until reg 0 mie a (stop when register mie=0xa)
: until mem 2020 50a9907311096993 (stop when mem[2020]=50a9907311096993)
Alternativ können Sie so lange ausführen, wie eine Gleichheit wahr ist:
: while mem 2020 50a9907311096993
Sie können die Ausführung unbegrenzt fortsetzen durch:
: r
Zu jedem Zeitpunkt während der Ausführung (auch ohne -d) können Sie den
interaktiven Debug-Modus mit <control>-<c> aufrufen.
Um die Simulation von der Debug-Eingabeaufforderung aus zu beenden, drücken Sie <control>-<c> oder:
: q
Eine Alternative zum interaktiven Debug-Modus ist das Anhängen mit gdb. Da spike versucht, wie echte Hardware zu sein, benötigen Sie dafür auch OpenOCD. Wir verwenden das folgende Testprogramm:
$ cat rot13.c
#include <stdio.h>
char text[] = "Vafgehpgvba frgf jnag gb or serr!";
// Don't use the stack, because sp isn't set up.
volatile int wait = 1;