1.
Introduzione
L’addizione di due numeri binari A e B può essere ottenuta per mezzo della relazione
Si = Ai
xor Bi xor Ci [ Somma ( Sum )]
Ci+1 = Gi or ( Pi and Ci ) [ Riporto (Carry) nel bit i+1 ]
dove
Pi = Ai xor Bi [ segnale di Propagazione ( Propagate ) ]
Gi = Ai and Bi [segnale di Generazione ( Generate ) ]
ed
i =
posizione del bit a partire da quello meno significativo dell’adder
(LSB)
In un semplice sommatore ripple carry il ritardo nel caso peggiore è proporzionale alla sua dimensione, perché se un riporto è generato nel LSB esso sarà propagato attraverso l’intera struttura.
Possiamo dividere il numero totale di bit in gruppi ed applicare le seguenti regole ad ogni gruppo:
· Se ogni Ai # Bi in un gruppo , allora non abbiamo bisogno di calcolare il nuovo valore di Ci+1 per il blocco; il carry-in del blocco può essere propagato direttamente al prossimo blocco.
· Se Ai = Bi = 1 per qualche i nel gruppo , è generato un riporto che può essere propagato fino all’uscita del gruppo.
· Se Ai = Bi = 0 , non sarà propagato un riporto dalla locazione del bit.
L’idea di base del carry-skip adder è di controllare se in ogni gruppo tutti gli Ai # Bi e permettere al carry-in del blocco di saltare (skip) il blocco quando si verifica questa situazione. In generale un ritardo di un block-skip, può essere differente dal ritardo introdotto dalla propagazione del riporto nella prossima posizione di bit.
Nel caso di un adder ad un solo livello di skip, dobbiamo generare per ogni gruppo un segnale Skip1 , che è semplicemente la logica and di tutti i Pi in quel blocco . Skip1 abiliterà la cella di skip a propagare il carry-in del gruppo direttamente all’ingresso del prossimo gruppo.
Skip1 = Pn
and Pn-1 and ….. and P1
n =
numero di bit nel gruppo
Il ritardo totale del sommatore, sarà dato dal caso peggiore del ritardo di propagazione del riporto più il ritardo di produzione dell’ultimo bit di somma ( Sum ).
Il problema, dato il ritardo dello skip e del ripple , è di trovare la dimensione del blocco che minimizza il ritardo nel caso peggiore. Il concetto può essere applicato ricorsivamente in un sommatore carry-skip ad n-livelli, allo scopo di ottenere un sommatore carry-skip ad (n-1)-livelli con le celle di skip controllate dai segnali:
Skip2
= Skip1n and Skip1n-1 and . . .
and Skip11
. . . and . and . . .
and .
. . .
and . and . .
. and .
Skipm
= Skipmn and
Skipmn-1 and . .
. and Skipm1
dove Skipij è
il j-esimo segnale al livello i
Sono stati scritti molti articoli sulla scelta dei gruppi di skip, ma tutti trattano il problema senza considerare alcuni importanti dettagli. Essi restringono la trattazione, a volte implicitamente, ad una particolare implementazione ed ad un caso di esempio , come quello di un carry-skip adder ad uno o due livelli. Nell articolo di Lehman e Burla la configurazione migliore è ricavata per gruppi di dimensione uguale; Majerski studiò anche il problema e Guyot, Hochet e Muller ridussero l’ottimale distribuzione del gruppo alla soluzione di un problema geometrico. Nell’ articolo di Oklobdzija e Barnes è descritto un metodo per determinare la divisione ottima di una catena di riporto. Sono anche descritti esempi per carry-skip ad uno e due livelli, ma i metodi non possono essere applicati se i ritardi delle differenti celle non soddisfano alcune limitazioni. L’algoritmo proposto qui supera le seguenti limitazioni dei metodi precedenti:
· Anche le distribuzioni asimmetriche possono essere generate. Alcuni degli articoli considerano solo distribuzioni simmetriche.
· È presa in considerazione la possibilità di avere un carry-in nel bit di ordine basso dell’adder, consentendo performance efficienti di due dei complementi aritmetici.
· Possono essere assegnati ritardi differenti alle celle di ripple ed alle celle di skip ad ogni livello di carry skip. Non ha importanza quale tecnologia consideriamo,il nodo alla fine di un blocco, dove si fondono due o più percorsi di riporto ,ha una capacità maggiore di quella dei nodi intermedi nella catena di riporto. Questo implica che il ritardo associato alle celle che pilotano questo nodo è maggiore in tecnologie come la CMOS ,dove le porte devono essere ridimensionate per ottimizzare le performance, o in tecnologie come l’ ECL,in cui la potenza deve essere incrementata a causa di differenti situazioni elettriche.
· Non c’è limitazione al numero di livelli di carry-skip. E’ possibile migliorare le prestazioni del sommatore usando tre o più livelli di skip. Per esempio in CMOS estendendo il numero di livelli di carry-skip a tre ed anche a quattro, ha bassi costi in termini di area e può abbassare il ritardo totale del sommatore del ritardo di una o due gates nel caso di un percorso dati a 32 bit. L’applicazione di questa metodologia all’ECL produce un sommatore che è non solo molto efficiente in termini di area di silicio e consumo di corrente, ma il ritardo totale può essere molto basso a comparabile a quello dei più complessi e costosi sommatori quali carry-look ahead ,conditional sum adder e Ling adder.
· Sono identificate le celle che propagano il riporto più veloce del necessario così da eliminare l’eccesso di velocità o tenerne conto durante il processo di ottimizzazione. Questo è molto utile in ECL, dove il ritardo di una porta è una funzione della potenza dissipata dalla porta stessa.
2. Caso peggiore nel ritardo del riporto
Definiamo l’ordine di un carry-skip adder come il numero di livelli del suo circuito di carry-skip ed un blocco come una qualsiasi distribuzione di bits dell’adder raggruppati assieme e bypassati da una cella di skip. Un blocco ha anche un ordine, che dipende dal livello del circuito di carry –skip connesso ad esso. Nell’esempio di Figura 1 il blocco che contiene i bits b3…b8 , ha ordine due, uguale al più alto livello di celle di skip collocate fra input ed oupot del blocco stesso.
In dipendenza degli operandi forniti, ci sono molti percorsi per il riporto con differenti ritardi di propagazione.Siamo interessati al più lungo ,in quanto rappresenta il caso peggiore nel ritardo di propagazione del sommatore. In generale il percorso del caso peggiore è composto da tre subpercorsi basilari:
· Un riporto è generato all’interno qualche blocco e propagato all’output del blocco stesso , in un tempo proporzionale alla dimensione del blocco stesso. Chiamiamo questo ritardo Dg.
· Dall’output del blocco in cui è stato generato, il riporto salta un certo numero di altri blocchi con un ritardo totale indicato con Ds.
·
Finalmente esso termina in un blocco dopo una
propagazione attraverso un certo numero di bits con un ritardo De, che è
proporzionale alla dimensione del blocco. Poiché siamo interessati al ritardo
nel caso peggiore , sarà considerato solamente il percorso più lento compiuto
dal riporto.
Il ritardo nel caso
peggiore totale Dt, sarà la
somma di tre Di:
Dt =
Dg + Ds + De
Nell’esempio di Figura 1 un possibile caso peggiore potrebbe essere:
b1 ®
b2 ®
b3 ®
s1 ®
b6 ®
b7 ®
b8
dove un riporto è generato in b1 e propagato fino a b8 attraverso celle di ripple ( bi ) e di skip (Si ).
Ma potrebbe anche essere:
b0 ®
S1 ®
b3 ®
S1 ®
b6 ®
b7 ® b8
se il ritardo di S1 è più alto della somma del ritardo di ripple attraverso b1 e b2.
Al
fine di progettare il sommatore ottimo,la giusta distribuzione dei blocchi così
come la loro sistemazione interna che minimizza questo tempo, deve essere
trovata per tutte le possibili
combinazione degli ingressi
Trovare un algoritmo che, dati il numero di bit dell’adder ed il ritardo associato a tutte le differenti celle, ottimizzi la distribuzione, è un problema hard . E un problema perfino più hard se vogliamo trascurare l’assunzione semplificativa che i ritardi in tutti i possibili percorsi del riporto sono uguali.
Il problema è semplificato se invece di fornire il numero di bit dell’adder e trovare la distribuzione ottima con il ritardo associato al riporto nel caso peggiore , forniamo il ritardo nel caso peggiore per il riporto e cerchiamo la distribuzione ottima per quel ritardo con l’associato numero totale di bit . Variando il ritardo fornito nel caso peggiore, l’algoritmo genererà le distribuzioni ottimali che saranno caratterizzate da un differente numero di bits. Sarà scelta quella con il numero totale di bit uguale o maggiore del valore richiesto dal progetto. Iniziamo questo processo con un ritardo minimo, che è quello richiesto per un gruppo singolo affinché operi correttamente all’assegnato livello di carry-skip,e procederemo fino a che sarà generata l’appropriata distribuzione.
In generale potremmo ottenere distribuzioni che non hanno necessariamente il numero usuale di bit che si incontrano negli adder ( 16 , 32, 64 etc. ), ma possono essere maggiori. Questo significa semplicemente che per un dato ritardo del riporto nel caso peggiore , il numero che otteniamo, rappresenta il numero massimo di bit che può fornire la distribuzione ottima generata . Possiamo eliminare alcune configurazioni di bit al fine di ottenere il numero desiderato senza influire sul ritardo nel caso peggiore. L’eliminazione può essere fatta in accordo con alcune semplici regole che saranno enunciate in seguito.
3. Osservazioni di base sull’algoritmo
L’idea di base consiste nell’assegnare ad ognuno dei blocchi dell’adder, una coppia di ritardi corrispondenti ad una generazione e ad una terminazione del riporto nel blocco. Il ritardo sarà funzione della posizione del blocco lungo il percorso del riporto. Ogni blocco, in accordo con le costrizioni imposte dai ritardi assegnati, conterrà un numero massimo di bits. La combinazione dei ritardi introdotti da tutti i blocchi sarà uguale al ritardo massimo di propagazione del riporto permesso dall’adder.
Partendo con un ritardo del riporto nel
caso peggiore assegnato per il sommatore,divideremo in intervalli di tempo in
relazione alla posizione del blocco lungo il percorso del riporto, e genereremo
la combinazione con il massimo numero di bit. Durante il processo di
generazione, che chiameremo espansione del blocco, il percorso per i bit che saranno raggruppati assieme, sarà una
funzione del livello di carry-skip assegnato al blocco,anche indicato come ordine
del blocco. Se stiamo considerando un blocco di ordine zero, possiamo generare il massimo numero
possibile di bit direttamente. Se l’ordine è maggiore ,possiamo considerare il
blocco come se fosse un sommatore
carry-skip di ordine più basso esso stesso e possiamo applicare
ricorsivamente la stessa procedura al blocco. Così, per un livello di
carry-skip dato , più alto del banale caso di zero,L’algoritmo genererà un
albero i cui nodi corrispondono ai blocchi ed i cui livelli corrispondono ai
livelli del carry-skip. Le foglie di quest’ albero saranno i bits dell’adder, e
le radici sono i blocchi generati dalla divisione del ritardo totale dell’adder
in intervalli di tempo durante la fase iniziale.La struttura ad albero
rispetterà la regola in base alla quale da un blocco genitore saranno generati
solo i discendenti più prolifici. Questi sono coloro che saranno abilitati a
generare il numero più grande di bit. Il percorso che connette le radici al
maggior numero di foglie formerà la distribuzione ottima finale.
Al fine di descrivere il funzionamento di un blocco introduciamo una coppia di ritardi ad esso associati. Il primo rappresenta il ritardo massimo consentito al riporto che è generato all’ interno del blocco ed è propagato fino all’uscita.
Il secondo rappresenta il ritardo massimo consentito al riporto che è stato generato in qualche blocco precedente e “muore” nel blocco considerato. Dal significato di questi due valori possiamo assegnare differenti costrizioni al blocco in dipendenza della sua posizione lungo il percorso del riporto. Mentre procediamo lungo il percorso del riporto attraverso i blocchi, il primo numero nella coppia dei ritardi i , sarà incrementato, poichè sarà calcolato più tempo nel caso di una generazione di riporto, mentre il secondo numero, j , sarà decrementato dello stesso ammontare, in quanto un riporto che entra nel blocco ha un ritardo che aumenta tanto più lo prendiamo vicino al carry-out del sommatore. Si vuole anche usare proficuamente il tempo speso nella generazione del segnale Skip di livello più alto usando questo tempo nei blocchi generatori ad un livello più basso dove i corrispondenti segnali di Skip sono pronti . Così la parte iniziale della lista dei blocchi includerà alcuni blocchi di livello più basso per tenere conto di questo fatto.
4. Algoritmo generale
L’algoritmo può essere diviso logicamente in due passi:
· Partizionamento ed assegnamento del ritardo. Partendo con il ritardo totale del riporto, l’insieme di costrizione al livello più alto sarà calcolato ed assegnato ai blocchi corrispondenti.
· Costruzione dell’albero. Sarà generato l’intero albero, partendo dalle costrizioni iniziali assegnate e procedendo verso il basso fino al livello più basso. Il percorso che connette i blocchi generati al passo precedente al numero di bit più grande possibile che può essere derivato dai blocchi stessi , definirà la struttura ottima.
4.1. Partizionamento ed assegnamento del
ritardo
Assumiamo in questa sezione e nel resto della trattazione che il riporto si propaga da sinistra verso destra: il bit più a sinistra è il LSB nell’adder. Il partizionamento e l’assegnamento dei ritardi per ogni blocco è un processo in due passi:
Primo passo: Ad ogni livello di carry-skip desiderato, la regola base che determina la generazione del blocco
consiste nel fatto che il ritardo associato con una generazione di riporto sarà lo stesso del ritardo
che avrebbe un riporto se salta quel blocco. Per il primo blocco la situazione è lievemente
differente, differente in quanto il segnale di Skip deve essere pronto prima di usare proficuamente il circuito
di skip. Il ritardo associato ai riporti che scompaiono nel blocco è semplicemente la differenza
fra il ritardo totale del riporto ed il ritardo all’uscita del blocco precedente.
Secondo passo: Nel secondo passo calcoleremo altre coppie di ritardi di livello decrescente, partendo dai ritardi
associati al primo blocco e generati nel primo passo,fino al minimo ritardo possibile per un
riporto generato in un singolo bit. Il valore i nella coppia di ritardi è calcolato aggiungendo il
massimo dei ritardi di Gi e Pi al ritardo della cella di skip a quel livello. La differenza rispetto
alle partizioni generate al primo passo consiste nel fatto che le nuove avranno un livello di
carry-skip più basso. Come detto precedentemente , il livello più basso è motivato dal fatto che il
corrispondente segnale di Skip è già pronto e può essere usato l’opportuno circuito di skip.
4.2 Costruzione dell’ albero
Sarà visitata la lista finale e su di essa si opererà in base al valore del livello di skip della partizione:
Se il livello di skip = 0 : Deve essere generato il giusto numero di bit che soddisfa i ritardi associati alla partizione.
Ciò può essere fatto una volta noti i ritardi per la propagazione e la generazione del riporto
a questo livello. Se il riporto scompare in questo blocco, il massimo numero di bit sarà
determinato dividendo il ritardo dato per il tempo di ripple del riporto ed aggiungendo uno.
Questo perché ,arrivato al circuito di skip, un riporto può propagarsi dal prossimo all’ultimo
bit, altrimenti sarebbe stato intrapreso il percorso di skip. Il ritardo associato ad una
generazione o “uccisione” (kill) di un riporto all’interno di un gruppo di bit è espresso da:
D < =
min ( di , dj )
dove
D =
massimo ritardo totale di gruppo per un riporto generato o “ucciso”
(Kill)
di = massimo ritardo quando un riporto è
generato nel blocco
dj = massimo ritardo per la propagazione di un
riporto nel blocco prima di essere “ucciso” (Kill)
Per esempio assumiamo che il ritardo associato ai segnali Pi e Gi è un unità di ritardo. Allora per la coppia {3 , 4 } possiamo generare due bit, in quanto in questo caso il primo numero nella coppia ,che è tre, è la costrizione più salda sul numero massimo di bit che soddisfa la relazione in alto. Infatti esso richiede:
1
( per Pi ) + 2 ( per rippling)
= 3 unità di ritardo
per la generazione di un riporto e per la sua trasmissione a cresta (rippling) attraverso due bit.Ora consideriamo la coppia di ritardi {4,2} e le stesse assunzioni sui ritardi. Allora entrambi i valori avrebbero limitato a tre il numero totale di bit che possono essere generati da questa partizione. Questo in quanto esso richiede:
1
( per Pi ) + 3 (rippling) = 4 unità di ritardo
per la generazione di un riporto nel primo bit e per la sua propagazione attraverso i 3 bits, ma solamente 2 unità per entrare nel blocco e propagarsi dal prossimo all ultimo bit.
Se il livello di skip >= 0 : Questo algoritmo può essere applicato ricorsivamente ad una nuova lista di partizioni un
un livello più in basso che è generata dalla coppia di ritardi data. Solamente la partizione che
genererà il più grande numero di bit sarà scelta come la migliore candidata. Con la lista
delle possibili partizioni sono associati ritardi che variano dal ritardo dato al minimo
ammontare possibile, che è il ritardo giusto relativo ad un bit. Durante questa valutazione,
i ritardi fra i blocchi successivi differiranno del ritardo di una cella di skip un livello in
basso. Per esempio, se assumiamo per semplicità che i ritardi di tutte le celle coinvolte a
a tutti i livelli sono uguali a una unità di ritardo, e partiamo con {4, 5} al livello 2 ,le
possibili
scelte saranno:
{2 , 5} {3 , 4} {4 , 3} Insieme di 3 elementi
{3 , 5} {4 , 4} Insieme di
2elementi
{4 , 5}
La partizione originale
Il valore 2 nel ritardo di generazione del riporto è stato stabilito considerando che il
ritardo associato con la propagazione del riporto giusto di un bit è:
ritardo di Pi + ritardo di
rippling = 1 + 1 = 2
Si può notare che i ritardi differiscono dalle precedenti partizioni di una unità, ma mentre i
ritardi corrispondenti alla generazione del riporto si incrementano, quelli che corrispondono
ad una conclusione del riporto nel blocco si decrementano.
L’insieme che contiene la coppia di ritardi che genererà il più grande numero di bit sarà
scelto come migliore candidato. Nel caso di due insiemi che generano lo stesso numero di
bit , ma differiscono nel numero di elementi, sono possibili varie strategie.
Nel programma sviluppato viene scelto l’insieme con il minore numero di elementi.
Ciò in quanto questa partizione genererà un numero di bit o gruppi di
bit più piccolo.Questo significa che il fan-in delle porte coinvolte nella generazione dei
segnali Skip sarà più basso.
Stampa dei gruppi Quando tutte le partizioni originali hanno generato l’intero albero il processo si ferma,e
l’intera struttura, specificando l’organizzazione dei bit di ogni livello, può essere stampata.
Questa è stata una descrizione generale dell’algoritmo, senza differenziazioni fra ritardi che provengono da partizioni in differenti posti e livelli lungo la lista dei possibili candidati. Nella situazione attuale, i ritardi che corrispondono ad un bit o a gruppi alla fine della lista , possono essere più alti per tenere conto della diversa situazione elettrica dove i differenti percorsi si fondono. Lo stesso discorso si applica ai ritardi delle celle di skip. Si può tenere conto di queste differenze senza cambiare il comportamento di base dell’ algoritmo.
Durante il processo di ricerca della distribuzione ottima con il numero totale di bit richiesto, si forniscono i ritardi del riporto nel caso peggiore incrementati con una generazione più ampia e distribuzioni finali più ampie.L’incremento che è sommato al ritardo nel caso peggiore ad ogni passo deve essere tale che il nuovo insieme di coppie di ritardo genererà distribuzioni con almeno un bit in più. Questo incremento , chiamato adder efficiency incremental delay, o AEID, è definito come Il minimo ritardo incrementale che ,se aggiunto ad ritardo di propagazione del riporto nel caso peggiore, genererebbe una nuova distribuzione con almeno un bit in più.
Un osservazione sull’efficienza di questo algoritmo e che si ha una complessità esponenziale nella costruzione dell’ albero in quanto è ottenuto mediante ricorsione. Tuttavia nei casi pratici fino a 5 o 6 livelli e 128 bit le prestazioni sono molto buone.
4.3. Un esempio
Come esempio consideriamo un adder carry-skip a due livelli e 32 bits, dove il ritardo di ripple del riporto, i ritardi dei segnali Gi e Pi, il ritardo della cella di skip ed i ritardi associati a tutti i segnali Skip sono tutti uguali ad un ritardo unitario. Visto che vogliamo realizzare un carry-skip adder a due livelli , dobbiamo generare i segnali Skip1 e Skip2.
Mostriamo ora una tabella che illustra i ritardi associati ad ogni segnale partendo dall’istante zero.
Segnali |
Ritardo totale |
Gi , Pi |
1 |
Skip1 |
2 |
Skip2 |
3 |
ed esso impiega una unità di ritardo per
saltare un blocco ad entrambi i livelli.
{ 4,
5, 2 } {5, 4, 2} {6, 3, 2 } {7, 2, 2} { 8, 1, 2}
Il valore 4 nella prima partizione rappresenta il ritardo che questo gruppo introdurrebbe nel caso fosse generato un riporto. Il valore 4 deriva dalla considerazione che esso impiega tre unità per generare un segnale Skip2, il quale abilita il primo blocco a saltare il riporto,più un’unità che è il ritardo per l’attuale salto del blocco. Il valore 5 nella prima tripla rappresenta il massimo ritardo permesso per riporti che terminano in questo blocco.Esso è calcolato considerando che il riporto provenendo dal blocco precedente, che farà parte della lista generata al secondo passo,deve avere un ritardo che differirà del ritardo introdotto da una cella di skip rispetto al valore 4, nell’esempio una unità. Questo perché noi vogliamo sempre i ritardi nei percorsi del carry-ripple e del carry-skip siano gli stessi per massimizzare il numero di bit per ogni partizione. Così se sottraiamo dal ritardo totale dell’adder 8, il valore generato dal blocco precedente, che è tre, otteniamo cinque unità.
Gli altri valori sono generati considerando che ad ogni passo lungo la lista, i è incrementato del ritardo di un carry skip a livello e j deve essere decrementato della stessa quantità, in quanto così come si procede lungo la lista, è aggiunta una cella di skip in più. Al secondo passo aggiungeremo nuove partizioni ad un livello più basso e la nuova lista sarà:
{ 2,
8, 0 } {3, 6, 1} {4, 5, 2 } {5, 4, 2} { 6, 3, 2} {7, 2, 2} { 8, 1, 2}
Il valore due nel primo blocco è il minimo ritardo di riporto generato assumendo che la dimensione minima del blocco è due. In questo caso il ritardo è uguale a due unità in quanto abbiamo un’unità di ritardo per Gi o Pi ed una unità di ritardo per la propagazione del riporto attraverso un bit. Il ritardo massimo per la scomparsa del riporto (carry kill delay) è uguale al ritardo di propagazione nel caso peggiore che è stato fornito.
Nel secondo blocco, i è uguale a tre unità e j è calcolato sottraendo il massimo ritardo all’uscita del blocco precedente dal ritardo totale di riporto, che è:
8 -
2 = 6 unità e
k = 1
Ora dobbiamo visitare ogni gruppo della lista e per tutti e due calcolare il massimo numero di bit, oppure generare una nuova lista di ritardi per un livello di partizione più basso ed applicare l’algoritmo ricorsivamente. Per il primo gruppo non c’è scelte in quanto possiamo solo generare un bit singolo. Per la seconda partizione , possiamo avere due possibilità:
1 2 oppure 2
che rappresentano due gruppi di uno e due bits rispettivamente con una cella skip ad un livello bypassando ogni gruppo , oppure un singolo gruppo di due bit senza circuito di bypass. Chiaramente la prima scelta genera più bits e perciò sarà selezionata come la migliore candidata. Lo stesso criterio può essere applicato al resto della lista e la tabella in Figura 3 mostra l’espansione di due dei gruppi della lista. Ogni riga indica l’insieme che può essere generato partendo dalla partizione data al livello più alto fino al livello zero. Il gruppo che genera il numero maggiore di bits sarà scelto.
La migliore distribuzione che soddisfa i requisiti con 34 bits è mostrata in Figura 2.
In questo esempio ci sono alcune osservazioni da fare:
· Il numero totale di bits eccede di due bit rispetto alle dimensioni richieste dell’adder. L’individuazione dei bits da eliminare,può essere basata sulla facilità di implementazione,così come l’abbassamento del massimo fan-in delle porte o l’abbassamento del livello del carry-skip in alcuni blocchi. Nel nostro esempio il massimo fan-in è tre e non cambierà a causa dell’eliminazione di soli due bits ,in quanto ci sono sei gruppi di tre bits. Se l’ultimo bit nell’ultimo gruppo viene eliminato tuttavia,possiamo eliminare un carry bypass a due livelli. La posizione per l’eliminazione del secondo bit è arbitraria. Nell’esempio è stato scelto l’ultimo bit nelle vicinanze dell’ultimo gruppo. Così in Figura 4 è mostrata una possibile distribuzione a 32 bit.
· L’eliminazione di qualche bit non cambia il ritardo di propagazione del riporto nel caso peggiore a meno che l’eliminazione non abbassa entrambi i ritardi associati al blocco di cui i bit sono membri. Come sarà chiarito nella prossima sezione se nell’algoritmo è incluso un test sul numero totale di bit generati ed ad ogni passo il giusto AEID è fornito sempre, per costruzione la precedente distribuzione generata deve avere avuto un numero di bit più piccolo di quello richiesto.Nel nostro esempio ciò può essere facilmente provato dal fatto che l’AEID è costante ad ogni passo ed è uguale al ritardo di una cella di skip al livello più alto, 1 unità nel nostro caso.
Livello |
Partizione |
Partizione |
2 |
{4,
5, 2} |
{5,
4, 2} |
1 |
{ 2, 5, 1 } {3, 4, 1} {4, 3, 1 } { 3, 5, 1 } {4, 4, 1} {4, 5, 1} |
{ 2, 4, 1 } {3, 3, 1} {4, 2, 1 } {5, 1, 1 } { 3, 4, 1 } {4, 3, 1} {4, 4, 1 } {4, 4, 1} {5, 3, 1 } {5, 4, 1 } |
0 |
( 1 2
3 ) ® 6 bits ( 2 3 ) ® 5 bits ( 3 ) ® 3 bits |
( 2 3
2 1 ) ® 8 bits ( 3
3 2 ) ® 8 bits ( 4
3 ) ® 7 bits ( 4 ) ® 4 bits |
I gruppi ( 1
2 3 ) e (
3 3 2 ) saranno scelti
Figura 3 : espansione di 2 partizioni
La Figura 5 mostra un altro esempio un carry-skip adder a 4 livelli e 56 bits con le stesse assunzioni circa il ritardo delle celle come nell’esempio a 32bit. Nel diagramma è mostrato che il ritardo del riporto nel caso peggiore è il ritardo di 8 gate come nell’esempio precedente.
Migliorie: AEID e controllo del ritardo di
ogni bit
Come è stato definito nella sezione 2, l’AEID è il minimo ritardo di cui deve essere incrementato il ritardo di propagazione del riporto nel caso peggiore , al fine di generare una nuova distribuzione con almeno un bit in più.
Questo garantisce che nel processo di determinare la distribuzione con il giusto numero di bit, ci sarà una perfetta coincidenza fra il numero di bit ed il ritardo di propagazione del riporto nel caso peggiore che questi generano e non sarà sprecato tempo in qualche bit o in gruppi di bit. The AEID è implementato in modo molto semplice. Ogni volta che si genera un blocco, confrontiamo il ritardo che questo blocco sta attualmente generando con i limiti definiti dalla coppia di ritardi. La differenza è comparata con l’AEID precedente e salvata se è minore. Inoltre la differenza fra il ritardo attuale ed il massimo consentito per la configurazione, può essere salvato con il nodo rappresentante la partizione. In questo modo possiamo tenere traccia delle prestazioni in eccesso di alcuni bit e correggere la velocità delle celle coinvolte diminuendo la potenza nel caso di una implementazione in logica ECL , oppure ridimensionando le porte nel percorso nel caso di un progetto a CMOS.