Generazione BE

Transcript

Generazione BE
1 PROBLEMA
1
Divertissement BE
Ovvero generazione dei segnali BE nell’architettura X86 a 32 bit
Aggiornato al 2 luglio 2014
Al fine di evidenziare alcuni aspetti dell’indirizzamento della memoria e del
trasferimento da/verso i registri della CPU, si cerca di definire la rete responsabile del trasferimento di byte, semiparole (16 bit), o parole (32 bt) –allineate
o meno– con riferimento all’architettura X86 a 32 bit, .
Per rendere il problema trattabile quanto a dimensioni, ma senza perdere di
concretezza, si fa un certo numero di assunzioni semplificative.
Ovviamente, non c’è la pretesa che la rete cui si perviene corrisponda
esattamente alla logica interna di quei processori.
1
Problema
Con riferimento all’architettura X86 a 32 bit, delineare la rete che genera i segnali BE.
Assunzioni
1. Non si considera l’indirizzamento relativo al fetch1 ; si considera solo l’indirizzamento dei dati. Più
specificatamente si considera l’indirizzamento relativo alla fase di esecuzione delle istruzioni MOV.
2. Si assume che la macchina sia a 32 bit.
3. Si considerano le sole operazioni di lettura; le operazioni di scrittura, mutatis mutandis, si trattano
allo stesso modo.
In sostanza si considerano solo queste istruzioni:
mov
mov
mov
mov
rl,m8
rh,m8
rx,m16
erx,m32
dove “r” rappresenta un generico registro tra A, B, C o D, mentre m- rappresenta il nome simbolico una
posizione di memoria corrispondente a un byte (m8), a una semiparola (m16) o a una parola (m32). Si
ricorda che nel caso di semiparole o parole l’indirizzo è quello del byte meno significativo delle medesime.
Per ragioni di chiarezza espositiva, nella parte che segue faremo riferimento al registro A (AL, AH, AX
EAX), tuttavia, come sarà evidente nel seguito, quanto verrà sviluppato si applica immutato agli altri
tre registri B, C e D.
Si dice che una parola è allineata se il suo indirizzo è multiplo di 4 (ovvero se il suo byte meno
significativo è a un indirizzo multiplo di 4); si dice che una semiparola è allineata se il suo indirizzo
(quello del suo byte meno significativo) è un multiplo di 2. I byte per definizione sono allineati.
Si noti che il concetto di allineamento descrive in modo inequivocabile soltanto la relazione che c’è
tra il posizionamento in memoria e il posizionamento nel registro di destinazione nel caso di parole di
32 bit (EAX). Nel caso di byte o di semiparole “allineate” non è detto che ci sia tale corrispondenza.
Consideriamo ad esempio l’istruzione MOV AL,m8 e assumiamo che il byte indirizzato si trovi a un indirizzo
non multiplo di 4. È evidente che il byte viene letto su una corsia del bus dati esterno diversa da quella
corrispondente agli 8 bit meno significativi, mentre, per andare in AL, deve transitare per la parte bassa
del bus dati interno che conduce ai registri. Un analogo ragionamento si può fare per le semiparole
allineate a indirizzi non multipli di 4: esse vengono lette sulla metà più significativa del bus dati esterno,
ma devono transitare sulla parte meno significativa del bus dati interno per finire in AX. Per questo
motivo, nel seguito, si usa il termine “corrispondente” per indicare un’entità (byte o semiparola) che sia
sul bus esterno sia sul bus interno transita su linee di pari peso.
1 Sin dall’8086 il fetch, a parte l’istruzione seguente un salto che poteva trovarsi a un indirizzo non allineato, avviene
sempre per parole allineate.
2 SCHEMATIZZAZIONE
2
Figura 1: Schematizzazione della rete da progettare.
2
Schematizzazione
In Figura 1 viene data una schematizzazione della rete (blocco XFER) che si intende progettare2 . La
figura serve per formalizzare il problema e per definire il significato dei segnali. Più specificatamente
• D31−0 rappresenta il bus dei dati interno, diviso in 4 corsie di un byte (D31−24 , D23−16 , D15−8 ,
D7−0 ). DE31−0 rappresenta il bus dei dati esterno, esso pure diviso in 4 corsie di un byte. In base
alla definizione precedente, un byte di memoria è corrispondente se transita sulle stesse linee dei
due bus (per esempio D7−0 ⇐ DE7−0 .
• Le linee L, H, X e E sono generate dalla logica di decodifica dell’istruzione (non mostrata in figura)
quando viene eseguita (ordinatamente e corrispondentemente) una della 4 istruzioni riportate al
Par.1. Per le parole non allineate e per le semiparole a cavallo a due parole allineate occorrono due
cicli di lettura.
• Assumiamo per semplicità che un ciclo di lettura duri esattamente 1 periodo di clock. Come appena
detto ci sono situazioni in cui si rendono necessari due cicli di lettura; in tali casi denotiamo con TM 1
il primo ciclo e con TM 2 il successivo. Stabiliamo che la logica di decodifica mantenga invariati i
segnali L, H, X e E attraverso i due cicli (se il secondo viene effettivamente eseguito). La generazione
di TM 1 e TM 2 è, almeno concettualmente, banale e fa parte della logica essenziale della CPU (si
veda l’Appendice).
• A1 e A0 rappresentano i due bit meno significativi dell’indirizzo a cui l’istruzione legge in memoria;
essi individuano la posizione all’interno della parola indirizzata.
• BE0 , BE1 , BE2 e BE3 le 4 linee che servono a identificare quale fascia di memoria deve essere letta3 .
• A31−2 è l’indirizzo di parola generato dalla logica di CPU. L’esecuzione di una della 4 istruzioni
di MOV sopra riportate presuppone che venga asserito l’indirizzo di parola e i BE congruenti. In
particolare, se per esempio si legge una parola non allineata, viene prima asserito l’indirizzo di parola
a cui trova la parte meno significativa e i relativi BE, quindi viene incrementato di 1 l’indirizzo di
parola e vengono asseriti i BE necessari a leggere i byte che compongono la parte restante della
2 Ovviamente il blocco XFER è parte della stessa logica di CPU, qui viene schematizzato a parte per formalizzare il
problema, assumendo che la logica della CPU decodifichi le istruzioni e generi i segnali L, H, X, E, A0 , A1 , TM 1 , TM 1 ,
oltre a A31−2 .
3 Per semplicità e per non aggravare la notazione assumiamo che i BE, come tutti gli altri segnali di controllo) siano
attivi in stato di alto, diversamente da quanto accade nel caso concreto dei processori con architettura X86.
3 ACCESSI ALLA MEMORIA
3
parola. Ancora una volta, assumiamo che l’incremento dell’indirizzo di parola (e l’asserzione di
TM 2 sia compito della logica di CPU diversa da XFER.
Nel seguito si adotta questa convenzione: si scrive MOV R,--A1 A0 , dove A1 A0 assumono i valori 00,
01, 10 o 11, per mettere in evidenza la dislocazione (entro la parola) del byte indirizzato. In Figura 2
vengono dati tre esempi di percorsi da bus esterno a bus interno.
L’istruzione MOV AH,--00 legge il byte sulle linee DE7−0 del bus esterno e lo trasferisce verso AH sulle
linee D15−8 del bus interno.
L’istruzione MOV AX,--01 legge 2 byte sulle linee DE23−8 e li trasferisce verso AX sulle linee D15−0 .
L’istruzione MOV EAX,--11 richiede due letture; sulla prima (TM 1 ) il byte meno significativo della
parola risultante viene letto su DE31−24 e trasferito verso AL su D7−0 ; sulla seconda (TM 2 ) i restanti tre
byte vengono letti su DE23−0 . e trasferiti verso la parte restante di EAX (cioè AH e la porzione E) su
D31−8 .
3
Accessi alla memoria
Vengono ora esaminati i singoli differenti accessi alla memoria per le 4 istruzioni elencate in precedenza
in funzione dell’allineamento dell’entità letta. Per ciascuna operazione viene indicato: (i) il codice; (ii) la
rappresentazione sintetica dell’istruzione, da interpretare come la condizione che si verifica quando viene
eseguita l’istruzione stessa; (iii) i BE asseriti; (iv) il trasferimento da bus dati esterno a bus dati interno.
3.1
Accessi che si completano in 1 ciclo
Vengono ora considerate le istruzioni che si completano in 1 ciclo. Esse possono leggere dati in posizioni
corrispondenti o non corrispondenti tra bus dati esterno e interno.
3.1.1
Letture corrispondenti
Sono le letture per le quali l’entità letta passa dal bus dei dati esterno al bus dei dati interno mantenendo
la stessa posizione.
MOV
MOV
MOV
MOV
AL,--00
AH,--01
AX,--00
EAX,--00
3.1.2
L.00
H.01
X.00
E.00
BE0
BE1
BE1, BE0
BE3, BE2, BE1, BE0
D7−0 ⇐ DE7−0
D15−8 ⇐ DE15−8
D15−0 ⇐ DE15−0
D31−0 ⇐ DE31−0
Letture non corrispondenti
Sono le letture per le quali l’entità letta percorre differenti corsie tra bus dei dati esterno e sul bus dei
dati interno.
MOV AL,--01
MOV AL,--10
MOV AL,--11
L.01
L.10
L.11
BE1
BE2
BE3
D7−0 ⇐ DE15−8
D7−0 ⇐ DE23−16
D7−0 ⇐ DE31−24
MOV AH,--00
MOV AH,--10
MOV AH,--11
H.00
H.10
H.11
BE0
BE2
BE3
D15−8 ⇐ DE7−0
D15−8 ⇐ DE23−16
D15−8 ⇐ DE31−24
MOV AX,--01
MOV AX,--10
X.01
X.10
BE2, BE1
BE3, BE2
D15−0 ⇐ DE23−8
D15−0 ⇐ DE31−16
Notare che l’ultima istruzione legge una parola “allineata”, ma non “corrispondente”.
3.2
Accessi che richiedono due cicli
Riguardano la lettura di una semiparola a cavallo tra due parole allineate consecutive e la lettura di
parole non allineate. Si riportano anche i due cicli di clock in cui avvengono le letture, Si tenga conto che
su TM 2 l’indirizzo di parola (quello corrispondente a “--” nell’istruzione) è incrementato di 1 rispetto a
quello in TM 1 .
3 ACCESSI ALLA MEMORIA
4
Figura 2: Schematizzazione di alcuni percorsi e dell’uso dei BE per la selezione. Si invita il lettore a
elencare tutti i possibili casi.
MOV AX,--11
X.11
BE3
BE0
D7−0 ⇐ DE31−24
D15−8 ⇐ DE7−0
su TM 1
su TM 2
MOV EAX,--01
E.01
BE3, BE2, BE1
BE0
D24−0 ⇐ DE31−8
D31−24 ⇐ DE7−0
su TM 1
su TM 2
MOV EAX,--10
E.10
BE3, BE2
BE1, BE0
D15−0 ⇐ DE31−16
D31−16 ⇐ DE15−0
su TM 1
su TM 2
MOV EAX,--11
E.11
BE3
BE2, BE1, BE0
D7−0 ⇐ DE31−24
D31−8 ⇐ DE24−0
su TM 1
su TM 2
3 ACCESSI ALLA MEMORIA
3.3
5
Generazione BE0
Siamo ora in posizione per tracciare la rete genera che i BE. In particolare per quanto riguarda BE0 si
ha che su TM 1 esso deve essere asserito se è verificata la condizione
L.00+X.00+E.00+H.00
mentre deve essere asserito su TM 2 se è verificata la condizione
X.11+E.01+E.10+E.11
Ne consegue la rete di Figura 3. Le reti che generano gli altri BE si ricavano i modo analogo.
Figura 3: Parte della rete XFER che genera BE0.
Risulta facile tracciare la rete di multiplexing della porzione DE7−0 del bus esterno sul bus interno,
come in Figura 4.
Figura 4: Trasferimento di DE7−0 sul bus dei dati interno.
A conclusione di questo paragrafo vale la pena di osservare che l’esserci riferiti al registro A è,
ovviamente, del tutto irrilevante. I BE non dipendono in alcun modo dal registro coinvolto nell’operazione.
4 ABILITAZIONE (PARTI DI) EAX
4
6
Abilitazione (parti di) EAX
Possiamo ora derivare le espressioni per le linee di controllo in ingresso al registro A (che faremo generare
sempre dalla rete XFER di Figura 1, anche se non sono state indicate) che determinano il caricamento di
AL e AH, oltre al caricamento della parte bassa e della parte alta dell’estensione, che, per convenienza,
indicheremo rispettivamente con EAL e EAH4 . Infine si osservi che non serve considerare AX né tantomeno la parte di estensione, perché sono dati rispettivamente dall’unione di AL con AH e di EAL con
EAH
Con riferimento al nostro registro A definiamo i seguenti 4 segnali di abilitazione.
• EnAL il segnale di abilitazione al caricamento di AL.
Il caricamento del registro AL deve essere abilitato sempre e solo su TM 1 tutte le volte che c’è la
condizione L, ovvero la condizione X, ovvero la condizione E.
• EnAH il segnale di abilitazione al caricamento di AH.
Deve essere asserito su TM 1 quando vale la condizione H, ovvero X.00, X.01, X.10, ovvero E.00,
ovvero E.01, ovvero E.10; deve essere asserito su TM 2 quando vale la condizione X.11, ovvero E.11.
• EnEAL il segnale di abilitazione al caricamento della parte bassa dell’estensione di AX (bit EAX23−16 ).
Deve essere asserito su TM 1 quando vale una delle condizioni seguenti: E.00, oppure E.01; deve
asserito su TM 2 quando vale la condizione E.10, ovvero la condizione E.11.
• EnEAH il segnale di abilitazione al caricamento della parte alta dell’estensione di AX (bit EAX31−24 ).
Su TM 1 deve essere asserito se vale E.00; su TM 2 deve essere asserito se vale una di queste condizioni:
E.01, ovvero E.10, avvero E.11.
Riformuliamo quanto sopra in logica delle reti:
EnAL = TM 1 (L + X + E)
EnAH = TM 1 (H + X.00 + X.01 + X.10 + E.00 + E.01 + E.10) + TM 2 (X.11 + E.11) =
= TM 1 (H + (X + E)(A1 A0 + A1 A0 + A1 A0 )) + TM 2 (X + E)A1 A0 =
= TM 1 (H + (X + E)(A1 + A1 A0 )) + TM 2 (X + E)A1 A0 =
= TM 1 (H + (X + E)(A1 + A0 )) + TM 2 (X + E)A1 A0
EnEAL = TM 1 (E.00 + E.01) + TM 2 (E.10 + E.11) =
= TM 1 E(A1 A0 + A1 A0 ) + TM 2 E(A1 A0 + A1 A0 ) =
= TM 1 EA1 + TM 2 EA1 =
= E(TM 1 A1 + TM 2 A1 )
EnEAH = TM 1 E.00 + TM 2 (E.01 + E.10 + E.11) =
= TM 1 EA1 A0 + TM 2 E(A1 A0 + A1 A0 + A1 A0 ) =
= TM 1 EA1 A0 + TM 2 E(A1 A0 + A1 ) =
= TM 1 EA1 A0 + TM 2 E(A0 + A1 ) =
= E(TM 1 A1 A0 + TM 2 (A0 + A1 ))
Nei nomi dei precedenti segnali di abilitazione è presente “A” a indicare che ci si stava riferendo al
registro A. Tuttavia, nelle espressioni alla destra dell’uguale non c’è traccia del registro “A”, dunque le
espressioni trovate sono valide per selezionare le 4 parti di 8 bit di qualunque registro. Per riferirsi ad un
quarto di uno specifico registro basta mettere in AND il selettore del registro con il selettore del quarto
di registro. Si ottiene cosı̀ lo schema di Figura 5 dove con R si è indicato il generico registro (la linea
R è asserita dalla logica di CPU quando il registro di destinazione è R, ovvero uno tra A, B, C, D). I
segnali EnL, EnH, EnEL e EnEH sono i precedenti EnAL, EnAH, EnEAL e EnEAH, mentre i segnali
che escono dalle porte AND sono gli effettivi segnali di abilitazione delle 4 parti del registro R.
4 Si noti che i 16 bit di estensione che trasformano AX in EAX non sono direttamente indirizzabili attraverso il repertorio
di istruzioni di macchina. Essi possono essere letti/scritti solo nelle istruzioni che nominano EAX, cioè assieme ai 16 bit
bassi corrispondenti ad AX. Abbiamo dato i nomi di EL e EH alle due le due metà dell’estensione per poterle abilitare
indipendentemente, a seconda del posizionamento della parola.
5 UN MIGLIORAMENTO
7
Figura 5: Formazione dei segnali di abilitazione di (parti di) un generico registro.
5
Un miglioramento
Lo schema da cui siamo partiti (Figura 1) prevede un unico blocco di cui fa parte sia la logica di controllo
che il percorso dati (datapath). E’ buona norma, anche come pulizia di pensiero, tenere separata la logica
di controllo dal percorso dei dati. Nel caso specifico il percorso dati comprende la memoria M, il blocco
X, e il blocco RF (Register File), come in Figura 6. Il blocco X fa la funzione di multiplexer e corrisponde
a quanto rappresentato in Figura 4; il blocco BEG è responsabile della generazione dei BE e dei comandi
di abilitazione dei registri; esso corrisponde a quanto illustrato in Figura 3 e alla logica del Paragrafo
4. Nel tracciare la figura, le abilitazioni dei singoli registri, coerentemente con la Figura 5, sono state
nascoste nel blocco RF .
Nei nostri ragionamenti si è fatto riferimento alla lettura della memoria, ma non abbiamo mai messo
in evidenza il segnale MRead. È un esercizio banale tenere conto di questo segnale ove serve.
Figura 6: Separazione della logica di controllo dal percorso dati.
Conclusioni
Abbiamo costruito la rete che genera i BE con riferimento all’architettura X86 a 32 bit. Abbiamo
considerato il caso delle sole operazioni di lettura di un dato dalla memoria e abbiamo fatto un buon
5 UN MIGLIORAMENTO
8
numero di assunzioni semplificative. Abbiamo inoltre ricavato le espressioni dei comandi che abilitano il
caricamento del dato letto nelle porzioni del registro di destinazione.
Naturalmente non si pretende che l’effettiva rete sia come quella illustrata; peraltro essa diversamente
dalla nostra sarà integrata nella logica di decodifica ed esecuzione delle istruzioni, che noi abbiamo assunto
esistesse a parte.
Infine, sono possibili alcune variazioni che potrebbero derivare da una analisi più dettagliata del
funzionamento della macchina. Per esempio, abbiamo supposto che nel caso di allineamento che richieda
due cicli di lettura, il dato letto nel primo ciclo venga immediatamente scritto nella parte di registro
deputata ad accoglierlo e che quello letto sul secondo ciclo venga scritto nella (sola) parte rimanente del
registro sul secondo ciclo. Potrebbe essere il caso che il registro venga scritto in una sola volta, utilizzando
un registro di appoggio che serva a parcheggiare il dato letto nel primo ciclo in modo da comporlo con
quello letto nel secondo ciclo per formare il dato completo, effettuando perciò una sola scrittura nel
registro di destinazione.
Appendice
Mostriamo schematicamente come vengono generati TM 1 e TM 2 . Si suppone che l’accesso alla memoria
sia su T3 e che l’eventuale secondo accesso sia su T4.
5
Figura 7: Generazione di TM 1 e TM 2
Lo schema per TM 1 è ovvio: TM 1 viene comunque generato se c’è un accesso alla memoria.
Per quanto riguarda TM 2 si consideri che questo segnale si rende necessario se: (a) deve essere
letta/scritta una parola non allineata (ovvero con uno tra A0 o A1 a 1); (b) deve essere letta/scritta
una semiparola che ha il byte meno significativo posizionato nella posizione più significativa (ovvero
A0 A1 = 1). Naturalmente il precedente ragionamento si basa sull’assunto che su TM 2 la logica di CPU
asserisce l’indirizzo della prossima parola (su A31 − A2 ) mantenendo immutati A1 e A0 .