Architetture RISC-V per il settore embedded

Con il termine RISC-V si identifica un’architettura con set di istruzioni ridotto progettata per essere scalabile e adattabile a un’ampia gamma di applicazioni. L’ecosistema RISC-V, che comprende un ampio ventaglio di microprocessori, SoC e FPGA, sta rapidamente guadagnando consensi tra i progettisti e gli utilizzatori come alternativa open source alle architetture con ISA (Instruction Set Architecture) di tipo tradizionale. Nel mercato embedded, RISC-V si sta diffondendo grazie a caratteristiche di assoluto rilievo quali: assorbimento di potenza ridotto, elevata flessibilità, bassa latenza e piena compatibilità con l’ambiente Linux, che a partire dalla versione 5.18 del kernel include il supporto per l’architettura RISC-V.

Le origini di RISC-V

RISC-V è un’architettura hardware open source con set di istruzioni ridotto il cui progetto ha avuto inizio nel 2010 presso la University of California Berkeley all’interno del laboratorio di calcolo parallelo (Par Lab), guidato dal Prof. Krste Asanović. Le ragioni che hanno spinto all’introduzione dell’architettura RISC-V sono state le seguenti:

  • soddisfare la domanda di un’architettura ISA open source che fosse disponibile agli studenti universitari per lo sviluppo di progetti
  • creare uno strumento per condividere le esperienze di progettazione con architetture ISA
  • evitare di pagare le licenze legate all’utilizzo di architetture e core sviluppati dai principali fornitori di IP presenti sul mercato
  • consentire alle aziende di proteggere i dettagli progettuali (IP) delle proprie soluzioni hardware.

Dal punto di vista tecnico, RISC-V è nata come un’architettura semplificata espressamente progettata per ottenere elevata velocità di esecuzione delle istruzioni con un assorbimento di potenza molto contenuto. Ciò ha consentito alle soluzioni embedded basate su RISC-V di adattarsi anche alle applicazioni commerciali, non solo ai progetti in ambito accademico. Attualmente, la RISC-V Foundation raggruppa oltre trecento membri ed include aziende del calibro di Google, Microchip Technology, NVIDIA e Qualcomm.

Architettura RISC-V

L’architettura RISC (Reduced Instruction Set Computer) non è una novità, essendo presente sul mercato da diversi decenni come dimostra la storica serie di processori MIPS. Essa si differenzia dalla tradizionale architettura CISC (Complex Instruction Set Computer) basata sulla macchina di Von Neumann, in cui il codice macchina in esecuzione sul processore implementa operazioni cicliche di fetch, decodifica ed esecuzione delle istruzioni. I processori RISC, viceversa, riflettono l’architettura Harvard, in cui il bus istruzioni è separato dal bus dati, consentendo al processore di eseguire potenzialmente ciascuna istruzione in un singolo ciclo. Questa caratteristica rende i processori RISC molto performanti, consentendo l’esecuzione deterministica degli algoritmi e rendendo il codice più portabile tra una macchina e l’altra. In Figura 1 è visibile un confronto tra le architetture di Von Neumann (a sinistra) e RISC (a destra).

Figura 1: confronto tra architettura CISC e RISC

Come del resto giò avvenuto per i processori CISC, anche per i RISC esistono diversi produttori, con una proliferazine di architetture interne, periferiche e set di istruzioni differenti tra loro. Nasce quindi l’esigenza di uniformare questa realtà, identificando uno standard comune a cui produttori e utilizzatori possano fare riferimento. Il progetto RISC-V nasce proprio per rispondere a questa esigenza.

Una caratteristica chiave dell’architettura open source RISC-V è quella di avere un set di istruzioni estensibile. Ciò significa che, partendo dal set di istruzioni standard RISC-V, i progettisti possono comunque creare degli ASIP (Application Specific Instruction-set Processor) aggiungendo delle nuove istruzioni che eseguono funzionalità embedded in modo più efficiente. Ciò ha consentito l’implementazione di RISC-V su una moltitudine di chip, anche molto differenti a livello hardware, come ASIC e FPGA. Queste estensioni possono ad esempio essere supportate tramite i linguaggi Verilog o VHDL.

Per quanto riguarda il set di istruzioni, il RISC-V offre due opzioni, RV32I (32 bit) e RV64I (64 bit), che devono essere entrambe sempre presenti in qualunque implementazione. Esistono poi i set RV32E (un subset espressamente progettato per i sistemi embedded) e RV128I, nato per supportare la futura architettura ISA a 128 bit.

I registri sono 32 (x0-x31), con il primo (x0) che contiene un valore fisso pari a 0. La dimensione di tali registri dipende dalla variante di architettura RISC-V utilizzata, ovvero RV32, RV64, o RV128. Il set di registri e il loro significato sono indicati in Figura 2. Si noti inoltre come il subset per microcontrollori embedded (RV32E) utilizzi soltanto i primi 16 registri. Se l’hardware dispone di un’unità FPU per il calcolo in virgola mobile, sarà inoltre disponibile un corrispondente set di registri floating point a 32 bit (f0-f31).

Figura 2: set di registri interi di RISC-V

La base dell’architettura RISC-V comune a tutte le implementazioni è minimale, in quanto contiene soltanto 47 istruzioni, rispetto alle oltre 1500 di un sistema x86 e alle oltre 500 dell’architettura Arm. Utilizzando un semplice meccanismo di load/store, tutte le operazioni sono eseguite sui registri interni, mentre esistono istruzioni dedicate per eseguire il trasferimento tra registri e memoria. Queste scelte progettuali riflettono la natura originale di RISC-V, ovvero la sua scalabilità e adattabilità (tramite varianti ed estensioni) a diversi tipi di applicazioni. Ad esempio, la versione ‘E’ (si osservi la Figura 2) permette di dimezzare il numero di registri, che passano da 32 a 16.

SiFive, uno tra i principali produttori di sistemi RISC-V con oltre un milione di core venduti, ha recentemente annunciato un’implementazione dell’architettura RV32E che utilizza soltanto 13.500 gate. In modo del tutto analogo, IZERO-RISCY, un core sviluppato come parte della piattaforma PULP per il calcolo ad alta efficienza energetica, ha un’implementazione di pipeline a due stadi che impiega 11.600 gate. La specifica RISC-V consente inoltre di definire microcontrollori semplici che non richiedono molta logica attorno al core.

Un altro aspetto dell’architettura RISC-V molto importante per i sistemi embedded riguarda la sicurezza. La protezione dagli attacchi perpretati via rete è una funzionalità non sempre disponibile su ogni tipo di core, specialmente se si tratta di applicazioni IoT. Sotto questo punto di vista, RISC-V è unico, in quanto include nativamente meccanismi per la sicurezza informatica, come il blocco del buffer overflow e protezione nei confronti degli attacchi via rete che sfruttano le vulnerabilità del codice. Aggiungendo delle estensioni specifiche a un core RISC-V, come filtri FIR (Finite Impulse Response), calcolo del CRC32 (controllo di ridondanza ciclica a 32 bit) e algoritmi 3DES (Triple Data Encryption Standard), le funzionalità per la sicurezza possono essere notevolmente aumentate.

Grazie al suo approccio open source, RISC-V offre una flessibilità quasi illimitata, essendo un’architettura priva di barriere o restrizioni. I creatori del progetto hanno raggiunto questo obiettivo attraverso il concetto basilare di estensione. Ciò significa che l’ISA, l’elemento costitutivo più piccolo, può essere esteso per soddisfare i requisiti di ogni implementazione hardware, piccola o grande che sia. È così possibile impiegare la medesima architettura hardware in appliczioni anche molto differenti tra loro, come PC industriali, dispositivi indossabili, sistemi embedded, nodi IoT, applicazioni automotive o persino aerospaziali.

Tra le possibili estensioni dell’architettura RISC-V, molto interessante è l’estensione vettoriale (RVV), la quale consente ai core di ogni processore basato sull’architettura con set di istruzioni RISC-V di elaborare array di dati, insieme alle tradizionali operazioni scalari per accelerare il calcolo di singoli flussi di istruzioni su set di dati di grandi dimensioni.

L’architettura RISC-V offre importanti e nuove possibilità per la progettazione embedded, consentendo la realizzazione di un framework di microcontrollori in grado di abbracciare intere generazioni di dispositivi e prodotti. Per le applicazioni che richiedono performance elevate, esiste sempre la possibilità di sviluppare implementazioni basate su FPGA a elevate prestazioni e core con estensioni vettoriali (RVV).

L’approccio seguito dalla filosofia RISC-V consiste nello scegliere prima un set di istruzioni e successivamente un fornitore per il core, oppure, se si dispone delle opportune risorse, decidere di svilupparlo da sè.

Stefano Lovati
Dopo aver conseguito la laurea in Ingegneria Elettronica al Politecnico di Milano, Stefano ha iniziato a lavorare, inizialmente, come progettista digitale e sviluppatore firmware. Negli anni ha maturato una solida esperienza nella progettazione di sistemi embedded, anche con prestazioni real-time, con applicazioni nei settori avionico, trasporti e telecomunicazioni. Stefano ha una profonda passione per tutto ciò che riguarda le tecnologie elettroniche e l'innovazione in generale, curando nel tempo libero la stesura di alcuni articoli tecnici inerenti il mondo dell'elettronica.