LOG - Obijuan/FemtoRV-learn GitHub Wiki

3-Nov-2021

Voy a estudiar el procesador FemtoRV de Bruno Levy. Ha hecho una versión minimalista que cabe en una icestick!

Lo voy a poner en marcha en la Icestick y luego voy a analizar el código, para usarlo desde Icestudio

  • Clono el repositorio
git clone https://github.com/BrunoLevy/learn-fpga.git

Tengo instalas las herramientas de la oss-cad-suite. Las voy a usar. Configuro el Path:

export PATH=$PATH:/home/obijuan/Bin/oss-cad-suite/bin

Estoy siguiendo las instrucciones de este enlace: https://github.com/BrunoLevy/learn-fpga/blob/master/FemtoRV/TUTORIALS/IceStick.md

Este es el archivo de configuración: learn-fpga/FemtoRV/RTL/CONFIGS/icestick_config.v

// Default femtosoc configuration file for IceStick

/************************* Devices **********************************************************************************/

`define NRV_IO_LEDS          // Mapped IO, LEDs D1,D2,D3,D4 (D5 is used to display errors)
`define NRV_IO_IRDA          // In IO_LEDS, support for the IRDA on the IceStick (WIP)
`define NRV_IO_UART          // Mapped IO, virtual UART (USB)
// `define NRV_IO_SSD1351       // Mapped IO, 128x128x64K OLED screen
// `define NRV_IO_MAX7219       // Mapped IO, 8x8 led matrix
`define NRV_MAPPED_SPI_FLASH // SPI flash mapped in address space. Use with MINIRV32 to run code from SPI flash.

/************************* Processor configuration *******************************************************************/

`define NRV_FEMTORV32_QUARK
`define NRV_FREQ 50                 // Validated at 50 MHz on the IceStick. Can overclock to 70 MHz.
`define NRV_RESET_ADDR 32'h00820000 // Jump execution to SPI Flash (800000h, +128k(20000h) for FPGA bitstream)
`define NRV_COUNTER_WIDTH 24        // Number of bits in cycles counter
`define NRV_TWOLEVEL_SHIFTER        // Faster shifts
// tinyraytracer: 70 MHz, 17:30 


/************************* RAM (in bytes, needs to be a multiple of 4)***********************************************/

`define NRV_RAM 6144 // default for ICESTICK (cannot do more !)

/************************* Advanced devices configuration ***********************************************************/

`define NRV_RUN_FROM_SPI_FLASH // Do not 'readmemh()' firmware from '.hex' file
`define NRV_IO_HARDWARE_CONFIG // Comment-out to disable hardware config registers mapped in IO-Space
                               // (note: firmware libfemtorv32 depends on it)

/********************************************************************************************************************/

`define NRV_CONFIGURED

Ahora compilo:

obijuan@Hoth:~/Develop/learn-fpga/FemtoRV$ make ICESTICK

Es genial, porque se ha descargado y compilado las herramientas para el RISCV! (gcc y cia)

Se ha generado el fichero femtosoc.bin con el bitstream. Conecto la icestick y repito el make. Se carga el bitstream correctamente.

No ocurre nada porque todavía no hay programa cargado. Voy a probar este ejemplo: un Hola mundo:

cd FIRMWARE/EXAMPLES
make hello.prog

y abro el gtkterm a 115200 baudios:

Aparece el mensaje:

Freq: 50 MHz
Hello world !!
 Let me introduce myself, I am FemtoRV32, one of the smallest RISC-V cores

Estoy muy impresionado!!! Madre mía... Bruno Levy es un crack! Y documenta todo MUY BIEN!!!

En el directorio learn-fpga/FemtoRV/FIRMWARE/ASM_EXAMPLES/ hay ejemplos en ensamblador. Voy a probar un par de ellos:

obijuan@Hoth:~/Develop/learn-fpga/FemtoRV/FIRMWARE/ASM_EXAMPLES$ make blinker_loop.prog

Muestra una secuencia en los LEDs de la Icestick

Y este ejemplo es muy impresionante: El conjunto de Mandelbrot!!!

obijuan@Hoth:~/Develop/learn-fpga/FemtoRV/FIRMWARE/ASM_EXAMPLES$ make mandelbrot_terminal.prog

Pruebas con APIO

El siguiente paso es sintetizar utilizando APIO para ver si con la toolchain (antigua) de apio se sintetiza correctamente...

OK. Ya tengo una versión lista que funciona en APIO, subida al repo. No se puede meter en icestudio todavía porque en el fichero femtosoc hay varios módulos, que hay que separar en ficheros separados

LIsto! Separado en módulos y listo para pasarse a Icestudio!

obijuan@Hoth:~/Develop/FemtoRV-learn/FemtoRV-quark-APIO$ ls
apio.ini  femtoPLL.v       femtosoc.v    LEDDriver.v       uart.v
buart.v   femtoRV_quark.v  icestick.pcf  MappedSPIFlash.v
obijuan@Hoth:~/Develop/FemtoRV-learn/FemtoRV-quark-APIO$

Esto es lo que sale al cargar con apio:

obijuan@Hoth:~/Develop/FemtoRV-learn/FemtoRV-quark-APIO$ apio upload
(DEBUG) Profile path: /home/obijuan/.apio/profile.json
(DEBUG) Home_dir: /home/obijuan/.apio
(DEBUG) Profile path: /home/obijuan/.apio/profile.json
(DEBUG) Home_dir: /home/obijuan/.apio
(DEBUG) Run Command: lsusb
(DEBUG) System_base_dir: /home/obijuan/.apio/packages/tools-oss-cad-suite
(DEBUG) System bin dir: /home/obijuan/.apio/packages/tools-oss-cad-suite/bin
(DEBUG) Executable file: /home/obijuan/.apio/packages/tools-oss-cad-suite/bin/lsusb
(DEBUG) Profile path: /home/obijuan/.apio/profile.json
(DEBUG) Home_dir: /home/obijuan/.apio
(DEBUG) Run Command: lsftdi
(DEBUG) System_base_dir: /home/obijuan/.apio/packages/tools-oss-cad-suite
(DEBUG) System bin dir: /home/obijuan/.apio/packages/tools-oss-cad-suite/bin
(DEBUG) Executable file: /home/obijuan/.apio/packages/tools-oss-cad-suite/bin/lsftdi
[Thu Nov  4 00:59:40 2021] Processing icestick
--------------------------------------------------------------------------------
yosys -p "synth_ice40 -json hardware.json" -q LEDDriver.v MappedSPIFlash.v buart.v femtoPLL.v femtoRV_quark.v femtosoc.v uart.v
Warning: Yosys has only limited support for tri-state logic at the moment. (MappedSPIFlash.v:33)
nextpnr-ice40 --hx1k --package tq144 --json hardware.json --asc hardware.asc --pcf icestick.pcf -q
icepack hardware.asc hardware.bin
iceprog -d i:0x0403:0x6010:0 hardware.bin
init..
cdone: high
reset..
cdone: low
flash ID: 0x20 0xBA 0x16 0x10 0x00 0x00 0x23 0x12 0x67 0x21 0x20 0x00 0x78 0x00 0x21 0x04 0x11 0x11 0xC5 0xFD
file size: 32220
erase 64kB sector at 0x000000..
programming..
reading..
VERIFY OK
cdone: high
Bye.
========================= [SUCCESS] Took 10.24 seconds =========================
obijuan@Hoth:~/Develop/FemtoRV-learn/FemtoRV-quark-APIO$

Pruebas con Icestudio

Ya tengo el core del FemtoRV funcionando en la Alhambra II, pero sólo con un mini-periférico de los LEDs (y el código está en veriglo en el interior). Pero estoy ejecutando programas y va muy bien. La síntesis es rápida

25-Enero-2023

El RV32I de Bruno Levy lo tengo ya en icestudio, y lo he usado en la asignatura de mecatrónica