
Simulatore funzionale dell'ISA RISC-V che supporta molteplici estensioni (RV32/64, V, crittografia) con modalità di debug interattivo, integrazione GDB e modellazione a livello di istruzione per lo sviluppo congiunto hardware-software e l'esplorazione dell'architettura.
Spike, il simulatore ISA RISC-V, implementa un modello funzionale di uno o più hart RISC-V. Prende il nome dallo spike d'oro usato per celebrare il completamento della ferrovia transcontinentale statunitense.
Spike supporta le seguenti funzionalità ISA RISC-V:
I progetti vengono versionati principalmente per indicare quando l'API è stata estesa o resa incompatibile. In questo spirito, Spike mira a seguire lo schema di versionamento SemVer, in cui i numeri di versione major vengono incrementati quando vengono apportate modifiche incompatibili con le versioni precedenti all'API; i numeri di versione minor vengono incrementati quando vengono aggiunte nuove API; e i numeri di versione patch vengono incrementati quando vengono corretti bug in modo retrocompatibile.
L'API pubblica principale di Spike è l'ISA RISC-V. L'interfaccia C++ verso le parti interne di Spike non è considerata un'API pubblica in questo momento, e modifiche incompatibili con le versioni precedenti a questa interfaccia verranno apportate senza incrementare il numero di versione major.
Presumiamo che la variabile d'ambiente RISCV sia impostata al percorso di installazione degli strumenti RISC-V.
$ 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
Se il tuo sistema utilizza il gestore di pacchetti yum, puoi sostituire
yum install dtc al primo passaggio.
Puoi saltare il secondo passaggio se non hai bisogno di usare l'I/O dei comandi via socket per la modalità di debug interattiva.
Installa bash, gmake, dtc e usa 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
Installa spike (vedi Passaggi di compilazione), riscv-gnu-toolchain e riscv-pk.
Scrivi un breve programma C e chiamalo hello.c. Poi, compilalo in un binario ELF RISC-V chiamato hello:
$ riscv64-unknown-elf-gcc -o hello hello.c
Ora puoi simulare il programma sopra il proxy kernel:
$ spike pk hello
Aggiungere un'istruzione al simulatore richiede due passaggi:
Descrivi il comportamento funzionale dell'istruzione nel file riscv/insns/<new_instruction_name>.h. Esamina altre istruzioni in quella directory come punto di partenza.
Aggiungi l'opcode e la maschera dell'opcode a riscv/opcodes.h. In alternativa, aggiungilo al pacchetto riscv-opcodes, e lo farà per te:
$ cd ../riscv-opcodes
$ vi opcodes // add a line for the new instruction
$ make install
Aggiungi l'istruzione a riscv/riscv.mk.in. Altrimenti, l'istruzione non sarà inclusa nella build e sarà trattata come un'istruzione illegale.
Ricompila il simulatore.
Per invocare la modalità di debug interattiva, avvia spike con -d:
$ spike -d pk hello
Per vedere il contenuto di un registro intero (0 è per il core 0):
: reg 0 a0
Per vedere il contenuto di un registro in virgola mobile:
: fregs 0 ft0
oppure:
: fregd 0 ft0
a seconda che tu voglia stampare il registro in precisione singola o doppia.
Per vedere il contenuto di una locazione di memoria (indirizzo fisico in esadecimale):
: mem 2020
Per vedere il contenuto della memoria con un indirizzo virtuale (0 per il core 0):
: mem 0 2020
Puoi avanzare di un'istruzione premendo il tasto invio. Puoi anche eseguire fino a raggiungere un'uguaglianza desiderata:
: 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)
In alternativa, puoi eseguire finché un'uguaglianza è vera:
: while mem 2020 50a9907311096993
Puoi continuare l'esecuzione indefinitamente con:
: r
In qualsiasi momento durante l'esecuzione (anche senza -d), puoi entrare nella
modalità di debug interattiva con <control>-<c>.
Per terminare la simulazione dal prompt di debug, premi <control>-<c> oppure:
: q
Un'alternativa alla modalità di debug interattiva è collegarsi usando gdb. Poiché spike cerca di essere come l'hardware reale, hai anche bisogno di OpenOCD per farlo. Useremo il seguente programma di test:
$ 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;
int main()
{
int i = 0;
while (text[i]) {
char lower = text[i] | 32;
if (lower >= 'a' && lower <= 'm')
text[i] += 13;
else if (lower > 'm' && lower <= 'z')
text[i] -= 13;
i++;
}
done:
printf("decoded text: %s\n", text);
}
$ riscv64-unknown-elf-gcc -g -Og --specs=semihost.specs -o rot13 rot13.c