DLX sequenziale

Transcript

DLX sequenziale
Calcolatori Elettronici T
ISA DLX: Implementazione
Tramite Struttura Sequenziale
1
E’ disponibile un interprete e simulatore (EasyDLX) per un
insieme semplificato dell’ISA DLX realizzato da Daniele Biagi
nell’ambito di un progetto del corso di Linguaggi e Modelli
computazionali (prof. Denti).
Il simulatore è in grado di eseguire salti, evidenziando step by
step la prossima istruzione che verrà eseguita. Supporta tutte
operazioni logiche e aritmetiche con operandi interi.
Home page (Google code):
http://code.google.com/p/easydlx/
Pagina web sul sito di Linguaggi e Modelli computazionali:
http://edenti.deis.unibo.it/Ling/2010-2011/BestProjects/Biagi/
index.html
2
Riassunto delle principali caratteristiche
dell’ISA del DLX
• 
32 registri da 32 bit di uso generale (R0..R31, con R0=0)
• 
32 registri floating point da 32 bit (utilizzati esclusivamente dalle unità funzionali in
virgola mobile)
• 
Istruzioni di lunghezza costante 32 bit allineate
• 
Campi di dimensioni fisse nell’ambito di istruzioni diverse
• 
3 formati di istruzione: I, R, J
• 
Non ci sono istruzioni specifiche per la gestione dello stack
• 
Nelle istruzioni di tipo JL l’indirizzo di ritorno e’ salvato in R31
• 
Non c’è un registro di FLAG settato dalle istruzioni ALU; le condizioni vengono settate
esplicitamente nei registri con il gruppo di istruzioni SET condition IN REGISTER (SCN):
SetCoNdition Rd, Rs1, Rs2/Immediato (ex. Cond: EQ (if Rs1=Rs2 then Rd <- 1, else Rd <0), LT, NEQ, …)
• 
C’è un registro di FLAG testabile a controllo di programma per le condizioni settate
dall’unità Floating Point
• 
Una sola modalità di indirizzamento di memoria (registro + offset)
• 
MOVS2I e MOVI2S: sposta un registro speciale (eg IAR) da/verso un registro general
purpose (i.e. R0..R31). Utile per implementare annidamento degli interrupt (stack...)
3
Il set di istruzioni del DLX
• Le principali istruzioni aritmetiche e logiche
•  Istruzioni logiche anche con op. immediato: AND, ANDI, OR, ORI, XOR, XORI
•  Istruzioni aritmetiche: ADD, ADDI, SUB, SUBI, MULT, DIV
•  Istruzioni di traslazione logica (a destra anche aritmetica): SLL(I)1, SRL(I), SRA(I)2
•  Istruzioni di SET CONDITION: Scn, ScnI(mmediate), con cn = EQ, NE, LT, GT, LE, GE
• Le principali istruzioni di trasferimento dati
•  Load byte (signed/unsigned), Load Halfword (signed/unsigend), Load Word (LB, LBU, LH,
LHU, LW)
•  Store byte, Store Halfword, Store Word (SB, SH, SW)
•  Load/Store Floating Point in singola o doppia precisione (LF/SF e LD/SD)
•  Copia un dato da un GPR a un FPR e viceversa (MOVI2FP e MOVFP2I)
• Le principali istruzioni di trasferimento del controllo
•  Istruzioni di salto condizionato (PC+4 relative): BNEZ, BEQZ
•  Istruzioni di salto incondizionato diretto e indiretto(PC+4 relative): J, JR
•  Istruzioni di chiamata a procedura (Jump and Link, l’indirizzo di ritorno viene
automaticamente salvato in R31): JAL, JALR
•  Istruzione di ritorno dalla procedura di servizio delle interruzioni: RFE
1) Shift logico a sinistra e shift aritmetico a sinistra coincidono (entrano 0 nei bit meno significativi). Per questa
ragione NON esiste SLA. Fare attenzione con shift a sinistra, non preserva il segno e può generare overaflow.
2) NB. Trascinando a destra di una posizione un registro e inserendo a sinistra sempre il bit del segno si mantiene il
segno del dato mentre lo si divide successivamente per 2
4
Formato tipico delle istruzioni
nelle architetture R - R (Es. DLX)
Attenzione: in alcune istruzioni I (LOAD e ALU) RS2 rappresenta il registro destinazione
Codice
operativo
I
RS2/Rd
RS1
Operando immediato di 16 bit
Load, Store, Branch condizionale, JR e JALR (trasf. controllo via registro), SetCond e ALU con op. imm.
Nelle operazioni di LD e ALU RS2=Rdest, nelle ST RS2=sorg. -- RS1 per indirizzo o sorgente (con imm.)
6 bit
Codice
operativo
R
5 bit
5 bit
5 bit
RS2
RS1
Rd
11 bit
Estensione al Cod. op (11 bit)
•  Istruzioni aritmetiche e logiche del tipo Rd ← Rs1 op Rs2 oppure SetCond fra registri
Codice
operativo
J
Offset di 26 bit (PC relative)
31
0
•  Trasferimento del controllo diretto e incondizionato (J e JAL)
5
Numerazione dei bits
ISTRUZIONI ARITMETICHE E
LOGICHE (ALU)
•  Istruzioni a 3 operandi
–  2 operandi “sorgente”
–  1 operando “destinazione”.
•  “destinazione”: registro
•  “sorgente” :
registro, registro / operando immediato (16 bit)
•  Esempi:
R1 in posizione Rd nel formato della
istruzione
ADD R1, R2, R3
R1 ß R2+R3 formato R
ADDI R1, R2, 3
R1 ß R2+3
ADDI R1, R0, 5
R1 ß 0+5 (cioè : R1 ß 5 )
formato I
ADD R1, R5, R0
R1 ß R5+R0 (cioè :
formato R
formato I
R1 ß R5 )
R1 in posizione Rd, R2 e R0 in
posizione RS1 nel formato della
istruzione
6
Set Condition
Queste istruzioni confrontano i due operandi sorgente e mettono a “1” oppure
a “0” l’operando destinazione in funzione del risultato del confronto
“SET EQUAL” (SE, =), “SET NOT EQUAL” (SNE, =),
“SET LESS THAN” (SLT, <), ……………..
ESEMPI:
SLT R1,R2,R3
ß 1 else R1 ß 0
if (R2<R3): R1
formato R
R1 in posizione RS2 e R2 in posizione RS1
nel formato della istruzione
Nel caso di operando sorgente immediato:
SLTI R1,R2,5
if (R2<5):
ß 1 else R1 ß 0
R1
formato I
Nel caso di confronto fra operandi “unsigned” :
SLTU R1,R2,R4
if (R2<R4):
R1
ß 1 else R1 ß 0
formato R
7
ISTRUZIONI DI TRASFERIMENTO
DATI
(formato I)
•  Sono istruzioni che accedono alla memoria (load e store)
•  L’indirizzo dell’operando in memoria è la somma del contenuto di
un registro con un “offset” di 16 bit
•  L’istruzione è codificata secondo il formato I
•  Esempi:
LW R1, 40(R3)
R1 ß32 M[40+R3]
LB R1, 40(R3)
R1 ß (M[40+R3]7)24
## M[40+R3]
“Sign Extension”
LBU R1,40(R3)
R1 ß
LH R1, 40(R3)
R1 ß (M[41+R3]7)16
SW R7,10(R5)
M[10+R5]
(0)24 ## M[40+R3]
ß32 R7
## M[41+R3]
## M[40+R3]
8
ISTRUZIONI DI TRASFERIMENTO
DEL CONTROLLO
• 
• 
• 
“JUMP”: Trasferimento del controllo (o salto) incondizionato
“JUMP AND LINK: Trasferimento di controllo con salvataggio
dell’indirizzo di ritorno (chiamata a procedura)
“BRANCH”: Trasferimento di controllo condizionato (salto condizionato)
“JUMP”
J alfa
PC ß (PC +4) + OFFSET(alfa)
Formato Istruz. di tipo J
(“PC relative”, OFFSET di 26 bit)
J R3
Formato Istruz. di tipo I
PC ß R3
“JUMP AND LINK” (salto a procedura e ritorno)
JAL alfa
R31 ß PC+4 ; PC ß (PC +4) + OFFSET(alfa)
JALR R3
R31 ß PC+4 ; PC ß R3
J R31
PC ß R31
Questa è l’istruzione di ritorno da procedura
(senza stack è possibile un solo livello di nesting !!)
9
ISTRUZIONI DI TRASFERIMENTO DEL
CONTROLLO
(salto condizionato)
“BRANCH”
N.B. il registro da cui dipende il salto
è indicato nel formato della istruzione
nella posizione RS1
–  “BRANCH EQUAL ZERO”
–  “BRANCH NOT EQUAL ZERO”
BEQZ R4, alfa if (R4=0):PC ß (PC +4)+OFFSET(alfa)
BNEZ R4, alfa if (R4=0):PC ß (PC +4)+OFFSET(alfa)
( sono entrambe istruzioni “PC relative”, con OFFSET di 16 bit)
BEQZ e BNEZ sono istruzioni di formato I
Con una istruzione di tipo set condition seguita da un’istruzione di
salto condizionato si realizza la funzione di Compare and Branch
(confronto e salto condizionato dal risultato del confronto) senza
10
bisogno di flag dedicati
Esempio di codice in Assembler
di una macchina R-R
Si scriva il codice assembler per il calcolo della somma degli elementi di un vettore di
indirizzo iniziale A (<2^15) di 8 elementi (32 bytes) e lo si scriva all’indirizzo Z
utilizzando i seguenti registri:
–  R1 per la somma corrente
–  R2 per l’indice
–  R3 per il contatore delle iterazioni
CICLO
ADD
ADD
ADDI
R1, R0, R0
R2, R0, R0
R3, R0, 8
; azzera la somma corrente
; azzera R2 registro indice
; inizializza il contatore dei cicli
LW
ADD
ADDI
ADDI
BNEZ
R4, A(R2)
R1, R1, R4
R2, R2, 4
R3, R3, -1
R3, CICLO
; indirizzo dell’operando in memoria (calcolato a run time )
; aggiorna somma corrente
; 4 e’ il numero di bytes per word
SW
…..
Z(R0), R1
; Qui niente SCN: implicita nella istruzione precedente
; vero se il test è fatto sull’intero contenuto del registro
: altrimenti SC
; Z e’ l’indirizzo della variabile con il risultato (R0=0)
Come si sarebbe dovuto trasformare il codice se A>= 2^15 ?
11
Calcolatore
Istruzioni
Programma
Unità di
controllo
(rete
sequenziale)
Ingressi Xi
(dalla memoria)
Ingressi
secondari
o variabili
di stato
Yi(n+1)
Segnali di
controllo
Sommatore e
moltiplicatore
per n (variabile)
Registri
Uscite Oi
(alla memoria)
Uscite
di stato
Yi(n)
12
Datapath e Unità di Controllo
• 
• 
La struttura di una CPU, come tutte le reti logiche sincrone che elaborano dati, può essere
strutturata in due blocchi Unità di Controllo e Datapath.
La CPU, per funzionare, ha bisogno della memoria esterna su cui risiedono il programma
e i dati.
Rete logica processore
indirizzi
ready
interrupt
reset
istruzioni
U.d.C.
memoria
clock
Dati (in)
Dati (out)
Data Path
CPU
13
Datapath e Unità di Controllo
•  Datapath: contiene tutte le unità di elaborazione ed i registri
necessari per l’esecuzione delle istruzioni della CPU. Ogni
istruzione appartenente all’Instruction Set è eseguita mediante
una successione di operazioni elementari,
dette micro-operazioni.
•  Micro-operazione: operazione eseguita all’interno del
DATAPATH in un ciclo di clock (esempi: trasferimento di un
dato da un registro ad un altro registro, elaborazione ALU)
•  Unità di Controllo: è una RSS che in ogni ciclo di clock invia
un ben preciso insieme di segnali di controllo al DATAPATH al
fine di specificare l’esecuzione di una determinata microoperazione.
14
Struttura del DLX (esecuzione sequenziale)
S1
C
O
N
T
R
O
S2
dest
alu
U
A
N
B
I
Register file
C
PC
T
TEMP
L
IAR
MAR
MDR
Instruction
register
CPU
dati in scrittura
fetch
Indirizzi
Parallelismo dell’architettura: 32 bit
(bus, alu e registri hanno parallelismo 32)
Memoria
dati/istruzioni in lettura
I segnali di controllo
non sono riportati !
execute
15
I registri del DLX (tutti a 32 bit)
A parte il Register File questi registri NON sono noti al programmatore !!!
•  Register file : 32 Registri General Purpose Registers R0….R31 con
R0=0
•  IAR: Interrupt Address Register – Deposito dell’indirizzo di ritorno
in caso di interruzione
•  PC: Program Counter
•  MAR: Memory Address Register – Contiene l’indirizzo del dato da
scrivere o leggere in memoria
•  IR: Instruction Register – Contiene l’istruzione attualmente in
esecuzione
•  TEMP: Temporary Register – Registro di deposito temporaneo di
risultati
•  MDR: Memory Data Register – Registro di transito temporaneo dei
dati da e per la memoria
•  A e B – Registri di uscita dal Register File
16
Funzioni della ALU
Dest (uscite) – 4 bit di comando
S1 + S2
S1 – S2
S1 and S2
S1 or S2
S1 exor S2
Shift S1 a sinistra di S2 posizioni
Shift S1 a destra di S2 posizioni
Shfit S1 aritmetico a destra di S2 posizioni
S1
S2
0
1
Flag di uscita
Zero
Segno negativo
Carry
La ALU è una rete PURAMENTE combinatoria
17
Trasferimento dati sul datapath
•  I bus S1 ed S2 sono multiplexati (tri-state) con parallelismo 32 bit.
•  I registri campionano sul fronte positivo del clock, hanno due porte di
uscita O1 e O2 per i due bus (o i registri A e B) e dispongono di tre ingressi
di controllo:
–  un ingresso di Write Enable (WE*) ed uno di Output Enable per ogni
porta di uscita, una per ogni bus S1 e S2 (OE1* e OE2*).
•  Al fine di valutare la massima frequenza a cui è possibile far funzionare il
datapath è importante conoscere le seguenti temporizzazioni:
–  TC (max) : ritardo max tra il fronte positivo del clock e l’istante in cui i
segnali di controllo generati dall’unità di controllo sono validi;
–  TOE (max): ritardo max tra l’arrivo del segnale OE e l’istante in cui i
dati del registro sono disponibili sul bus;
–  TALU (max): ritardo massimo introdotto dalla ALU;
–  TSU (min) : tempo di set-up minimo dei registri (requisito minimo per il
corretto campionamento da parte dei registri).
•  La massima frequenza di funzionamento del data path si calcola come
segue:
TCK > TC (max) + TOE (max) + TALU (max) + TSU (min)
fCK(max) = 1/TCK
18
Esempio : esecuzione della microistruzione
Rin ← Rout
Clock sempre collegato:
write enable !
I segnali in blu (segnali di controllo)
provengono dall’Unità di Controllo
S1
S2
OE1*
OE2Rout*
OE2*
(e.g. TEMP)
O1
Rout
I
O2
WE*
OE1*
OE2*
O1
O2
Rin
I
WE*
WERin*
i2
i1
(e.g. MAR)
u = i2
alu
clock
dest
I segnali di controllo in grassetto sono attivi nel ciclo di clock in cui
il micro-step Rin ← Rout viene eseguito
19
Il set di istruzioni non floating-point del DLX
Data Transfer
LW
LB
LBU
LH
SW
SH
SB
LHI
*MOVS2I
*MOVI2S
Ra, offset(Rb)
Ra, offset(Rb)
Ra, offset(Rb)
Ra, offset(Rb)
Ra, offset(Rb)
Ra, offset(Rb)
Ra, offset(Rb)
Ra, value
Ra, Rs
Rs, Ra
* Special register Rs (IAR)
Aritmetiche/logiche
ADD
ADDI
ADDU
ADDUI
SUB
SUBI
SUBU
SUBUI
DIV
DIVI
MULU
MULI
SLL
SLLI
SHR
SHRI
SLA
SLAI
OR
ORI
XOR
XORI
AND
ANDI
Ra,Rb,Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb, value
Ra,Rb,Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb, value
Ra,Rb,Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb, value
Ra ,Rb,Rc
Ra,Rb;value
Ra,Rb.Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb,value
Ra,Rb,Rc
Ra,Rb,value
Controllo
SETx
SETIx
BEQZ
BNEQZ
J
JR
JL
JLR
Ra,Rb,Rc
Ra,Rb,value
Ra, offset
Ra, offset
offset
Ra
offset
Ra
N.B. x può essere LT, GT, LE, GE, EQ, NE
20
Il progetto dell’Unità di Controllo
•  Una volta definito il Set di Istruzioni e progettato il DATAPATH, il passo
successivo del progetto di una CPU è il progetto dell’Unità di Controllo
(CONTROLLER).
•  Il CONTROLLER è una RSS: il suo funzionamento può essere specificato
tramite un diagramma degli stati.
•  Il CONTROLLER (come tutte le RSS) permane in un determinato stato per
un ciclo di clock e transita (può transitare) da uno stato all’altro in
corrispondenza degli istanti di sincronismo (fronti del clock).
•  Ad ogni stato corrisponde quindi un ciclo di clock. Le micro-operazioni che
devono essere eseguite in quel ciclo di clock sono specificate (in linguaggio
RTL) nel diagramma degli stati che descrive il funzionamento del
CONTROLLER all’interno degli stati.
•  A partire dalla descrizione RTL si sintetizzano poi i segnali di controllo che
devono essere inviati al DATAPATH per eseguire le operazioni elementari
associate ad ogni stato.
21
Il diagramma
degli
stati del
controller
Qui non si sa ancora quale sia
l’istruzione ma il
trasferimento ai registri è fatto
comunque !!
MAR <- PC
Ready ?
IR <- M [MAR]
PC<- PC+4
A <- RS1
B <- RS2
INSTRUCTION
FETCH
INSTRUCTION
DECODE*
Oltre a decodificare
l’istruzione si prelevano gli
operandi sorgente dal RF
(anche se non utilizzati !) e
si incrementa il PC.
Data transfer
ALU
Set
N.B. I primi tre stadi sono
comuni a tutte le
istruzioni
Jump
Branch
22
Estrazione “automatica” dei registri durante la
fase di decode di una istruzione (qualsiasi)
B
A
<
I
Codice
operativo
RS2/Rd
RS1
R
Codice
operativo
RS2
RS1
J
Codice
operativo
31
Operando immediato di 16 bit
Rd
Estensione al Cod. op (11 bit)
Offset di 26 bit (PC relative)
0
Questi 5 + 5 bit sono utilizzati per estrarre, preventivamente e ancora prima di conoscere che tipo
di istruzione che è stata letta dalla memoria, dal Register File due registri in A e B. Nel caso di
istruzione J non ci sono registri coinvolti e quindi saranno estratti bit corrispondenti all’offset. Nel
caso di istruzione I, in B potrebbe finire il valore del registro destinazione (e.g. in una LD o
operazione ALU (tipo I)).
Infine: i 5 + 5 bit rappresentano gli indici (o presunti tali) ma non il valore dei due registri che è
contenuto nel Register File.
Gli stati della fase di fetch
•  In questa fase si deve verificare se è presente un interrupt (evento esterno
asincrono che la CPU deve “servire” con apposito software);
•  se l’interrupt è presente e può essere servito (IEN = true) si esegue
implicitamente l’istruzione di chiamata a procedura all’indirizzo 0, e si salva
l’indirizzo di ritorno nell’apposito registro IAR;
•  se l’interrupt non è presente o le interruzioni non sono abilitate, si va a leggere
in memoria la prossima istruzione da eseguire (il cui indirizzo è in PC)
Dall’ultimo stato
dell’istruzione
precedente
(int and IEN) = 1
(int and IEN) = 0
MAR ← PC
IAR ← PC
Ready = 0
IR ← M(MAR)
PC ← 0
Ready = 1
Alla fase di
decodifica
IEN ← 0
IAR:
Interrupt
Address
Register
IEN:
Interrupt
Enable
Flag
24
Il diagramma
degli
stati del
controller
Si modifica il
DATAPATH in
maniera da poter
indirizzare
la memoria dal PC.
Meno stati ma
maggiore complessità
Ready ?
IR <- M [PC]
INSTRUCTION FETCH
PC <- PC +4
A <- RS1
B <- RS2
INSTRUCTION
DECODE*
Data transfer
Tutte le istruzioni
impiegano un clock
in meno per essere
eseguite !
Ma
potenzialmente
aggiore lentezza
-> minore freq. clock
ALU
Set
Jump
Branch
25
Controllo per
l’istruzione LB
(LOAD BYTE)
IR <- M [PC]
Ready ?
Parte
comune
PC <- PC +4
A <- RS1
B <- RS2
LOAD
MAR <- A +
Ready ?
(IR15)16
## IR15..0
MDR <- M[MAR]
ALU
(A) = (RS1)
Estensione
segno
LB
C <- (MDR7)24 ## MDR7..0
ALU
RD <- C
RS2 è da intendersi
come registro di
destinazione
26
Estensione del segno
(IR15)16 ## IR15..0
IR
Da UdC
0
15
31
31 30…………17 16 15-0
BUS S1 o S0
27
Controllo per
le istruzioni di
DATA
TRANSFER
NB: in lettura la parte meno
significativa del dato viene letta
sempre allineata al registro MDR per
permettere il filling
Mancano nell’esempio
SH e SB (sempre unsigned)
che corrispondono a
attivazione degli specifici
WE delle memorie e
“traslatori” dei bytes del
registro MDR.
Come si realizzerebbero ?
STORE
Byte -> SB
Half Word –> SH
Word -> SW
Il contenuto di A come unsigned
MAR <- A +
(IR15)16
## IR15..0
LW
LOAD
Ready ?
SW
STORE
MDR <- M[MAR]
LBU
LBU
LB LB
C <-(MDR7)24 ## MDR7..0
LH LH
C <- (0)24 ## MDR7..0
LHU
LHU
C <- (MDR15)16 ## MDR15..0
C <-(0)16 ## MDR. 15..0
LW
C <- MDR
RD <- C
Ready ?
INIT
M[MAR] <-MDR
MDR <- B
28
Memoria
logica
Memoria
fisica
8
i
8
7
h
7
6
g
6
5
f
5
4
e
4
3
d
2
c
1
b
h
0
a
d
bit 31
24
BUS 3
23
2
l
i
g
1
f
e
c
0
b
a
BUS 2
16 15
BUS 1
8
7
BUS 0
0
Trasferimenti BYTE, HW
•  I trasferimenti di bytes sono SEMPRE considerati allineati
•  I trasferimenti di HW debbono avvenire a indirizzi multipli di 2
•  I trasferimenti di Word debbono sempre avvenire a indirizzi multipli di 4
•  In caso di disallineamento: fault
•  Nel caso di store di dati di dimensione inferiore alla word NON si ha estensione del segno
•  La lettura/scrittura di bytes e HW (a causa del reciproco disallineamento fra i registri e la
memoria) implica che fra i registri e la memoria siano interposti dei mux/demux (realizzati
con tristate)
Registro MDR
Come sono attivati i
WE delle memorie ?
Progettare la rete
Memoria
30
Trasferimento
“unsigned”
MDR
31
Trasferimenti BYTE, HW
24 23
16
0
“0”
Mux
Mux
Demux Demux
Solo in
lettura
Bit più signif.
byte precedenti
Memoria
I MUX 23-16 e 31-24 hanno come ingresso
anche il bit 7 del byte 7-0 della memoria (LB)
e il bit 15 del byte 15-8 della memoria (LH)
Ad esempio in una LB il MUX 7-0 si collega
direttamente alla memoria mentre i MUX
15-8, 23-16 e 31-24 si collegano al bit 7 del
MUX 7-0 proveniente dalla memoria. In una
SH a indirizzo multiplo di 2 e non di 4 il
DEMUX 7-0 dal MDR si collega alla
memoria 23-16 e il DEMUX 15-8 alla
memoria 31-24. Gli altri due bytes della
memoria rimangono invariati
31
Registro (formato R)
Esempi di
istruzioni
ALU
Lo stesso schema si può
usare per gli shift etc.
Temp <- (IR15)16 ## IR15..0
Temp <- B
Il contenuto dei registri come signed se op aritmetica
ADD
Duplicando i percorsi si
potrebbe risparmiare il
passaggio in TEMP
Immediato (formato I)
C <- A + Temp
SUB
C <- A - Temp
AND
C <- A and Temp
XOR
C <- A xor Temp
RD <- C
OR
C <- A or Temp
INIT
32
Controllo per
le istruzioni
di SET
(confronto)
ex. SLT R1,R2,R3
Registro (formato R)
Immediato (formato I)
Temp <- (IR15)16 ## IR15..0
Temp<- B
SLT
SEQ
A = Temp
SGE
A < Temp
A >= Temp
Il contenuto dei registri come signed
Duplicando i percorsi si
potrebbe risparmiare il
passaggio in TEMP
I micropassi sono eseguiti
in ALU ma il risultato
NON è memorizzato in
un registro: i flag sono
utilizzati dalla ALU per
impostare (almeno) il bit
0 del registro C
SNE
SGT
A! = Temp
YES
SLE
A > Temp
A <= Temp
Il risultato del test è un input
per il controller !
NO
C <- 1
C <- 0
RD <- C
INIT
33
Per il salvataggio in R31
JALR
Controllo per
le istruzioni
di JUMP
C <- PC
JAL
JR
C <- PC
JMP
JAL
JALR
Istruzione
formato I
PC <- A
(IR15)16 ## IR15..0
Istruzione
formato J
PC <- PC + (IR25)6 ## IR25..0
JAL
JALR
JR
R31 <- C
JMP
JALR JAL
INIT
34
Controllo per
le istruzioni
di BRANCH
Ex. BNEQZ R5, 100
Il controllo se 0 (o !=0)
è fatto sull’intero
registro A (a 32 bit) e
non solo sul bit meno
significativo
BRANCH
BEQZ
BNEZ
A=0
YES
A! = 0
NO
YES
NO
PC <- PC + (IR15)16 ## IR15..0
INIT
35
Numero di clock necessari per eseguire le
istruzioni
Istruzione
Load
Store
ALU
Set
Jump
Jump and link
Branch (taken)
Branch (not taken)
Cicli
Wait
6
5
5
6
3
5
4
3
2
2
1
1
1
1
1
1
n
CPI =
( CPI
∑
i=1
i
*
Totale
8
7
6
7
4
6
5
4
Ni
numero totale di istruzioni
)
Esempio su DLX
LOAD: 21%, STORE: 12%, ALU: 37%, SET: 6%, JUMP: 2%
BRANCH (taken): 12%, BRANCH (not-taken): 11%
CPI = 6.3
36
Controllo cablato (“hardwired”)
U.d.C.
Segnali di
controllo
228 righe
Rete combinatoria che
genera uscite e stato futuro
Datapath
40
2 6+11 3
Int e ready
Opcode +
OpCode Extension
Rs1, Rs2, Rd
6
Stato futuro
Stato presente
IR25..0
Flag
INSTRUCTION REGISTER (IR)
32 bit dalla
memoria
- Indici di Rs1, Rs2 e Rd provengono da IR
- IR25..0 sono portati ai bus S1 ed S2
del data path attraverso due buffer tristate
- U.d.C. genera anche i segnali di comando
37
per la memoria (MEMRD e MEMWR)
I passi dell’esecuzione delle istruzioni
Nel DLX l’esecuzione di tutte le istruzioni può essere scomposta in 5 passi,
ciascuno eseguito in uno o più cicli di clock.
Tali passi sono detti:
1) FETCH: l’istruzione viene prelevata dalla memoria e posta in IR.
2) DECODE: l’istruzione in IR viene decodificata e vengono prelevati gli
operandi sorgente dal Register File.
3) EXECUTE: elaborazione aritmetica o logica mediante la ALU.
4) MEMORY: accesso alla memoria e, nel caso di BRANCH aggiornamento
del PC (“branch completion”).
5) WRITE-BACK: scrittura sul Register File.
38
Le micro-operazioni eseguite
in ciascun passo
1) FETCH
MAR ß PC ;
IR ß M[MAR];
2) DECODE
Aß RS1, Bß RS2, PC ß PC+4
39
Le micro-operazioni eseguite
in ciascun passo
3) EXECUTE
MEMORIA:
MAR ß A + (IR15)16 ## IR15..0 ;
MDR ß B;
(utilizzano ALU, S1, S2, dest)
(NB: serve nelle Store ove RD=RS2
operazione non significativa nelle LOAD)
ALU:
C <- A op B (oppure A op (IR15)16 ## IR15..0) ;
C <- sign( A op B (oppure A op (IR15)16 ## IR15..0)); se SCn
BRANCH:
Temp ß PC + (IR15)16 ## IR15..0) ; (utilizza ALU, S1, S2, dest: qui non si sa
ancora se si deve saltare)
J e JAL
Temp ß PC + (IR25)6 ## IR25..0) ;
JR e JALR
Temp ß A;
40
40
Le micro-operazioni eseguite
in ciascun passo
4) MEMORY
Memoria:
MDR ß M[MAR]; (LOAD)
M[MAR] ß MDR;
(STORE)
BRANCH:
If (Cond)
PC ß Temp;
[A] è il registro che condiziona il salto (Cond) ;
JAL e JALR:
C ß PC;
41
Le micro-operazioni eseguite
in ciascun passo
5) WRITE-BACK
istruzioni diverse da J, JR, JAL, JALR
C
ß MDR; (se è una LOAD – due micropassi))
RD ß C ;
istruzioni J, JR, JAL, JALR
PC ß Temp;
RD ß C ;
42