Introduzione pag. II
In genere i sistemi embedded sono caratterizzati da:
• Funzionalità fissa e determinata dalle interazioni con l’ambiente.
• Diversi modi di funzionamento alternativi.
• Limitato accesso dell’utente alla programmabilità del sistema.
• Capacità di reagire rapidamente agli eventi esterni.
• Alto livello di parallelismo e concorrenza.
• Elevate garanzie di sicurezza e affidabilità.
Lo schema tipico di un sistema embedded è riassumibile come in figura 1:
Sistema embedded
memoria CPU
Unita' hardware
ASIC; timer; convertitoti A/D, D/A
S
e
n
s
o
r
i
A
t
t
u
a
t
o
r
i
Ambiente
Figura 1 – Schema tipico di un sistema embedded
Accanto a uno o più microprocessori, che vengono visti come “unità
software”, sono presenti nuclei hardware dedicati a particolari funzioni
(eventualmente funzioni critiche in termini temporali, che non possono
quindi essere demandate a procedure software) e strutture hardware
specifiche di interfacciamento col sistema ospitante (in generale, sensori e
attuatori).
Introduzione pag. III
L’obbiettivo di questo lavoro di tesi e quello di realizzare un coprocessore
matematico che lavori sui numeri in formato floating point (FPU) allo
scopo di aumentare la potenza di calcolo del processore LEON, un
processore realizzato in VHDL dall’Agenzia Spaziale Europea (oggi
mantenuto dalla Gaisler Research, Svezia) che è disponibile in open source
e può essere utilizzato per realizzare un core all’interno di sistemi
embedded più complessi.
Nel capitolo 1 viene brevemente descritto il processore LEON a cui verrà
interfacciata la FPU da realizzare.
Nel capitolo 2 vengono descritti i vari modi utilizzati per rappresentare i
numeri nei sistemi di elaborazione dell’informazione e lo standard IEEE
per la rappresentazione dei numeri in virgola mobile.
Nel capitolo 3 viene trattata l’aritmetica in virgola mobile, in particolare
sono studiate le operazioni base dell’aritmetica in virgola mobile e lo
standard IEEE.
Nel capitolo 4 viene realizzata la FPU. Dopo aver studiato le FPU presenti
in letteratura vengono scelte le specifiche e l’architettura della FPU da
realizzare. La FPU è stata realizzata usando il linguaggio VHDL per la
descrizione dell’hardware e il flusso di progetto da esso conseguente.
Vengono descritti e testati singolarmente tutti i blocchi della FPU, superata
questa fase la FPU è stata sottoposta alla verifica del UCBTEST, un test
che esamina il comportamento dei dispositivi che utilizzano l'aritmetica in
virgola mobile con lo standard IEEE 754 sviluppato a Berkeley presso la
University of California.
Nel capitolo 5 viene descritta la sintesi della FPU e dell’interfaccia per
connetterla al LEON.
Nell’Appendice A è riportato tutto il codice VHDL che descrive la FPU.
Nell’Appendice B è riportato il test bench eseguito sulla FPU ed i risultati
dell’UCBTEST a cui è stata sottoposta.
Introduzione pag. IV
Nell’Appendice C è riportato il codice VHDL che descrive l’interfaccia per
connettere la FPU al LEON.
Nell’appendice D è riportato lo Script utilizzato per fare la sintesi della
FPU con il software di Synopsys.
Nell’Appendice E è riportata la verifica del metodo di Newton-Raphson per
il calcolo della radice quadrata dei numeri denormalizzati.
Capitolo 1
Il Microprocessore LEON
1.1 Il Microprocessore LEON
L’architettura del processore LEON si basa sullo standard SPARC a 32 bit
(versione 8), il cui set di istruzioni è conforme allo standard IEEE-754. Il
codice che descrive il LEON è stato scritto sotto forma di file VHDL (Very
high speed circuits Hardware Description Language) da Jiri Gaisler [1.1],
ed è distribuito ed utilizzabile entro i limiti di due licenze:
• La GNU Public Licence (GPL)
• La Lesser GNU Public Licence (LGPL)
I termini di queste licenze consentono di utilizzare il codice VHDL del
processore per realizzare un core all’interno di un sistema contenente altri
dispositivi integrati (System on Chip, SoC), con il vincolo di rendere
disponibili tutte le modifiche apportate al codice stesso, senza dover fare
nessun cenno agli altri elementi aggiuntivi del progetto.
Figura 1.1 – Il microprocessore LEON
Capitolo 1 : Il Microprocessore LEON pag. 2
1.2 Architettura SPARC
Poiché il processore LEON viene implementato secondo la versione 8 dello
SPARC (Scalable Processor ARChitecture), di esso ne verrà dato un breve
cenno. Lo SPARC [1.2] è un’architettura di istruzioni RISC, con dati interi
su 32 bit e floating-point su 32, 64 e 128 bit secondo lo standard IEEE 754.
Si tratta di un’architettura load/store nella quale, per la manipolazione dei
dati, possono essere utilizzati solo i registri e non locazioni di memoria. Le
istruzioni di load/store in memoria indirizzano uno spazio lineare di 2
32
byte, consentendo l’indirizzamento di byte singoli nella modalità big
endian (la MSB viene caricata per prima). Come tutte le architetture RISC,
SPARC sfrutta la tecnica della pipeline e per ottimizzarla usa un branch
delay slot, ciò significa che l’istruzione che segue un branching è sempre
eseguita.
Sono disponibili da 2 a 32 set di 24 registri generali che si dividono in local
%l[0-7], in %i[0-7] e out %o[0-7] e che sono utilizzati mediante un sistema
di finestre sovrapposte. L’architettura SPARC fornisce anche 8 registri
global %g[0-7], 32 registri floating-point %f[0-31] ed alcuni registri di
controllo/stato (%pc, %sp, %psr ecc.). Il set di istruzioni, tutte codificate su
32 bit, è molto semplice ed è formato da 72 istruzioni di base che per la
maggior parte utilizzano 3 registri (origine 1, origine 2 e destinazione).
Tutte le procedure condividono i registri globali mentre i registi %l[0-7],
%i[0-7] e %o[0-7] costituiscono la register window dove i registri di output
sono sovrapposti con quelli di input della subroutine da essa chiamata. Se
ad esempio un procedura A chiama una procedura B che a sua volta invoca
una procedura C si avrà la situazione illustrata nella figura 1.2. Le finestre
hanno un andamento circolare e l’attuale register window è indirizzata da
CWP (current window pointer) contenuto nei 5 bit meno significativi di
%psr e modificabile mediante save e restore.
Capitolo 1 : Il Microprocessore LEON pag. 3
Figura 1.2 - Register window
Strutturalmente il processore è costituito da 3 unità fondamentali (figura
1.1) :
1. unità intera (Integer Unit, IU ): contiene registri di uso generale
(general pourpose) e controlla le operazioni del processore
2. unità floating-point (Floating Point Unit, FPU)
3. coprocessore (Coprocessor, CP): opzionale e dipendente
dall’implementazione.
Ognuna di queste unità utilizza i propri registri, tutti a 32 bit. FPU e CP
sono connessi alla IU e ricevono da quest’ultima i segnali di controllo per il
loro funzionamento. Il processore può essere in due modalità: utente (user
mode) o supervisore (supervisor mode). In modalità supervisore può
eseguire ogni istruzione, incluse quelle privilegiate mentre in modalità
utente ogni tentativo di eseguire un’istruzione privilegiata causerà
un’eccezione di tipo trap: l’istruzione non viene eseguita e si passa a quella
immediatamente successiva.
1.3 Amba BUS
Le varie unità funzionali che costituiscono il processore LEON sono
interconnesse attraverso l’utilizzo di 2 bus: AMBA AHB (Advanced High
performance Bus) e AMBA APB (Advanced Peripheral Bus). I 2 bus
svolgono le seguenti funzioni:
Capitolo 1 : Il Microprocessore LEON pag. 4
AMBA AHB: interconette il processor core (integer unit e i controllori
della cache) al controllore della memoria, all’APB bridge e ad eventuali
altre unità a cui sono richieste alte prestazioni. Il processore è l’unico
master sul bus mentre ci sono due slave: il controllore della memoria e
l’APB bridge. L’AMBA AHB è in grado di connettere fino a 16 unità
master e un numero elevato di unità slave.
AMBA APB: interconette l’AMBA AHB con le unità periferiche attraverso
l’APB bridge. Le unità periferiche connesse all’APB sono: il controllore
delle interruzioni, il timer, 2 unità uart e la I/O port. L’APB bridge è
connesso all’AHB come unità slave, mentre è l’unica unità master per
l’AMBA APB bus.
1.3.a Bus AHB
Permette di realizzare trasferimenti dati ad alta velocità e consente:
• trasferimenti burst;
• transizioni split;
• handover tra i master presenti sul bus in un unico ciclo;
• operazioni su un unico fronte di clock;
• implementazione non tristate;
• trasferimenti dati fino a 128 bit.
Tipicamente il sistema AMBA AHB è costituito da:
• AHB master: il master è capace di iniziare un’operazione di lettura o
scrittura fornendo un indirizzo e informazioni di controllo. Ad ogni
istante un solo master è abilitato ad utilizzare il bus. (figura 1.3)
• AHB slave: lo slave risponde ad un’operazione di lettura o scrittura
effettuata in un dato range nello spazio di indirizzamento. Segnala al
master attivo il successo, il fallimento o un’operazione di attesa
(waiting) del trasferimento dati richiesto.(figura 1.4).
Capitolo 1 : Il Microprocessore LEON pag. 5
Figura 1.3 - AHB master Figura 1.4 - AHB slave
• AHB arbiter : l’arbitro assicura che ad ogni istante un solo master
sia autorizzato ad iniziare il trasferimento dati. Ciascun master ha
una interfaccia di tipo request /grant con l’arbitro e può richiedere
un accesso esclusivo al bus con il segnale HLOCK. Il protocollo
di arbitraggio non è specificato nello standard e viene definito
internamente all’applicazione. (figura 1.5)
• AHB decoder: il decoder è utilizzato per decodificare gli indirizzi
dei trasferimenti e fornisce un segnale di selezione allo slave
coinvolto nel trasferimento. (figura 1.6)
Il protocollo dell’AMBA AHB bus è progettato per essere usato con uno
schema di interconnessione centrale multiplexato.
Tutti i master inviano l’indirizzo e i segnali di controllo indicanti il
trasferimento che vorrebbero effettuare e l’arbitro decide quale master può
inviare questi segnali a tutti gli slave. È necessario anche un decoder
centralizzato, per controllare i dati letti e i segnali di risposta multiplexati e
selezionare il segnale appropriato proveniente dallo slave coinvolto nel
trasferimento.
Capitolo 1 : Il Microprocessore LEON pag. 6
Figura 1.5 - Arbitro AHB Figura 1.6 - AHB decoder
1.3.b Bus APB
Il bus APB è stato progettato per
avere bassi consumi di potenza e
interfacce semplificate sulle
periferiche. Per questo motivo si
adatta particolarmente a
periferiche con banda stretta che
non richiedono le alte
performance di un bus in pipeline.
Anche la temporizzazione è molto
semplice in quanto è presente un
solo master (l’APB bridge), la
selezione degli slave avviene attraverso i segnali dedicati PSELx (uno per
ogni slave) e l’esecuzione del comando (lettura o scrittura) attraverso il
segnale PENABLE. Per rappresentare l’attività dell’APB si usa il
diagramma di stato di figura 1.7.
Figura 1.7 - Diagramma di stato APB.
Capitolo 1 : Il Microprocessore LEON pag. 7
• IDLE: stato di default per il bus APB;
• SETUP: quando è richiesto un trasferimento il bus si sposta in questo
stato e viene asserito l’opportuno segnale di selezione PSELx. Il bus
rimane in questo stato per un solo ciclo e al clock successivo si
sposta nello stato enable,
• ENABLE: in questo stato viene asserito il segnale PENABLE. I
segnali di indirizzo, scrittura e selezione devono rimanere stabili
durante il passaggio tra i due stati. Anche questo stato dura un solo
ciclo e dopo, se non sono richiesti altri trasferimenti, torna nello stato
idle, se invece ci sono altri trasferimenti riguardanti la stessa
periferica va nello stato setup.
L’operazione di scrittura ( figura 1.8) ha inizio con il cambiamento, dopo il
fronte di clock, dell’indirizzo (PADDR), del dato da scrivere (PWDATA),
del segnale di scrittura (PWRITE) e del segnale di selezione della periferica
(PSELx).
Il primo ciclo di clock è il ciclo di SETUP mentre al successivo fronte di
clock, con l’asserimento del segnale di abilitazione (PENABLE), entriamo
nel ciclo di ENABLE alla fine del quale il trasferimento è completato. In
questo ciclo l’indirizzo, il dato e i segnali di controllo rimangono validi.
Alla fine del trasferimento il segnale PENABLE deve essere rimosso ed
anche il segnale di selezione deve tornare basso, a meno che il
trasferimento non sia immediatamente seguito da un altro per la stessa
periferica. Per ridurre i consumi di potenza l’indirizzo e il segnale di
scrittura non cambiano finché non comincia un altro trasferimento.
Nell’operazione di lettura (figura 1.9) la temporizzazione dei segnali di
indirizzo, scrittura, selezione e abilitazione è la stessa del trasferimento di
scrittura mentre il dato deve essere fornito dallo slave durante il ciclo
Capitolo 1 : Il Microprocessore LEON pag. 8
ENABLE e viene campionato sul fronte in salita del clock alla fine del
ciclo.
Figura 1.8 - Trasferimento in scrittura. Figura 1.9 - Trasferimento in lettura.
1.4 APB bridge
L’ APB bridge è l’unico master presente sul bus APB ed è anche uno slave
sul bus AHB. La sua funzione è quella di memorizzare i trasferimenti
effettuati sul bus AHB (diretti a una periferica APB) e in seguito pilotare
opportunamente il bus APB in modo da rendere effettivi tali trasferimenti.
Figura 1.10 - APB bridge.
Capitolo 1 : Il Microprocessore LEON pag. 9
Il bridge esegue le seguenti operazioni:
• campiona gli indirizzi e li mantiene validi per tutto il trasferimento.
• decodifica gli indirizzi e genera i corrispondenti segnali di selezione
(PSELx) per ciascuna periferica.
• invia i dati dell’AHB sul bus APB in caso di trasferimento in
scrittura.
• manda i dati dell’APB sul bus AHB nei trasferimenti in lettura.
• pilota il segnale PENABLE che regola la temporizzazione dell’APB.
1.5 Architettura del microprocessore LEON
Il modello del LEON [1] implementato è composto dalle seguenti unità:
• Integre Unit con 32 register
window
• 2 cache separate per istruzioni
e dati
• una RAM AHB da 32 Kbyte
• un APB bridge
• un controllore delle
interruzioni
• 2 contatori a 24 bit
• un watchdog
• 2 porte seriali (UARTs)
• una porta di I/O
• un controllore AHB
• un controllore di memoria
• un blocco di protezione
scrittura
• Interfaccia generica per FPU e
coprocessore
Di questi blocchi verrà fatta una breve descrizione senza entrare nei dettagli
della loro realizzazione, per ulteriori approfondimenti si rimanda a [1].
Capitolo 1 : Il Microprocessore LEON pag. 10
1.5.a L’Integer Unit
La Integer Unit dell LEON implementa lo standard SPARC V8 incluse le
istruzioni di moltiplicazione e divisione. La configurazione scelta è
caratterizzata da :
• 5 stadi di pipeline per le istruzioni.
• Interfacce separate per data cache e instruction cache.
• 32 register windows (NWINDOWS).
• Moltiplicatore 16x16.
• MAC (moltiplicatore con accumulatore) 16x16 bit con accumulatore
a 40 bit.
I 5 stadi della pipeline sono :
1. FE (instruction fetch) : se l’instruction cache è abilitata viene
prelevata l’istruzione dalla cache, altrimenti la fase di fetch è
rimandata al controllore di memoria. L’istruzione è valida alla fine di
questa fase e viene registrata all’interno della IU.
2. DE (instruction decode) : viene decodificata l’istruzione e vengono
letti gli operandi. L’indirizzo del target per le istruzioni CALL e
Branch viene calcolato in questa fase.
3. EX (execute) : sono eseguite operazioni aritmetiche, logiche e di
shift. Viene generato l’indirizzo per le operazioni di memoria (load e
store) e per le istruzioni JMPL e RETT.
4. ME (memory) : viene effettuato l’accesso alla data cache. Per le
letture nella cache il dato deve essere valido alla fine di questo stadio
e per le scritture in memoria il dato è scritto nella data cache in
questo stadio.
5. WR (write) : il risultato delle operazioni aritmetiche, logiche, di shift
e i dati letti nella cache vengono scritti nei registri destinatari.
Capitolo 1 : Il Microprocessore LEON pag. 11
1.5.b Reset del processore
Il processore viene resettato asserendo l’ingresso RESET almeno per un
ciclo di clock. L’esecuzione ha inizio dall’indirizzo 0. La tabella 1.1 indica
i valori dei registri del processore sensibili all’operazione di reset, gli altri
mantengono invariato il loro valore.
Registro
PC
program
counter
nPC
next PC
PSR
processor
status reg
CCR
cache control
reg.
Valore
reset
0x0 0x4 ET=0, S=1 0x0
Tabella 1.1 – Registri sensibili al reset del processore LEON
1.5.c Eccezioni
Il processore LEON aderisce al modello generale di trap dello Sparc. Nella
tabella 1.2 sono mostrate le trap implementate, il tipo e la priorità.
Trap TT Priorità Descrizione
Reset 0x00 1 Reset
write error 0x2b 2 Errore nel write buffer
instruction_access_error 0x01 3 Errore durante la fase di fetch
illegal_instruction 0x02 5 Istruzione non implementata
privileged_instruction 0x03 4 Esecuzione di istruzione privilegiata
in modalità user
fp_disabled 0x04 6 Istruzione FP con FPU disabilitata
cp_disabled 0x24 6 Istruzione CP con coprocessore
disabilitato
watchpoint_detect 0x0b 7 Watchpoint
window_overflow 0x05 8 Istruzione SAVE in finestra non
valida