• Non ci sono risultati.

1 STESURA DELLA PIPELINE 1

N/A
N/A
Protected

Academic year: 2021

Condividi "1 STESURA DELLA PIPELINE 1"

Copied!
20
0
0

Testo completo

(1)

1 STESURA DELLA PIPELINE 1

Approfondimenti sulla pipeline

Aggiornato al 13 settembre 2013

Questo documento contiene approfondimenti sulla pipeline relativamente ad aspetti che, per ragioni di spazio, sono stati esclusi dal testo. In particolare, si fornisce lo schema complessivo della pipeline stessa, si traccia la rete per la soluzione dei conflitti sui dati tramite il forward (by-pass) e dei conflitti di controllo, si esamina il problema del trattamento delle interruzioni e delle eccezioni.

Sar` o grato a chi mi segnaler` a eventuali errori o suggerir` a miglioramenti (giacomo.bucci@unifi.it)

1 Stesura della pipeline

Nel testo sono stati mostrati percorsi e comandi nella pipeline, ma non ` e stato dato uno schema comples- sivo. Lo schema in questione ` e nella figura che segue. Esso non tiene conto delle istruzioni INT e RFI, n´ e tantomeno delle istruzioni CLI e STI. L’istruzione INT viene esaminata nel dettaglio nel seguito. Si lascia come esercizio al lettore l’individuazione dei percorsi, degli eventuali comandi o selettori aggiuntivi delle altre 3 istruzioni appena menzionate (dopo che egli avr` a studiato il funzionamento dell’istruzione INT e il trattamento delle interruzioni).

Vale la pena di rimarcare alcuni punti.

1. La logica di controllo ` e rappresentata dal blocco UC che, in base al codice di operazione (e a fALU) genera

• i comandi e i selettori per gli stadi EX, ME e WB, rappresentati dai segnali raggruppati sotto i medesimi nomi;

• i selettori per lo stadio ID (in cui `e inserita UC), cio`e IMMux e RWMux.

Si noti che UC ` e una effettiva rete combinatoria. La sequenzialit` a ` e data dal clock applicato a PC e ai latch della pipeline.

2. Da UC ` e stato tenuta separata la logica (PCCONTR) di selezione dell’ingresso a PC. Essa ` e re- sponsabile di asserire il selettore PCMux (verso lo stadio IF). Ovviamente il blocco PCCONTR

`

e esso stesso parte della logica di controllo. E stato tenuto separato da UC per migliorare la ` comprensibilit` a dello schema.

3. Si osservi il multiplexer all’ingresso del campo ID/EX.IMM. Esso serve a selezionare: (0) la somma di PC con l’estensione con segno a 32 bit del campo del campo OFFSET (istruzioni JE e JS); (1) l’estensione con segno a 32 bit del campo del campo OFFSET (istruzioni LD e ST); (2) l’uscita RF.B (istruzione JR); (3) l’espansione a 32 bit del campo IND (istruzioni JMP e JAL).

4. In ingresso al campo ID/EX.RW c’` e un multiplexer per selezionare Rd, Rs2, ovvero il registro R31;

RWMux deve valere ordinatamente: 0, 1, 2.

5. La porta A della ALU non prevede multiplexer.

6. Sulla porta B della ALU possono presentarsi: (0) il campo B, contenente il (valore letto nell’even-

tuale secondo registro sorgente); (1) il campo PC, contenente l’indirizzo (PC+4) dell’istruzione che

segue quella correntemente in EX (` e necessario portare questo valore fino allo stadio EX a causa

dell’istruzione JAL che deve salvare l’indirizzo di ritorno. Poich´ e JAL scrive in WB, il valore di PC

viene propagato attraverso la ALU su EX/ME come ALUOut, e da qui verso ME/WB per essere

scritto in R31, il cui selettore, a quel punto sar` a in ME/WB.RW); (2) il campo IMM, contenente

l’indirizzo di salto o lo scostamento da sommare al registro del sorgente Rs1 nelle operazioni LD/ST.

(2)

1 STESURA DELLA PIPELINE 2

Figura 1:

(3)

1 STESURA DELLA PIPELINE 3

7. Sul latch EX/ME viene propagato ALUOut e B. ALUout pu` o rappresentare: (i) il risultato di un’operazione aritmetica; (ii) l’indirizzo in memoria del dato per LD/ST; (iii) l’indirizzo di ritorno della JAL. B rappresenta il dato da scrivere in memoria nel caso di operazione ST. ` E in EX che viene asserito PCMux per gli eventuali salti.

8. In ME si notino i due buffer abilitati in modo da assecondare il percorso del dato da/verso (LD/ST) la memoria. Sulla linea M Write ` e stato introdotto un ritardo (∆); esso serve a garantire che quando il comando viene applicato alla memoria gli indirizzi siano effettivamente stabili (onde evitare possibili scritture erronee).

9. Nello stadio WB il comando R Write determina la scrittura nel registro di destinazione identificato da ME/WB.RW; il selettore MemToReg stabilisce se il trasferimento debba attuarsi da OLUOut o da MEMDat.

Sul libro di testo il campo PC viene propagato fino a ME/WB, mentre, per quanto riguarda la pipeline di Figura 1, al punto 6 abbiamo osservato che dallo stadio EX in avanti l’indirizzo dell’istruzione successiva viene propagato come ALUOut. e cos`ı ` e stata costruita la pipeline di Figura 1. Si faccia caso al fatto che se questo indirizzo dovesse essere salvato dal campo PC, propagandolo fino a ME/WB, allora il multiplexer nello stadio WB dovrebbe essere a 3 vie. La soluzione di Figura 1 ` e dunque preferibile. Tuttavia lo schema del libro non ` e errato, infatti, come vedremo, il trattamento delle eccezioni (in particolare l’eccezione che si manifesta nello stadio ME) richiede che il campo PC venga propagato fino a ME/WB.

Una precisazione Si ricorder` a che nel libro di testo, per non appesantire la trattazione (e i disegni) si ` e stabilito di non rappresentare l’estensione da 16/26 a 32 bit, mentre queste espansioni sono state considerate in Figura 1.

C’` e per` o un altro aspetto che pu` o ulteriormente essere precisato. Nel testo, sempre per semplificare, abbiamo ipotizzato che i campi OFFSET e IND contenessero lo scostamento effettivo. In realt` a, poich´ e le istruzioni sono tutte a indirizzi multipli di 4, nel caso delle istruzioni di salto conviene che nel campo OFFSET (istruzioni di salto condizionate) e nel campo IND (istruzioni di salto incondizionato) venga messo l’effettivo scostamento o l’effettivo indirizzo divisi per 4, in modo che tutto avvenga come se i due campi fossero rispettivamente di 16 e di 28 bit. Naturalmente, questo comporta che la logica deve moltiplicare per 4 i contenuti dei campi suddetti.

Ovviamente questa tecnica non pu` o applicarsi alle istruzioni di Load e Store, non tanto nel nostro repertorio, dove si immagina sempre di indirizzare dati (allineati) di 32 bit, quanto in una macchina reale dove sono presenti le istruzioni LDH/STH e LDB/STB (che indirizzano rispettivamente semiparole –16 bit– o byte) per le quali l’OFFSET codificato nell’istruzione deve essere quello effettivo

1

In definitiva assumendo che per i salti lo scostamento/l’indirizzo siano quelli effettivi divisi per 4 e che per le istruzioni che fanno riferimento alla memoria il campo OFFSET contenga quello effettivo, lo schema di Figura 1, nella parte di interesse, si modificherebbe come in Figura 2. Si osservi che il campo di IND (26-31) viene moltiplicato per 4 ed esteso a 32 bit, il campo OFFSET viene moltiplicato per 4 ed esteso a 32 bit con segno per le operazioni di salto condizionato, mentre lo stesso campo viene esteso a 32 con segno per le operazioni LD/ST.

1.1 Comandi e selettori

Con riferimento allo schema di Figura 1, vogliamo ora trovare le espressioni per i comandi e dei selettori generati da UC. La tabella 1 riporta i valori assunti dai segnali di controllo che appaiono nello schema della pipeline in funzione del tipo di istruzione.

La tabella consente di costruire la rete combinatoria contenuta in UC. Ad esempio R Write = LD + ARITM + JAL

Tutti i selettori di Figura 1 richiedono 2 bit. Facendo riferimento al selettore ALUMux e indicando con ALUMux

1

e ALUMux

0

rispettivamente il bit pi` u significativo e il meno significativo, si ha

ALUMux

1

= ST + LD ALUMux

0

= JAL Allo stesso modo

1In realt`a, a costo di qualche complicazione si potrebbe pensare che l’OFFSET codificato `e quello effettivo solo per LDB/STH, `e quello effettivo diviso 2 per LDH/STH, `e quello effettivo diviso 4 per LD/ST.

(4)

1 STESURA DELLA PIPELINE 4

Figura 2: Variazione allo schema di Figura 1 per tenere conto del fatto che nell istruzioni di salto i campi OFFSET e IND vengono codificati dividendo per quattro i valori effettivi corrispondenti.

ST LD ARITM JMP JAL JE/JS JR NOP

IMMux 1 1 – – – 3 3 0 2 – – –

RWMux – – 1 0 – – 2 – – – – – –

OpALU ADD ADD fALU – PASSA B SUB – –

ALUMux 2 2 0 – 1 0 – –

PCMux 0 0 0 1 1 0/1

(∗)

1 0

M Write 1 0 0 0 0 0 0 0

M Read 0 1 0 0 0 0 0 0

MemToWrite – 1 0 – 0 – – –

RWrite 0 1 1 0 1 0 0 0

Tabella 1: Valori assunti dai segnali dell’Unit` a di Controllo a seconda del tipo di istruzione.

Ci si attiene alle convenzioni della logica positiva. Il segno “–” significa don’t care, ovvero che non importa quale valore venga assunto.

(∗)

A seconda dell’esito nel calcolo della condizione di salto.

IMMux

1

= JMP + JAL + JR IMMux

0

= ST + LD + JMP + JAL

RWMUX

1

= JAL RWMUX

0

= LD Mentre PCMux ` e gi` a stato rappresentato in Figura 1 come

PCMUX= JMP + JAL + JR + JEZero + JSSegno.

Notare che, mentre alcuni segnali presentano condizioni di indifferenza, i tre segnali che influiscono

sullo stato (futuro) del processore, cio` e PC Mux, MWrite e RWrite, devono comunque assumere un valore

definito per ogni istruzione; per analogia, sebbene non strettamente necessario, si ` e preferito assegnare

sempre un valore anche a M Read, per non impegnare la memoria dati in letture inutili.

(5)

2 CONFLITTI DATI 5

2 Conflitti dati

I conflitti sui dati sono stati trattati al Paragrafo 8.5 del testo, dove sono state definite le condizioni di conflitto ConflXa, ConflXb, ConflMa e ConflMb, espresse rispettivamente da (8.11), (8.12), (8.13) e (8.14). Ovviamente, come nel testo, assumiamo che i conflitti tra ID e WB siano sanati in modo del tutto trasparente attraverso la sovrapposizione (clock halving). La rete che genera i 4 segnali ` e in Figura 3.

Figura 3: Rete di rilevamento dei conflitti sui dati (RCD). Gli ingressi S1 e S2 sono dettati dalle condizioni (8.9) e (8.10) del testo e vengono generati da UC (come esplicitamente indicato in figura). Si osservi che viene usata la notazione semplificata ID/EX.R Write e ID/EX.R Write in luogo di ID/EX.WB.R Write e ID/EX.WB.R Write, in quanto essa non ` e ambigua e individua univocamente i segnali corrispondenti;

analogo criterio viene seguito per le figure che seguono.

Vogliamo ora costruire la rete che genera i segnali di by-pass (anticipazione) per trattare i conflitti dati. Anche in questo caso, per chiarezza di esposizione, faremo l’ipotesi di sviluppare la relativa logica come indipendente e sovrapposta a UC, nel senso che essa imporr` a ulteriori multiplexer e che questi saranno posti a valle di quelli trovati fino a questo punto

2

.

Conviene riassumere i criteri secondo cui vengono trattati i conflitti sui dati.

• Il conflitto viene riconosciuto prima possibile, ovvero nello stadio ID, e si predispongono i selettori per i multiplexer che attueranno i by-pass ai clock successivi, in EX e/o in ME. Ci` o implica che ai campi EX, ME ed eventualmente WB dei latch ID/EX, EX/ME e ME/WB vanno aggiunti i selettori di bypass che operano agli stadi corrispondenti

• In accordo a quanto detto sopra, raccoglieremo la logica di by-pass nel blocco FW, che, ovviamente, si trova nello stadio ID da dove genera gli eventuali comandi di bypass che vengono propagati agli stadi successivi dove vengono usati.

Il by-pass si attua in due modi: facendo il forward del dato dallo stadio ME o dallo stadio WB verso lo stadio EX oppure dallo stadio WB verso lo stadio ME.

La rete (combinatoria) contenuta in FW verr` a costruita, nella parte che segue, in modo incrementale a partire dai casi riportati nel libro di testo al paragrafo 8.5.4.

2.1 Conflitto ID-EX

Caso 1a) L’istruzione in ID usa il dato in EX; l’istruzione in EX produce il dato in EX. Dire il dato viene usato in EX equivale a dire che viene presentato alla ALU.

Si noti che, con il nostro repertorio in ID pu` o esserci qualunque istruzione che legga un dato, eccetto l’istruzione ST relativamente all’impiego del registro Rsd (che viene usato in ME). In EX pu` o esserci qualunque istruzione eccetto LD che invece produce il dato in ME. Con riferimento alla Figura 4, si deve avere SelA = 01 e/o SelB = 01 (ovvero SelA

0

= 1 e/o SelB

0

= 1), a seconda che sia valida la condizione

2Una successiva fase di ottimizzazione (che non faremo) consentirebbe di ottimizzare le selezioni, accorpando i multiplexer in cascata.

(6)

2 CONFLITTI DATI 6

Figura 4: Percorsi di by-pass e relativi selettori corrispondenti ai casi 1a e 2 del conflitto ID-EX (non viene riportato il percorso corrispondente al caso 1b, aggiunto nel seguito). I percorsi di by-pass e i relativi selettori sono disegnati con un tratto pi` u marcato. Per quanto si riferisce ai valori dei selettori SelA e SelB ` e stata riportata la numerazione in forma binaria al fine di facilitare la definizione dei bit SelA

1

, SelA

0

e SelB

1

, SelB

0

che li compongono.

ConflXa e/o ConflXb. Dunque per il momento la logica di forward si riduce a porre SelA

0

= ConflXa e SelB

0

= ConflXb.

Caso 1b) L’istruzione in ID usa il dato in EX (non pu` o essere ST sulla via B); l’istruzione in EX produce il dato in ME (non pu` o essere che LD).

In questo caso la logica di by-pass deve imporre uno stallo all’istruzione che ` e in ID (e quindi anche a quella che ` e in IF), per dare modo all’istruzione LD di produrre il dato in ME (quando, senza lo stallo, l’istruzione in ID si troverebbe in EX). L’istruzione in EX viene riconosciuta come LD se e solo se risulta asserito ID/EX.M Read. Da ci` o deriva che la logica forzante lo stallo ` e ottenuta semplicemente come in Figura 5. La figura mostra la logica complessiva risultante dal caso 1a) e dal caso 1b).

Il segnale “Stallo” viene usato per annullare il clock sia al latch IF/ID sia al PC (in modo che l’istruzione su IF/ID venga “stallata” in ID); inoltre esso determina il caricamento di tutti 0 per i comandi su ID/EX,in modo che al clock successivo in EX ci sia una bolla.

Figura 5: Aggiunta della logica che genera lo stallo a causa del LD.

A causa dello stallo, al clock successivo la situazione ` e quella schematizzata in Figura 6 (la figura ` e

tracciata assumendo che l’istruzione che segue quella di LD sia ADD). Ovviamente il conflitto si riproduce,

ma questa volta ` e tra ID e ME. Poich´ e il dato non ` e ancora disponibile, il forward potra avere luogo

solo al clock successivo, dallo stadio WB alla ALU. La logica corrispondente viene illustrata pi` u avanti

al punto in cui si tratta il conflitto ID-ME.

(7)

2 CONFLITTI DATI 7

Figura 6: Bolla determinata da Stallo (Figura 5). Poich´ e ADD confliggeva con LD al clock precedente, il conflitto permane ma tra ID e ME.

Caso 2 L’istruzione in ID usa il dato in ME (col nostro repertorio si tratta esclusivamente dell’istruzione ST e il conflitto ` e necessariamente sulla B). Il forward deve necessariamente attuarsi al clock successivo tra lo stadio WB e lo stadio ME. Con riferimento alla Figura 8 deve essere asserito MMux quando ST si trova in ME. Lo schema di Figura 5 diventa quello di Figura 7. Notare che quando il conflitto prende questa forma il selettore SelB

0

non deve essere asserito, altrimenti quando l’istruzione in ID passa in EX determina un errato ingresso sulla porta ALU.B.

Figura 7: Logica che tratta i conflitti relativi ai casi 1a), 1b) e 2.

2.2 Conflitto ID-ME

Per avere questo conflitto, con il nostro repertorio, in ME pu` o esserci solo LD. La Figura 8 ` e ottenuta dalla precedente Figura 4 aggiungendo i percorsi relativi a questi conflitti (i percorsi da WB a EX risolvono il caso 1b del conflitto ID-EX), secondo i criteri descritti qui di seguito.

Caso 1 L’istruzione in ID usa il dato in EX.

E evidente che il forward potr` ` a attuarsi solo al clock successivo dallo stadio WB alla ALU

3

. A seconda del percorso su cui si ha conflitto si avr` a SelA = 10 (ovvero SelA

1

= 1, SelA

0

= 0) e/o SelB = 10 (ovvero SelB

1

= 1, SelB

0

= 0). Ovviamente, il conflitto ` e effettivo solo se l’istruzione in ID non confligge anche con quella in EX, nel qual caso, essendo il dato prodotto in EX pi` u recente di quello prodotto in ME, deve prevalere il conflitto con EX. In definitiva lo schema di Figura 7 si modifica in quello di Figura 9 Caso 2 L’istruzione in ID usa il dato in ME.

Con il nostro repertorio l’istruzione in ID non pu` o che essere ST e il conflitto ` e necessariamente sulla via B. Il forward non pu` o che essere fatto, al clock successivo, dallo stadio WB; per poter utilizzare il dato in ME (l’istruzione ST su questo clock ` e in EX) occorre che il forward sia verso il campo EX/ME.B, ovvero deve essere asserito il selettore BMux.

Si giunge cos`ı alla forma finale della logica di forward di Figura 10

3Si riporta a questo caso il caso 1b) del paragrafo 2.1

(8)

2 CONFLITTI DATI 8

Figura 8: Visione complessiva dei percorsi di by-pass e dei relativi selettori.

Figura 9: Aggiunta allo schema di Figura 7 della logica che tratta il caso 1 del conflitto ID-ME.

Figura 10: Rete di Forward; a destra la sua schematizzazione.

2.3 Composizione di UC, RCD e FW

A questo punto ` e possibile comporre UC con FW e RCD come in Figura 11. Si noti che il segnale

stallo deve andare a silenziare il clock al latch IF/ID e a PC, in modo che non entri altra istruzione

in IF. Al tempo stesso, ai fini dell’introduzione della bolla, “Stallo” deve rendere nulli tutti i comandi

(9)

3 CONFLITTI DI CONTROLLO 9

trasferiti nei campi EX, ME e WB di ID/EX. Per non complicare la Figura 11, a “Stallo” si sono fatti azzerare solo i componenti dei campi EX, ME e WB provenienti da UC. Poich´ e questi componenti sono quelli che effettivamente compiono le azioni, i campi SelA, SelB e BMux di EX e il campo MMux di ME diventano irrilevanti. Tuttavia, per omogeneit` a, sarebbe meglio passare attraverso l’AND con “Stallo”

anche le uscite del blocco FW prima di dirigerle ai corrispondenti campi di ID/EX, in modo che esse pure risultino “0” in presenza di stallo. A questo proposito si veda anche quanto detto al Paragrafo 2.4.

Infine si osservi che alla UC schematizzata in Figura 8.13 del testo ci sono da aggiungere le due uscite S1 e S2 (e ovviamente portare in ingresso i segnali che le determinano).

Figura 11: Composizione della logica di forward con UC e con la logica di rilevamento dei conflitti.

L’AND tra stallo e le linee indicate come EX, ME e WB deve intendersi come un AND tra Stallo e ciascuna delle linee contenute nel gruppo che questi simboli rappresentano.

2.4 Un miglioramento

In Figura 11 l’inserimento della bolla in EX (al clock successivo) ` e stato ottenuto attraverso l’annulla- mento delle componenti EX, ME e WB. Analogamente, nel libro di testo, parlando di conflitti strutturali (Paragrafo 8.4.1), la bolla ` e stata ottenuta caricando “0” (ovvero l’istruzione NOP) nel campo IF/ID.OP.

Conviene seguire un altra tecnica: dotare tutti i latch di un proprio ingresso di RESET, che, se asserito sul clock, causa l’annullamento dei segnali che determinano l’esecuzione di azioni. Pi` u precisamente il RESET – qualsiasi siano gli altri ingressi – causa:

• su IF/ID l’azzeramento del campo OP;

• su ID/EX l’azzeramento dei campi EX, ME, WB;

• su EX/ME l’azzeramento dei campi ME, WB;

• su ME/WB l’azzeramento del campo WB.

Lo schema di Figura 11, che fa nascere una bolla in EX al clock successivo, pu` o essere semplificato semplicemente portando la linea “Stallo” all’ingresso RESET di ID/EX.

3 Conflitti di controllo

Di seguito faremo riferimento alla soluzione delineata al Paragrafo 8.6.1, Figura 8.21, del libro di testo

(inserimento di bolle).

(10)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 10

La pipeline di Figura 1, attraverso il blocco PCCONTR asserisce gi` a PCMux in presenza di salti, dunque resta solo da definire la logica per l’inserimento delle bolle. Facendo riferimento a quanto detto al Paragrafo 2.4, si tratta banalmente di asserire gli ingressi RESET di IF/ID e ID/EX (quando l’istruzione di salto ` e in EX), ovvero quando ` e asserito PCMux. Con lo schema di Figura 1, si tratta semplicemente di portare PCMux agli ingressi RESET di IF/ID e ID/EX. Con la nostra notazione ci` o si esprime come:

4

IF/ID.RESET = PCMux ID/EX.RESET = PCMux

4 Trattamento delle interruzioni in pipeline

Le situazioni che possono derivare dalle interruzioni sono di difficile gestione nei processori in pipeline.

Nel momento in cui si verifica un’interruzione sono presenti in pipeline pi` u istruzioni, la cui esecuzione pu` o essere completata o rinviata per servire l’interruzione. Non solo, ` e possibile che due o pi` u eccezioni si manifestino contemporaneamente o in istanti di clock adiacenti. In questo caso la CPU deve decidere quale interruzione trattare e quale debba essere l’istruzione interrotta, ed eventualmente abortire delle istruzioni che siano gi` a entrate nella pipeline.

Cominciamo a considerare l’interruzione software.

4.1 L’istruzione INT

L’interruzione software (INT) determina:

• il passaggio del controllo alla routine di gestione dell’interruzione, raggiunta attraverso il vettore di interruzione selezionato in TABIR

5

tramite il campo [6 · · · 10] dell’istruzione;

• il salvataggio in R30

6

dell’indirizzo di ritorno (PC+4), contenuto nel campo PC del relativo latch di pipeline;

• la disabilitazione del sistema di interruzione.

INT ` e un’istruzione di trasferimento del controllo (` e facile verificare che differisce dalla nostra JAL per il fatto che essa trova in altro modo l’indirizzo di destinazione e per il fatto di salvare l’indirizzo di ritorno in R30). Anche per essa si pone il problema eliminare dalla pipeline le eventuali istruzioni che sono state caricate dopo la INT prima dell’effettivo aggiornamento di PC. Esattamente come per le istruzioni di salto (Paragrafo 3). Ovviamente, all’ingresso all’OR che genera PCMux deve essere portato anche il bit INT che deve entrare a far parte del campo EX.

E necessario che in EX l’istruzione trovi in ID/EX.IMM l’indirizzo di salto. Con l’assunzione che i ` vettori di interruzione stiano in un file di registri TABIR contenuto in CPU, tutto si riduce a trasferire (in fase ID) in ID/EX.IMM il contenuto della posizione di TABIR individuata tramite il campo NInt dell’istruzione, ovvero (nello stadio ID):

ID/EX.IMM ← TABIR[IF/ID[6...10]]

Con riferimento alla Figura 1 ci` o comporta un ulteriore ingresso al multiplexer in fronte a ID/EX.IMM.

Alternativamente, si pu` o mettere un multiplexer a due vie sull’ingresso 1, avente la funzione di selezionare tra l’uscita del blocco X e l’uscita da TABIR. In questo modo, IMMux resterebbe 3 come per JMP e JAL. Il selettore di questo multiplexer ` e ovviamente il segnale INT.

Per quanto riguarda il salvataggio dell’indirizzo di ritorno, INT deve comportarsi come la JAL (con riferimento alla Figura 1 e alla Tabella 1 deve essere ALUMux=1 e OPALU=PASSB). Ma la selezione del registro deve avvenire tramite il campo Rsd, come per la LD, e quindi deve essere RWMux=1.

In conclusione, per quanto accade in pipeline, l’istruzione INT differisce dalla JAL per il fatto che l’indirizzo di destinazione non ` e codificato nell’istruzione, ma viene trovato tramite NInt, mentre il registro di destinazione ` e invece codificato nell’istruzione stessa. In Figura 12 si mostrano le variazioni alla Figura 1 derivanti dai precedenti ragionamenti.

La disabilitazione del sistema di interruzione deve avvenire da EX non ID; infatti quando l’istruzione INT ` e in ID ` e ancora possibile che le istruzioni a monte generino eccezioni. In particolare, se l’istruzione

4Ovviamente se questo reset dovesse essere dato anche in altre condizioni, si tratterebbe di aggiungerle in OR a PCMux.

5Stiamo facendo la stessa semplificazione fatta nel caso della CPU multiclock. Chi avesse voglia pu`o approfondire cosa comporta leggere il vettore di interruzione dalla memoria.

6Il campo [11· · · 15] dell’istruzione identifica il registro R30. Il formato dell’istruzione INT `e in Figura 19.

(11)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 11

Figura 12: Variazioni alla Figura 1 per il trattamento dell’istruzione INT.

INT ` e in EX e l’istruzione che la precede ` e in ME e questa genera un’eccezione (di indirizzamento alla memoria) l’eccezione deve passare avanti annullando la INT che si trova in EX. Se non c’` e questa eccezione la INT disabilita il sistema di interruzione e da quel momento non sono possibili altre eccezioni o interruzioni. Per disabilitare il sistema di interruzione, l’unit` a di controllo UC deve essere dotata di un bit di uscita INTD (Interrupt Disable) asserito quando viene decodificata l’istruzione INT. Il segnale viene propagato allo stadio EX da dove viene diretto come reset al FF IE (Interrupt Enable). Dunque (nello stadio ID):

ID/EX.INTD ← UC.INTD

7

Ovviamente, come le istruzioni di salto, tramite PCMux l’istruzione INT dallo stadio EX inserisce due bolle. Quando la INT passa in ME, negli stadi ID e EX c’` e una bolla, mentre lo stadio IF esegue il fetch dell’istruzione alla posizione determinata tramite TABIR.

4.2 Il concetto di interruzione precisa

Il concetto di interruzione precisa si definisce attraverso le seguenti propriet` a:

1. Un’interruzione ` e detta precisa se lo stato salvato ` e consistente col modello di esecuzione sequenziale, secondo il quale ogni istruzione termina prima che la successiva abbia inizio.

2. Un’eccezione ` e precisa se tutte le istruzioni che precedono quella che la genera arrivano a conclusione e se tutte quelle che la seguono possono essere riavviate come se non fossero mai entrate in pipeline.

3. Al rilevamento di un’interruzione tutte le istruzioni che precedono l’istruzione interrotta

8

arrivano a conclusione, mentre quelle che seguono vengono rimosse e non devono aver completato l’esecuzione, n´ e aver modificato in alcun modo lo stato del processore. Dunque non ` e possibile che lo stato salvato contenga istruzioni solo parzialmente eseguite.

In base a queste definizioni, un’eccezione ` e detta precisa se l’istruzione che la solleva ` e anche l’istruzione interrotta.

4.3 Tipi di interruzioni e aspetti architetturali

In presenza di pi` u interruzioni contemporanee, la logica di CPU deve decidere quale interruzione trattare, scegliendo in base alla sua natura (interruzione esterna, eccezione o trappola) e, per le eccezioni, in base

7Si pu`o notare che la funzione del bit INTD pu`o essere svolta dal segnale INT, pertanto INTD `e del tutto ridondante e pu`o essere tranquillamente eliminato, inviando ID/EX.EX.INT all’ingresso di Reset del FF IE.

8Con la dizione istruzione interrotta ci si riferisce all’istruzione pi`u avanti in pipeline la cui esecuzione viene annullata e il cui PC viene salvato per consentire di ripartire da essa.

(12)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 12

allo stadio che ha rilevato la condizione anomala. Possono anche aversi eccezioni contemporanee se pi` u stadi della pipeline rilevano sullo stesso ciclo di clock una condizione anomala.

In Tabella 2 sono riportati differenti tipi di interruzione e gli stadi in cui si manifestano.

9

Ovviamente lo stadio WB non d` a eccezione.

Nome Tipo Causa Stadio

MAdEr Eccezione Tentativo lettura/scrittura dato disallineato ME DIV0 Eccezione Divisione per 0 durante operazioni aritmetiche EX

O/UfEr Eccezione Overflow/Underflow EX

RI Eccezione Esecuzione istruzione riservata/Codice non definito ID FAdEr Eccezione Tentativo lettura di un’istruzione disallineata IF

INTR Interr. esterna Evento esterno Tutti

INT Interr. software Evento programmato (istruzione) –

Tabella 2: Esempi di differenti tipi di interruzioni. La colonna a destra identifica lo stadio in cui le differenti interruzioni si possono manifestare. Per le eccezioni la priorit` a ` e determinata dallo stadio in cui si manifestano. La priorit` a massima ` e per l’eccezione MAdEr (Memory Address Error ) che si manifesta nello stadio ME, la minima per FAdEr (Fetch Address Error ) che si manifesta nello stadio IF.

Per garantire il trattamento preciso delle interruzioni ` e necessario stabilire una priorit` a. La priorit` a deve privilegiare le eccezioni che si manifestano in stadi pi` u avanzati della pipeline e che perci` o sono relative a istruzioni pi` u prossime al completamento. Ad esempio: supponiamo che si verifichino contem- poraneamente l’eccezione RI (a causa di un codice di operazione non definito) e la FAdEr (tentativo di fetch di istruzione non allineata). Poich´ e la prima precede la seconda nella pipeline, ` e necessario che essa abbia priorit` a di servizio su quest’ultima. Ma, anche se l’istruzione che ha sollevato eccezione nello stadio ID ` e candidata ad essere servita, non ` e detto che al clock successivo l’istruzione precedente non sollevi eccezione MadEr: in tal caso la priorit` a passerebbe all’istruzione che solleva eccezione nello stadio ME.

Ci` o significa che il sistema delle interruzioni non pu` o essere immediatamente disabilitato nel momento in cui si verifichi una eccezione: infatti, nel caso in cui l’eccezione si verifichi in ID o IF, l’eccezione non pu` o essere servita immediatamente, perch´ e ` e possibile che le istruzioni che precedono in pipeline determinino eccezione ai clock successivi. Quindi, se l’eccezione si manifesta nello stadio ME, sar` a immediatamente servita; ugualmente nello stadio EX: infatti, se l’eccezione si manifesta in EX, significa che l’istruzione in ME non sta provocando eccezione e sicuramente non la provocher` a al ciclo successivo (a quel punto il sistema di interruzione ` e ormai disabilitato).

Seguendo questo ragionamento, nel caso di eccezione in ID o IF, si dovrebbe attendere uno o due cicli di clock prima di disabilitare il sistema delle eccezioni e avviare la relativa routine di gestione. Al Paragrafo 4.5.3 vedremo che ci` o non ` e necessario.

Un altro problema ` e relativo al modo di servire le interruzioni esterne; di esso si parla al paragrafo seguente.

4.4 Interruzioni esterne

Le azioni che devono essere svolte per trattare le interruzioni esterne coincidono in larghissima parte con quelle dell’istruzione INT. Perci` o si segue un criterio analogo a quello usato nel gestire le interruzioni esterne nella CPU multiciclo. Si tratta di sospendere il normale caricamento sequenziale in pipeline e forzare in IF il codice dell’istruzione INT, lasciando a quest’ultima il compito di saltare alla routine di servizio e di salvare il Program Counter.

Sarebbe auspicabile che al manifestarsi di un’interruzione esterna fosse possibile completare le istru- zioni gi` a in pipeline (negli stadi da ID a WB), intervenendo solo sullo stadio IF forzandovi il codice dell’istruzione INT. Supponiamo di avere la sequenza di istruzioni sotto riportate, per ciascuna delle qua- li ` e stato indicato a sinistra il rispettivo indirizzo, e si faccia l’ipotesi che l’interruzione esterna inizi ad essere servita sul ciclo di clock i in corrispondenza del quale sarebbe stato effettuato il fetch dell’istruzione SUB in 112.

(100) LD ----

(104) ST ----

(108) ADD ----

9Naturalmente la tabella non `e esaustiva di tutte le possibili eccezioni.

(13)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 13

(112) SUB ----

Figura 13: Inserimento del codice INT nella fase IF, al posto dell’istruzione in sequenza, al momento della rilevazione di un’interruzione esterna. I campi indicati sono OP (o derivati) e PC. Il contenuto di PC al clock i+1 ` e quello che si avrebbe se PC venisse incrementato normalmente. .

La parte superiore di Figura 13 mostra che al clock i l’istruzione LD ` e in ME e che il campo EX/ME.PC contiene l’indirizzo dell’istruzione successiva (104). Allo stesso modo l’istruzione ADD ` e in ID e il campo IF/ID.PC contiene 112, l’indirizzo dell’istruzione SUB che segue la ADD. Se si vuole portare a conclusione le istruzioni che sono negli stadi diversi da IF, ` e necessario che l’istruzione INT (forzata in IF) possa salvare in R30 l’indirizzo dell’istruzione che essa sostituisce, in modo che il controllo torni a quest’ultima al ritorno dalla routine di servizio dell’interruzione.

L’indirizzo in questione si trova sia in PC sia IF/ID.PC. Nel caricare INT in IF/ID.OP occorrerebbe copiare questo valore nuovamente in IF/ID.PC, in modo che esso venga propagato fino allo stadio WB e salvato in R30. Al clock i + 1 si avrebbe la situazione rappresentata nella parte bassa di Figura 13, dove si ` e assunto che in PC ci sia il valore che si ha con il normale incremento di 4. Ci` o ci dice che verrebbe fatto il fetch dell’istruzione addirittura successiva alla SUB, che risulta saltata! Ma questo non

`

e un problema perch´ e l’istruzione INT, come abbiamo visto al Paragrafo 4.1, introduce dietro di s´ e due bolle dallo stadio EX e quindi rimedia da sola questa situazione.

In conclusione, il ragionamento precedente ci permette di affermare che, almeno per il genere di istruzioni considerate nell’esempio di Figura 13 (non salti), per servire l’interruzione esterna basta inserire INT in IF, senza azzerare alcuna delle istruzioni gi` a in pipeline (da ID in avanti). Tenuto conto che l’istruzione INT introduce 2 bolle dietro di s´ e, questa sarebbe la penalizzazione in cui –con il nostro modello di pipeline e con le regole stabilite in precedenza per trattare INT– si incorrerebbe.

Purtroppo, come mostreremo al paragrafo che segue, il processo precedente non ` e possibile a causa delle istruzioni di salto; come vedremo la penalizzazione risulter` a maggiore.

4.4.1 Il problema dovuto ai salti

Mostriamo ora perch´ e le interruzioni esterne non possono essere processate come illustrato in Figura 13, ovvero perch´ e non ` e possibile portare a conclusione le istruzioni in ID e in EX, eliminando la sola istruzione in IF. Sia i il clock durante il quale la INT viene forzata in IF:

a) se al clock i in ID si trova un’istruzione di salto, al clock i+1 essa sar` a in EX da dove inserir` a due bolle nei due stadi precedenti, con ci` o eliminando il codice INT appena introdotto. Il risultato sarebbe la soppressione dell’interruzione esterna. Ci` o impone necessariamente l’eliminazione l’istruzione in ID;

b) se al clock i in EX si trova una istruzione di salto, questa tende a inserire una bolla in IF. Sarebbe

ancora possibile forzare INT in IF/ID e mantenere l’effetto del salto, ma: (i) occorrerebbe fare in

modo di salvare in R30 (come indirizzo di ritorno dalla routine di interruzione) l’indirizzo calcolato

in EX dal salto; (ii) l’istruzione in ID andrebbe comunque annullata; (iii) il salto in questo caso

avrebbe l’effetto apparente di inserire la bolla solo in ID..

(14)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 14

Per chiarezza espositiva stabiliamo di trattare in modo uniforme tutte le istruzioni, nel senso che esse producano gli stessi effetti indipendentemente dalla situazione in cui eseguono. In altre parole, vogliamo che il trattamento delle interruzioni esterne segua gli stessi passi elementari indipendentemente dalle istruzioni che si trovano in pipeline. A tale scopo occorre:

1. svuotare ambedue gli stadi ID ed EX;

2. forzare in IF/ID.OP il codice INT e forzare in IF/ID.PC il corretto indirizzo di ritorno (dalla routine di interruzione), in modo che l’esecuzione di INT porti a salvare questo indirizzo in R30;

Ci` o richiede che in pipeline ci sia l’indirizzo di ritorno e poich´ e gli stadi ID ed EX vengono svuotati, l’indirizzo di ritorno deve trovarsi su EX/ME. Dunque occorre reintrodurre il campo PC su questo latch (come nel libro). (Su di esso ovviamente si propaga ID/EX.PC.)

• se in ME c’`e un’istruzione diversa dal salto, allora in EX/ME.PC c’`e l’indirizzo dell’istruzione che la segue, che quindi pu` o essere copiato in IF/ID.PC in modo che l’esecuzione di INT lo salvi in R30;

• se per`o in ME c’`e un’istruzione di salto, allora – se non prendiamo provvedimenti – in EX/ME.PC ci sarebbe l’indirizzo dell’istruzione che segue nel testo del programma, mentre occorre avere l’in- dirizzo di destinazione del salto, in modo che al ritorno dalla routine di interruzione il program- ma riprenda dall’istruzione cui rinviava il salto (ultima istruzione a concludere prima del servizio dell’interruzione).

Ci` o si ottiene facendo s`ı che l’istruzione di salto, quando da EX modifica PC con l’indirizzo di destinazione (DEST nel seguito), scriva lo stesso indirizzo anche in EX/ME.PC. In tal modo, al clock successivo, quando il salto ` e in ME in EX/ME.PC si trova l’indirizzo DEST che, come al punto precedente, pu` o essere copiato in IF/ID.PC. Da ci` o deriva che il salto deve agire come in Figura 14. (La ragione per cui DEST viene copiato anche in IF/ID e ID/EX verr` a spiegata poco avanti)

Figura 14: La parte alta mostra lo schema dell’aggiornamento di PC e dell’inserimento delle bolle per la soluzione dei conflitti di controllo. I tre campi riportati sui latch sono, a partire dall’alto, OP (o suoi derivati), IMM e PC. Con SALTO si ` e indicato sia un salto incondizionato sia una diramazione effettiva.

Con I1, I2, I4 e I5 si sono indicate generiche istruzioni diverse da quelle di trasferimento del controllo.

La parte bassa mostra lo stato della pipeline al clock successivo.

Rispetto allo schema di Figura 1 la modifica comporta:

(15)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 15

• La presenza del campo PC su EX/ME. A fronte del campo deve esserci un multiplexer che permetta di selezionare tra ID/EX.PC o ALU.Out (provenienza di DEST). Questo multiplexer deve essere comandato dal salto, ovvero da PCMux.

• Un corrispondente selettore a fronte di IF/ID.PC e ID/EX.PC, sempre comandato direttamente da PCMux, in modo da selezionare tra i percorsi indicati in Figura 1 e il percorso proveniente da ALU.Out.

Se le istruzioni di salto vengono trattate come in Figura 14, allora l’interruzione esterna trover` a sempre in EX/ME.PC l’indirizzo di da salvare in R30. In conclusione, il trattamento uniforme delle interruzioni esterne richiede:

– il trattamento del salto come in Figura 14;

– lo svuotamento egli stadi ID e EX;

– l’inserimento del codice INT in IF/ID.OP;

– l’inserimento di EX/ME.PC in IF/ID.PC.

Lo svuotamento degli stadi ID ed EX si ottiene semplicemente portando PCMux all’ingresso RESET di IF/ID e ID/EX.

In conclusione, nella nostra pipeline, il servizio di un’interruzione esterna comporta 4 cicli di clock persi (due per lo svuotamento di ID ed EX e due insiti nell’istruzione INT).

Con il modo sopra delineato di trattare i salti, per il campo PC di un qualunque LATCH di pipeline, valgono le seguenti propriet` a:

• P1: Per tutte le istruzioni diverse dai salti, il campo LATCH.PC contiene sempre l’indirizzo dell’istruzione che segue nell’ordine testuale del programma (cio` e PC+4).

• P2: Per le istruzioni di salto, il campo LATCH.PC contiene PC+4 fino allo stadio EX e DEST negli stadi successivi.

• P3: Per le bolle introdotte dai salti, il campo LATCH.PC contiene sempre l’indirizzo della prossima istruzione diversa dalla bolla.

10

Occorre fare due osservazioni.

La propriet` a P3 (corrispondente alle scritture di DEST su IF/ID e ID/EX di Figura 14 garantisce il corretto trattamento di due salti in sequenza (un salto a una locazione che contiene un salto). Infatti, per questa combinazione di istruzioni, se l’interruzione arriva quando in EX c’` e il secondo dei due salti, allora in ME c’` e la bolla imposta dal primo. Se la bolla non portasse con s´ e (nel campo EX/ME.PC) l’indirizzo della seconda istruzione di salto (che si trova in EX e sta per essere eliminata) quest’ultima verrebbe persa.

Secondariamente, si deve rimarcare che le eccezioni (Paragrafo 4.5) non pongono problemi nei confronti dell’istruzione in ME (qualunque essa sia). Infatti, per ipotesi, l’istruzione in ME non sta dando eccezione e non potr` a darla al ciclo di clock successivo, in quanto si trover` a in WB.

4.4.2 Trattamento interruzioni esterne

Resta ora da definire la logica per il trattamento delle interruzioni esterne.

Il segnale INTR, asserito dal mondo esterno, indica una richiesta di interruzione. Si assume che il trattamento dell’interruzione esterna venga scatenato dal riconoscimento di INTR sul fronte finale del clock (ciclo i − 1). Nel ciclo successivo (ciclo i) la CPU asserisce INTA verso l’esterno e si aspetta di leggere sul fronte finale il selettore di interruzione (VT, Vector Type) prodotto dal mondo esterno in risposta a INTA

11

. Il selettore di interruzione ` e di cinque bit e identifica la periferica che ha fatto richiesta di interruzione, esso viene forzato nel campo [6. . . 10] del registro IF/ID, in modo che al ciclo successivo (i + 1), corrispondente alla fase ID, possa essere usato per accedere a TABIR. In Figura 15 viene mostrata la temporizzazione degli eventi. Nella stessa figura si leggono le azioni svolte sul clock i.

10Si faccia caso al fatto che la bolla ha “0” nel campo OP, come l’istruzione NOP. Tuttavia mentre l’istruzione NOP ha PC+4 nel campo PC del latch di stadio in cui si trova, una bolla causata da un conflitto di controllo ha, nel medesimo campo, l’indirizzo dell’istruzione di destinazione calcolato dal salto che ha introdotto la bolla stessa.

11Si suppone che la periferica sia in grado di fornire VT entro il periodo di clock.

(16)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 16

Figura 15: Schema temporale della gestione delle interruzioni esterne.

4.4.3 Discussione

Vale la pena rimarcare che il trattamento dell’interruzione sopra esposto si basa sulle seguenti scelte:

• utilizzare per quanto possibile la logica relativa al trattamento dell’istruzione INT (che a sua volta ha una logica simile alle istruzioni di salto);

• cercare di trattare le istruzioni in modo uniforme. A tale scopo, al punto b) del paragrafo 4.4.1 abbiamo deciso di annullare anche l’istruzione in EX, per evitare che in EX le istruzioni di salto avessero un differente comportamento in presenza o meno di interruzione esterna.

Ovviamente le precedenti scelte potrebbero essere riviste al fine di rendere meno penalizzante il tratta- mento delle interruzioni esterne. Per esempio, se si rinunciasse a usare l’istruzione INT come veicolo per il trattamento delle interruzioni esterne, non ci sarebbe pi` u ragione di inserire due bolle subito dietro (infatti esse vengono inserite proprio dall’“istruzione” INT.

Un ulteriore motivo per rivedere le scelte fatte sarebbe la presenza di un predittore di salti (che impone lo svuotamento dell’istruzione dietro a una diramazione solo se la predizione ` e errata).

4.5 Eccezioni

Si fanno queste assunzioni

• gli indirizzi delle routine di servizio associate alle eccezioni sono pure contenuti in TABIR;

• il trattamento delle eccezioni comporta la disabilitazione del sistema di interruzione

12

e il salvataggio dell’indirizzo di ritorno nel registro R30, condiviso con il trattamento delle interruzioni esterne.

Ovviamente un’eccezione viene servita inserendo in IF/ID l’istruzione INT, con i campi opportuna- mente configurati. La presenza contemporanea di pi` u istruzioni in pipeline rende possibile che due o pi` u eccezioni si manifestino contemporaneamente o in istanti di clock adiacenti. In questo caso la CPU deve decidere quale eccezione trattare e quale debba essere l’istruzione interrotta. La regola ` e:

• privilegiare le eccezioni che si manifestano negli stadi pi`u avanzati della pipeline, cio`e relative a istruzioni che hanno maggiore probabilit` a di aver modificato lo stato della macchina

13

;

• privilegiare le eccezioni rispetto alle interruzioni esterne.

12Ci`o implica che la routine di servizio di una eccezione, una volta avviata, non `e interrompibile fino a quando non viene riabilitato il sistema di interruzione.

13Escludendo i trasferimenti del controllo, che hanno effetto in EX, lo stato della macchina pu`o essere modificato soltanto dalle istruzioni giunte negli stadi ME e WB.

(17)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 17

Conseguentemente, se, dopo che ` e stata scelta l’istruzione interrotta, si verifica un’altra eccezione in uno stadio pi` u avanzato della pipeline (da parte di un’istruzione ancora in fase di completamento), deve essere designata come interrotta l’istruzione che ha generato la seconda eccezione, annullando gli effetti di tutte le istruzioni che la seguono e inserendo una nuova INT in IF/ID.

Quando la INT giunge regolarmente al termine di EX, significa che nessuna istruzione precedente, ancora in pipeline, ha sollevato un’eccezione prioritaria e, a quel punto, la INT disabilita il sistema di interruzione.

In conclusione quando viene rilevata un’eccezione, in uno qualsiasi degli stadi, occorre:

a) svuotare tutti gli stadi precedenti quello che ha sollevato l’eccezione, resettando i relativi registri di stadio;

b) avviare l’istruzione INT esattamente come per le interruzioni esterne, ma con la differenza che questa volta VT ` e generato internamente in base al tipo di eccezione (equivale a dire che nel campo IF/ID[6..10] viene immesso il valore di NInt associato alla specifica eccezione);

c) forzare in IF/ID.PC l’indirizzo dell’istruzione interrotta.

Abbiamo pi` u volte osservato che nello stadio WB non sono previste eccezioni; inoltre, se un’eccezione si manifesta negli stadi EX o ME, non ` e possibile che istruzioni che si trovano in stadi pi` u avanzati possano dare un’eccezione ad un clock successivo. Dunque, se l’eccezione si manifesta in EX o ME, le azioni dei precedenti punti a) e b) garantiscono che la INT forzata in IF arriver` a allo stadio EX e che l’eccezione sar` a servita.

4.5.1 Eccezione in ME

In Figura 16 viene schematizzato il trattamento dell’eccezione in ME. Si suppone che l’istruzione I1 sia all’indirizzo 100. Al verificarsi dell’eccezione:

• viene immediatamente disabilitato il sistema di interruzione;

• vengono inserite bolle in ME, EX e ID;

• viene forzata INT in IF, e viene copiato (come indirizzo di ritorno) su IF/ID.PC il contenuto di ME/WB.PC. (Implicitamente, abbiamo assunto che, come nel libro di testo, anche il latch ME/WB abbia il camp PC.)

Essendo disabilitato il sistema di interruzione, la INT avanza indisturbata fino allo stadio EX, dove inserisce due bolle nelle posizioni che la seguono, qualunque cosa ci sia stato scritto.

E importante rilevare che la routine di servizio ha come indirizzo di ritorno quello dell’istruzione che ` ha determinato l’eccezione

14

.

Figura 16: Schema del trattamento delle eccezioni in ME (l’istruzione che genera eccezione ` e incorniciata).

Come in Figura 14 i tre campi rappresentati sui latch sono, dall’alto in basso, OP (o suoi derivati), IMM e PC.

L’inserimento della bolla in ME pone un problema. Diversamente dalle bolle introdotte fino a questo punto (azzeramento dei campo IF/ID.OP e dei campi EX, Me e WB su ID/EX), che forzavano a “nessuna

14Un esempio notevole `e il caso del page fault nell’indirizzamento di un dato. Il page fault viene rilevato da MMU che solleva l’eccezione. Al ritorno dalla routine di servizio viene rieseguita l’istruzione che ha determinato il fault.

(18)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 18

operazione” gli stadi nei quali transitano le bolle ai clock successivi, non basta azzerare il campo ME/WB sul fronte finale del clock. Infatti, se l’istruzione in ME ` e la ST, ` e possibile che qualcosa venga scritto in memoria, essendo ME/WB.M Write asserito nel corso del clock. Dunque, oltre a copiare 00 su ME/WB (avr` a l’effetto di non far scrivere nel registro di destinazione se l’istruzione che d` a eccezione ` e LD), occorre azzerare immediatamente il comando M Write, in modo che non avvengano scritture (di risultato impredicibile). Questo vuol dire che la condizione di eccezione in ME deve essere messa in AND con M Write (ovviamente, a valle dell’elemento di ritardo ∆).

4.5.2 Eccezione in EX

In Figura 17 viene schematizzato il trattamento dell’eccezione in EX. Lo schema ` e del tutto simile a quello precedente:

• viene immediatamente disabilitato il sistema di interruzione;

• vengono inserite bolle in EX e ID;

• viene forzata INT in IF, e viene copiato (come indirizzo di ritorno) su IF/ID.PC il contenuto di EX/ME.PC.

Anche in questo caso la routine di servizio ha come indirizzo di ritorno quello dell’istruzione che ha determinato l’eccezione. Si noti che l’eccezione in EX ` e equivalente all’interruzione esterna, con la differenza che il selettore di interruzione (che far` a saltare al gestore dell’eccezione in EX) non viene letto dall’esterno, ma forzato direttamente in IF/ID[6..10] dalla logica.

Figura 17: Schema del trattamento delle eccezioni in EX.

4.5.3 Eccezione in ID e IF

Al Paragrafo 4.3 si ` e osservato che il trattamento di eccezione su eccezione imporrebbe di disabilitare il sistema delle eccezioni solo quando le istruzioni precedenti non possono pi` u sollevarne. Tuttavia, come

`

e stato illustrato al Paragrafo 4.4.1, il trattamento dei conflitti di controllo impone di annullare tutte le istruzioni fino allo stadio EX incluso e prendere dal latch EX/ME l’indirizzo di ritorno. Dunque, anche nel caso di eccezione in ID o IF si pu` o disabilitare immediatamente il sistema delle eccezioni e trattare l’eccezione come nel caso di eccezione in EX.

In Figura 18 viene schematizzato il trattamento di una eccezione in ID. Come si vede ` e del tutto analogo a quello delle eccezioni in EX.

Tuttavia, dal trattamento ora illustrato per le eccezioni in ID e IF consegue che esse non sono pi` u precise, non essendo pi` u soddisfatta la condizione 2 del Paragrafo 4.2. Infatti, viene salvato come indirizzo di ritorno non quello dell’istruzione che ha sollevato eccezione

15

, ma quello dell’istruzione precedente (o di due precedenti) se l’eccezione si ` e verificata in ID (o in IF). In altre parole, come spesso accade con le architetture reali, la nostra impone al programmatore un vincolo: nello scrivere la routine di servizio deve sapere quale indirizzo ` e stato salvato e quale invece ` e l’indirizzo dell’istruzione che ha sollevato eccezione.

15In ME potrebbe esserci una bolla conseguente a un salto, ormai fuori dalla pipeline. Ma per la propriet`a P3 del Paragrafo 4.4.1, in EX/ME.PC c’`e l’indirizzo di destinazione del salto.

(19)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 19

]

Figura 18: Schema del trattamento delle eccezioni in ID (l’istruzione che genera eccezione ` e incorniciata).

4.6 Considerazioni finali sul sistema di interruzione

Il sistema di interruzione si ` e confermato come la parte pi` u complessa anche per la CPU in pipeline. Vale la pena rimarcare alcuni aspetti.

• Il trattamento delle interruzioni `e stato fortemente condizionato dal metodo scelto per la gestione dei conflitti di controllo, che ha determinato notevoli semplificazioni. Si pu` o verificare che differenti soluzioni avrebbero portato necessariamente a dover trattare i salti in modo diverso dalle altre istruzioni.

• Una seconda scelta di rilievo `e stata quella di ricorrere alle funzionalit`a dell’istruzione INT per trattare istruzioni esterne ed eccezioni.

• Si `e pervenuti a una soluzione che, alla fine, si `e rivelata incapace di trattare le eccezioni in modo

preciso. Non ` e questo un difetto gravissimo se si tiene conto che le architetture reali, normalmente,

soggiacciono al medesimo problema.

(20)

4 TRATTAMENTO DELLE INTERRUZIONI IN PIPELINE 20

Appendice

Per convenienza in Figura 19 si riportano i formati delle istruzioni.

Figura 19: Formati delle istruzioni.

Riferimenti

Documenti correlati

In tal caso spiegare perch`

Se, dunque, la scuola rappresenta, particolarmente in questa difficile contingenza, l’essenza dello sviluppo, il fulcro della ripresa, è compito di ciascuno di

non pare confermato in altri contesti nazionali l’uso della riforma strutturale ed onnicomprensiva in quanto strumento utile a tale scopo; piuttosto, emerge una preferenza

Vitto, alloggio, divise, materiale antinfortunistico, compartecipazione spese a fondo perso. Libri di testo gratuiti per i residenti in

Nella gestione della fase post Covid-19, durante la quale sarà necessario non solo interrogarsi su come sanare gli effetti diretti e indiretti della pandemia, ma anche avere

Il Formatore inserito nel Registro Nazionale delle Professioni non organizzate tenuto della Conf. PMI ITALIA e/o in iter di inserimento dichiara di condividere e sottoscrivere

14 (Divieto di discriminazione) della CEDU. In estrema sintesi, nell’esame del caso Izzettin Dogan, la Corte affronta dettagliatamente la questione della necessità,

liquidare la somma complessiva di € 40.000,00 (Euro quarantamila/00))a titolo di pagamenti intermedi, pari al 20% dei finanziamenti assegnati, a valere sul Fondo