L'estensione di moltiplicazione per RISC-V aggiunge capacità di moltiplicazione a 32 bit efficienti a RV32I

L'architettura ISA (Instruction Set Architecture) RISC-V ha origine a Berkley nel 2010. RISC sta per "Reduced Instruction Set Computer" (computer con un set ridotto di istruzioni). Nonostante ciò, i produttori non riescono mai a fare a meno di aggiungere un'istruzione qua, una nuova modalità di indirizzamento là, riempiendo la mappa degli opcode fino a farla diventare più CISC che RISC, cioè complessa anziché ridotta. Gli sviluppatori di Berkely di RISC-V erano stati però piuttosto chiari nel voler mantenere il proprio core veramente RISC. L'architettura ISA RISC-V RV32I era stata progettata per avere solo 47 istruzioni di base (un numero particolarmente caro ai fan più sfegatati di Star Trek) e, 11 anni dopo, il numero rimane lo stesso.

Il motivo del numero di istruzioni base ridotto è che un'istruzione CISC complessa può essere riprodotta come serie di istruzioni RISC semplici. Nella mia esperienza, il fatto che questo vincolo aumenti o meno l'efficienza del codice e ne riduca le dimensioni dipende dall'applicazione. In passato era sicuramente vero, a tal punto che Arm ha aggiunto istruzioni complesse alla mappa degli opcode.

Sebbene ulteriori istruzioni possano contribuire a migliorare le prestazioni, le cose si complicano in presenza di un core a 32 bit con istruzioni a 32 bit se poi si vuole aggiungere la possibilità di comprimere alcune istruzioni a 32 bit in istruzioni a 16 bit per risparmiare spazio. Per aggiungere istruzioni a 16 bit, il core deve avere però abbastanza spazio nella mappa degli opcode per queste istruzioni compresse, e aggiungere istruzioni CISC riduce il numero di opcode disponibili.

Ed è qui che il vantaggio di RISC-V diventa evidente. Arm ha aggiunto il formato di istruzione compressa Thumb2 in seguito, accogliendo queste istruzioni a 16 bit nell'ISA esistente e aggiungendo un'ISA a 16 bit distinta. L'ISA RISC-V però era stata progettata fin dall'inizio con un'opzione per le istruzioni compresse e quindi prevede un'unica ISA, che mantiene il core semplice ed efficiente e semplifica la progettazione e il test dei semiconduttori.

Migliorare l'ISA RISC-V RV32I con un'istruzione per la moltiplicazione

I produttori possono espandere l'ISA a 47 istruzioni aggiungendo estensioni di istruzioni standardizzate (figura 1). Dato che l'ISA di base non prevede istruzioni di moltiplicazione o divisione, l'estensione M fornisce questa funzionalità. Ad esempio, una RV32I con l'estensione M si chiamerebbe RV32IM.

Figura 1: L'ISA di base RISC-V con 47 istruzioni può essere ampliata aggiungendo estensioni di istruzioni standardizzate, indicate da una lettera come suffisso dopo il nome del core. (Immagine per gentile concessione di RISC-V.org)

Un esempio di core con estensione M è RED-V Thing Plus di SparkFun Electronics, con un microcontroller open-source Freedom E310 (FE310) RISC-V a 32 bit e 150 MHz. Il core FE310 è progettato come RV32IMAC. Oltre alla funzionalità di base per i valori matematici interi (I), facendo riferimento alla Figura 1, possiamo vedere che supporta le moltiplicazioni con numeri interi (M), le istruzioni atomiche (A) e le istruzioni compresse (C).

La scheda di valutazione RISC-V RED-V DEV-15799 di SparkFun (figura 2), ha 32 MB di memoria di programma, QSPI flash e un connettore USB-C che si interfaccia con un computer host per le funzioni di alimentazione, programmazione e debug. È inoltre presente un connettore aggiuntivo, utilizzabile per fornire l'alimentazione a batteria.

Figura 2: La scheda DEV-15799 di SparkFun viene utilizzata per valutare il core RISC-V open-source RV32IMAC FE310 a 150 MHz. Si collega a un computer host tramite interfaccia USB-C. (Immagine per gentile concessione di SparkFun Electronics)

L'estensione M aggiunge istruzioni di divisione DIV e DIVU 32/32 con e senza segno, oltre a istruzioni REM e REMU con e senza segno. Aggiunge anche quattro istruzioni di moltiplicazione:

  1. MUL esegue una moltiplicazione nel registro 32 x 32 e memorizza i 32 bit inferiori del risultato a 64 bit in un registro.
  2. MUL e MULHU eseguono una moltiplicazione nel registro rispettivamente con e senza segno e memorizzano i 32 bit superiori del risultato a 64 bit in un registro.
  3. MULSHU esegue una moltiplicazione nel registro con segno x senza segno e memorizza i 32 bit superiori del risultato a 64 bit in un registro.

Quindi per una moltiplicazione senza segno 32 x 32 = 64, la sequenza di codice consigliata è:

Dove i registri rs1 e rs2 sono il moltiplicando e il moltiplicatore e i registri rdh e rdl sono i risultati a 32 bit rispettivamente più alto e più basso.

Dividendo il risultato della moltiplicazione a 64 bit in due operazioni a 32 bit, l'ISA non deve aggiungere un'istruzione CISC 32 x 32 = 64 complessa. Questo comportamento è coerente con la filosofia RISC, che prevede l'uso di istruzioni semplici per eseguire operazioni CISC.

Sebbene la maggior parte delle istruzioni nell'ISA RV32I di base venga eseguita in un solo ciclo di clock di istruzione, queste istruzioni di moltiplicazione in FE310 RED-V richiedono cinque cicli di clock. Secondo questo ragionamento, la sequenza di codice consigliata sopra necessiterebbe di dieci cicli di clock. Questa situazione potrebbe essere accettabile a 150 MHz, tuttavia ho visto applicazioni di microcontroller a bassa potenza e clock ridotto in cui gli interrupt erano così fondamentali che, con una moltiplicazione a dieci cicli a 5 MHz, l'attesa di un interrupt cruciale diventava eccessiva. In questi casi, alcuni sviluppatori di firmware eseguivano la moltiplicazione mediante una subroutine assembly complessa che poteva essere interrotta.

Il core FE310 ha però la capacità di accettare istruzioni consecutive e fonderle internamente in un'istruzione più veloce tramite fusione di macro-op. La microarchitettura del core può fondere le due istruzioni in un'unica istruzione interna, che viene eseguita più rapidamente di dieci cicli. La microarchitettura RISC-V esegue questa operazione automaticamente per alcune sequenze di codice come i carichi indicizzati, le istruzioni load-pair e store-pair, migliorando sensibilmente la velocità di esecuzione. Ancora meglio, dato che FE310 supporta l'estensione "C" quando due istruzioni compresse a 16 bit compatibili possono essere fuse, può garantire vantaggi in termini sia di codice che di velocità di esecuzione.

Mentre Arm ha aggiunto la fusione di macro-op nell'architettura in seguito come istruzioni compresse, RISC-V è stato progettato fin dall'inizio per prevedere la fusione di macro-op. Il modo migliore per comprendere a pieno i vantaggi della compressione del codice e capire quando è utile la fusione di macro-op è osservare questi comportamenti con una scheda di valutazione come DEV-15799 di SparkFun. Il codice può essere esaminato nel debugger per vedere in che modo la microarchitettura FE310 si fa carico di ogni istruzione e la esegue. In questo modo, si comprende meglio il comportamento del linguaggio assembly, e questo può aiutare a scrivere codice efficiente con un compilatore C che supporta la compressione del codice e la fusione di macro-op.

Conclusione

L'ISA RISC-V si definisce orgogliosamente set di istruzioni veramente ridotto, con solo 47 istruzioni di base. Questa condizione può essere migliorata con estensioni standardizzate, come l'estensione di moltiplicazione "M" che aggiunge istruzioni di moltiplicazione e divisione. La fusione di macro-op, intrinseca dell'architettura RISC-V, può velocizzare l'esecuzione di codice di istruzioni compatibili sotto forma di istruzioni di moltiplicazione consecutive, mentre l'estensione "C" di compressione riduce la dimensione del codice. Sia le istruzioni compresse che la fusione di macro-op offrono vantaggi importanti in termini di prestazioni rispetto ad altre architetture.

Informazioni su questo autore

Image of Bill Giovino

Bill Giovino è un ingegnere elettronico con un BSEE ottenuto a Syracuse University, ed è uno dei pochi ad essere passati con successo da progettista, a ingegnere delle applicazioni sul campo, al marketing tecnologico.

Da oltre 25 anni, Bill promuove le nuove tecnologie per un pubblico tecnico e non tecnico a nome di molte aziende, tra cui STMicroelectronics, Intel e Maxim Integrated. In STMicroelectronics, Bill ha contribuito a guidare i primi successi dell'azienda nel settore dei microcontroller. Con Infineon, Bill ha orchestrato i primi successi di progettazione di microcontroller dell'azienda nel settore automotive statunitense. In qualità di consulente di marketing per la sua società CPU Technologies, Bill ha aiutato molte aziende a trasformare prodotti di secondo grado in storie di successo.

Bill è stato uno dei primi ad adottare l'Internet delle cose, compresa l'integrazione del primo stack TCP/IP completo su un microcontroller. Bill è fedele al motto "Le vendite guidate dall'educazione" e tiene molto alla crescente importanza di comunicazioni chiare e ben scritte nella promozione di prodotti online. È moderatore del famoso gruppo Sales & Marketing di LinkedIn Semiconductor e parla correntemente di B2E.

More posts by Bill Giovino
 TechForum

Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.

Visit TechForum