[SpinalHDL] [VexRiscv] Implementación FPGA-friendly de una CPU RISC-V de 32 bits

238 views
Skip to first unread message

1138-4EB

unread,
Mar 6, 2018, 4:26:35 PM3/6/18
to FPGAwars: explorando el lado libre
El proyecto https://github.com/SpinalHDL/VexRiscv incluye un par de diseños System-On-Chip (SoC): Briey (https://github.com/SpinalHDL/VexRiscv#briey-soc) y Murax (https://github.com/SpinalHDL/VexRiscv#murax-soc). El segundo es especialmente interesante en este grupo porque:

Murax is a very light SoC (fit in ICE40 FPGA) which could work without any external component.

  • VexRiscv RV32I[M]
  • JTAG debugger (eclipse/GDB/openocd ready)
  • 8 kB of on-chip ram
  • Interrupt support
  • APB bus for peripherals
  • 32 GPIO pin
  • one 16 bits prescaler, two 16 bits timers
  • one UART with tx/rx fifo

Depending the CPU configuration, on the ICE40-hx8k FPGA with icestorm for synthesis, the full SoC will get following area/performance :

  • RV32I interlocked stages => 51 Mhz, 2387 LC 0.45 DMIPS/Mhz
  • RV32I bypassed stages => 45 Mhz, 2718 LC 0.65 DMIPS/Mhz
La idea del SoC es muy similar a la de Lattuino (http://fpgalibre.sourceforge.net/Lattuino/), pero son diferentes la arquitectura (juego de instrucciones) y los protocolos de comunicación utilizados.

NOTA: el proyecto está escrito en SpinalHDL, que es Scala, un lenguaje diseñado para ser ejecutado en la máquina virtual de Java. Por lo tanto, es necesario tener JVM y el compilador instalados. Ver https://spinalhdl.github.io/SpinalDoc/spinal_getting_started/ . Una vez satisfechas las dependencias, hay scripts para automatizar la síntesis, simulación y verificación.
 

Juanma Rico

unread,
Mar 10, 2018, 7:08:48 AM3/10/18
to FPGAwars: explorando el lado libre

Buenas Unai,

Estoy revisando los mensajes del grupo después de unos meses sin tan siquiera poder leerlos y me encuentro, como siempre, con un post tuyo super-interesantísimo... De esos que te suben el SAV... ¡Gracias! :))

Mirando muy por encima ambas implementaciones del proyecto veo que el de "murax-soc" efectivamente dicen que encaja o entra en una iCE40... pero, si no me equivoco al leer, debe ser una 8k; con lo cual en una iceZum Alhambra no entra... de todas formas la implementación de un RISC-V en una FPGA creo que es motivo más que suficiente para volver a retomar la programación abandonada de mi tiny-FPGA-B (Según voy escribiendo el SAV aumenta por momentos.... jejejejeje)

Quería retomar el tema de las FPGA (no sé si podré), pero si lo retomo me pondré con SpinalHDL y esta implementación de un RISC-V, creo que es ideal para cerrar lo más posible el ciclo de implementación libre, de una arquitectura libre mediante herramientas libres... A ver qué sale... ya te cuento. ;)

Muchas gracias por tus siempre interesantes aportaciones y un cordial saludo.
Juan Manuel Rico

1138-4EB

unread,
Mar 10, 2018, 2:54:01 PM3/10/18
to FPGAwars: explorando el lado libre
Hola Juanma!

Justamente la idea de un diseño SoC en HDL es poder ajustarlo para encajar en el dispositivo que quieras. Es decir, aunque el ejemplo está parametrizado para una 8K, es posible que puedas escoger con más detalle qué incluir (y qué quitar) para que entre en una 4K, por ejemplo. Puedes ver en este apartado diferentes resultados de síntesis: https://github.com/SpinalHDL/VexRiscv#area-usage-and-maximal-frequency

VexRiscv smallest (RV32I, 0.52 DMIPS/Mhz, no datapath bypass, no interrupt) ->
  Artix 7    -> 346 Mhz 481 LUT 539 FF
  Cyclone V  -> 201 Mhz 347 ALMs
  Cyclone IV -> 190 Mhz 673 LUT 529 FF 
  
VexRiscv smallest (RV32I, 0.52 DMIPS/Mhz, no datapath bypass) ->
  Artix 7    -> 340 Mhz 562 LUT 589 FF 
  Cyclone V  -> 202 Mhz 387 ALMs
  Cyclone IV -> 180 Mhz 780 LUT 579 FF 
  
VexRiscv small and productive (RV32I, 0.82 DMIPS/Mhz)  ->
  Artix 7    -> 327 Mhz 698 LUT 558 FF 
  Cyclone V  -> 158 Mhz 524 ALMs
  Cyclone IV -> 146 Mhz 1,061 LUT 552 FF 

VexRiscv small and productive with I$ (RV32I, 0.72 DMIPS/Mhz, 4KB-I$)  ->
  Artix 7    -> 331 Mhz 727 LUT 600 FF 
  Cyclone V  -> 152 Mhz 536 ALMs
  Cyclone IV -> 156 Mhz 1,075 LUT 565 FF 

VexRiscv full no cache (RV32IM, 1.22 DMIPS/Mhz, single cycle barrel shifter, debug module, catch exceptions, static branch) ->
  Artix 7    -> 295 Mhz 1399 LUT 971 FF 
  Cyclone V  -> 151 Mhz 922 ALMs
  Cyclone IV -> 136 Mhz 1,859 LUT 992 FF 
      
VexRiscv full (RV32IM, 1.21 DMIPS/Mhz with cache trashing, 4KB-I$,4KB-D$, single cycle barrel shifter, debug module, catch exceptions, static branch) ->
  Artix 7    -> 253 Mhz 1840 LUT 1394 FF 
  Cyclone V  -> 126 Mhz 1,172 ALMs
  Cyclone IV -> 117 Mhz 2,548 LUT 1,703 FF
      
VexRiscv full max perf -> (RV32IM, 1.44 DMIPS/Mhz, 16KB-I$,16KB-D$, single cycle barrel shifter, debug module, catch exceptions, dynamic branch prediction in the fetch stage, branch and shift operations done in the Execute stage) ->
  Artix 7    -> 183 Mhz 1813 LUT 1424 FF 
  Cyclone V  -> 93 Mhz 1,253 ALMs
  Cyclone IV -> 84 Mhz 2,642 LUT 1,711 FF 

VexRiscv full with MMU (RV32IM, 1.26 DMIPS/Mhz with cache trashing, 4KB-I$, 4KB-D$, single cycle barrel shifter, debug module, catch exceptions, dynamic branch, MMU) ->
  Artix 7    -> 214 Mhz 2070 LUT 1913 FF 
  Cyclone V  -> 108 Mhz 1,430 ALMs
  Cyclone IV -> 100 Mhz 2,976 LUT 2,201 FF

Aun así, es posible que no entre en la 1K/4K. No he probado a sintetizarlo con yosys.

Saludos! Y gracias a ti por el aprecio.

PD: SpinalHDL lo tengo en mi ToDo, por delante de Chisel, Clash, Bluespec, MyHDL, etc. Pero no lo he usado en condiciones.

Salvador Eduardo Tropea

unread,
Mar 22, 2018, 8:33:08 AM3/22/18
to fpga-wars-explora...@googlegroups.com
Muy interesante el proyecto!!!
Lo pude hacer funcionar en la Kéfir I.
Entiendo que el SpinalHDL debe ser muy intuitivo para programadores de
Java, pero a priori lo veo muy áspero para pequeñas cosas, muchas
herramientas y archivos involucrados.

On 06/03/18 18:26, 1138-4EB wrote:
> El proyecto https://github.com/SpinalHDL/VexRiscv incluye un par de
> diseños System-On-Chip (SoC): Briey
> (https://github.com/SpinalHDL/VexRiscv#briey-soc) y Murax
> (https://github.com/SpinalHDL/VexRiscv#murax-soc). El segundo es
> especialmente interesante en este grupo porque:
>
> Murax is a very light SoC (fit in ICE40 FPGA) which could work
> without any external component.
>
> * VexRiscv RV32I[M]
> * JTAG debugger (eclipse/GDB/openocd ready)
> * 8 kB of on-chip ram
> * Interrupt support
> * APB bus for peripherals
> * 32 GPIO pin
> * one 16 bits prescaler, two 16 bits timers
> * one UART with tx/rx fifo
>
> Depending the CPU configuration, on the ICE40-hx8k FPGA with
> icestorm for synthesis, the full SoC will get following
> area/performance :
>
> * RV32I interlocked stages => 51 Mhz, 2387 LC 0.45 DMIPS/Mhz
> * RV32I bypassed stages => 45 Mhz, 2718 LC 0.65 DMIPS/Mhz
>
> La idea del SoC es muy similar a la de Lattuino
> (http://fpgalibre.sourceforge.net/Lattuino/), pero son diferentes la
> arquitectura (juego de instrucciones) y los protocolos de comunicación
> utilizados.
>
> NOTA: el proyecto está escrito en SpinalHDL, que es Scala, un lenguaje
> diseñado para ser ejecutado en la máquina virtual de Java. Por lo
> tanto, es necesario tener JVM y el compilador instalados. Ver
> https://spinalhdl.github.io/SpinalDoc/spinal_getting_started/ . Una
> vez satisfechas las dependencias, hay scripts para automatizar la
> síntesis, simulación y verificación.

--
Ing. Salvador Eduardo Tropea http://utic.inti.gob.ar/
INTI - Micro y Nanoelectrónica (CMNB) http://www.inti.gob.ar/
Unidad Técnica Sistemas Inteligentes Av. General Paz 5445
Tel: (+54 11) 4724 6300 ext. 6919 San Martín - B1650KNA
FAX: (+54 11) 4754 5194 Buenos Aires * Argentina




Reply all
Reply to author
Forward
Message has been deleted
0 new messages