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
Idea di base per la formattazione del testo
1) Condividere gli stati della lw fino al calcolo di rs+offset
2) Leggere il valore di M[rs+offset] e memorizzarlo in un registro temporaneo MDR2 (oltre che MDR) controllato con un segnale di scrittura in modo da non perderne il valore
3) Calcolare l'indirizzo rt+offset, leggere in MDR M[rt+offset] e scriverlo direttamente in M[rs+offset] per non perdere il valore
4) Completare l'istruzione scrivendo MDR2 in M[rt+offset].
Modifica al DataPath
Una soluzione è quella di introdurre un MDR2 che viene collegato all'uscita della memoria e che viene dotato di un segnale di scrittura che consente di scrivere questo registro quando vogliamo → se WRMDR2 = 0 non si scrive nulla ma si mantiene il valore già contenuto nel registro.
Per calcolare r2+offset dobbiamo poter utilizzare la ALU: aggiungiamo un ulteriore ingresso al MUX alla destra di A al quale facciamo arrivare il valore di r2 con label = 2 che viene posto in B.
Potremmo anche aggiungere un segnale
Di scrittura all'MDR → lecito ma non indispensabile: MDR viene scritto ad ogni ciclo di clock, ossia mantiene il dato per un solo ciclo di clock. Quello che intendiamo noi è scriverlo e nello stesso ciclo di clock trasferiamo subito il dato in esso contenuto nella memoria dati.
Aggiungiamo un altro multiplexer (in basso a sinistra della memoria) che viene comandato da un segnale di controllo DT (impostato dall'unità di controllo) per poter scrivere il valore in uscita dal MDR in memoria quando WriteData = 1. Allo stesso MUX si aggiunge l'ingresso proveniente da MDR2.
Per risparmiare cicli di clock possiamo subito fare il calcolo di r2+offset nello stato in cui facciamo il prelievo dalla memoria in quanto la ALU sarebbe inutilizzata altrimenti e possiamo così sfruttarla → visibile nel cerchio evidenziato dalla freccia azzurra in cui compare: MemRead - AluOp = 00 - IorD = 1 - WRMDR2 - ALUSrcA
Matilde Simonini
Ingegneria Informatica anno 2021/2022
= 2 - ALUScrB = 2-Il primo valore letto dalla memoria viene scritto in questo modo sia in MDR che in MDR2, ma questo non è un problema in quando MDR viene scritto ad ogni ciclo di clock.
Riassumendo quanto viene fatto dei vari cicli di clock:
- Fetch
- Decode → r1(A), r2(B) (intercambiabili)
- ALU per calcolare r1 + offset → posto in ALUout
- Leggo M[r1 + offset] e pongo in MDR2 + calcolo r2 + offset
- Leggo M[r2 + offset] e pongo in MDR + calcolo ancora r1 + offset
- Uso r1 + offset appena calcolato per mettere M[r2 + offset] in r1 + offset (MDR → memoria) + calcolo ancora r2 +offset
- Uso r2 + offset per porre M[r1 + offset] in r2 + offset (MDR → memoria)
102Matilde Simonini Ingegneria Informatica anno 2021/2022
Esercizio 6: dall’appello CALC-A del 25 marzo 2009 [8 punti]
Si considerino, mostrati nelle figure alla pagina seguente, il datapath ed il diagramma a stati finiti che specifica l’unità di controllo secondo la tecnica multiciclo
relativamente alle istruzioni MIPS lw, sw, beq, j ed alle istruzioni Tipo-R. Si vuole implementare la nuova istruzione MOVA r1, r2 che copia il vettore (array) di parole di memoria di indirizzo r1 nell'indirizzo r2. Si suppone che la fine del vettore sia indicata da un elemento di valore nullo (che va anch'esso copiato). Ricordando i tre formati di codifica delle istruzioni (riportati di seguito) si chiede di: - riportare il formato della nuova istruzione macchina (specificando anche i campi destinati rispettivamente a r1 e r2); - riportare, nella corrispondente figura, le modifiche necessarie al datapath; - estendere il diagramma degli stati per implementare la nuova istruzione. SVOLGIMENTO Dovremo copiare il primo elemento del vettore nella parola di memoria indirizzata da r2, il secondo all'indirizzo appena dopo r2 per poi continuare così finché non si finisce il vettore. Si tratta quindi di un'istruzione che ha un tempo variabile di esecuzione che non si può determinare a priori. Formato della nuova istruzione MOVA r1, r2: ``` OPCODE r1 r2 6 bit 5 bit 5 bit ``` Modifiche necessarie al datapath: ``` [Immagine del datapath con le modifiche necessarie] ``` Diagramma degli stati esteso per implementare la nuova istruzione: ``` [Immagine del diagramma degli stati esteso] ```Può conoscere a priori: dipende dalla lunghezza dell'array. Non possiamo leggere un valore e copiarlo immediatamente nello stesso ciclo di clock. Ogni passo deve essere effettuato in due: ogni volta che dobbiamo copiare un elemento dal primo vettore nel secondo dobbiamo fare 2 passi, per i quali sfruttiamo il registro MDR nel quale posizioniamo inizialmente il valore preso dal primo vettore, che verrà poi, nel ciclo successivo, copiato in memoria all'indirizzo desiderato. Dovremo poi avere la possibilità di incrementare gli indirizzi di partenza e destinazione per ciclare su tutti gli elementi dell'array. Dovremo prevedere un ciclo per l'esecuzione di questa istruzione.
Formato: Bisogna rappresentare due registri: Tipo-I o Tipo-R. È lecito, in questo caso, scegliere uno dei due formati in maniera arbitraria in quanto a noi interessa solo la porzione che va da Op a rt, ossia la parte comune a entrambi i formati; il resto non interessa.
IDEA DI
BASE1) Decode: si caricano r1 e r2 rispettivamente in A e B
2) A e B contengono gli indici che andranno di volta in volta incrementati di 4.
Creazione di un “ciclo” in cui:
Con la terza e 4 riga si fa riferimento all’incremento degli indirizzi, per ciclare l’array.
Le iterazioni terminano quando viene copiato il valore 0 che identifica la fine dell’array.
103
Matilde Simonini Ingegneria Informatica anno 2021/2022
Modifica al DataPath
Possiamo utilizzare gli stessi registri A e B per puntare la posizione che deve essere coinvolta nello spostamento.
Ad ogni iterazione dobbiamo poter usare l’indirizzo di A per poter leggere dalla memoria un valore: al mux iniziale si aggiunge l’ingresso 2 per collegarlo all’uscita di A → in questo modo possiamo selezionare A come indirizzo di memoria, con IorD = 2.
Se poi IorD = 3 allora viene selezionato il valore di B.
A deve essere poi incrementato per poter puntare all’elemento successivo.
La ALU ci consente di
aggiungere il valore 4. Per fare A + 4 possiamo sfruttare quanto è già presente nel datapath: dobbiamo aggiungere un altro mux che ci consenta di riportare la somma A + 4 in A → aggiungiamo un altro segnale di scrittura WA che ci permette di decidere se scrivere o no in A. Lo stesso ragionamento viene fatto per la somma B + 4. Per fermare le iterazioni bisogna verificare che il valore copiato in memoria sia 0. Questo valore passa anche per Memory Data Register e quindi possiamo generare un segnale di controllo che ci dica quando in MDR è presente il valore 0 prendendo i 32 bit del Data Register e mettendoli tutti in OR → negando l'OR otteniamo 1 se tutti i 32 bit sono 0 se il segnale in uscita vale 1 allora vuol dire che in MDR abbiamo il valore 0 e dobbiamo terminare. → Se si considera l'OR singolarmente, senza la negazione: risulta 0 se tutti i bit sono a 0, mentre risulta 1 se almeno un bit fa 1. Modifica diagramma a stati finiti: A rigoredobbiamo conservare i collegamenti e le scritture precedenti. Durante il primo stato. NB: per altri esempi: cfr i testi d'esame di Calcolatori Elettronici A (oltre a quelli di Calcolatori!).104 Matilde Simonini Ingegneria Informatica anno 2021/2022
CPU multiciclo - Complementi: gestione delle eccezioni
Eccezioni
Le eccezioni sono: eventi inattesi che cambiano il flusso di esecuzione delle istruzioni.
Ci sono due tipi di eccezioni: interne ed esterne (interruzioni).
Eccezioni: provenienti dall'interno del processore uso di istruzioni indefinite (quando il COP non corrisponde a nessuno di quelli conosciuti), divisione per zero, overflow, ecc. chiamata del sistema operativo da parte di un programma utente → il processore passa alla modalità supervisore ed esegue una routine di servizio, per poi tornare all'istruzione successiva a quella della chiamata.
Interruzioni (interrupt): provenienti dall'esterno del processore (es. richieste dei dispositivi di I/O).
Processori possono lavorare in più modalità: nella modalità utente sono disponibili meno opzioni, mentre nella modalità amministratore sono disponibili alcune operazioni in più.
Un utente potrebbe scrivere un programma che include un'istruzione relativa all'istruzione privilegiata, in questo caso, se il processore lo esegue in modalità utente viene generata un'eccezione interna.
La tecnica più efficiente nel caso delle interruzioni esterne è quella di dotare le periferiche di un segnale che arriva al processore per comunicargli qualcosa. In questo caso l'HW del processore fa sì che il programma corrente venga interrotto: si va ad un indirizzo prestabilito al quale si trova l'algoritmo per gestire l'interruzione relativa alla periferica considerata.
NB: terminologia non standard, p.es. Intel 80x86: si utilizza il termine interrupt per tutti gli eventi- MIPS: eccezione indica tutti gli eventi
(esterni ed interni), quelli esterni sono anche chiamati interrupt-In ogni caso è necessario che il processore sia predisposto per passare all'esecuzione di unaroutine di servizio nel caso di un'eccezione e in più si ha bisogno che metta a disposizione neiregistri delle informazioni che permettano di capire da dove è stata generata l'eccezione.Successivamente il controllo deve tornare al programma utente, cosa che rende necessariosalvare e ripristinare lo stato del programma utente.Le eccezioni devono evitare assolutamente di modificare lo stato della macchina; ad esempioil contenuto dei registri non deve essere alterato durante la gestione dell'eccezione.Ora vediamo: eccezioni dovute a istruzioni indefinite e overflow.
Gestione delle eccezioni
- Controllo trasferito a routine di servizio (handler S.O.)
- L'indirizzo dell'istruzione che causa l'eccezione è salvato in EPC (Exception Program Counter)
- Viene
segnalata la causa:
- in un registro di stato (approccio usato dal MIPS: cause register) e il controllo è trasferito a routine di indirizzo predefinito.
- mediante interrupt vettorizzato (indirizzi diversi a seconda della causa, tipicamente separati di poche istruzioni, p.es. 8) → si salta ad indirizzi diversi a seconda della tipologia di causa.
Vediamo come modificare il datapath per gestire le seguenti eccezioni secondo l'architettura MIPS:
- undefined instruction: Causa [0] = 0
- overflow: Causa [0] = 1
Modifiche datapath
In basso a destra troviamo il registro causa che può essere impostato con 0 o 1, mediante il mux appena a sinistra, pilotato dal segnale di controllo IntCause.
L'EPC può essere scritto, mediante un segnale di scrittura, con il valore del PC: in questo progetto l'EPC riceve il dato in uscita dal