Varianti architetturali: Von Neumann, Harvard, CISC e RISC | Sistemi e Reti Anno 3 Modulo 1 Lezione 04 | Prof. Giagnotti
Sistemi e Reti · Anno 3 · Modulo 1 · Lezione 04
✍ Autore: profgiagnotti · Materia: Sistemi e Reti

Varianti architetturali: Harvard, CISC e RISC – oltre Von Neumann

Dopo Von Neumann, pipeline e cache, scopriamo come l'evoluzione ha generato scelte diverse su due livelli: come è organizzata la memoria (Von Neumann vs Harvard) e come è fatta l'ISA (CISC vs RISC). Capirai perché il tuo PC e il tuo smartphone usano filosofie opposte ma entrambe vincenti.

// OBIETTIVI DI APPRENDIMENTO
✓Descrivere il collo di bottiglia di Von Neumann e spiegare perché limita le prestazioni al crescere del clock.
✓Distinguere architettura Von Neumann, Harvard pura e Harvard modificata su memoria, bus e cache.
✓Confrontare filosofia CISC vs RISC per lunghezza istruzioni, complessità di decode e impatto su pipelining.
✓Collegare le scelte architetturali (memoria + ISA) all'efficienza energetica e alle prestazioni complessive.
✓Riconoscere nelle CPU reali (x86-64, ARM, RISC-V, microcontrollori) la combinazione di Harvard modificata + CISC/RISC.

1. Perché superare Von Neumann?

Dopo aver analizzato il modello di Von Neumann, il ciclo macchina e le ottimizzazioni come pipeline e cache, è il momento di allargare la prospettiva. L'evoluzione dei calcolatori non si è limitata a migliorare il modello originale — ha prodotto varianti architetturali basate su scelte progettuali fondamentalmente diverse.

// LIVELLO 1 · MEMORIA

Organizzazione memoria

Von Neumann vs Harvard — memoria condivisa o separata? Dove metto dati e istruzioni cambia tutto il flusso.

// LIVELLO 2 · ISA

Filosofia istruzioni

CISC vs RISC — istruzioni complesse o semplici? Cambia quanto è facile fare pipeline e quanto consumi.

// OBIETTIVO

Efficienza complessiva

Non solo GHz: bus, cache, decode, parallelismo. Le scelte interne decidono prestazioni reali.

📌 Definizione da ricordare

Variante architetturale = scelta progettuale diversa rispetto a Von Neumann puro che ottimizza un aspetto: parallelismo memoria (Harvard) o parallelismo esecuzione (RISC).

2. Il collo di bottiglia di Von Neumann

Nel modello classico, dati e istruzioni condividono la stessa memoria e lo stesso bus. Questo comporta una conseguenza strutturale precisa:

⚠️ Limite strutturale - Collo di bottiglia di Von Neumann

La CPU non può accedere contemporaneamente a un'istruzione e a un dato. Istruzioni e dati condividono lo stesso canale — devono transitare uno alla volta. Con l'aumento della velocità dei processori, questo limite è diventato il principale ostacolo alle prestazioni.

VON NEUMANN — Memoria unificata Memoria condivisa [dati + istruzioni] Unico bus → un accesso alla volta BUS condiviso ⚠️ CPU attesa sequenziale HARVARD — Memorie separate Mem. IstruzioniBus I Mem. DatiBus D Bus Istr. Bus Dati Accessi paralleli ✓
💬 Tip del docente

Pensa al bus unico come a un ponte a una corsia: o passano le istruzioni o passano i dati. Harvard invece ha due ponti. Quando a verifica ti chiedono "cos'è il collo di bottiglia?" non dire solo "lentezza": specifica "condivisione di memoria e bus tra codice e dati". Il dettaglio fa la differenza tra 6 e 8.

3. Architettura Harvard: memorie separate

📌 Harvard pura

Architettura in cui memoria istruzioni e memoria dati sono fisicamente separate, con bus distinti. Permette fetch dell'istruzione e accesso al dato nello stesso ciclo di clock.

L'idea nasce negli anni '40 ad Harvard (da cui il nome) e diventa centrale nei microcontrollori. Vantaggi immediati: parallelismo memoria, larghezza bus ottimizzata (es. 16 bit istruzioni, 8 bit dati), maggiore sicurezza (codice non sovrascrivibile da dati per sbaglio).

01 · STRUTTURA

Due memorie

Program memory (Flash/ROM) + Data memory (RAM). Indirizzi indipendenti, tecnologie diverse.

02 · BUS

Due bus

Bus istruzioni + bus dati. La CPU fa fetch e load/store contemporaneamente. Raddoppia throughput.

03 · USO

Dove la trovi

PIC, AVR, Arduino Uno, DSP real-time. Massima prevedibilità, tempistiche deterministiche.

🎯 Esempio in classe

Su Arduino Uno (ATmega328P) la Flash contiene lo sketch (32KB), la SRAM i dati (2KB). Se scrivi int x=5; il valore 5 sta in Flash come costante, ma a runtime viene copiato in RAM. Prova a riempire RAM con array grandi: compila ma crasha a runtime — perché? Flash ok, RAM esaurita. Harvard pura te lo mostra chiaramente.

🚫 Da non confondere

Harvard non è CISC/RISC. Harvard riguarda dove stanno dati e istruzioni. CISC/RISC riguarda come sono fatte le istruzioni. Sono assi diversi: puoi avere Harvard + RISC (AVR) o Von Neumann + RISC (ARM vecchio).

4. Harvard modificata: il compromesso moderno

I processori moderni non usano né Von Neumann puro né Harvard pura. Usano una Harvard modificata:

  • L1 Cache separate: I-cache per istruzioni, D-cache per dati, entrambe sulla CPU → accessi paralleli velocissimi
  • L2/L3 e RAM condivise: oltre L1, istruzioni e dati possono risiedere nella stessa RAM → flessibilità di Von Neumann
  • MMU unificata: spazio di indirizzamento unico visto dal programmatore, separazione gestita hardware
HARVARD MODIFICATA · quella che usi tutti i giorni CPU CoreFetch + Execute L1 I-Cache32KB Istruz. L1 D-Cache32KB Dati L2/L3 unificatacondivisa I+D RAM principaleVon Neumann logico
💬 Perché ci interessa

Quando in Linux usi time ./programma e vedi miss di cache, stai vedendo proprio questo: L1 separata veloce, se sbagli prediction vai in RAM condivisa lenta. Harvard modificata spiega perché codice e dati possono stare insieme in RAM ma la CPU li tratta in parallelo in L1.

5. CISC vs RISC: due filosofie dell'ISA

Secondo asse: non dove stanno, ma come sono fatte le istruzioni.

📌 CISC · Complex Instruction Set Computer

ISA con molte istruzioni complesse, lunghezza variabile, che in una singola istruzione possono fare fetch, operazione ALU e accesso memoria. Obiettivo storico: ridurre codice e semplificare compilatori (anni '70 con memoria cara).

📌 RISC · Reduced Instruction Set Computer

ISA con poche istruzioni semplici, lunghezza fissa, che eseguono una sola operazione semplice per ciclo. Load/Store separati: solo istruzioni dedicate accedono alla RAM. Obiettivo: pipeline facile, CPI ~1, hardware semplice.

🎯 Esempio concreto - Somma con accesso memoria

CISC (x86): ADD [mem], AX fa tutto: legge [mem], somma AX, riscrive [mem] — 1 istruzione, ma 5-6 cicli, decode complesso.

RISC (ARM): servono 3 istruzioni: LDR R1,[mem] poi ADD R1,R1,R0 poi STR R1,[mem] — 3 istruzioni fisse 32-bit, 1 ciclo ciascuna, pipeline perfetta. Codice più lungo ma 3 cicli totali vs 6 e zero stalli.

Assembly · Confronto CISC vs RISC
; CISC x86 - istruzione complessa, memoria cara ADD [0x1000], EAX ; [0x1000] = [0x1000] + EAX ; Micro-operazioni interne: Fetch, Decode CISC, Read Mem, ALU, Write Mem ; Tempo: 5 cicli, pipeline bloccata; RISC ARM - solo load/store accede a RAM LDR R1, [R2] ; 1) LOAD: R1 = RAM[R2] (0x1000) ADD R1, R1, R0 ; 2) ALU: R1 = R1 + R0 (EAX) STR R1, [R2] ; 3) STORE: RAM[R2] = R1 ; Ogni istruzione 32bit fissa, 1 ciclo, CPI=1, pipeline lineare ; Totale 3 cicli, ma parallelizzabile con altre istruzioni
⚠️ Errore comune in verifica

Dire "RISC ha meno istruzioni quindi è più lento" è sbagliato. RISC ha istruzioni più semplici, quindi ogni istruzione è più veloce e pipeline non si blocca. Un programma RISC ha più istruzioni, ma impiega meno cicli totali. È come confrontare: CISC = camion che fa tutto in un viaggio, RISC = moto che fa 3 viaggi veloci senza traffico.

6. Confronto tecnico CISC vs RISC

AspettoCISC (x86, x86-64)RISC (ARM, RISC-V)
Lunghezza istruzioneVariabile 1-15 byte, decode complessoFissa 32 bit (16 bit thumb), decode banale
Cicli per istruzione (CPI)2-12 cicli, imprevedibileObiettivo 1 ciclo, prevedibile
Accesso memoriaQualsiasi istruzione può accedere a RAMSolo LOAD/STORE, resto solo registri
RegistriPochi (8-16), architettura storicaMolti (32+), uso intensivo compilatore
PipeliningDifficile, stalli, micro-op translationOttimale, pipeline pulita, in-order semplice
CompilatoreSemplice (ISA fa lavoro)Complesso (deve ottimizzare)
Efficienza energeticaMedia-bassa, decode energivoroAlta, hardware semplice, ideale mobile
EsempioIntel Core i7, AMD RyzenApple M3, Snapdragon, ESP32, RISC-V
CISC · Istruzioni complesse ADD [mem],EAX → Fetch 8B, Decode complesso micro-op, Mem R, ALU, Mem W Tempo: ▓▓▓▓▓ 5 cicli, pipeline stall Decode: tabella microcode, costoso in energia Programma corto, esecuzione imprevedibile RISC · Istruzioni semplici LDR / ADD / STR → Fetch 4B fisso, Decode 1 ciclo LDR 1c ADD 1c STR 1c Pipeline: ▓▓▓ 3 cicli, tutti in parallelo con altre Programma più lungo, esecuzione ottimizzata

7. Combinazioni reali: cosa usano PC, smartphone e microcontrollori

I due assi sono indipendenti: memoria (Von Neumann / Harvard) e ISA (CISC / RISC). I processori moderni combinano i due livelli.

Intel / AMD x86-64

CISC esterno → RISC interno

ISA CISC per compatibilità, ma dentro traduce in micro-operazioni RISC-like (μOps) durante l'esecuzione. Front-end CISC, back-end RISC.

Harvard modificata + CISC

Apple Silicon / ARM

RISC puro ottimizzato

ISA RISC con estensioni SIMD, ottimizzata per efficienza energetica. Domina smartphone, tablet, laptop moderni. Da M1 in poi supera x86 in perf/W.

Harvard modificata + RISC

Microcontrollori + RISC-V

Harvard pura + RISC

PIC, AVR, ESP32, RISC-V embedded: Harvard pura con ISA ridotta, massima prevedibilità e velocità su sistemi real-time, open source.

Harvard pura + RISC

🎯 Perché Intel traduce CISC in RISC?

Perché il compilatore x86 è storico: non puoi rompere compatibilità con 40 anni di software. Soluzione: fuori vedi CISC, dentro la CPU spacca ADD [mem],EAX in micro-op tipo RISC: LD TMP,[mem] / ADD TMP,EAX / ST [mem],TMP. Così pipeline RISC funziona anche con ISA CISC, pagando costo extra di traduzione (più transistor, più energia).

8. Perché l'architettura conta più del clock

📌 Principio fondamentale

Le prestazioni non dipendono solo dalla velocità del clock, ma dalle scelte progettuali interne. Separare memoria e dati riduce i colli di bottiglia. Semplificare le istruzioni favorisce il parallelismo. Ottimizzare la struttura interna permette di sfruttare meglio pipeline e cache. Tempo = (Istruzioni × CPI × Tclock). Con RISC abbassi CPI, con Harvard abbassi stalli, con cache abbassi Tmemory.

Calcolo · Perché 3.5GHz ARM batte 4GHz x86
Formula prestazioni: Tempo_CPU = IC * CPI * TclockEsempio programma 1e9 istruzioni:CISC x86: IC=1.0e9, CPI medio=2.5 (micro-op + stalli mem), f=4GHz → T=0.625s Energia decode: altaRISC ARM: IC=1.3e9 (più istruzioni), CPI=1.1 (pipeline pulita), f=3.5GHz → T=0.409s → Più veloce nonostante clock più basso e più istruzioni!Morale: conta CPI e parallelismo, non solo GHz.

9. Verifica operativa

🔬 Confronta le architetture

Hai un ESP32 per sensore temperatura (batteria) e un PC per rendering video. Rispondi motivando:

  1. Quale usa Harvard pura e quale Harvard modificata? Perché?
  2. Se il PC usa x86-64, perché traduce internamente in RISC-like? Cosa perderebbe altrimenti?
  3. CISC vs RISC: quale ha formato istruzione fisso? Perché questo aiuta il pipeline?
  4. Un programma CISC ha 1M istruzioni, CPI 3, 4GHz. Uno RISC 1.4M istruzioni, CPI 1.2, 3GHz. Quale finisce prima? Calcola.
  5. Perché ARM domina su mobile? Collega RISC + Harvard + energia.
✅ Soluzione ragionata

1) ESP32 → Harvard pura: Flash separata da SRAM, determinismo real-time. PC → Harvard modificata: L1 separate, RAM condivisa, flessibilità OS.
2) Senza traduzione, decode CISC variabile bloccherebbe pipeline. Traducendo in μOps fissi, pipeline RISC-like funziona, recuperando IPC. Costo: area e potenza per decoder complesso.
3) RISC: lunghezza fissa 32bit → fetch sempre uguale, decode in 1 ciclo, predizione PC banale. CISC variabile → devi capire dove finisce istruzione prima di fetchare prossima.
4) T_CISC = 1e6*3/4e9=0.75ms. T_RISC=1.4e6*1.2/3e9=0.56ms → RISC vince nonostante più istruzioni.
5) RISC = hardware semplice → meno transistor → meno consumo. Harvard L1 = parallelismo → meno stalli → meno cicli persi. Mobile = batteria, quindi perf/Watt vince su GHz puri.

✓Nel modello di Von Neumann, dati e istruzioni condividono memoria e bus — questo crea il collo di bottiglia.
✓L'architettura Harvard separa fisicamente le due memorie con bus distinti, consentendo accessi simultanei.
✓La Harvard modificata è il compromesso usato nei processori moderni: cache L1 I/D separate, L2/L3 e RAM condivise.
✓Harvard e Von Neumann riguardano l'organizzazione della memoria — CISC e RISC riguardano l'insieme di istruzioni.
✓Le architetture CISC (x86) usano istruzioni complesse e variabili — programmi compatti, decode complessa, pipelining difficile.
✓Le architetture RISC (ARM, RISC-V) usano istruzioni semplici e fisse — ogni istruzione in un ciclo, pipelining ottimale, alta efficienza energetica.
✓I processori moderni combinano i due livelli: Intel/AMD traducono CISC in micro-op RISC internamente, Apple Silicon è Harvard modificata + RISC.
✓La scelta architetturale non riguarda solo la velocità, ma l'efficienza complessiva: T = IC×CPI×Tc, energia e determinismo.

📚 Prossimo passo - Alternative ai microprocessori

Hai visto come ottimizzare la CPU. Ora vediamo alternative: GPU con migliaia di core, FPGA riconfigurabili, TPU per IA. Quando conviene non usare la CPU? Porta schema Von Neumann vs Harvard e CISC vs RISC — nella prossima lezione confrontiamo i modelli di calcolo parallelo.