Un semplice microprocessore - istruzioni, ciclo singolo e cicli multipli
In questa pagina 5
Dopo il datapath (Un semplice microprocessore - datapath, ALU e register fileUn calcolatore semplificato ma completo ha datapath, unità di controllo e memoria. Il datapath contiene un register file ($2^m$ registri da $n$ bit, due porte di lettura A e B e una di scrittura), un MUX B (registro o costante), una unità funzionale = ALU + shifter e un MUX D (risultato o dato dalla memoria); segnala V, C, N, Z. La ALU unisce un circuito aritmetico (sommatore con logica di ingresso per $B$: $0$, $B$, $\overline B$, tutti 1, più $C_{in}$) e uno logico (AND, OR, XOR, NOT) tramite un MUX. Le 15 microoperazioni si scelgono con un codice FS a 4 bit; la control word del datapath è di 16 bit (DA, AA, BA, MB, FS, MD, RW).Un semplice microprocessore - datapath, ALU e register file →) si completa il calcolatore con la unità di controllo e la memoria. Il quadro generale delle architetture è in Instruction Set ArchitectureChe cosa definisce un insieme di istruzioni; elementi di un'istruzione; tipi di operandi e di operazioni; macchine a 0, 1, 2 e 3 indirizzi con lo stesso calcolo svolto in ciascuna; architetture load/store.Instruction Set Architecture →, Formato delle istruzioni e modalità di indirizzamentoModalità di indirizzamento (immediato, diretto, indiretto, a registro, indiretto a registro, con spiazzamento, relativo al PC, indicizzato e scalato, a pila) con indirizzo effettivo ed esempi; formati fissi e variabili; i formati R, I e J di MIPS e il formato a 32 bit di ARM con il calcolo dei campi.Formato delle istruzioni e modalità di indirizzamento →, Ciclo fetch-executeRegistri PC, IR, MAR e MBR; ciclo dell'istruzione diviso in fetch ed execute; i quattro tipi di operazioni; diagramma degli stati del ciclo con calcolo degli indirizzi degli operandi e controllo delle interruzioni; esempio su una macchina ad accumulatore.Ciclo fetch-execute →, Unità di controlloCompiti dell'unità di controllo e micro-operazioni; segnali di controllo del datapath con tabella per le classi di istruzioni; controllo cablato (combinatorio o a stati finiti) e controllo microprogrammato (memoria di controllo, microistruzioni orizzontali e verticali); confronto.Unità di controllo →.
Il calcolatore e il Program Counter
Il computer prende in ingresso una sequenza di istruzioni contenute in una memoria (RAM o ROM). Ogni istruzione comprende l'operazione da effettuare, gli operandi, la destinazione e, in alcuni casi, la prossima istruzione. Il Program Counter (PC) contiene l'indirizzo della prossima istruzione, che può essere ottenuto in due modi: con un contatore (, istruzione successiva) oppure con un caricamento parallelo (parallel load) per cambiare il flusso (salti).
Eseguire un'istruzione significa attivare la sequenza appropriata di microoperazioni: nel datapath e come trasferimenti da e verso la memoria. La unità di controllo:
- preleva (fetch) un'istruzione dalla memoria;
- la decodifica;
- la esegue con una sequenza di una o più microistruzioni.
Definizione (istruzione, instruction set e ISA). Un'istruzione è un insieme di bit che specifica completamente un'operazione in modo sintetico; l'instruction set è l'insieme di tutte le istruzioni; l'ISA ne è il catalogo con la descrizione completa. Si vedono due strutture di controllo: ciclo singolo e cicli multipli.
Esempio. Con un opcode di bit l'instruction set può avere fino a istruzioni, ciascuna di bit.
Instruction set architecture
Tre componenti: elementi di memoria, formato delle istruzioni, specifiche delle istruzioni.
Elementi di memoria visibili all'utente: la memoria istruzioni e la memoria dati (nell'esempio bit ciascuna; potrebbero essere fisicamente la stessa memoria), il register file (, operandi delle operazioni logico-aritmetiche), il program counter. A seconda della microarchitettura ci possono essere altri elementi usati internamente e non visibili.
Formato delle istruzioni
Definizione (formato delle istruzioni a 16 bit). I bit sono divisi in campi. L'opcode specifica l'operazione; gli operandi (registri o memoria) sono indicati in modo esplicito (bit dedicati) o implicito (inclusi nell'opcode). Tre formati, a 16 bit:
formato bit 15–9 bit 8–6 bit 5–3 bit 2–0 Registro opcode (7) DR (registro destinazione) SA (sorgente A) SB (sorgente B) Immediato opcode (7) DR SA OP (operando immediato) Salto (jump/branch) opcode (7) AD sinistra SA AD destra
Esempio. Nel formato registro bit; con , e i tre campi valgono , e .
Gli 8 registri si indicano con 3 bit. Nel formato immediato l'operando ha solo 3 bit: i 13 restanti sono riempiti con zeri (zero fill, zf). Il formato di salto serve ad alterare il flusso:
- branch (ramo): condizionato dal contenuto di un registro (per esempio ); è PC-relativo: con offset AD di bit esteso in segno (se, sign extension) per poter saltare avanti e indietro (complemento a 2). Intervallo limitato di indirizzi (vicini al PC);
- jump (salto): intervallo più ampio, il contenuto di un registro è la destinazione.
Set di istruzioni
(RD, RA, RB = registri; OP = operando; AD = indirizzo; mnemonico = rappresentazione simbolica dell'opcode, tradotta in binario dall'assembler; bit di stato aggiornati: .)
| istruzione | opcode | mnemonico | descrizione |
|---|---|---|---|
| Move A | 0000000 | MOVA RD,RA | |
| Increment | 0000001 | INC RD,RA | |
| Add | 0000010 | ADD RD,RA,RB | |
| Subtract | 0000101 | SUB RD,RA,RB | |
| Decrement | 0000110 | DEC RD,RA | |
| AND | 0001000 | AND RD,RA,RB | |
| OR | 0001001 | OR RD,RA,RB | |
| XOR | 0001010 | XOR RD,RA,RB | |
| NOT | 0001011 | NOT RD,RA | |
| Move B | 0001100 | MOVB RD,RB | |
| Shift right | 0001101 | SHR RD,RB | |
| Shift left | 0001110 | SHL RD,RB | |
| Load immediate | 1001100 | LDI RD,OP | |
| Add immediate | 1000010 | ADI RD,RA,OP | |
| Load | 0010000 | LD RD,RA | |
| Store | 0100000 | ST RA,RB | |
| Branch on zero | 1100000 | BRZ RA,AD | se : , altrimenti |
| Branch on negative | 1100001 | BRN RA,AD | se : , altrimenti |
| Jump | 1110000 | JMP RA |
Per tutte le istruzioni (salvo salti presi) vale anche , per preparare il ciclo successivo. È un'architettura load/store: LD e ST sono le uniche istruzioni con accesso alla memoria dati; tutte le altre operano sui registri.
Osservazione sui codici. I quattro bit meno significativi dell'opcode (bit 12–9 dell'istruzione) coincidono con il codice della unità funzionale (Un semplice microprocessore - datapath, ALU e register fileUn calcolatore semplificato ma completo ha datapath, unità di controllo e memoria. Il datapath contiene un register file ($2^m$ registri da $n$ bit, due porte di lettura A e B e una di scrittura), un MUX B (registro o costante), una unità funzionale = ALU + shifter e un MUX D (risultato o dato dalla memoria); segnala V, C, N, Z. La ALU unisce un circuito aritmetico (sommatore con logica di ingresso per $B$: $0$, $B$, $\overline B$, tutti 1, più $C_{in}$) e uno logico (AND, OR, XOR, NOT) tramite un MUX. Le 15 microoperazioni si scelgono con un codice FS a 4 bit; la control word del datapath è di 16 bit (DA, AA, BA, MB, FS, MD, RW).Un semplice microprocessore - datapath, ALU e register file →): ADD (), SUB (), AND , LDI ( con = costante), ADI . I tre bit alti (15, 14, 13) distinguono il tipo: operazioni su registri, LD, ST, operazioni con costante, salti condizionati, salto incondizionato.
Esempio di rappresentazione in memoria
| indirizzo | contenuto | istruzione | effetto |
|---|---|---|---|
| 25 | 0000101 001 010 011 |
SUB (opcode 5), DR=1, SA=2, SB=3 | |
| 35 | 0100000 000 100 101 |
ST (opcode 32), SA=4, SB=5 | |
| 45 | 1000010 010 111 011 |
ADI (opcode 66), DR=2, SA=7, OP=3 | |
| 55 | 1100000 101 110 100 |
BRZ (opcode 96), AD=101 100, SA=6 |
se : |
L'offset di BRZ è che in complemento a 2 a 6 bit vale : se il programma torna a . Se e , l'istruzione in 35 scrive all'indirizzo (dove prima c'era ).
Computer a ciclo singolo
Il computer a ciclo singolo carica ed esegue ogni istruzione in un solo ciclo di clock. Blocchi: PC, memoria istruzioni (non viene scritta), decoder delle istruzioni, register file, MUX B, unità funzionale, memoria dati (scritta con ), MUX D, un blocco di controllo del PC e un'unità di estensione (extend) che aggiunge i bit a sinistra dell'offset. Nella parte di controllo l'unica memoria è il PC, aggiornato a ogni ciclo:
- normalmente ;
- jump: valore del bus A;
- branch: offset esteso in segno (se la condizione è vera).
Decoder delle istruzioni. È una rete combinatoria che dai bit dell'istruzione produce i segnali di controllo del datapath. Alcuni bit passano diretti: = bit 8–6 (campo DR), = bit 5–3 (SA), = bit 2–0 (SB), = bit 12–9. Gli altri segnali () dipendono dai bit 15, 14, 13 e 9. Tabella di verità (X = indifferente):
| tipo di istruzione | 15 14 13 9 | MB | MD | RW | MW | PL | JB | BC |
|---|---|---|---|---|---|---|---|---|
| operazione della unità funzionale su registri | 0 0 0 X | 0 | 0 | 1 | 0 | 0 | X | X |
| lettura memoria (LD) | 0 0 1 X | 0 | 1 | 1 | 0 | 0 | X | X |
| scrittura memoria (ST) | 0 1 0 X | 0 | X | 0 | 1 | 0 | X | X |
| operazione su registro e costante | 1 0 0 X | 1 | 0 | 1 | 0 | 0 | X | X |
| salto condizionato su zero (BRZ) | 1 1 0 0 | X | 0 | 0 | 0 | 1 | 0 | 0 |
| salto condizionato su negativo (BRN) | 1 1 0 1 | X | 0 | 0 | 0 | 1 | 0 | 1 |
| salto incondizionato (JMP) | 1 1 1 X | X | 0 | 0 | 0 | 1 | 1 | X |
Significato: (0 registro, 1 costante), (0 risultato, 1 dato dalla memoria), (scrive il register file), (scrive la memoria dati), PL (load PC: il PC non incrementa ma si carica), JB (jump: il PC prende il bus A, altrimenti PC + offset), BC (condizione: 0 zero, 1 negativo). La control word a ciclo singolo è di 20 bit: .
Come esegue un'istruzione (sempre nello stesso ciclo): il PC indirizza la memoria istruzioni; l'istruzione è decodificata; si leggono i registri e ; la unità funzionale calcola; il risultato (o il dato letto dalla memoria) torna al register file (scritto sul fronte di clock); il PC è aggiornato. Esempi:
- ADD (tipo registro): , , , ;
- LD RD,RA: l'indirizzo è il bus A (), , ;
- ST RA,RB: indirizzo = bus A (), dato = bus B (), , .
Formula (periodo di clock del ciclo singolo). Il periodo di clock deve essere almeno la somma dei ritardi di tutti i blocchi lungo il cammino critico, perché in un ciclo il segnale attraversa tutti in sequenza. Esempio con ritardi tipici:
blocco PC memoria istruzioni register file (lettura) MUX B unità funzionale o memoria dati MUX D register file (scrittura) ritardo (ns) 0,2 4 0,6 0,2 4 0,2 0,6 Somma ns MHz. Anche l'istruzione più semplice (un ADD) impiega l'intero periodo, dimensionato sulla più lenta (LD). Inoltre servono memorie separate per istruzioni e dati (nello stesso ciclo si accede a entrambe), cosa costosa: le due limitazioni si superano con il computer a cicli multipli, e le prestazioni con la pipeline (Pipeline, hazard e architetture RISC e CISCLa pipeline divide l'esecuzione in stadi separati da registri (IF, DOF, EX, WB) che lavorano in parallelo su istruzioni diverse: la latenza di una istruzione non cambia, il throughput aumenta di un fattore minore del numero di stadi (ritardo dei FF, stadio più lento). Con $k$ stadi e $N$ istruzioni servono $k+N-1$ cicli (riempimento e svuotamento). Gli hazard bloccano la pipeline: di dato (operando non ancora scritto: rimedi NOP, stall, forwarding) e di controllo (salti: bolle, branch prediction). RISC: istruzioni semplici, load/store, formato unico, 32 registri con R0$=0$; CISC: istruzioni complesse, più modi di indirizzamento, formato variabile, controllo microprogrammato.Pipeline, hazard e architetture RISC e CISC →).
Esempio. Con ritardo totale ns si ha MHz.
Computer a cicli multipli
Le istruzioni sono eseguite in un numero variabile di cicli di clock, quindi possono essere più complesse. Servono modifiche a:
- memoria: si può usare una sola memoria per istruzioni e dati. Spesso per una singola istruzione servono più accessi (l'istruzione stessa e un dato), impossibili in un ciclo;
- unità di controllo: l'istruzione va mantenuta per più cicli, quindi si aggiunge l'instruction register (IR) con segnale di load; il decoder combinatorio è sostituito da una macchina sequenziale: un registro dello stato di controllo, logica di controllo e uno stato futuro: (stato, opcode, bit di stato) control word;
- datapath: registri duplicati per contenere risultati intermedi, ottenuti in un ciclo e necessari in un ciclo successivo della stessa istruzione. Sono interni e non visibili al programmatore (–); i campi , , (4 bit) scelgono un registro utente (DR/SA/SB) oppure interno, a seconda del bit più significativo.
Control word a cicli multipli (28 bit): (4, stato futuro) (2) (4) (4) (4) (4) . (program sequence) determina il PC: mantiene, incrementa, salto condizionato, jump; (instruction load) carica l'IR; è il MUX che sceglie l'indirizzo della memoria (PC per il fetch, bus A per i dati).
Macchina a stati. Le istruzioni più semplici richiedono il numero minimo di cicli, due, perché accedono sia all'istruzione sia ai dati: instruction fetch (INF), in cui , e instruction execution (EX0), che esegue l'operazione, aggiorna il PC e riporta a INF. Esempi: ADD: INF, poi EX0 con e .
Istruzioni più lunghe (3 o più cicli): per esempio un load con registro indiretto ha 3 cicli: INF; EX0: (uso del registro interno ); EX1: e . Gli shift multipli (a destra e a sinistra di più posizioni, definite da OP) richiedono un ciclo di stati EX0–EX4 che usa come registro di lavoro e come contatore che si decrementa finché non vale zero (il segnale di stato ne rileva l'azzeramento): ogni iterazione sposta di un bit, alla fine .
Vantaggi: l'orologio può essere più veloce (determinato dal blocco più lento in ogni ciclo, non dall'intera catena) e si può usare una memoria sola; svantaggio: ogni istruzione impiega almeno due cicli. Per riportare a un'istruzione per ciclo con clock veloce si usa la pipeline.
Errori comuni
- Dire che l'indirizzo di memoria di LD/ST è un campo dell'istruzione: è il contenuto del registro (bus A).
- Dimenticare l'incremento del PC nelle istruzioni che non saltano.
- Credere che in un ciclo singolo un'istruzione semplice impieghi meno tempo: il periodo è lo stesso per tutte.
- Confondere registri interni (non visibili) e registri utente.
- Leggere l'offset di BRZ come numero senza segno: è in complemento a 2 ().
Versione ripasso
- PC e istruzioni: il PC contiene l'indirizzo della prossima istruzione: (contatore) o caricamento parallelo per i salti. Eseguire un'istruzione: fetch, decodifica, esecuzione con una o più microistruzioni.
- Formati a 16 bit: registro
opcode(7) DR(3) SA(3) SB(3); immediatoopcode DR SA OP(3), con l'operando esteso con zeri (zero fill); saltoopcode AD(3) SA AD(3), con offset di 6 bit in complemento a 2 e PC-relativo. - Load/store: solo LD () e ST () accedono alla memoria dati; le altre operano sui registri.
- Set di istruzioni: MOVA, INC, ADD, SUB, DEC, AND, OR, XOR, NOT, MOVB, SHR, SHL; LDI, ADI; LD, ST; BRZ, BRN (se la condizione è vera ), JMP (). Per tutte le altre istruzioni .
- Codici: i bit 12–9 dell'opcode coincidono con il codice FS della unità funzionale (ADD , SUB , AND ); i bit 15–13 distinguono il tipo ( registri, LD, ST, con costante, salti condizionati, jump).
- Esempi in memoria:
0000101 001 010 011è SUB, ;1100000 101 110 100è BRZ con AD , cioè in complemento a 2: se il programma passa da 55 a 35. - Ciclo singolo: il decoder combinatorio ricava , , direttamente dai bit dell'istruzione e , , , , , , dai bit 15, 14, 13 e 9. Control word di 20 bit. Ogni istruzione dura un ciclo, dimensionato sulla LD.
- Periodo del ciclo singolo: somma dei ritardi lungo il cammino critico, ns, cioè circa 102 MHz. Servono memorie separate per istruzioni e dati.
- Ciclo multiplo: una memoria sola; si aggiungono l'instruction register IR e registri interni –, non visibili al programmatore; il decoder è una macchina sequenziale con stato futuro. Control word di 28 bit (NS, PS, IL, DX, AX, BX, MB, FS, MD, RW, MM, MW). sceglie il PC: mantiene, incrementa, salto condizionato, jump.
- Stati: ogni istruzione inizia con INF (); ADD usa poi EX0 e richiede due cicli. Il LD con registro indiretto richiede 3 cicli (INF, EX0 con , EX1). Gli shift multipli usano come contatore fino a zero.
- Vantaggi e costi: il clock è determinato dal blocco più lento per ciclo e si usa una sola memoria; ogni istruzione richiede almeno due cicli. Per tornare a un'istruzione per ciclo si usa la pipeline (Pipeline, hazard e architetture RISC e CISCLa pipeline divide l'esecuzione in stadi separati da registri (IF, DOF, EX, WB) che lavorano in parallelo su istruzioni diverse: la latenza di una istruzione non cambia, il throughput aumenta di un fattore minore del numero di stadi (ritardo dei FF, stadio più lento). Con $k$ stadi e $N$ istruzioni servono $k+N-1$ cicli (riempimento e svuotamento). Gli hazard bloccano la pipeline: di dato (operando non ancora scritto: rimedi NOP, stall, forwarding) e di controllo (salti: bolle, branch prediction). RISC: istruzioni semplici, load/store, formato unico, 32 registri con R0$=0$; CISC: istruzioni complesse, più modi di indirizzamento, formato variabile, controllo microprogrammato.Pipeline, hazard e architetture RISC e CISC →).
- Errori: indirizzo di LD/ST letto come campo dell'istruzione (è il contenuto di , cioè il bus A); PC non incrementato; offset di BRZ letto senza segno; registri interni confusi con quelli utente.
- Esempio di ST:
0100000 000 100 101(ST, opcode 32) con e scrive ; con e la locazione 70 passa da 192 a 80. - Esempio di ADI:
1000010 010 111 011(opcode 66) dà , con esteso con zeri. - Decoder delle istruzioni: segnali , , , presi direttamente dai bit; , , , , , , dalla tabella sui bit 15, 14, 13 e 9. Per BRZ e BRN si ha e ; per JMP .
- Esecuzione a ciclo singolo: il PC indirizza la memoria istruzioni, si leggono e , la unità funzionale calcola e il risultato torna al register file sul fronte di clock; per LD l'indirizzo è il bus A e ; per ST l'indirizzo è il bus A e il dato il bus B, con e .
- Stato in cicli multipli: INF carica l'IR da ; il decoder sequenziale usa il registro di stato per sapere quale microistruzione eseguire nel ciclo successivo, e il segnale rileva la fine dello shift multiplo.
- Errori aggiuntivi: BRN senza il controllo del segno (il bit vale 1 per il negativo); ST scambiato con LD nell'uso dei bus; control word a ciclo singolo (20 bit) confusa con quella a cicli multipli (28 bit).