UNITO · INFORMATICA · 2026/2027
Architettura
degli elaboratori
Dispensa organica per lo studio
Logica digitale · RISC-V · Processore · Cache · I/O
Dalla porta logica al sistema che esegue il programma
Teoria spiegata in modo discorsivo, figure integrate, definizioni,
esempi numerici e formulario.
Materiale didattico non ufficiale, rielaborato dagli appunti e dalle slide del corso. A.A. 2026/2027
Architettura degli elaboratori Dispensa di studio
Indice
1. ARCHITETTURA DEI CALCOLATORI: LIVELLI, COMPONENTI E PRESTAZIONI
1.1 LA SCALA DELLE ASTRAZIONI
1.2 I BLOCCHI DEL CALCOLATORE
1.3 CHE COSA SIGNIFICA "PRESTAZIONI"
1.4 FREQUENZA, POTENZA E IL MURO TERMICO
1.5 COME LEGGERE I CAPITOLI SUCCESSIVI
2. IL LIVELLO LOGICO DIGITALE: CIRCUITI COMBINATORI
2.1 SEGNALI, PORTE E ALGEBRA BOOLEANA
2.2 DECODER E MULTIPLEXER
2.3 ADDIZIONATORI E SOTTRATTORI
2.4 L'ALU DEL RISC-V
2.5 VERILOG: DESCRIVERE IL CIRCUITO
3. CIRCUITI SEQUENZIALI, REGISTRI E MEMORIE
3.1 IL PROBLEMA DI MEMORIZZARE UN BIT
3.2 IL CLOCK E LA SINCRONIZZAZIONE
3.3 REGISTRI E REGISTER FILE
3.4 ORGANIZZAZIONE DELLA MEMORIA
4. IL LINGUAGGIO MACCHINA RISC-V
4.1 REGISTRI, PAROLE E MEMORIA
4.2 OPERAZIONI ARITMETICHE E LOGICHE
4.3 NUMERI CON E SENZA SEGNO
4.4 ISTRUZIONI PER PRENDERE DECISIONI
4.5 PROCEDURE E STACK
4.6 FORMATI DELLE ISTRUZIONI
4.7 CARATTERI, STRINGHE E DATI DI DIMENSIONE RIDOTTA
4.8 DA C AL PROGRAMMA ESEGUIBILE
5. IL PROCESSORE RISC-V: DATAPATH E UNITÀ DI CONTROLLO
5.1 IL CICLO FETCH-DECODE-EXECUTE
5.2 GLI ELEMENTI DEL DATAPATH
5.3 ESECUZIONE DELLE ISTRUZIONI
5.4 IL DATAPATH UNIFICATO
5.5 L'UNITÀ DI CONTROLLO
5.6 ESECUZIONE PASSO PER PASSO
5.7 PERCHÉ IL SINGOLO CICLO NON BASTA
1
Architettura degli elaboratori Dispensa di studio
6. LA GERARCHIA DELLE MEMORIE E LE CACHE
6.1 TECNOLOGIE DI MEMORIA
6.2 IL PRINCIPIO DI LOCALITÀ
6.3 COME FUNZIONA UNA CACHE
6.4 SCRITTURA IN CACHE
6.5 MIGLIORARE LE PRESTAZIONI DELLA CACHE
6.6 OTTIMIZZARE IL SOFTWARE PER LA CACHE
7. INPUT/OUTPUT, INTERRUZIONI ED ECCEZIONI
7.1 BUS, CONTROLLORI E REGISTRI
7.2 I/O PROGRAMMATO E BUSY WAITING
7.3 INTERRUZIONI
7.4 DMA
7.5 ECCEZIONI E TRAP
APPENDICE A - RIFERIMENTO RAPIDO RISC-V
A.1 REGISTRI E CONVENZIONI
A.2 ISTRUZIONI PRINCIPALI
A.3 FORMATI
A.4 OPCODE E FUNCT3
A.5 PSEUDOISTRUZIONI UTILI
APPENDICE B - FORMULARIO
B.1 PRESTAZIONI
B.2 LOGICA
B.3 CACHE
B.4 UNITÀ DI MISURA
APPENDICE C - GLOSSARIO
APPENDICE D - GUIDA ALLO STUDIO E DOMANDE DI SINTESI
D.1 METODO DI STUDIO
D.2 DOMANDE TRASVERSALI
D.3 ESERCIZI GUIDA 2
Architettura degli elaboratori Dispensa di studio
1. ARCHITETTURA DEI CALCOLATORI:
LIVELLI, COMPONENTI E PRESTAZIONI
Un calcolatore è una macchina che esegue istruzioni. Dietro questa definizione dimessa si
nasconde una catena di trasformazioni: un testo scritto in un linguaggio ad alto livello diventa
una sequenza di bit, i bit diventano segnali elettrici, i segnali attraversano miliardi di transistor.
L'architettura dei calcolatori studia i punti di contatto tra questi passaggi: che cosa la macchina
offre al software, come lo realizza con l'hardware e quanto tempo impiega a farlo.
Questo capitolo serve da mappa. Prima ricostruisce la scala delle astrazioni e il cammino che
porta dal codice sorgente all'esecuzione; poi presenta i grandi blocchi di un calcolatore; infine
introduce le metriche con cui si misura la velocità e le ragioni fisiche per cui la frequenza ha
smesso di crescere. Le grandezze definite qui — tempo di CPU, CPI, speedup —
ricompariranno in ogni capitolo successivo, spesso come strumento per confrontare due
alternative di progetto.
1.1 LA SCALA DELLE ASTRAZIONI
Nessun programmatore scrive i segnali che pilotano i transistor, e nessun progettista di circuiti
ha in mente il programma che verrà eseguito. Il sistema funziona perché è diviso in livelli,
ciascuno dei quali espone al livello superiore un'interfaccia semplice e nasconde i dettagli di
quello inferiore. Un livello può essere riscritto o sostituito senza che gli altri se ne accorgano, a
patto che l'interfaccia resti la stessa. 3
Architettura degli elaboratori Dispensa di studio
La figura mostra la catena completa. In cima ci sono i linguaggi orientati al problema, cioè quelli
con cui si esprimono gli algoritmi. Scendendo si incontra il linguaggio assembly, una forma
simbolica delle istruzioni della macchina; poi il linguaggio macchina, fatto di parole binarie;
quindi il livello del sistema operativo e della microarchitettura; sotto ancora la logica digitale,
costruita con porte e registri; e alla base i transistor, governati dalle leggi dell'elettronica.
Il passaggio da un livello all'altro non è una traduzione riga per riga. Il compilatore analizza il
programma, riorganizza i calcoli, assegna i registri e sceglie le istruzioni: il codice assembly
prodotto può avere una struttura molto diversa dal sorgente. L'assemblatore compie un lavoro
più meccanico, traducendo i nomi simbolici in numeri e risolvendo le etichette locali. Il linker
collega tra loro file oggetto e librerie, mentre il loader prepara lo spazio di memoria del processo
e cede il controllo alla prima istruzione.
La figura riassume questa sequenza: programma C, compilazione, assembly, assemblaggio,
modulo oggetto, collegamento, eseguibile in linguaggio macchina. Ogni freccia è un cambio di
rappresentazione, non di significato: il comportamento osservabile del programma deve restare
identico attraverso tutte le trasformazioni.
DEFINIZIONE
L'Instruction Set Architecture (ISA) è il contratto tra software e hardware. Stabilisce quali istruzioni
esistono, quali registri sono visibili, come è organizzata la memoria e quali convenzioni devono
rispettare compilatori e sistemi operativi. La microarchitettura è invece il modo concreto in cui una
certa ISA viene realizzata: numero di stadi della pipeline, dimensione delle cache, unità funzionali
disponibili. 4
Architettura degli elaboratori Dispensa di studio
La distinzione tra ISA e microarchitettura spiega un fatto che altrimenti sorprenderebbe:
processori molto diversi tra loro possono eseguire lo stesso programma compilato. Un
microcontroller economico e un server ad alte prestazioni possono condividere l'ISA RISC-V,
pur avendo prestazioni, consumi e costi lontanissimi. Il compilatore produce codice per l'ISA;
sarà poi il singolo processore a decidere come eseguirlo.
Un esempio minimo chiarisce il rapporto tra linguaggio ad alto livello e istruzioni.
L'assegnamento C richiede tre operazioni: due somme e una
f = (g + h) - (i + j)
sottrazione. In RISC-V le variabili vengono associate a registri e i risultati intermedi a registri
temporanei.
ESEMPIO
La funzione C diventa:
f = (g + h) - (i + j)
(t0 = g + h)
add t0, s1, s2 (t1 = i + j)
add t1, s3, s4 (f = t0 - t1)
sub s0, t0, t1
I registri da s0 a s4 contengono f, g, h, i, j; t0 e t1 sono temporanei e possono essere riusati subito
dopo.
Il compilatore ha compiuto due scelte che il programmatore C non vede: ha deciso in quale
ordine calcolare le due somme e ha scelto quali registri usare. Sono libertà permesse dall'ISA,
purché il risultato finale sia quello previsto dal programma.
1.2 I BLOCCHI DEL CALCOLATORE
Dal punto di vista hardware un calcolatore si organizza in tre parti: il processore, la memoria e
l'input/output. A queste si aggiungono i bus, che trasportano dati, indirizzi e segnali di controllo,
e la rete, che collega la macchina ad altre macchine.
Il processore contiene due componenti complementari. Il datapath compie le operazioni: legge i
registri, calcola, scrive i risultati, accede alla memoria. L'unità di controllo interpreta l'istruzione
in corso e genera i segnali che comandano il datapath. Tutto avanza a ritmo di clock: ogni ciclo
esegue una porzione di lavoro, e la frequenza indica quante porzioni si possono svolgere in un
secondo.
La memoria principale conserva istruzioni e dati dei programmi attivi. È un vettore di byte
indirizzabili; in RISC-V una parola occupa quattro byte e gli indirizzi delle parole sono multipli di
quattro. La memoria è volatile: senza alimentazione perde il contenuto. Per conservare i dati nel
tempo si usano memorie secondarie — dischi, unità a stato solido — gestite dal sistema
operativo attraverso il file system.
L'input/output comprende tutto ciò che mette il calcolatore in relazione con l'esterno: tastiera,
schermo, mouse, dischi, rete, sensori. Il processore non dialoga direttamente con ogni
dispositivo, ma con controllori che espongono registri di dati, stato e comando. Il capitolo 7
5
Architettura degli elaboratori Dispensa di studio
descrive questo livello nel dettaglio.
OSSERVAZIONE
Nell'architettura di von Neumann istruzioni e dati condividono la stessa memoria e lo stesso bus. Il
progetto è semplice, ma introduce un limite: se il bus è unico, il processore non può prelevare
un'istruzione e leggere un dato nello stesso istante. Le cache separate per istruzioni e dati, tipiche
delle architetture Harvard modificate, attenuano il problema senza rinunciare alla semplicità del
modello.
1.3 CHE COSA SIGNIFICA "PRESTAZIONI"
Dire che un calcolatore è veloce senza aggiungere altro non ha senso: la velocità dipende dal
programma, dalla dimensione dei dati e dalla metrica scelta. Si distinguono due grandezze. Il
tempo di risposta, o tempo di esecuzione, misura quanto impiega un singolo lavoro dall'inizio
alla fine. Il throughput, o produttività, misura quanti lavori vengono completati nell'unità di
tempo.
Le due grandezze non coincidono. Un processore può completare prima un singolo programma
senza aumentare il numero di programmi serviti in un'ora, e un sistema con molti core può
aumentare il throughput senza rendere più rapido ciascun programma. Nei sistemi interattivi
conta soprattutto il tempo di risposta; in un centro di calcolo conta il throughput per watt.
1.3.1 IL TEMPO DI CPU
Il tempo di esecuzione di un programma si scompone in tre fattori: il numero di istruzioni
eseguite, indicato con IC; il numero medio di cicli per istruzione, CPI; il periodo di clock, T. Vale
la relazione:
dove f è la frequenza, cioè l'inverso del periodo. I tre fattori dipendono da responsabili diversi.
IC dipende dal programma, dal compilatore e dall'ISA. CPI dipende dall'ISA, dalla
microarchitettura e dal comportamento del programma, per esempio dalla frequenza con cui la
cache non trova un dato. T dipende dalla tecnologia, dal progetto del circuito e dal percorso
critico, cioè dal cammino logico più lento che il segnale deve attraversare in un ciclo.
La formula è utile proprio perché separa le responsabilità. Aumentare la frequenza riduce T, ma
può allungare il percorso critico, aumentare il consumo e costringere a semplificare la pipeline.
Ridurre CPI richiede più hardware, per esempio più unità funzionali o cache più grandi. Ridurre
IC significa usare istruzioni più potenti, che però spesso costano più cicli. Ogni intervento
migliora un fattore e ne peggiora un altro: il progetto è sempre un compromesso.
ESEMPIO
Un processore a 2 GHz esegue un programma di un miliardo di istruzioni con CPI medio 1,5. Il
9 9
tempo vale 10 × 1,5 / (2 × 10 ) = 0,75 s. Se il CPI scende a 1,2 senza cambiare la frequenza, il
tempo diventa 0,60 s, con un guadagno del 20%.
6
Architettura degli elaboratori Dispensa di studio
1.3.2 PERCHÉ IL MIPS INGANNA
In passato si usava il MIPS, milioni di istruzioni al secondo:
Il MIPS conta quante istruzioni vengono emesse, non quanto lavoro utile viene completato. Un
processore con istruzioni molto potenti può avere un MIPS basso e finire prima lo stesso
programma, perché usa meno istruzioni. Inoltre il valore cambia da programma a programma.
Per questo oggi si preferiscono benchmark applicativi, tempo di esecuzione e speedup.
Lo stesso vale per il confronto basato sulla sola frequenza. Due processori a 3 GHz possono
avere prestazioni molto diverse se uno esegue più istruzioni per ciclo o dispone di cache
migliori. La frequenza è uno dei tre fattori della formula, non una misura complessiva della
velocità.
1.3.3 LA LEGGE DI AMDAHL
Quando si migliora una parte di un sistema, il guadagno complessivo è limitato dalla frazione di
tempo che quella parte occupa. La legge di Amdahl lo formalizza:
dove p è la frazione di tempo migliorata e s è il fattore di miglioramento applicato a quella
frazione. Se p = 0,5 e s = 2, lo speedup vale 1 / (0,5 + 0,25) = 1,33, non 2. Se la parte migliorata
è il 90% e la si rende dieci volte più veloce, il limite è 1 / (0,1 + 0,09) ≈ 5,26.
La conseguenza pratica è che i miglioramenti locali hanno rendimenti decrescenti e che il
parallelismo conviene solo se coinvolge porzioni significative del carico. Spiega anche perché
cache e pipeline sono così efficaci: intervengono su una frazione molto ampia del tempo di
esecuzione.
1.4 FREQUENZA, POTENZA E IL MURO TERMICO
Per decenni la frequenza dei processori è cresciuta insieme al numero di transistor. Fino agli
anni Duemila ridurre le dimensioni permetteva di alzare la frequenza mantenendo quasi
costante la densità di potenza: era la scala di Dennard. Poi la tendenza si è interrotta. La
potenza dinamica di un circuito CMOS è circa:
dove C è la capacità commutata, V la tensione di alimentazione e f la frequenza. La potenza
cresce linearmente con la frequenza e con il quadrato della tensione. Poiché la tensione non
può scendere all'infinito senza compromettere l'affidabilità, a un certo punto alzare la frequenza
è diventato impraticabile: il calore prodotto non è smaltibile. È il cosiddetto power wall, il muro
della potenza. 7
Architettura degli elaboratori Dispensa di studio
La figura mostra l'andamento storico: la frequenza di clock cresce rapidamente fino ai primi
anni Duemila e poi si stabilizza, mentre il numero di core per processore aumenta. La risposta
dell'industria è stata duplice. Da un lato si è smesso di inseguire il clock e si sono integrati più
core sullo stesso chip. Dall'altro si è lavorato sull'efficienza energetica, sulle architetture
specializzate e sul parallelismo a livello di dati.
Il passaggio al multicore introduce problemi nuovi. Un programma sequenziale non trae
beneficio da core aggiuntivi: va parallelizzato. La memoria condivisa richiede protocolli di
coerenza tra le cache. La sincronizzazione introduce attese e overhead. La legge di Amdahl
ritorna: se una parte del programma è intrinsecamente sequenziale, il guadagno è limitato.
Programmazione parallela e consapevolezza dell'hardware sono diventate competenze
ordinarie, non opzioni per specialisti.
ERRORE COMUNE
Credere che "più core" significhi automaticamente "più veloce". Senza parallelismo nel software i
core restano inattivi, e la contesa per memoria e cache condivise può ridurre il guadagno atteso.
1.5 COME LEGGERE I CAPITOLI SUCCESSIVI
Il resto della dispensa segue l'ordine con cui un calcolatore è costruito. Il capitolo 2 parte dalle
porte logiche e arriva all'ALU, cioè al blocco che esegue le operazioni aritmetiche. Il capitolo 3
introduce i circuiti sequenziali, i registri e le memorie, che permettono di conservare uno stato
tra un ciclo e l'altro. Il capitolo 4 presenta l'ISA RISC-V: registri, istruzioni, formati di codifica e
convenzioni di chiamata. Il capitolo 5 mette insieme i pezzi e mostra il processore, prima a
singolo ciclo e poi in pipeline. Il capitolo 6 affronta la gerarchia delle memorie e le cache. Il
capitolo 7 chiude con l'input/output, le interruzioni e le eccezioni.
Tre fili conduttori attraversano il percorso. Il primo è l'astrazione: ogni capitolo costruisce un
componente e poi lo tratta come una scatola nera. Il secondo è la località: i programmi riusano
dati e istruzioni recenti, e le cache sfruttano questa regolarità. Il terzo è il compromesso:
prestazioni, costo, consumo e semplicità non si massimizzano insieme.
8
Architettura degli elaboratori Dispensa di studio
2. IL LIVELLO LOGICO DIGITALE: CIRCUITI
COMBINATORI
Il processore, per quanto complesso, è fatto di pochi tipi di elementi ripetuti miliardi di volte:
porte logiche, fili, multiplexer, decoder, addizionatori e registri. Questo capitolo scende a quel
livello e mostra come, partendo da segnali a due valori, si costruiscono le funzioni aritmetiche e
le scelte che stanno alla base del datapath. L'obiettivo non è diventare progettisti di circuiti
integrati, ma capire che cosa l'hardware sa fare davvero e perché una certa istruzione costa un
certo numero di porte e di ritardi.
Un circuito si dice combinatorio quando la sua uscita dipende esclusivamente dagli ingressi
attuali. Non ha memoria, non ha stato, non ha clock. Un sommatore, un multiplexer e un
decoder sono circuiti combinatori. Un registro, una cache e un contatore sono circuiti
sequenziali, perché la loro uscita dipende anche dalla storia passata. Il capitolo si concentra sui
circuiti combinatori; il successivo introduce quelli sequenziali.
2.1 SEGNALI, PORTE E ALGEBRA BOOLEANA
Un segnale digitale è una tensione che viene interpretata come 0 o come 1. La soglia esatta
dipende dalla tecnologia, ma il principio è che i valori intermedi vengono evitati: il circuito lavora
in modo affidabile solo se i segnali sono ben separati dai due estremi. Questa scelta rende i
circuiti digitali robusti rispetto al rumore e permette di costruire sistemi complessi con
co
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.
Scarica il documento per vederlo tutto.