COSTRUZIONE DI UNA
ARITHMETIC LOGIC UNIT (ALU)
(V. PHRV1, APPENDICE A.5)
Roberto Giorgi, Università di Siena, C122L03, Slide 1
Full Adder a 1 bit
a Sum
b
CarryIn
sum = a Å b Å CarryIn = a Å (b Å CarryIn )
CarryOut = a × b + a × CarryIn + b × CarryIn CarryOut
Roberto Giorgi, Università di Siena, C122L03, Slide 2
Realizzazione di ALU a 1-bit
• AND e OR
Roberto Giorgi, Università di Siena, C122L03, Slide 3
Semplice ALU a 1-bit
Operation
CarryIn 2 ALU a 1-bit
Operation
a 2
0 a CarryIn
Result
b
1 Result CarryOut
b 2
CarryOut
Operation Function
0 AND
1 OR
2 ADD
Roberto Giorgi, Università di Siena, C122L03, Slide 4
Costruire una ALU a 64 bit
2
2
da 1 a 64 bit
Un sommatore costruito in questo modo e’ chiamato
“sommatore con riporto seriale”
Problema:
il risultato e’ disponibile solo dopo che ALU63
ha ricevuto il carry
Altre implementazioni “con riporto parallelo” o “Carry Look Ahead”
superano questo problema (v. Lezione-06 e PHRV1 appendice A.6)
Roberto Giorgi, Università di Siena, C122L03, Slide 5
Supporto per la sottrazione (a – b)
• Approccio: fare a + (-b)
• Usare la rappresentazione in complemento a due
semplifica la logica necessaria per fare la negazione: -b = ~b+1
(inverto il bit e sommo 1)
1
Binvert Operation
CarryIn 2
a
0
1
Result
b 0 2
CarryOut
Roberto Giorgi, Università di Siena, C122L03, Slide 6
(inverto tutti i bit e poi sommo 1)
(*) numero senza segno traslato di 2N-1 (es 1101-> 101=5 –> 5-8=-3)
Roberto Giorgi, Università di Siena, C122L03, Slide 7
Roberto Giorgi, Università di Siena, C122L03, Slide 8
Roberto Giorgi, Università di Siena, C122L03, Slide 9
Roberto Giorgi, Università di Siena, C122L03, Slide 10
Roberto Giorgi, Università di Siena, C122L03, Slide 11
Roberto Giorgi, Università di Siena, C122L03, Slide 12
Supporto per la slt e per il test di uguaglianza
• Funzione set-on-less-than (slt)
• Se a < b produce 1, altrimenti 0
• Idea: usare la sottrazione
(a-b) < 0 implica a < b
• Per vedere se (a-b) e’ negativo basta che verifico se il bit piu’ significativo vale 1
Supporto per il test di uguaglianza
• Ci servira’ per supportare le condizioni degli statement if/while/for
per decidere se devo eseguire quanto segue o «saltare» a un altro pezzo di codice
• Se a == b allora produco 1, altrimenti 0
• Idea: usare nuovamente la sottrazione
(a - b) = 0 implica a = b
à In entrambi i casi si puo’ si puo’ sfruttare la rete per fare la sottrazione
Roberto Giorgi, Università di Siena, C122L03, Slide 13
B in v e r t O p e r a tio n
2
Supporto alla slt nella ALU
C a r r y In
a
0
• Inserisco il caso “3” al multiplexer,
corrispondente a slt 1
• Nelle ALU 0,1, ..., N-1 R e s u lt
questo ingresso e’ collegato
b 0 2
a un filo “Less” che costituisce 1
un “bypass” ingresso-uscita L ess 3
ALU 0
• Nella ALU N-1 inoltre • C a r ryO u t
(bit piu’ significativo), • B in v e r t O p e r a tio n
controllo il valore di uscita ‘set’ • C a r ryIn 2
che indica come e’ andato
l’esito del confronto a<b a
0
ALU N-1
R e s u lt
• Mentre per gli interi in complemento a b 0 2
due e’ semplice sapere quando il
risultato e’ negativo (segnale ‘set’), in
1
generale per rivelare l’overflow L e ss 3
ho bisogno di una rete logica Set
un poco piu’ complessa ([Link] finale)
O v e rf lo w
O v e r flo w
d e te c tio n
Roberto Giorgi, Università di Siena, C122L03, Slide 14
Supporto alla slt fuori dalla ALU
Binvert O peration
• Se il confronto ha esito positivo 2
il filo less, manda sul bit meno
significativo il risultato (1) a0
b0
C arryIn
ALU0 R esult0
Less
CarryO ut
• Aggiustiamo il CarryIn0: a1
b1
C arryIn
ALU1 R esult1
0 Less
CarryO ut
Operation Function CarryIn0 BInvert
0 AND 0 0
a2 C arryIn
1 OR 0 0 b2 ALU2 R esult2
0 Less
2 ADD 0 0 CarryO ut
2 SUB 1 1
3 SLT 1 1
CarryIn
a63 C arryIn R esult63
b63 ALU 63 S et
à CarryIn0 = BInvert 0 Less O verflow
Roberto Giorgi, Università di Siena, C122L03, Slide 15
Test per l’uguaglianza (eq)
• La rete fornisce
Binvert Operation
il valore 1 quando
tutti i bit del risultato a0 CarryIn Result0
sono a zero, in quanto:
b0 ALU0
Less
(a-b)==0 --> a==b CarryOut
• Chiameremo tale
segnale “Zero” e ci serve
a1 CarryIn Result1
b1 ALU1
per decidere se l’esito del 0 Less
Zero
confronto e’ positivo o
CarryOut
meno
a2 CarryIn Result2
b2 ALU2
0 Less
CarryOut
Result63
a63 CarryIn
b63 ALU31 Set
0 Less Overflow
•Nota: “Zero” vale 1
quando il risultato e’ zero!
Roberto Giorgi, Università di Siena, C122L03, Slide 16
ALUcontrol
• Aggiungiamo quindi la funzione «EQ» che sfrutta la sottrazione
e produce un ulteriore filo di uscita dalla ALU («Zero»)
• I fili di ingresso {Operation,Binvert} possono essere raggruppati
nei fili chiamati «ALUcontrol» come mostrato in tabella
Operation Function BInvert ALUcontrol Function
0 AND 0 Binvert à ALUcontrol2 0 00 AND
Operation1 à ALUcontrol1 0 01 OR
1 OR 0
Operation0 à ALUcontrol0
2 ADD 0 0 10 ADD
2 SUB 1 1 10 SUB
3 SLT 1 1 11 SLT
2 EQ 1 1 10 EQ
Roberto Giorgi, Università di Siena, C122L03, Slide 17
Blocco “ALU a 64-bit” – situazione finale
Binvert Operation
ALUcontrol
3
a0 CarryIn Result0 64
b0 ALU0
Less a
CarryOut
Zero
64
ALU ALU Result
a1 CarryIn Result1 64
b1 ALU1 Overflow
0 Less b
CarryOut Zero
CarryOut
Result
a2 CarryIn Result2
b2 ALU2
0 Less
CarryOut
Result63
a63 CarryIn
b63 ALU63 Set
0 Less Overflow
CarryOut
Overflow lo possiamo dare
Roberto Giorgi, Università di Siena, C122L03, Slide 18 per implicito nel blocco ALU
Rete di Overflow
• Nella somma o differenza di due interi con segno
in complemento a due, ho OVERFLOW se:
• I due operandi hanno lo stesso segno MA il risultato ha segno opposto
a31 b31 Result31
Binvert Cout31
a31 b31 Result31
Binvert Cout31
Overflow
O v e rf lo w Overflow
d e te c tio n
• Le istruzioni add, addi, sub causano overflow:
pero’ l’approccio RISC-V e’ di lasciare al software questa verifica
Roberto Giorgi, Università di Siena, C122L03, Slide 19