Al di sopra del livello logico digitale si trova il livello di microarchitettura :

Il suo compito è di implementare il livello ISA ( Instruction Set Architecture ), che non dipende solo dall’ISA ma anche dagli obiettivi di costo e prestazioni del computer che si intende progettare.
Siccome ogni ISA ha un suo principio di progettazione della microarchitettura, vedremo un esempio di ISA : un sottoinsieme della Java Virtual Machine ( JVM ), e siccome questo “sottoinsieme” contiene solo istruzioni su interi, lo chiamiamo IJVM.
Quindi iniziamo descrivendo la microarchitettura sopra la quale implementare IJVM.
Come abbiamo visto in Introduzione-1 molte architetture con istruzioni complesse, come IJVM, sono implementate attraverso la microprogrammazione. Infatti nella nostra microarchitettura, avremo un microprogramma in ROM, e il suo compito sarà di prelevare ( fetch ), decodificare ( decode ) ed eseguire ( execute ) le istruzioni IJVM.
Il microprogramma è costituito da una sequenza di microistruzioni ( che costituiscono il microprogramma ) che utilizzano variabili che rappresentano lo stato della macchina tra cui il PC ( Program Counter ), che indica la locazione di memoria contenente la successiva istruzione ISA da eseguire, infatti viene fatto avanzare durante l’esecuzione di un’istruzione.
Ogni istruzione IJVM è composta da :
- OPCODE ( Operation Code ) : identifica il tipo d’istruzione ( ADD, BRANCH o altro )
- operando/i su cui si applicherà l’istruzione
Questo di esecuzione, chiamato fetch-decode-execute costituisce la base per l'implementazione di ISA complessi come IJVM.
Percorso dati
Il percorso dati ( o data path ) è quella parte di CPU che contiene la ALU, i suoi input e suoi output. review

Questo data path del nostro esempio, contiene dei registri a 32-bit che controlla l’accesso in memoria ( PC, SP, MDR … ).
A questi registri è possibile accedere solamente a livello di microarchitettura, ovvero dal microprogramma.
Quasi tutti i registri possono inviare il proprio contenuto sul bus B collegato in input alla ALU. L’output della ALU guida lo shifter, che a sua volta invia il proprio risultato sul bus C, che a sua volta il suo valore può essere scritto in uno o più registri.
Esistono 2 segnali di controllo :

ALU
La funzione della ALU è determinata da 6 linee di controllo :
F0,F1: selezionare il tipo di funzioneENx: abilita l’inputx(AeB)INVA: invertire l’input di sx, quindi diAINC: incrementare di 1 il risultato
Non tutte le 64 combinazioni delle 6 linee di controllo sono utili, tra le più interessanti ci sono :

(dove -A indica il complemento a due di A)
La ALU come si vede, prende due input A ( dal registro H - Holding ) e B ( dal bus B ).
È possibile “spostare” il valore dell’input B in A, basta applicare la funzione che restituisce B e poi memorizzare il risultato del bus C nel registro H.
Inoltre per gestire l'output della ALU si utilizzano 2 linee di controllo per lo shifter :
SLL8- Shift Left Logical : shifta di 1 byte ( 8 bit ) verso sinistra, impostando i primi 8 bit meno significativi a 0SRA1- Shift Right Arithmetic : shifta di 1 bit verso destra
Temporizzazione del data path
Vediamo ora come funziona la temporizzazione del data path :

In corrispondenza del fronte di salita dell’impulso di clock inizia il ciclo di clock : 0. vengono impostati i bit che guideranno tutte le porte logiche, con un intervallo di tempo finito
- viene selezionato il registro richiesto e "scaricato" il suo valore nel bus
B, prima che il suo valore diventi stabile occorre attendere - ALU e shifter fanno l'operazione, e il risultato è stabile dopo
- dopo un ulteriore tempo i risultati vengono propagati sul bus
Cfino ai registri, che possono essere caricati in corrispondenza del fronte di salita dell’impulso successivo
Operazione della memoria
I registri sono :
MAR- Memory Address Register : contiene gli indirizzi espressi in wordMDR- Memory Data registerPC- Program Counter : contiene gli indirizzi espressi in byteMBR- Memory Byte RegisterSP- Stack PointerLV- Local VariableCPP- Constant PoolTOS- Top word On The StackOPC- Op Code Register ( importante )H- Holding
Inoltre è importate capire che :
MAR/MDRsono utilizzati per leggere e scrivere word di dati del livello ISAPC/MBRsono utilizzati solo per leggere il programma eseguibile del livello ISA
Microistruzioni
Per controllare il percorso dati abbiamo bisogno di 29 segnali, suddivisi in 5 gruppi funzionali :
- 9 segnali per controllare la scrittura dei dati dal bus
Cai registri - 9 segnali per controllare l’abilitazione dei registri sul bus
Bper l’input della ALU - 8 segnali per le funzioni della ALU ( 6 segnali ) e dello shifter ( 2 segnali )
- 2 segnali ( non mostrati ) per dire alla memoria di leggere ( o scrivere ) attraverso
MAR( oMDR) - 1 segnale ( non mostrato ) per indicare il prelievo dalla memoria attraverso
PCoMBR
Siccome in alcuni casi è utile scrivere l’output presente nel bus C in un registro, mentre non ha senso abilitare più registri nello stesso momento sul bus B, infatti è possibile ottimizzare i 9 segnali di abilitazione per il bus B, utilizzando un decoder in modo da utilizzare solo 4 segnali di controllo. Quindi avremo in totale 9+4+8+2+1 = 24 segnali di controllo.
Il formato delle microistruzioni sarà definito dai 24 bit controllo + 2 campi aggiuntivi per definire che cosa deve essere effettuato nel ciclo successivo :

dove sono divisi in 6 gruppi :
- Addr : contiene indirizzo di una eventuale microistruzione successiva
- JAM : determina come viene selezionata la microistruzione successiva
- ALU : seleziona le funzioni della ALU e dello shifter
- C : seleziona quali registri sono scritti dal bus
C - Mem : seleziona funzione della memoria
- B : seleziona la sorgente del bus
B
Microarchitettura Mic-1
Fino ad ora abbiamo parlato di come viene controllato il microprogramma, ma non abbiamo ancora detto quali segnali di controllo abilitare durante ciascun ciclo. Questo è fatto dal sequencer che fa avanzare passo per passo la sequenza di operazioni necessarie per eseguire una singola istruzione ISA. Inoltre il sequencer deve produrre due tipi di informazione ad ogni ciclo :
- lo stato di ogni segnale di controllo
- indirizzo della microistruzione successiva
Vediamo ora un’intero blocco della microarchitettura della nostra macchina di esempio Mic-1 : review

questo blocco è composto da :
- parte del data path ( già analizzato )
- parte di controllo ( vediamo ora )
L’elemento più importante della sezione di controllo è la memoria di controllo ( control store ), che contiene l’intero microprogramma ( memorizza microistruzioni ). Nel nostro caso contiene 512 microistruzioni in formato word e ogni microistruzione è a 36-bit come il formato mostrato in precedenza.
Anche la memoria di controllo necessita di :
- registro di indirizzo : MPC ( MicroProgram Counter )
- registro dei dati : MIR ( MircoInstruction Register ) che consiste nel memorizzare la microistruzione corrente
Consideriamo ora il funzionamento (completo) di questo esempio :

- sul fronte di discesa del clock la microistruzione “puntata” da
MPCviene trasferita inMIR, questo viene effettuato in - i segnali contenuti in
MIRvengono propagati nel data path, grazie al quale il contenuto di un registro scelto va nel busBe la ALU sa quale funzione deve eseguire ( tempo ) - gli input della ALU diventato stabili ( tempo )
- tutto nel circuito si è stabilizzato compresi gli output della ALU, di
N( Negativo ), diZ( Zero ) e dello shifter - dopo un tempo l’output raggiunge i registri attraverso il bus
Ce vengono salvati nel fronte di salita del clock successivo, inoltreMPCsi aggiorna con l’istruzione successiva in modo da riprendere dallo step 1
Componenti del Mic-1 ( aggiuntivi al data path ) :
MPCMIC: composto ( con formato di microistruzioni ) da :- Addr
- J - JAM : determina come modificare l’indirizzo della prossima microistruzioni ( es. in base al flag
N,Z) ( salto condizionato )JAMZJAMNJAMC: linee di ingresso che modifica ( se asserito )MPC( ok per effettuare un “salto” )
- ALU
- C (
C-bus ) - M ( Memory ) : bit che controllano le operazioni in memoria
- B (
B-bus ) : bit che attraverso il decoder 4:16, scelgono quale registro mettere nel busB
- Decoder 4:16
- Porta OR ( quadratino con O ) : serve per un eventuale modifica di
MPCper un “salto”

