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.
vuoi
o PayPal
tutte le volte che vuoi
I primi 15 bit (dopo i 6 dell’OP) dell’istruzione rappresentano gli indirizzi dei due registri sorgente
5
2
(operandi) e del registro destinazione (sono 5 bit perché con essi è possibile indirizzare tutti e =
32 registri del Register File). Tali indirizzi vanno in ingresso al Register File, e dopo un certo ritardo
in uscita escono i valori dei due registri sorgente che, vanno in ingresso all’ALU la quale effettua
l’operazione indicata dal segnale di controllo ALU control inviatogli dall’unità di controllo. Dopo
un certo ritardo dovuto alla parte combinatoria dell’ALU, viene fornito in output il risultato
dell’operazione il quale viene memorizzato nell’ingresso Write Data del Register File. Occorre un
segnale di abilitazione alla scrittura nel Register File chiamato RegWrite che l’unità di controllo
pone a 1 quando l’istruzione fornisce un risultato da memorizzare. Gli ingressi ovviamente non
cambieranno fino alla fine del ciclo. Si costruisce adesso il pezzo di datapath relativo all’executing
delle istruzioni load e store (formato I):
Adesso è presente anche la memoria dati; il formato d’istruzione I prevede l’OP, i 2 registri, ed un
valore costante chiamato immediato. Read Addr1 e read Addr2 rappresentano i due indirizzi dai
quali andare a leggere/scrivere. I restanti 16 bit indicano lo spiazzamento che occorre sommare
alla base, cioè al valore del contenuto del registro Read Data1, utilizzando l’ALU posta subito dopo
il Register File; il valore della base è però a 32 bit per cui occorre estendere in segno lo
spiazzamento a 32 bit, il risultato finale dell’ALU sarà l’indirizzo per accedere ad una locazione
della Data Memory, tenendo presente che:
Nel caso di uno store il register file seleziona nell’uscita Read Data2 il valore del registro da
scrivere nella memoria dati (quello richiesto dall’ingresso Read Addr2), e tale valore viene
15
scritto in memoria mediante l’ingresso Write Data. Per fare ciò il segnale di controllo
MemWrite deve essere settato a 1. In questo caso i 10 bit dell’istruzione successivi all’OP
vengono utilizzati per accedere alle locazioni Read Addr1 e Read Adrd2.
Nel caso di una load viene settato ad 1 il segnale MemRead dall’unità di controllo, viene
effettuato un accesso nella memoria dati in lettura, accedendo alla locazione di memoria
specificata dall’uscita dell’ALU, ed il valore letto dalla memoria viene scritto nel registro
mediante l’ingresso WriteData. In questo caso i 10 bit dell’istruzione successivi all’OP
vengono utilizzati per accedere alle locazioni Read Addr1 e Write Addr.
Adesso si costruisce il pezzo di Datapath relativo all’executing delle istruzioni branch (Formato I):
Il branch è l’operazione di salto condizionato: in ingresso al Register File vanno gli indirizzi dei due
registri di cui si vuole confrontare il valore, e dopo un certo ritardo il register file tira fuori il valore
di tali registri, che entrano in ingresso all’ALU. Quest’ultima effettua una sottrazione tra i due
operandi per confrontarli, così che se i due operandi sono uguali, il flag zero dell’ALU è pari ad 1;
questo flag sarà inviato ad una logica di controllo che dovrà capire se eseguire la prossima
istruzione (cioè PC + 4) oppure quella riportata nella destinazione di salto (PC + 4 + Spiazzamento).
Nel frattempo l’indirizzo di salto viene calcolato in parallelo prendendo i 16 bit dello spiazzamento
estendendoli a 32 e poi shiftandoli a sinistra di 2 bit per allineare le parole, ed infine sommando il
risultato di questa operazione con PC + 4. Cosi dal confronto degli operandi ((cioè dal flag zero) si
decide se saltare all’indirizzo di destinazione oppure proseguire normalmente alla prossima
istruzione. Il motivo di questo shift a sinistra di 2 bit è che in tal modo il secondo addendo
dell’adder terminerà con due zeri, ma anche il primo addendo PC + 4 termina con due zeri perché
si vuole accedere sempre al primo byte dell’indirizzo dell’istruzione, e la somma fra questi due
addendi sarà tale per cui il risultato termina sempre con due zeri, per cui anche in caso di salto si
accederà sempre al primo byte dell’indirizzo dell’istruzione. Infine si costruisce il pezzo di Datapath
relativo all’executing delle istruzioni Jump (Formato J): 16
Jump è l’operazione di salto incondizionato, ed è un’istruzione che ha formato J; la caratteristica
principale delle istruzioni di formato J è che tolti i 6 bit dell’OP, queste ultime contengono soltanto
i 26 bit di offset che compongono una parte dell’indirizzo a cui saltare. Grazie ad una operazione di
shift a sinistra questi 26 bit vengono portati a 28 (aggiungendo 00 alle ultime due posizioni per
allineare la parola), e poi ad essi vengono affiancati i 4 bit più significativi del PC + 4, cioè della
prossima istruzione da eseguire. I 32 bit ottenuti diventano l’indirizzo a cui saltare. Mettendo
insieme tutti questi pezzi si ottiene un datapath completo che esegue contemporaneamente tutte
queste istruzioni in un unico ciclo di clock. Basta mettere una serie di MUX le cui linee di selezione
sono controllate dall’unità di controllo: 17
MUX 1: Nel caso di istruzioni beq o aritmetiche-logiche (formato R), l’uscita Read Data2
(contenuto del secondo registro) del Register File entra nell’ALU. Invece nel caso di
istruzioni Load o Store, nella ALU entra l’immediato esteso a 32 bit. Il segnale che gestisce
questo MUX è l’ALUscr (o ALU_opB), che vale 0 quando il secondo operando dell’ALU è il
Read Data 2, oppure vale 1 quando il secondo operato è l’immediato esteso a 32 bit.
MUX 2: Nel caso di una istruzione R l’uscita dell’ALU entra nel Register File e viene scritto in
Write Data, ma non è così nel caso di istruzioni Load perché in tal caso nel Write Data del
register File viene scritto il dato letto dalla memoria dati. Il segnale di controllo si chiama
MemToReg, e vale 0 in caso di scrittura in WriteData dell’output dell’ALU, altrimenti vale 1
in caso di scrittura del contenuto letto da memoria.
MUX 3: Serve per fondere nel datapath anche l’istruzione branch. Tramite il segnale di
controllo PCSrc generato dall AND fra il flag zero ed il segnale Branch dell’Unità di
Controllo, viene deciso se il prossimo indirizzo da eseguire è PC + 4 (PCSrc = 0) oppure
l’indirizzo di salto (PCSrc = 1). Il Segnale Branch vale invece 1 quando c’è un’istruzione di
tipo beq oppure bne (branch not equals).
MUX 4: Serve per inserire nel datapath anche l’istruzione di jump. Tramite il segnale di
controllo Jump viene deciso se la prossima istruzione da eseguire è un salto incondizionato
(Jump = 1) oppure la prossima istruzione PC + 4 (Jump = 0); la scelta che viene fatta viene
scritta nel PC.
MUX 5: Decide se (in base al tipo di formato) ci sarà una scrittura nel Register File, perché
nel caso di istruzioni branch e store non viene scritto nulla nel banco di registri, ma per le
istruzioni R e load invece in essi viene scritto qualcosa. Tramite il segnale di controllo
RegDst quindi l’Unità di Controllo sceglie se far entrare o meno 5 bit dell’istruzione in Read
Addr2 (RegDst = 1, caso delle istruzioni R) oppure in Write Addr (RegDst = 0, caso di store).
La parte in rosso nella figura è quella relativa all’Unità di Controllo che deve generare nella fase di
Decoding delle istruzioni tutti i segnali di controllo da dare ai vari componenti (ALU, MUX,
Registri). In ingresso all’Unità di Controllo ci sono soltanto i 6 bit dell’OP; per semplificare
ulteriormente la progettazione è possibile scindere per essa la parte che riguarda l’ALU da tutto il
resto, generando un nuovo segnale chiamato ALU_op, che diviene l’input di questo nuovo
sottoblocco della unità di Controllo che gestisce l’ALU insieme agli eventuali ultimi 6 bit di funct
dell’istruzione R (in caso si volessero ampliare le funzionalità dell’ALU). Altri segnali di controllo
molto importanti generati dall ALU sono il RegWrite, che quando vale 1 abilita la scrittura alla fine
del ciclo di istruzione nel Write Data del Register File (nella locazione specificata dal Write Addr),
oppure il MemRead ed il MemWrite, che quando pari ad 1 abilitano la scrittura/lettura nella
memoria dati nel caso di istruzioni load/store. Si analizzano infine i PRO e CONTRO di questa
progettazione: 18
PRO: La soluzione è molto semplice, che perché l’Unità di Controllo è semplicissima da
realizzare, in quanto è una macchina combinatoria (un decoder oppure un transcoder) che
prende in ingresso l’OP dell’istruzione da eseguire e tira fuori i giusti segnali di controllo a
6
2
seconda della configurazione di bit dell’OP (in totale ci sono possibili combinazioni di
segnali).
CONTRO: Il periodo del clock T deve durare quanto l’istruzione più lunga che è la load (in
quanto oltre alla lettura nella memoria dati c’è anche un Write Back nel Register File).
Questo vuole dire che nel caso di istruzioni che durano poco tempo come una Jump si
perde molto tempo inutilmente.
CONTRO: Ci sono risorse di calcolo duplicate (ci sono 2 adder e 2 Memorie), ma non è
possibile accorparle insieme perché durante il ciclo di clock esse vengono utilizzate più
volte. Nella soluzione Multi-Ciclo l’ALU ed i 2 Adder vengono accorpati.
Quindi progettare un MIPS con una singola istruzione per ciclo di clock semplifica notevolmente la
soluzione, però comporta problemi di lentezza e di risorse duplicate.
1.1.5. Progetto di un Processore MIPS Multiple-Cycle
Per risolvere le inefficienze riscontrate nella progettazione del MIPS a singolo ciclo si cambia
approccio:
Ogni istruzione viene suddivisa in più fasi (massimo 5), dove ogni fase coincide con un ciclo
di clock, il cui periodo T sarà pari alla durata della fase più lenta.
Le 5 fasi dell’istruzione più lenta (load) sono le seguenti:
o Instruction Fetch: viene prelevata l’istruzione ed aggiornato il PC.
o Decode: l’Unità di Controllo decodifica l’istruzione ed invia i segnali di controllo ai
componenti; vengono letti gli operandi dell’istruzione dai registri, e viene calcolato
il valore esteso in segno dell’immediato per il Branch.
o Exec: vengono eseguite le istruzioni formato R, calcolati gli indirizzi di memoria, e
vengono completare già qui alla terza fase le istruzioni di Branch e Jump. 19
o Memory Access: viene effettuato l’accesso in memoria dati in lettura e scrittura,
vengono completate le istruzioni R con la scrit