# Microarchitettura

In ingegneria informatica e elettronica, la microarchitettura (talvolta abbreviata con le parole µarch o uarch), detta anche organizzazione del computer, è il modo in cui un'architettura del set di istruzioni (ISA, Instruction Set Architecture) viene implementata in un processore. Una data ISA può essere implementata con molteplici microarchitetture. Le implementazioni possono variare a causa di diversi obiettivi in fase progettuale o a causa dell'evoluzione della tecnologia. L'architettura del computer è la combinazione del set di istruzioni e del design concreto della microarchitettura.
Con microarchitettura si indica anche il progetto a livello logico di unità funzionali di un microprocessore, microcontrollore o digital signal processor. Viene mostrata tramite una progettazione a blocchi in modo da indicare le dipendenze tra le varie unità funzionali (come unità per i numeri in virgola mobile e unità per gli interi, la coda di decodifica, ecc).
Dalla microarchitettura si deduce la tipologia di pipeline (il numero di stadi, la loro correlazione), la disposizione della cache, (la presenza di cache separata per dati e istruzioni, la presenza di cache di secondo livello, ecc), la presenza di eventuali unità multimediali SIMD e i bus di collegamento con l'esterno. Dall'esame dello schema della microarchitettura si può comprendere se il processore è stato sviluppato per raggiungere prestazioni elevate o per ottenere dispositivi dal basso consumo.

## Relazione tra il set di istruzioni e l'architettura

Il set di istruzioni (ISA) corrisponde approssimativamente al modello di programmazione di un processore, secondo il punto di vista di un programmatore di linguaggio assembly o di un compilatore. L'ISA comprende, tra l'altro, il modello di esecuzione, i registri del processore, le modalità di indirizzamento e i formati dei dati. La microarchitettura comprende i componenti del processore e il modo in cui si interconnettono e interagiscono per implementare l'ISA.
La microarchitettura di un dispositivo viene solitamente presentata sotto forma di diagrammi, più o meno dettagliati, che descrivono le interconnessioni dei diversi elementi microarchitetturali. Questi elementi possono variare da semplici porte e registri a unità logico-aritmetiche complete fino a elementi più grandi. Questi diagrammi includono tipicamente due percorsi: il percorso dei dati, che è il percorso in cui viaggiano le istruzioni, gli operandi e i risultati; e il percorso di controllo, in cui viaggiano i segnali di controllo, che a loro volta guidano il funzionamento del percorso dei dati.
Ogni elemento microarchitetturale è, a sua volta, rappresentato da un diagramma schematico che descrive le interconnessioni delle porte logiche utilizzate per implementarlo. Ogni porta logica è rappresentata da uno schema elettrico che descrive le connessioni dei transistor utilizzati per implementarla in una particolare famiglia logica. Questo permette a macchine con microarchitetture diverse di condividere la stessa architettura del set di istruzioni, in modo da potervi eseguire gli stessi programmi. La possibilità di continuare a utilizzare la stessa ISA, pur ottenendo prestazioni più elevate, è ottenuta grazie a nuove microarchitetture e/o soluzioni circuitali, nonché ai progressi nella produzione dei semiconduttori.
In questo modo, una singola microarchitettura può eseguire molteplici ISA al prezzo di dover apportare modifiche minori al microcodice.
Una microarchitettura descrive, tra l'altro:
* il nome degli stadi della pipeline segmentata e la loro dimensione;
* il numero e il tipo di cache;
* l'esistenza di un registro rinominato;
* un'unità di Esecuzione fuori ordine;
* un'unità di predizione delle diramazioni.
La microarchitettura e l'architettura del set di istruzioni costituiscono l'architettura di un computer.

## Aspetti della microarchitettura

Il pipelined datapath è il progetto di percorso dati più comune nelle microarchitetture di oggi. Questa tecnica è utilizzata nella maggior parte dei moderni microprocessori, microcontrollori e DSP. L'architettura segmentata consente a diverse istruzioni di sovrapporsi durante la stessa esecuzione, come in una catena di montaggio. La segmentazione comprende diverse fasi fondamentali nei progetti microarchitetturali, come il fetch delle istruzioni e la loro decodifica, l'esecuzione e la scrittura dei risultati. Alcune architetture includono altre fasi, come l'accesso alla memoria. La progettazione di pipeline segmentate è uno dei compiti centrali della microarchitettura.
Anche le unità di esecuzione sono essenziali per la microarchitettura. Queste unità comprendono unità logiche aritmetiche (ALU), unità in virgola mobile (FPU), unità di lettura/scrittura (load/store), branch prediction e SIMD. Queste unità eseguono le operazioni o i calcoli del processore. La scelta del numero di unità di esecuzione, della loro latenza e delle loro prestazioni è un altro compito centrale della progettazione microarchitetturale. Anche le dimensioni, la latenza, le prestazioni e la connettività delle memorie all'interno del sistema sono parametri decisionali di tipo progettuali.
Pure le decisioni di progettazione a livello di sistema, come l'inclusione o meno di periferiche come i controller di memoria, possono essere considerate parte del processo di progettazione microarchitetturale. Ciò include decisioni sul livello di prestazioni e sulla connettività di tali periferiche.
A differenza della progettazione architettonica, che si concentra sul raggiungimento di un livello ottimale di prestazioni, la progettazione microarchitetturale presta maggiore attenzione ad altre esigenze. Poiché le decisioni di progettazione microarchitetturale influiscono direttamente su ciò che viene inserito in un sistema, è necessario prestare attenzione ad aspetti quali:
* area/costo del chip;
* consumo di energia;
* complessità della logica;
* facilità di connessione;
* facilità di fabbricazione;
* facilità di debug;
* facilità di collaudo.

## Concetti della microarchitettura

Tutte le CPU, così come le implementazioni di microprocessori a chip singolo o multi-chip in generale, eseguono i programmi mediante le seguenti fasi:
* lettura di un'istruzione
* decodifica dell'istruzione;
* reperimento dei dati necessari per la sua elaborazione;
* elaborazione dell'istruzione;
* scrittura dei risultati.
Questa serie di passaggi, apparentemente semplice, è complicata dalla gerarchia della memoria, che comprende la memoria cache, la memoria principale e la memoria non volatile, di cui sono esempi i dischi rigidi (dove vengono memorizzati le istruzioni e i dati del programma), che sono più lenti del processore stesso. Molto spesso, la fase di decodifica dell'istruzione causa un ritardo molto lungo (in termini di cicli della CPU) mentre i dati arrivano sul bus del computer. In effetti, al 2024 è in atto ancora la ricerca intensiva su come creare progetti che evitino il più possibile questi ritardi. Per molti anni, uno degli obiettivi principali della progettazione dei microcomputer è stato quello di eseguire il maggior numero possibile di istruzioni in parallelo, aumentando così la velocità effettiva di esecuzione di un programma. Inizialmente, questi sforzi hanno creato strutture logiche e circuitali piuttosto complesse. Infatti, inizialmente queste tecniche potevano essere implementate solo su costosi mainframe e supercomputer, a causa della quantità di circuiti necessari per realizzarle. Tuttavia, con il progredire della fabbricazione dei chip, queste tecniche sono state implementate su chip di semiconduttori sempre più piccoli, con costi significativamente inferiori.
Alcune tecniche microarchitetturali comuni nelle moderne CPU sono:
* selezione del set di istruzioni;
* pipelining delle istruzioni;
* memoria cache;
* previsione delle biforcazioni;
* scalare al massimo livello;
* esecuzione fuori ordine;
* rinominazione dei registri
* multiprocesso e multithreading.