
Simulador funcional del ISA RISC-V que admite múltiples extensiones (RV32/64, V, criptografía) con modo de depuración interactiva, integración con GDB y modelado a nivel de instrucción para el codesarrollo de hardware-software y la exploración de arquitecturas.
Spike, el Simulador de ISA RISC-V, implementa un modelo funcional de uno o más harts RISC-V. Recibe su nombre del clavo dorado utilizado para celebrar la finalización del ferrocarril transcontinental de EE. UU.
Spike admite las siguientes características de la ISA RISC-V:
Los proyectos se versionan principalmente para indicar cuándo la API se ha ampliado o se ha vuelto incompatible. Con ese espíritu, Spike pretende seguir el esquema de versionado SemVer, en el que los números de versión mayor se incrementan cuando se realizan cambios de API incompatibles hacia atrás; los números de versión menor se incrementan cuando se añaden nuevas APIs; y los números de versión de parche se incrementan cuando se corrigen errores de forma compatible hacia atrás.
La principal API pública de Spike es la ISA RISC-V. La interfaz C++ con los componentes internos de Spike no se considera una API pública en este momento, y se realizarán cambios incompatibles hacia atrás en esta interfaz sin incrementar el número de versión mayor.
Asumimos que la variable de entorno RISCV está configurada con la ruta de instalación de las herramientas RISC-V.
$ git submodule update --init --recursive
$ 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
Si tu sistema utiliza el gestor de paquetes yum, puedes sustituir
yum install dtc por el primer paso.
Puedes omitir el segundo paso si no necesitas usar la E/S de comandos mediante socket para el modo de depuración interactivo.
Instala bash, gmake, dtc y usa clang.
$ git submodule update --init --recursive
$ pkg_add bash gmake dtc
$ exec bash
$ export CC=cc; export CXX=c++
$ mkdir build
$ cd build
$ ../configure --prefix=$RISCV
$ gmake
$ [doas] make install
Instala spike (consulta los pasos de compilación), riscv-gnu-toolchain y riscv-pk.
Escribe un programa corto en C y llámalo hello.c. Luego, compílalo en un binario ELF de RISC-V llamado hello:
$ riscv64-unknown-elf-gcc -o hello hello.c
Ahora puedes simular el programa sobre el proxy kernel:
$ spike pk hello
Añadir una instrucción al simulador requiere dos pasos:
Describe el comportamiento funcional de la instrucción en el archivo riscv/insns/<new_instruction_name>.h. Examina otras instrucciones en ese directorio como punto de partida.
Añade el opcode y la máscara de opcode a riscv/opcodes.h. Alternativamente, añádelo al paquete riscv-opcodes, y lo hará por ti:
$ cd ../riscv-opcodes
$ vi opcodes // añade una línea para la nueva instrucción
$ make install
Añade la instrucción a riscv/riscv.mk.in. De lo contrario, la instrucción no se incluirá en la compilación y se tratará como una instrucción ilegal.
Recompila el simulador.
Para invocar el modo de depuración interactivo, lanza spike con -d:
$ spike -d pk hello
Para ver el contenido de un registro entero (0 es para el núcleo 0):
: reg 0 a0
Para ver el contenido de un registro de punto flotante:
: fregs 0 ft0
o:
: fregd 0 ft0
dependiendo de si deseas imprimir el registro en precisión simple o doble.
Para ver el contenido de una ubicación de memoria (dirección física en hexadecimal):
: mem 2020
Para ver el contenido de la memoria con una dirección virtual (0 para el núcleo 0):
: mem 0 2020
Puedes avanzar una instrucción pulsando la tecla enter. También puedes ejecutar hasta alcanzar una igualdad deseada:
: until pc 0 2020 (detener cuando pc=2020)
: until reg 0 mie a (detener cuando el registro mie=0xa)
: until mem 2020 50a9907311096993 (detener cuando mem[2020]=50a9907311096993)
Alternativamente, puedes ejecutar mientras una igualdad sea verdadera:
: while mem 2020 50a9907311096993
Puedes continuar la ejecución indefinidamente con:
: r
En cualquier momento durante la ejecución (incluso sin -d), puedes entrar en el
modo de depuración interactivo con <control>-<c>.
Para finalizar la simulación desde el prompt de depuración, pulsa <control>-<c> o:
: q
Una alternativa al modo de depuración interactivo es adjuntarse usando gdb. Como spike intenta comportarse como hardware real, también necesitas OpenOCD para hacerlo. Usaremos el siguiente programa de prueba:
$ 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