Che materia stai cercando?

Anteprima

ESTRATTO DOCUMENTO

Abbiamo già richiamato in passato il metodo delle

costanti di tempo. Noi abbiamo ora un sistema in

cui ci sono delle resistenze che collegano i vari

nodi e delle capacità verso massa che assumiamo

all’inizio tutte cariche a Vdd. Supponiamo di avere

un solo ingresso che commuta da 1 a 0. A regime,

tutte le capacità andranno a 0. Ma con quale

legge? E come posso approssimare la dinamica

completa con una sola costante di tempo?

Per trovare la risposta usiamo la tecnica Elmore

Delay.

Valutiamo la dinamica di questo sistema. Introduciamo le correnti nei condensatori. Vediamo poi le

tensioni sui nodi considerando che l’ingresso ha già effettuato la commutazione da 1 a 0.

Applichiamo il principio della sovrapposizione e calcoliamo il potenziale V3.

Considero solo la I1 eliminando le altre capacità: la I1 va

solo in R1 e in R3 non circola nulla quindi V3=V1=R1*I1.

Facendo discorsi analoghi per le altre correnti e

ottiene l’espressione:

sommando i vari contributi si

che può essere riscritta in termini delle R :

kj

Per calcolare una generica R effettuo la seguente procedura:

kj

Elimino i condensatori

Sostituisco il generatore di ingresso con un cortocircuito

Considerano i due cammini: (dal nodo k a massa); (dal

nodo j a massa)

La Rkj è la somma delle resistenze comuni a i due

cammini.

Ovviamente queste resistenze sono simmetriche rispetto ai pedici

k e j.

Abbiamo quindi:

L’espressione di V è un sistema di equazioni differenziali, esatto, ottenuto senza approssimazioni.

j

C’è una matrice di RC, ovvero di costanti di tempo. Noi cerchiamo una soluzione approssimata che

per definiziona dà luogo ad un errore ma che mi permette di esprimere la dinamica in funzione di

una sola costante di tempo. L’approssimazione è sulle derivate, ovvero assumiamo che le derivate

delle tensioni sui nodi sono proporzionali:

le costanti alfa sono incognite. Se applichiamo questa ipotesi, la Vj scritta prima diventa:

Con questa approssimazione la tensione sul nodo j non dipende dalla tensione degli altri nodi e

dipende da una sola costante di tempo. Queste costanti alfa le otteniamo cercando di minimizzare

l’errore: Q. α

Come otteniamo le costanti ?

kj

Valuto l’errore che mi da l’approssimazione che ho appena fatto per ottenere l’equazione

approssimata di V .

j

L’errore è ovviamente la differenza della formula esatta e di quella approssimata.

Quest’errore è funzione del tempo, io voglio renderlo piccolo e allora rendo piccolo quello medio

l’errore mediamente

ovvero si sceglieranno delle costanti in modo tale che sarà nullo:

α in modo tale da annullare l’errore medio. Svolgiamo l’integrale.

Quindi dobbiamo scegliere le kj

Vj e Vk a 0 e all’infinito è semplice calcolarli: all’infinito tutti i nodi si sono scaricati quindi Vj e Vk

all’infinito valgono 0. All’istante 0 invece valgono proprio Vdd. Impongo la seconda parentesi tonda

pari a 0 così da avere errore medio nullo.

α

Questa cosa si fa imponendo =1 poiché Vj(0) e Vk(0) sono Vdd.

kj

Quindi E si annulla per:

mean α =1

kj

e otteniamo:

In definitiva questa tecnica ci dice che la dinamica è retta da un sistema di equazioni differenziali

del primo ordine. Questa dinamica si approssima con una singola costante di tempo calcolabile

con l’espressione L’errore medio così facendo sarà nullo e abbiamo

appena scritta. visto come si

calcolano queste Rkj.

Per calcolare la costante di tempo si considera

una generica capacità e la si moltiplica per la

resistenza Rkj che è quella comune ai due

cammini. Si sommano i contributi e si ottiene la

costante di tempo equivalente.

Vediamo qualche esempio di Elmore Delay.

Caso idealizzato in cui una linea è pilotata da un generatore ideale di tensione

ed è aperta all’altro estremo. ΔL

Presa una linea, la si può scomporre in tanti caratterizzata da una R e una

capacità verso massa a SX e a DX, ovvero abbiamo una linea a parametri

distribuiti (R e C per unità di lunghezza). Il caso più semplice è quello in cui la

linea è pilotata a sinistra da un dispositivo attivo. Il ritardo è in questo caso intrinseco. Nel caso

ideale inoltre consideriamo che la R del generatore tenda a 0 e che la C del carico finale della linea

tenda ad infinito. ΔL,

Decomponiamo la linea in tanti pezzettini ognuno caratterizzato da c e r che sono resistenza e

capacità per unità di lunghezza. Ovviamente, più è fitta la discretizzazione più ci si avvicina al caso

reale. Per valutare questo ritardo utilizziamo la tecnica

Elmore Delay: inizialmente le capacità sono tutte

allo stesso valore, e poi sono tutte C verso massa.

Ricordando che la costante di tempo equivalente è

pari alla sommatoria di: RkjCk, dobbiamo

considerare tutte le capacità.

Partiamo dall’ultima capacità e valutiamo i due cammini: quello che unisce il nodo di uscita con

verso massa (nota che la massa si trova dove c’è Vin). Partendo

massa e il nodo della capacità

dall’ultima, la C è CΔL ΔL

e i due cammini sono identici: la R da considerare è n*r con n=numero

di pezzettini.

Consideriamo ora la capacità n-1 esima (nel disegno non è riportata): le capacità hanno tutte lo

stesso valore quindi la C è uguale al caso di prima, per valutare la R poi devo considerare i due

cammini: il primo che porta questo nodo a massa e l’altro che collega l’uscita verso massa. La R

ΔL.

comune è pari a (n-1)*r Questo discorso si ripete per tutte le capacità distribuite presenti nel

circuito e la sommatoria di questi contributi restituisce la costante di tempo.

costante di tempo equivalente relativa all’uscita. Si noti poi che n è molto

Questa è ovviamente la

maggiore di 1, quindi si può scrivere come ΔL

dove ncΔL è la capacità totale della linea e nr è la resistenza totale della linea. Quindi, la

costante di tempo è sostanzialmente il 50% di RC della linea! È ovviamente un termine

approssimato

Si può quindi riportare la nostra linea ad un modello equivalente come in

figura.

Questo modello è a T ed è simmetrico tra ingresso e uscita.

E si ottiene una costante di tempo pari a: dell’uscita rispetto

Si faccia attenzione che questo modello semplificato vale per la dinamica

all’ingresso: se invece volessimo sapere il ritardo a metà della linea piuttosto che alla fine della

linea, dovremmo riapplicare tutto il discorso fatto per ottenere questa t. In dettaglio, bisogna

considerare sia l’effetto delle capacità che stanno a sinistra sia quelle che stanno a destra. Tutte le

capacità che stanno a destra dell’uscita considerata, hanno in comune con l’uscita solo le R che

stanno a sinistra dell’uscita, quindi il contributo alla tau che danno è pari a CΔLRt/2, e saranno

n/2 termini. Per le capacità che si trovano a sinistra dell’uscita invece, si ha che il contributo totale

viene ½*Rt/2*Ct/2. Questo ovviamente è sempre frutto di una tecnica approssimata:

l’approssimazione più evidente la si vede (in questo caso) nei termini che si trovano a destra

dell’uscita considerata che vengono riportate in uscita 1 a 1.

Consideriamo come questo ritardo dipende dalle caratteristiche fisiche della nostra linea: la linea

2 2

ρ ρ

ha una resistenza di strato e una corrispondente resistenza totale pari a *L/W. Avrà poi una

capacità data dalla capacità perimetrale e da quella col substrato.

da cui si ottiene: ultimo passaggio in parentesi (tranne l’1) si ha l’aumento della capacità dovuto

Nell’ultima formula,

alla capacità perimetrale.

Risultati: la costante di tempo va col quadrato della lunghezza, questo perché la sia la resistenza

che la capacità raddoppiano con la L. Una cosa meno ovvia è che questo ritardo cresce al

decrescere di W: questo è dovuto alla capacità perimetrale, se questa non ci fosse il ritardo

sarebbe indipendente da W (perché la C si dimezza e la R si raddoppia quindi gli effetti si

compenserebbero). Si tenga presente che questo risultato è un ritardo intrinseco ovvero calcolato

in assenza di carico! Nessuna linea si troverà mai in questa situazione.

Analizziamo un altro caso. Questo caso è quello più realistico, ovvero si ha una porta logica

che pilota una linea e un fan out, rappresentato da un invertitore.

Ora si può analizzare il tutto molto facilmente: al posto del driver

si mette la sua resistenza equivalente Rn, poi la linea si

schematizza col modello a T, poi il carico che si schematizza

come una capacità. La seconda figura rappresenta quindi il

circuito equivalente per la determinazione del ritardo, della tau

equivalente. Questo modello ovviamente è valido per calcolare il

ritardo dal driver fino al carico (dove c’è scritto Vout). Calcoliamo

di tempo dell’uscita: la C

la costante vede come resistenza la

G

, poi c’è il contributo della Ct che vede la

somma di Rn e 2 R t/2

serie delle sole prime due resistenze. Si può quindi stimare il

ritardo in maniera abbastanza finale.

tau che si avrebbe senza l’interconnessione

Se si normalizza rispetto alla (RnCg) si ha

l’espressione:

Quindi, in definitiva il ritardo è “quello che si avrebbe senza l’interconnessione più qualcos’altro che

dipende dall’interconnessione e dai suoi parametri”.

Vediamo quali sono i casi possibili:

Nel modello di ordine 0 trascuriamo l’interconnessione: ciò si può

fare quando i termini in parentesi sono minori dell’unità: Ct<<Cg e l’effetto

Rt<<Rn ovvero se la capacità e la resistenza della linea sono molto minori del carico,

della linea è trascurabile.

Modello di ordine 1: Spesso queste due condizioni non sono

verificate, in particolare la condizione sulle capacità. Quella sulle

resistenze invece si verifica. Se è vero ciò, possiamo trascurare il

terzo e il quarto termine in parentesi. Quindi la tau equivalente si scriverà come:

In sostanza la mia linea diventa una capacità.

Modello di ordine 2: in questo caso non si possono

trascurare nemmeno i termini resistivi, quindi va portato in

modello per l’interconnessione con R e C.

conto un

Avremo quindi un espressione della costante di tempo pari a:

Nella stragrande maggioranza dei casi comunque va bene il modello di ordine 1, non è però

sempre così.

Ripetitori

Abbiamo visto che il ritardo intrinseco tende a crescere col quadrato della lunghezza. Questa

tecnica riduce il ritardo spezzando la linea (per esempio a metà) ed introducendo nel centro un

invertitore che prende il nome di repeater. Questa tecnica si utilizza nel caso di linee

estremamente lunghe.

Calcoliamo il ritardo che si ottiene con una linea in metal1 estremamente lunga (1.2cm). Si hanno

4

10 quadrati con una resistenza di 1Kohm. La capacità diventa in questo caso di 1.39pF.

Supponiamo che il driver abbia una resistenza di 100 ohm e che ci sia una capacità di fF. In

queste condizioni, la tau viene estremamente elevata.

Vediamo la prima soluzione: Primo approccio: divido la linea a metà e ci metto l’invertitore in

mezzo. In questo caso ognuna delle due linee darà luogo ad

un ritardo pari alla metà di prima ma l’invertitore a sua volta

introduce un ritardo pari al suo ritardo di propagazione.

Vediamo se questo ritardo introdotto è comunque minore del caso precedente.

Si vede che c’è un 2 davanti a tutto perché sono 2 stadi uguali e c’è un fratto2 perché le capacità

sono pari alla metà. Il ritardo è inferiore a prima.

Suddividendo la linea invece in K parti uguali si ha questa nuova formula. In parentesi c’è un

termine che cresce con K (perché introduco

K invertitori) e un termine che decresce con

K (perché spezzo la linea).

Per capire quale K sia meglio fissare, faccio la derivata.

La K ottima calcolata, sostituita nella formula del ritardo, restituisce il ritardo minimo. Si noti che

all’ottimo i due contributi in parentesi si eguagliano.

Nel caso che stavamo osservando, con K pari a 19 il ritardo passa da 856ps (senza repeaters) a

234ps. Si noti che la gran parte del vantaggio si ha già dividendo poche volte la linea, non c’è

bisogno di arrivare a 19 (bastano 2-3-4).

Osservazioni

La costante di tempo trovata è:

In generale bisogna:

Utilizzare il modello più semplice possibile, compatibilmente con la precisione richiesta

Le C hanno un ruolo fondamentale e non possono quasi mai essere trascurate

Le R entrano in gioco quando sono di valore confrontabile con quella del driver

(interconnessioni globali)

Caso particolare: distribuzione del clock: le R sono FONDAMENTALI (un ritardo sul clock,

che sincronizza il funzionamento del sistema, può causare errori di timing)

Per la distribuzione del clock, anche un piccolo ritardo lungo la linea ci può dare fastidio.

Distribuzione delle Alimentazioni

Le alimentazioni vengono distribuite mediante una interconnessione. Per questa abbiamo dei

problemi diversi, non ci sono ritardi di commutazione.

In generale, il problema che si ha se c’è rumore (o

dei disturbi in generale) è questo: sul circuito a

sinistra supponiamo ci sia esattamente la Vdd e la

massa. A destra c’è una porta logica collegata alla

Vdd con delle interconnessioni schematizzate con

delle resistenze, ma non è detto che siano

resistenze. Nelle interconnessioni ci sarà una

certa corrente che sarà tutt’altro che costante. In

prima approssimazione, la corrente nella R

provoca una caduta e quindi l’invertitore di destra vede una tensione massima pari a Vdd-DeltaV

quindi l’escursione di questo invertitore va da Vdd-deltaV

mentre la tensione minima sarà deltaV a

deltaV e può succedere che si va a finire nella regione proibita! Il caso critico è quello in cui la

porta di destra pilota un circuito dinamico: se il deltaV è superiore alla soglia, accende il mos e

scarica la C.

Questa distribuzione è strettamente legata a come è organizzato un chip.

Un chip è suddiviso in aree: la parte periferica esterna è dedicata ai terminali di ingresso è uscita.

Questi terminali alcuni sono collegati

all’alimentazione, altri includono i buffer che

pilotano l’uscita o gli stadi di ingresso che

prendono il segnale dall’esterno e lo inviano

L’area

al nucleo elaborativo (core).

complessiva del chip è spesso limitata dal

numero di pad per cui l’area finisce per

essere limitata dal fatto che ci sono molti

pad. In altri casi (foto di destra) l’area è limitata dal core.

I problemi che si hanno sulle alimentazioni è la cosiddetta migrazione metallica o

elettromigrazione. In foto c’è una pista che si è rotta per via di questo effetto. Se la J è troppo forte

(J=densità di corrente), col passare del tempo i grani metallici si allontanano dalle zone strette e la

sezione tende a ridursi ancora di più, la J

aumenta ancora e così via fino a quando la

pista metallica non si apre. Nel caso delle

linee dell’alimentazione, la corrente non è

costante. Allora consideriamo il suo valore

2

f. L’unico

medio e la potenza è C*Vcc

parametro che abbiamo è la W: il costruttore

ci dice che la nostra linea sarà esente da

questo effetto se la densità di corrente è

sufficientemente bassa (1 mA/um), ovvero

se per esempio hai una interconnessione

larga W=1um, non si rompe se ci fai passare max 1mA . Ora, se P=VccI, I=P/Vcc da cui ricavo W.

Facciamo un esempio: P=1W, Vdd=1V, I=1A. La W sarà = 1000um. È una W abbastanza grande.

Si noti che le tecnologie attuali lavorano a basse tensioni di alimentazione e se le potenze in gioco

sono pressoché costanti, la corrente tende ad aumentare e quindi le W devono essere grandi.

che deve circolare nell’interconnessione, il ΔV

Se conosciamo la R della linea e la I lo conosciamo

ΔV

immediatamente come R*I. Fortunatamente, facendo le linee grandi la R è piccola e il è

accettabile. In questo esempio si ha che la zona critica è al centro, ovvero nella zona più lontana

dal bordo e cioè dove la linea ha lunghezza maggiore. In generale, la caduta resistiva non è un

grosso problema.

I grossi problemi nascono dalle L in serie alle alimentazioni. Queste L ci

danno fastidio perché la caduata va con la derivata della corrente,

quindi anche se il valore della I non è molto grosso ma questa varia

velocemente, si hanno effetti pesanti. Dove sono queste L? Se

rimaniamo sul silicio, le L sono trascurabili. Quelle che danno fastidio

nascono quando colleghiamo il chip col

package. di package DIL, l’induttanza

Nel caso

sta nella bonding wire, ovvero nelle

linee di collegamento che si fanno per

collegare il chip con l’esterno! Inoltre

queste L variano al variare della

lunghezza di questo filo.

Ci sono altri package che cercano di

ridurre questo effetto ma ci sono comunque problemi. Ci sono tecniche più efficienti che sono state

sviluppate per ridurre questi effetti! Non si riescono ad azzerare gli effetti induttivi.

Vediamo come queste L determinano dei disturbi: considerando il circuito a) , carichiamo la

l’induttanza. Avremo

capacità attraverso

ΔV,

un disturbo stimiamolo (in via del

tutto approssimata). Ipotizziamo che la

tensione di uscita abbia una forma

predeterminata, ovvero rappresentabile

mediante due archi di parabola.

L’approssimazione è arbitraria e ci

semplifica i calcoli. In questa

approssimazione entra in gioco il

parametro tr necessario per effettuare la

transizione completa. Nel primo intervallo

e nel secondo intervallo la Vo(t) sarà

come in slide. Ovviamente, sono scritte

così perché vogliamo che al termine del

transitorio la tensione di uscita raggiunga

la V di alimentazione. Il parametro a si

sceglie facendo in modo che le due funzioni nel punto tr/2 siano uguali..

Una volta scritta la tensione di uscita, si può scrivere la corrente che è quella che carica la capacità

ovvero: vedi slide. Si può calcolare anche il valore massimo, ovvero il valore di picco. Si può quindi

calcolare il valore della tensione V . Il nostro invertitore vedrà Vdd-ΔV. In pratica si osservano una

L

serie di oscillazioni e non soltanto il disturbo rettangolare come mostrato nella terza immagine

sopra.

Nella fase in cui l’uscita va dal livello alto al livello basso si avrà una scarica verso massa e il

disturbo sarà quindi sul terminale di massa. Prima era su quello di Vdd, entrambi i terminali allora

l’entità di questi disturbi.

saranno affetti di questo rimbalzo. Vediamo

La capacità considerata è molto grande per i circuiti integrati, sarà per esempio una capacità di

uscita. La formula restituisce un disturbo di 0.2V, circa il 10% della Vdd. Questo valore può essere

assorbito sicuramente dai margini di rumore dei nostri circuiti digitali. Se però commutano 8

invertitori invece che 1 solo il disturbo va moltiplicato per 8 e il disturbo complessivo diventa di

1.6V. Si osservi che il caso non è assurdo, perché nei bus sappiamo che ciò accade. Si noti che gli

effetti si sommano perché se è vero da un lato che l’induttanza è unica dal terminale di

alimentazione del package verso Vdd e unica dal terminale di massa alla massa, la corrente che vi

scorre dentro è la SOMMA di tutte le correnti che devono caricare le capacità!! Il vero problema è

che tutta la logica presente nel circuito integrato collegata alla stessa alimentazione risentirà di

questi disturbi!! Poiché la condizione di commutazione contemporanea è comune, bisogna

prendere provvedimenti che limitino questi disturbi. Inoltre, l’entità del disturbo è direttamente

legata alla capacità. Il problema quindi si pone per i terminali di ingresso e uscita.

Per ridurre questi problemi si utilizzano quattro anelli di alimentazione.

Vdd ext, GNDext per i pad di I/O

Vdd int, GNDint per la logica interna

Gli accorgimenti che si adottano non risolvono al 100% il problema. In pratica, faccio in modo che il

nostro nucleo elaborativo del chip (il core, la logica) non veda questi disturbi. Spezzo la linea che

porta l’alimentazione al core. In questo modo, il core dovrà pilotare delle capacità interne che sono

ordini di grandezza più piccoli delle capacità esterne da 10pF circa!! In sostanza, basta spezzare le

alimentazioni ed ho risolto! Il prezzo da pagare è il numero di pin maggiore richiesto. Quindi, in

sintesi si separano le alimentazioni per i buffer di uscita e per il core. Si noti un’altra cosa: può

accadere anche che le alimentazioni per il core e per i buffer sono diverse, quindi separare le

alimentazioni può essere un buon modo per risolvere anche questo problema.

che sarà molto più

Osservando la slide, si avrà un disturbo per il core e un disturbo per per l’IO

grande del precedente.

Utilizziamo 4 anelli di alimentazione, ovvero quattro linee di alimentazione. Li chiameremo esterni

ed interni rispettivamente per l’IO e per il core. Si chiameranno anelli perché corrono su tutta la

del chip. Si noti che ci sono altre due linee dedicate all’alimentazione per il core. Si noti

periferia

che il vero numero dei terminali di alimentazione in questo esempio non sono 4 come dice la teoria

bensì 8.

Mettendo due terminali di alimentazione piuttosto che uno solo per ogni Vdd e GND, si ottengono

due induttanze in parallelo che sono la metà di una sola! Se mettessi 16 alimentazioni e 16 masse

ottengo dei disturbi che sono 16 volte inferiori rispetto al caso di un sol terminale. Nell’esempio, ho

2 terminali per ogni tensione di riferimento.

a) Le ricette per far fronte ai problemi sono:

separare le alimentazioni e le masse dei circuiti di IO da quelle per il core.

b) usiamo più terminali

scegliamo in maniera ottimale quali pin utilizzare per l’alimentazione:

c) osservando la slide

10, non useremo i pin negli spigoli perché hanno un collegamento interno maggiore e

un’induttanza maggiore.

quindi

d) cercheremo di aumentare i tempi di salita e di discesa al massimo possibile: i pin di uscita

non li porto alla massima velocità possibile, ma porto la velocità ad un valore compatibile

col funzionamento del sistema complessivo

e) si schedulano le transizioni che commutano: se ho un bus ad esempio, faccio sì che le

commutazioni non sono esattamente simultanee ma introduco dei ritardi piccolissimi.

f) utilizzare delle tecnologie di packaging più avanzate

g) laddove ciò non basti, si possono aggiungere delle capacità di disaccoppiamento sulla

scheda e sul chip. Le capacità di disaccoppiamento cosa sono? Sono condensatori messi

tra il terminale di Vdd ed il terminale di massa. Se sono di valore grande, la loro presenza

riduce in maniera sensibile i disturbi: più grande è la capacità di disaccoppiamento, meglio

sarà! Dove si piazza? Sotto le linee di alimentazione che comunque utilizzerebbero area

sul chip. Il problema esiste allo stesso modo anche sul circuito stampato

Le capacità di disaccoppiamento si pongono:

sulla board (giusto sotto i pin di alimentazione)

sul chip (sotto le linee di alimentazione, vicino a grandi buffer)

Possono essere utilizzate anche tecniche di packaging particolari per ridurre il problema:

Per esempio il processore Intel Core 2 Duo include un dissipatore integrato.

Nei system in package si cerca di fare una integrazione a livello di package: si cerca di integrare

più chip all’interno dello stesso contenitore collegati con il bonding. Questi Chip possono essere

anche di produttori differenti. Sistemi Combinatori

Layout & gate level

Dopo lo studio sulle interconnessioni, seguiamo l’approccio bottom up per capire come si

organizza il layout di un circuito semplice per vedere poi le celle che

utilizzeremo nelle esercitazioni. Il layout di un circuito integrato riporta tutti i

layer che servono per realizzare il circuito. Per disegnarli bisogna rispettare

delle regole di progetto.

Riporta tutti i layers necessari alla realizzazione delle maschere

fotolitografiche:

Deve rispettare le regole di progetto

Dimensione minima

Distanza minima

Composizione

Almeno in fase iniziale è più opportuno disegnare lo stick diagram ovvero una versione

semplificata del layout: segnamo i vari rettangoli con delle linee di colore diverso o tratteggio

diverso e non ci preoccupiamo delle distanze minime ecc. Quindi lo stick diagram ci dà solo una

informazione su dove piazzare i vari rettangoli.

Scelta la convenzione sulle linee da utilizzare, cosa succede se due di queste

(una verticale ed

una orizzontale)

si intersecano?

Fra poly e

metal1 nulla. Se

vogliamo farci un

collegamento tra

queste due linee, bisogna piazzare

un quadratino. Se invece

intersechiamo due linee di poly,

queste saranno per forza collegate

tra loro, ovvero in corto. Se

intersechiamo invece una linea di

poly con una di diffusione, stiamo

creano un mos. Si noti che è illegale intersecare una diffusione n ed una p: anzi, ricordiamo che

una delle regole più stringenti è la distanza tra una linea n ed una p per via della nwell da creare

per realizzare una linea p! A lato abbiamo lo stick diagram di un invertitore.

Si noti che l’alimentazione e al massa sono scritte con un

punto esclamativo finale (significa VARIABILE GLOBALE).

Le due linee sono parallele tra loro. Le prese di substrato

sono la x sulla vdd e sulla massa. In generale, abbiamo che

si tenta sempre di seguire questa strategia:

una linea orizzontale in alto per l’alimentazione ed una in

basso per la massa. Immediatamente sotto la linea di Vdd ci

saranno i vari PMOS in orizzontale: questo perché si

favorisce il piazzamento di un gran numero di prese di

substrato. Inoltre, anche gli nmos vengono messi in

orizzontale e vicino alla linea di massa così da riuscire a

rispettare facilmente la regola di progetto x la distanza

minima dmin. Non si fa una distribuzione a caso di pmos ed nmos. Inoltre si cerca di fare in modo

che le celle abbiano la stessa altezza h in modo tale che si possono poi alimentare semplicemente

accostandole.

Supponiamo ora di voler collegare i due punti K sullo stick diagram: per risolvere questo problema,

utilizzo il polisilicio (è vero che non è un gran che come collegamento, ma il tratto è piccolissimo)

per fare il collegamento verticale e poi uso il metal per fare il collegamento tra K e K. Infine, si noti

che l’ingresso è in poly e l’uscita in metallo.

Si ricordi che è importante mettere i nomi ai nodi (label) soprattutto per la simulazione.

Ora supponiamo di voler fare il layout di un buffer: approccio

gerarchico. Lo stick diagram è in figura: ci sono due copie,

due istanze della cella realizzata prima. Se la cella si chiama

inv, la prima istanza sarà inv_0 e la seconda onv_1.

Lo stick diagram quindi prevede l’accostamento dei due

rettangoli (si noti che c’è un errore: l’ingresso di ogni istanza è

in poly mentre io li ho collegati con un metal: devo mettere

allora un contatto e fare un collegamento in metal in

OGNUNA delle due istanze). Il nodo interno tra le due istanze

avrà due nomi, alias (sarà out1 o in2).

Progetto dell’addizionatore PICO Cominciamo a vedere quelle che saranno i vari

blocchi che realizzeremo per le nostre

esercitazioni:

avremo un microprocressore, una alu, etc.

Vediamo l’addizionatore: ha 2 ingressi a n bit, eventualmente un riporto

ad 1 bit (che non utilizzeremo) ed in uscita abbiamo la somma a n bit

(avremmo in teoria anche un riporto di uscita, ma noi non lo utilizziamo).

Un addizionatore veloce si può fare in 3-4 diversi modi. La struttura più

semplice è quella a propagazione del riporto (carry ripple) ma è

anche quella più lenta.

È costituito da una cascata di celle elementari ognuna delle quali

somma 1 bit dei due operandi: il circuito rispecchia l’algoritmo della somma. In sostanza ho

bisogno di un dispositivo che somma 3 bit di ingresso (2 bit + il riporto Cin) e fornisce in uscita 2

segnali (1 che è la somma S e 1 bit di riporto Cout che ha peso

doppio rispetto a S): FULL ADDER. Se non ho necessità di

sommare il riporto, uso un HALF ADDER che somma 2 bit di

ingresso e restituisce in uscita il bit S e il bit di riporto Cout.

Un addizionatore ad n bit richiede n full adder. Basta quindi

progettare un solo full adder e poi metterli in serie.

Full adder: Scriviamoci la tabella di verità del full adder,

ovvero della somma dei tre termini a, b e c. Spesso questo

circuito viene chiamato anche compressore 32 perché il

contenuto informativo espresso su 3 bit me lo esprime su 2

bit!

Per capire come ottenere il Cout, si esprimono i casi in cui si ha 1 e viene come in figura. è in

pratica la or di 3 and. Se metto poi la c in evidenza ottengo l’altra espressione. Si ottiene con una

AndOrInvert seguita con un invertitore. La somma è un XOR, una OR esclusivo. Questa funzione

compare molto spesso nei circuiti digitali ma non si presta bene ad essere integrata! La XOR in

generale è alta quando sono alti un numero dispari di ingressi, è quindi la funzione disparità. Con

una AOI sarebbe molto complicato. Allora, facciamo così: prendiamo la colonna di Cout negato

tanto ce l’abbiamo già gratis: si vede che è identica alla S tranne nel primo e nell’ultimo caso!! E

allora si può scrivere come in slide. Un inconveniente è che per calcolare S devo aspettare che

Cout negato sia disponibile!

Ecco il circuito dell’AOI. Si noti che la C che prima ho messo in

evidenza, ora lo metto vicino all’uscita! In sostanza lo sto

privilegiando perché ricordiamo che abbiamo visto che i mos più

vicini all’uscita devono caricare meno capacità! Questo circuito

comunque può essere ottimizzato: infatti, si nota che la rete pmos

condurrà quando A e B sono accesi e in pratica il ramo di destra

pmos può essere staccato.

L’ingresso C è privilegiato, quando conduce la rete evidenziata?

quando A=0 ed inoltre B=0, in questo caso il parallelo dei PMOS

comandati da A e B è sempre in conduzione.

È possibile ottimizzare la cella carry utilizzando quest’altra

configurazione a sinistra.

Facendo in questo modo, la rete pmos è esattamente DUALE rispetto

alla nmos!!! Il circuito è mirror, a specchio!

I vantaggi che si hanno sono sicuramente in termini di layout

simmetrico, ma soprattutto il numero massimo di dispositivi in serie è

passato da 3 a 2!!! Infine, possiamo ottimizzare l’ingresso C anche

nella rete pmos!

Questo è un esempio di Stick diagram. Si noti che le linee

grigie saranno in metal2: ci sarà comodo in seguito poter

passare in orizzontale una linea di metal1!! In sostanza tutti

i collegamenti verticali vengono fatti o in poly o in metal2. Il

diagramma non è completo, perché vanno collegati A ed A,

B e B.

Lo stick diagram definitivo è quello riportato nella figura sottostante:

A lo facciamo passare in parallelo alla linea di

massa sotto alla massa e B sopra alla linea di

alimentazione. Il segnale C invece lo facciamo

che mi

uscire a destra, così come Cout e Cout’

servirà per calcolare la S. In questa versione gli

ingressi A e B vengono portati su due linee

parallele alle linee di alimentazione, l’ingresso C

sulla sinistra così come Cout e Cout negato.

L’altra funzione logica da realizzare è quella che calcola la funzione

L’altra la possiamo realizzare guardando l’espressione logica:

somma.

nella rete di pull down abbiamo il parallelo di due reti, una che realizza

la and di A B e C e una che realizza la And tra NotCout e la or tra A,B

e C. La rete di pull-up poi si realizza per dualità. Il circuito ovviamente

calcola S negato, quindi è necessario un invertitore per ottenere S.

Semplifichiamo: quando conduce il ramo di pull-up evidenziato?

Quando A B e C sono entrambi bassi, allora possiamo spezzare la rete e ottenere questo:

Anche in questo caso le due reti di pull-up e di pull down sono

esattamente simmetriche. I vantaggi nell’usare questa versione della

porta sono: simmetria nel layout e un MOS in serie in meno nella rete

di pull-up. Abbiamo privilegiato un ingresso: NotCout! Infatti i

dispositivi di questo sono vicino all’uscita. Perché? Ovviamente

perché ha un ritardo maggiore, proviene da una rete di carry.

Lo stick diagram lo otteniamo dal circuito

semplicemente. Anche in questo caso, A e B

stanno su due linee parallele all’alimentazione,

proprio come abbiamo fatto per la porta logica

che calcola il carry. Inoltre, C e NotCout li

rendiamo disponibili sulla sinistra della cella, così

da poterli collegare facilmente alla cella carry. Si

nota anche l’invertitore finale che da NotS dà S.

Ora vediamo le due celle, una a fianco all’altra: per come le abbiamo organizzate, sarà semplice

collegare le masse, le alimentazioni, B ed A. Il segnale C potrà essere facilmente applicato ad

entrambe le celle, l’uscita Coutnegato va facilmente con Coutnegato alla cella che fa la somma, il

Cout poi è il riporto uscente che andrà collegato al fulladder successivo, quindi va portato proprio

fuori.

Ricordiamo le espressioni che ci permettono di calcolare il Cout e la somma:

ed andiamo a mostrare lo schema a blocchi complessiva della cella Sum+Carry:

Cout va sul lato superiore della cella perché andrà al fulladder successivo, il C invece va in basso.

Per la realizzazione dell’adder a 8 bit basterà fare un array. Se la cella è progettata bene, fare un

addizionatore a 16 o 64 bit è semplicissimo: basta richiamare il comando array. Ovviamente

cambieranno le prestazioni del circuito, ma a livello di realizzazione di layout è semplicissimo.

Questa è una struttura bit-slice, ovvero realizzato con strisce di bit. La struttura è duttile. In questo

caso abbiamo un flusso di dati. C’è poi un segnale di controllo che è il riporto che si propaga, ed è

proprio ortogonale al flusso di dati: bisogna stare attenti che nel layer questi viaggiano

ortogonalmente al flusso dati. Struttura bit-slice

DATA-PATH

Sistemi Combinatori

Timing Analysis

Come si fa la timing analysis di sistemi combinatori?

Prendiamo quest’esempio a lato: 5 ingressi e 3 uscite. Come valutiamo il ritardo di questo circuito?

La cosa più semplice è quella di realizzare una simulazione. Ragionando, è facile capire che

questa non è così semplice. Supponiamo di avere questi n (=5)

ingressi: quali saranno le sequenze da applicare per valutare i

ritardi? Per es passo da 00000 a 1101 e facciamo una prima

simulazione. Quale sarà quella che mi darà il massimo ritardo?

Devo effettuare tutte le possibili transizioni degli ingressi!! Con 5

5

ingressi, dovrò fare 2 -1 simulazioni per ogni ingresso fissato!!

5 5

Quindi, complessivamente dovrò effettuare 2 (2 -1) simulazioni!

2N

In generale, si hanno da fare 2 simulazioni e con N grande diventa inaccettabile!!

Con 16 bit per esempio devo fare 2 alla 32 simulazioni!! Ci vogliono altre tecniche che riescono a

darci stime dei ritardi, ovvero tecniche che realizzano una analisi statica dei ritardi (static timing

analisys).

Questa analisi procede così: noi per semplicità assumiamo che ogni porta logica sia caratterizzata

da uno specifico valore di ritardo, mentre questi tool potenti hanno a disposizione una

caratterizzazione delle celle. In pratica, tutte le celle devono essere in precedenza analizzate e

simulate per cui per la generica porta saranno scritte delle informazioni in un file specifico

(per es: tp A 10 , B=0, Cin=10fF, tr=50ps 250ps e questo per tutte le combinazioni). Una

parte di caratterizzazione quindi è indispensabile e richiede delle simulazioni che però vengono

fatte una volta per tutte su delle celle piccole, con pochi ingressi. Questa analisi viene fatta per

tutte le condizioni (tempi di salita degli ingressi, tensioni logiche ecc). Ci sono quindi delle librerie

standard molto ricche di informazioni relative alla caratterizzazione. Nel nostro esempio ripetiamo

che il ritardo della cella è unico.

Ci servono altre informazioni oltre ai ritardi delle celle.

Abbiamo informazioni relative ai tempi di arrivo dei segnali di ingresso: in generale i segnali non

arriveranno contemporaneamente perché provengono comunque da altra logica. Rispetto

all’instante di riferimento del clock gli ingressi I3 e

I4 arrivano immediatamente, I5 arriva dopo 60ps e

I1 e I2 arrivano dopo 20ps. In blu quindi sono

espressi in blu.

Poi, servono i tempi richiesti per le uscite. Sono

dei vincoli sulle uscite, ovvero “le uscite dovranno

essere disponibili entro un certo tempo”. A seconda

delle esigenze, questi vincoli saranno più o meno

stringenti. Nel nostro esempio, i tempi richiesti in

rosso li abbiamo fissati a 350ps.

Una volta definiti i tempi di arrivo e i tempi richiesti ed avendo a disposizione i ritardi delle celle,

possiamo procedere all’analisi dei ritardi.

La prima operazione che facciamo è trasformare la

nostra rete logica in un grafo: ogni nodo elettrico

viene trasformato in un nodo del grafo, anche i nodi

interni. La relazione ingresso-uscita la traduciamo in

archi che collegano i nodi di ingresso e i nodi di

uscita. Questi archi sono pesati in base al ritardo

relativo alla porta logica. Per esempio, il nodo I1 è

collegato al nodo A per mezzo della NAND, stesso

discorso per I2. Il peso di questi due archi sarà proprio il ritardo della nand pari a 100. Avendo a

disposizione una caratterizzazione come quella descritta prima, più accurata, non sarà unico il

peso dell’arco. Nel nostro caso otteniamo un grafo

orientato pesato.

A questo punto, possiamo propagare all’interno del grafo i

tempi assegnati, sia quelli di arrivo sia quelli richiesti.

Come propaghiamo i tempi di arrivo? La cosa importante è

che per i nodi in cui ci sono più ingressi e quindi diversi

tempi, prendo il peggiore! Per esempio, per il nodo E, il

valore del tempo di arrivo che metterò su E sarà il

massimo tra quello

dovuto ad A e a C (vedi

quad b)). Osserviamo

che la propagazione dei

tempi di arrivo si realizza

col grafo e procede secondo la schematizzazione vista.

La propagazione dei tempi di arrivo si effettua facilmente,

calcolando quindi il massimo dei tempi di arrivo più i ritardi legati

ai vari archi.

Si può procedere similmente riguardo ai tempi richiesti. In questo caso ci muoviamo da destra

verso sinistra: l’uscita Y3 sappiamo deve essere

disponibile entro il tempo 500. Quindi, il D dovrà

essere disponibile al tempo 500-150=350 e così via.

In questo caso si hanno situazioni come quella

relativa al nodo E: questo

deve soddisfare 2 condizioni

che riguardano il nodo Y3 e

Y2. Per quanto riguarda Y3,

E deve essere disponibile al

massimo al tempo 500-

150=350. Per quanto

riguarda l’uscita Y2 invece, il tempo deve essere 500-60=440. Il tempo

richiesto per il nodo E sarà il più stringente tra i due. La relazione allora

sarà diversa.

Qui calcoliamo il cammino critico: calcoliamo la differenza tra il tempo richiesto e il tempo di arrivo

(questa differenza si chiama SLACK). Affinché tutte le specifiche saranno rispettate se su tutti i

nodi si avrà uno SLACK > 0 (ovvero il segnale arriva prima di quanto necessario). Il nostro tool ci

dirà, in questo caso, che tutti i vincoli saranno rispettati. Il cammino critico del circuito è quello

evidenziato in verde, in cui lo slack per ogni

nodo assume lo stesso valore pari a 30 ed è il

MINIMO! Essendo comunque un valore positivo,

non c’è bisogno di intervenire. Se però lo slack

fosse stato NEGATIVO, a quel punto bisognava

cambiare qualcosa nel nostro circuito SOLO sul

cammino critico, ovvero SOLO dove i vincoli non

sono rispettati. Un’altra forma di ottimizzazione

può essere questa: se lo slack è positivo (vincoli

temporali rispettati), vediamo se è possibile

usare dispositivi più piccoli e quindi che

occupano meno area, dissipano di meno ecc. E

allora, se nella libreria c’è, uso un dispositivo più

piccolo! Quindi invece di rendere il dispositivo

più veloce, se le specifiche vengono rispettate

posso ottimizzare il circuito in termini di efficienza (area occupata, potenza dissipata). Si sottolinea

che il parametro da osservare per questa analisi è sempre lo SLACK.

slack=Trichiesto Tarrivo

L’insieme di nodi con slack minimo rappresenta il CAMMINO CRITICO del circuito, il cammino

critico si ottiene senza dover simulare il circuito: STATIC TIMING ANALYSIS.

Vantaggi di questa analisi: l’analisi della rete è veloce, si fa

velocemente anche per sistemi estremamente complicati; se la

libreria è completa (in termini di caratterizzazione dei ritardi vari

ecc), i valori predetti dalla timing analisys sono molto attendibili;

la timing analisis ci dà direttamente delle indicazioni su dove

agire per ottimizzare il circuito! Inoltre, la timing analisys ci dà

direttamente il cammino critico! Inoltre, si può richiedere al

software di provare a cambiare le porte nella speranza di ridurre i ritardi (oppure di cambiare le

dimensioni dei dispositivi).Si noti che, individuato il cammino critico, si può estrarre solo questa

parte di circuito (se per esempio si ha il dubbio che la caratterizzazione nelle librerie non è fatta

bene oppure si vuole analizzare bene in spice a livello transistor per avere informazioni

dettagliate).

Esiste però il problema dei cammini falsi: false path. Vediamo ora un esempio di un possibile

cammino falso. Si hanno 5 ingressi e 2 uscite. Per fare

l’analisi del circuito bisognerebbe assegnare tempi di

arrivo e tempi richiesti. Supponiamo tempi di arrivo tutti

pari a 0 e tempi richiesti tutti uguali. In questo caso, il

ritardo max sembrerebbe essere 50 + 10 + 15 + 10 = 85

MA non è vero! Perché se si osserva il multiplexer,

questo cammino non si attiva MAI per una questione di

logica quindi nel grafo ci sarà ma NON si attiverà mai!

Questi cammini creano dei problemi abbastanza

fastidiosi nei tool di simulazione. Comunque, qui il cammino critico è 20+10+15+10 = 55.

Ora, applichiamo questi concetti per un full adder. Scriviamone il

grafo dei ritardi (vedi slide). Il cammino critico dov è? Dovremmo

mettere il peso degli archi, i tempi di arrivo e richiesti. Però se i

tempi di arrivo ed i tempi richiesti sono uguali (e se i

ritardi dei vari archi sono simili), ad occhio, si ha che il cammino

critico, a partire dagli ingressi, è quello che passa per b,

NotCout, NotS e S.

Che succede per un addizionatore a propagazione di riporto? Il

cammino critico qual è? Sempre nell’ipotesi di archi con peso uguale e tempi di arrivo uguali, si ha

che qui il cammino critico prevede 5 archi! Per un addizionatore a n

bit il cammino critico sarà un cammino che ha n-1 ritardi di riporto e

un ritardo della somma. Si capisce subito che se il ritardo di carry è

notevole, questo sarà il peso più significativo nel ritardo totale. Ecco

perché abbiamo privilegiato i Cout nel realizzare il layout della singola

cella per la somma. Per ogni full adder allora, se vogliamo realizzare

questa applicazione bisogna privilegiare l’ingresso carry rispetto agli

altri. Tp=(n-1)Tcarry + Tsum

Possiamo allora ottimizzare il nostro addizionatore? Si, basiamoci sulle

funzioni logiche implementate nel full-adder. Qui, abbiamo due porte

logiche che calcolano i negati e noi ci abbiamo inserito i due invertitori

(vedi figura a sinistra). In un addizionatore ad n bit, sulla catena del riporto

ci sono n invertitori (che di volta in volta a partire da NotCout mi danno

Cout) che introducono n ritardi!! Come posso eliminarli?

Prendiamo la tabella di verità del full adder. Questa è simmetrica rispetto alla linea tratteggiata in

figura. In sostanza, se nego gli ingressi, ottengo l’uscita negata!

Come realizzo il circuito migliorato?

Partiamo dall’addizionatore che somma i termini di

peso 0 (i meno significativi). Questo sarà uguale a

prima. Ora, poiché in uscita al primo addizionatore

(ho tolto l’invertitore), in ingresso

non ho C1 ma NotC

metto rispettivamente un invertitore per A1 e uno per

B1 così da sommare tutti ingressi negati. Eliminando

anche l’invertitore in uscita all’addizionatore, ottengo

proprio S1! In sostanza, questo circuito nel

complesso mi somma una coppia di bit con un

invertitore in meno rispetto a prima (3 invece di 4) e

quindi occupa meno area però, cosa importante, ho tolto due invertitori dalla linea del riporto!

Nella realtà, non risparmio area perché le celle sono alternativamente uguali, ovvero 1-3-5-7 uguali

uguali. Sprecherò area, però posso realizzare l’addizionatore totale replicando

e 2-4-6-8 4 volte

questo circuito.

Per un carry ripple avrò: Sistemi Combinatori

Electrical & Logical effort

L’argomento che trattiamo ora è il ritardo dei sistemi combinatori. Soffermiamoci sulla generica

gate. Domandiamoci: come possiamo valutare il ritardo? Come possiamo ottimizzarla in termini di

dimensionamento? Introduciamo allora l’impegno elettrico(electrical e l’impegno

effort)

logico(logical effort).

Come esempio applicativo consideriamo la cella carry. Abbiamo visto che il ritardo di questa cella

rappresenta il cammino critico dell’addizionatore a propagazione del riporto. Chiediamoci: qual è la

condizione di ottimizzazione del circuito? Vediamo come si dimensiona la porta.

Assumiamo per semplicità che, a parità di dimensioni, le R dei

PMOS siano il doppio di quelle degli NMOS.

RETE NMOS: identifichiamo il cammino col numero massimo di

dispositivi in serie: in questo caso i cammini sono tutti

equivalenti quindi tutti i dispositivi avranno la stessa Wnc. La

Weq sarà allora Wnc/2, la metà perché ci sono due dispositivi in

serie. La Wnc è per ora un parametro, un grado di libertà.

RETE PMOS: La Weq in questo caso sarà ancora Wpc/2. Ora,

questi due ritardi equivalenti sono legati perché vogliamo che

sia simmetrico (in modo tale da equilibrare tphl e tplh). Il legame

è gamma che dipende dalla tecnologia, sappiamo che l’ordine di

grandezza (campo tipico di validità di gamma) è 1,8-2,5. Supponiamo per semplicità di calcolo

gamma=2. Dalla condizione imposta viene che:

Wpc=2Wnc

Nota che i valori di W non sono ancora tutti definiti, abbiamo ancora un grado di libertà che è

proprio Wnc. Posso sceglierlo pari al minimo o pari ad un valore grande a piacere. A seconda dei

casi, avrò una cella piccola (capace di pilotare piccola capacità) o una cella grande e capace di

pilotare grandi carichi. Per la nostra gate allora abbiamo un grado di libertà. Stesso discorso vale

anche per l’invertitore di figura, in cui ci sono solo 2 mos. Il PMOS viene pari al doppio in modo tale

da equilibrare tphl e tplh.

Il dimensionamento in figura garantisce la simmetria dei tp. Abbiamo quindi due gradi di libertà:

Wnc e Wni

COME SCEGLIAMO QUESTI PARAMETRI?

Per partire, comincio da un invertitore poi estenderemo i risultati ad una porta qualunque.

Nell’invertitore di figura il pmos è il doppio dell’nmos. Inolte, l’invertitore è ad area minima (infatti

Wn è pari a W0). Le L ovviamente sono minime (fuori discussione). Per valutare i ritardi,

consideriamo le capacità di carico che sono la somma di un certo numero di componenti: capacità

interna alla stessa porta logica (dovuta alle diffusioni delle regioni di drain dell’nmos e del pmos,

oltre che alle interconnessioni interne) che è un termine costante perché la porta quella è, e poi c’è

un termine dovuto al fanout, ovvero dipende dalle porte pilotate. Noi trascuriamo le capacità

interne per semplicità. Quale sarà la capacità di ingresso del nostro invertitore? Questa sarà pari

alla somma della capacità di ingresso dell’nmos e del pmos. La in questo caso per l’nmos e per

R

0

il pmos è uguale. Il tempo di propagazione è:

Tp = 0.69 Ro (Cext) = 0.69 Ro Cgo (Cext/Cgo)

Nel secondo passaggio divido e moltiplico per la capacità Cgo. La riscrivo allora come:

Tp=Tp0*h

h è detto electrical effort: h=Cext/Cgo (è il rapporto tra la capacità di carico e la capacità di

ingresso dell’invertitore).

Tp0 è un parametro caratteristico della tecnologia, non dipende da nient’altro.

h dipende solo dal dimensionamento della porta logica. Esso sarebbe il ritardo di un invertitore che

pilota un altro stadio perfettamente identico. Questo numero è indipendente dal dimensionamento

del nostro circuito, del nostro invertitore.

Tpo : ritardo intrinseco: 0.69 Ro Cgo

Tpo è un parametro caratteristico della tecnologia,

h : electrical effort: h=Cext/Cgo

h è il rapporto fra la capacità di carico e la capacità di ingresso della gate.

Tp0 quindi porta in conto la tecnologia (e quindi il costo), h porta in conto il dimensionamento.

Se aumentiamo le dimensioni del nostro invertitore di un fattore X che succede?

La capacità di ingresso sarà maggiore di X, la R equivalente si ridurrà del fattore X. Il prodotto

allora resta costante.

Se aumento il sizing allora, Tp0 rimane costante e h si riduce.

La formula Tp=Tp0*h ci fa capire che è

facile calcolare il ritardo. Infatti, Tp0 lo

calcolo una volta per tutte poiché è vero

per tutta la tecnologia utilizzata, l’h

invece lo calcolo volta per volta.

Facendone il prodotto ottengo il ritardo

dell’invertitore, o comunque della gate

considerata.

Tpo è un parametro caratteristico della tecnologia mentre h è il rapporto fra la capacità di carico e

la capacità di ingresso della gate => h dipende dal sizing.

Vediamo cosa accade se invece dell’invertitore consideriamo una porta logica, tipo una nand a 2

ingressi. Dimensioniamola in modo da renderla equivalente all’invertitore dimensionato prima:

Nell’invertitore avevamo un solo dispositivo di dimensione W , qui ne

0

ho 2 in serie quindi la loro dimensione sarà pari a 2W che in serie

0

equivalgono a W . Per i PMOS, la W sarà ancora pari a 2W in modo

0 0

tale che quando conduce un solo pmos esso è equivalente

all’invertitore di prima. La capacità che vedo su uno degli ingressi della

nand è maggiore. In particolare è maggiore di 4/3. Il ritardo della nostra

nand, quando piloto una certa capacità di uscita, sarà Tp. Come prima,

moltiplico e divido per la C di ingresso Cg,nand.

Il tutto lo riscrivo come Tp *h*g dove g una costante e prende il nome di logical effort. Questo g

0

mi dice di quanto è più lenta una porta logica rispetto ad un invertitore a parità di

dimensionamento. Infatti, in questo caso la nand è dimensionata in modo equivalente all’invertitore

ma è più lenta di un fattore 4/3!

Il logical effort ricordo è il rapporto tra capacità di carico e capacità di ingresso. Per le varie porte

vale:

. per renderla equivalente all’invertitore, gli NMOS

Nel caso di una NAND a 3 ingressi NAND3

hanno 3W perché ce ne sarannoo 3 in serie, i PMOS invece saranno uguali a prima perché nel

caso peggiore ne conduce sempre uno solo.

Calcoliamo la capacità relativa ad un ingresso e la capacità di ingresso dell’invertitore. Il rapporto

ci dà g. Se considerassi una porta a N ingressi, si ha che la capacità complessiva è pari a 2+ N e

h diventa 2+N/3 per una generica NAND a N ingressi.

Vediamo cosa accade per la NOR.

Dimensioniamo la porta affinché abbia la stessa resistenza di ingresso dell’invertitore:

Per gli NMOS la W è W0, per i PMOS sarà 4W0. L’h sarà 4+1/3.

Se fosse una NOR a N ingressi, la W dei pmos sarebbe 2N, quindi g sarà 2N+1/3.

Vediamo un esempio di ciò che abbiamo detto. Le nand sono X volte più grandi di quella ad area

minima. Quale sarà il ritardo di questo circuito?

Tp0 sarà un certo numero, g dipende dalla logica (NAND

a 2 ingressi: g=4/3) e h dipende da x. Per Cwire elevata,

conviene prendere una X elevata. Ad ogni modo, questo

ritardo non potrà essere mai inferiore a 4/3Tp0. Quindi, in

sintesi, per collegamenti con capacità elevate conviene

prendere dispositivi grossi, in maniera tale da ottenere un

ritardo che non dipende dalla capacità delle

interconnessioni. Se le capacità delle interconnessioni sono brevi, si può scegliere un

dimensionamento per i dispositivi non elevato così da ridurre l’area occupata.

In formule, avremo che il ritardo della prima NAND si scriverà:

Aumentando x, riduco Tp

Il Tp minimo è 4/3 Tpo

E’ necessario utilizzare celle con MOS grandi, quando si devono pilotare capacità elevate

Calcoliamo, come esempio, il ritardo su un cammino in cui abbiamo una cascata di diverse porte

logiche che in questo caso hanno tutte un dimensionamento uguale (x=1). Il ritardo per ogni porta

logica Tp=Tp0*g h .

i i

Il ritardo sul cammino è:

con:

quindi avremo in definitiva: il ritardo con un dimensionamento differente? Nell’esempio in

Domanda: possiamo ottimizzare

figura, il fattore di dimensionamento sarà 1 per la prima, 2 per la seconda, 3 ecc..

Esiste un dimensionamento ottimo!

Definiamo il logical effort complessivo che è pari alla produttoria dei vari coefficienti g ricavati

prima.

Definiamo anche l’electrical effort complessivo che è invece la produttoria delle h. Questa H è

molto semplice da calcolare! Infatti:

Si noti che:

Si può dimostrare che il dimensionamento ottimo si ha quando i ritardi di tutti gli stadi sono

uguali tra loro! g1h1=g2h2= .. =(gh) opt

quindi:

il ritardo minimo è quindi:

Ricordiamo che i ritardi sono Tp0*g*h, quindi si deve avere che sono tutti uguali i vari g*h! Si

ottiene che il (gh) è pari alla radice ennesima di GH. In questo caso, il ritardo minimo sarà pari a

opt

n volte il ritardo della singola porta logica della cascata.

Questa formula ci permette di ottenere il dimensionamento ottimale, ovvero la x ottimale per le

varie porte.

Infatti, se per il l’invertitore 1 deve accadere che hg=1,93, esplicitando h1 e g1 si ricava X2. A

seguire si ricava X3. Infine, X4. Ciò che accade è che la cella che viene fatta più grande è

l’invertitore finale.

Applichiamo il concetto appena visto al full-adder.

NMOS: la dimensione la scriviamo come 2W *Xc con

0

Xc=fattore di scala(il 2 è dovuto al fatto che ci sono 2 nmos in

serie, quindi per Xc=1 si ha proprio 2W e la W equivalente

0

). Per l’invertitore finale si ha W0Xi

della serie viene proprio W 0

con Xi=fattore di scala per l’invertitore.

Valutiamo il logical effort rapportando la capacità degli ingressi

(per es A).

In questo caso è molto inefficiente poiché ci sono 4 dispositivi,

due dei quali sono PMOS. Per l’ingresso B è uguale, perché è

simmetrico.

Per l’ingresso C invece le cose sono diverse perché esso è

stato collegato ad un numero diverso di dispositivi. Si ha un g

2. L’ingresso C è privilegiato, lo sappiamo.

pari a

Cerchiamo di dimensionare la nostra cella. Per farlo, vediamo dove è inserita nell’addizionatore a

propagazione di riporto. Il cammino più lungo

sappiamo che è quello che prevede tante celle di

carry in cascata. Dobbiamo minimizzare il ritardo

della serie delle due porte logiche Xc e Xi.

Calcoliamo l’electrical effort complessivo (pari al

rapporto tra la capacità finale e la capacità

iniziale) e il logical effort complessivo che è il

prodotto dei due. Il fattore gh ottimale è la radice

quadrata di GH. Sfruttiamo questo risultato per

dimensionare Xi e Xc. Si noti che il ritardo minimo viene pari a 2*radicedi2 Tp0 (2 perché sono 2

porte in cascata di pari ritardo). Il nostro addizionatore a propagazione del riporto non potrà mai

andare più veloce di questo.

Imponendo il fattore trovato, si ha che le dimensioni dell’invertitore devono essere maggiori delle

dimensioni della cella carry di un fattore radicedi2. Si noti che non si ricava MAI il valore esatto

delle 2 porte, ma si ottiene un fattore dato dal rapporto tra le due dimensioni. Si noti che conviene

fare più grande l’invertitore piuttosto che la cella carry.

Ricordiamo che abbiamo

trascurato le capacità verso la

cella somma: posso farlo solo se

la Cs è molto più piccola della

capacità di ingresso

dell’invertitore. Da questa

condizione trovo una condizione

su Xi. In maniera analoga

ragiono per Xc. Dalle due

condizioni diciamo che: il ritardo minimo è 2radice2Tp0 e lo ottengo quando le dimensioni

dell’invertitore e della cella carry sono abbastanza grandi in modo da poter trascurare le capacità

della cella somma ed inoltre devono essere in rapporto radice2. Una scelta ragionevole è fare Xi 5

VOLTE più grande del rapporto Cs/Cgo. Valutiamo infine il ritardo in cui non ci siano

invertitori dal cammino critico (per portarli in

serie agli ingressi, visto nella lezione di ieri).

Se facciamo questa operazione, nel cammino

critico c’è solo la cella carry. Se trascuriamo le

capacità della cella somma, l’electrical effort è

1 perché le 2 capacità sono uguali, quindi la Tp

viene 2Tp0. Xc lo dimensioniamo facendo in

modo che il contributo delle capacità della cella

somma siano trascurabili. In definitiva togliere l’invertitore è appagante, attenzione però perché le

dimensioni dei dispositivi della cella carry saranno più grandi. È vero che il circuito è più veloce ma

attenzione perché i dispositivi della cella carry saranno più grandi rispetto al caso in cui ci sono gli

invertitori in serie.

Trascuriamo le capacità della cella somma:

Tp=Tp0*h*g=2Tp0

Per poter trascurare le capacità della cella somma:

ALU

Discutiamo della struttura dell’unità logica aritmetica che realizzeremo nelle esercitazioni.

Questa ALU è un sistema combinatorio che dispone di due ingressi A e B a N bit (noi utilizziamo

un data path a 8 bit) dove arrivano i due operandi da trattare. L’altro ingresso (codice operativo)

espresso su m bit definisce l’operazione che si deve effettuare sui due operandi (somma,

m operazioni possibili, anche se in realtà c’è

differenza, ecc). Avendo m bit, possiamo codificare 2

ridondanza e le operazioni veramente

possibili saranno di meno. Avremo due

tipi di operazioni:

Operazioni logiche: AND, XOR, …

TUTTI 0, TUTTI 1…Sono

operazioni molto semplici,

vengono fatte su coppie di bit!

Non sono nemmeno operazioni

critiche dal punto di vista del

ritardo

Operazioni aritmetiche: somma,

incremento, decremento, sottrazione. Non prevediamo la moltiplicazione o la divisione per

le quali si adottano dei blocchi a parte. In questo corso vedremo più avanti come vengono

realizzati i moltiplicatori. Con queste poche operazioni elementari realizzate in hardware

possiamo affidarci a cicli software per realizzare per es la moltiplicazione come

successione di somme. Le operazioni di incremento e decremento sono fondamentali per

accesso ad indici di matrici ecc.

Le operazioni aritmetiche sono più complicate delle logiche, saranno il collo di bottiglia della ALU in

termini di velocità.

Per le operazioni aritmetiche, è importante vedere quale sarà la rappresentazione utilizzata per i

numeri. Ne esistono diverse, ma noi utilizziamo quella in complementi alla base.

Noi dobbiamo trattare numeri con segno.

Per rappresentare un numero negativo si segue questo semplice algoritmo:

Nella rappresentazione in complementi alla

base le cifre hanno i pesi presentati in

figura. Si noti che il più significativo ha peso

è l’unico ad avere un peso negativo. Si

-32,

capisce subito che se devo rappresentare

un numero negativo, il bit più significativo

deve essere per forza alto perché è l’unico

a darmi un contributo negativo. Il numero

più negativo è ovviamente 1000000 ovvero

n-1

-2 .

Vediamo la struttura interna della nostra ALU, particolarmente semplice. Dividiamo il nostro

sistema in due blocchi: uno effettua soltanto delle operazioni aritmetiche e un blocco che è

progettato per eseguire solo operazioni

logiche. Per le aritmetiche abbiamo 3

bit di codice operativo, mentre ne

abbiamo 4 per le operazioni logiche. Il

multiplexer sceglierà quale delle 2

uscite. Il bit di selezione farà parte

anch’esso del codice operativo.

Aritmetiche: con 3 bit di codice op. si

possono effettuare max 8 operazioni,

ne saranno di meno e lo vedremo.

Parte Aritmetica

Supponiamo di fare un circuito che sappia fare solo la somma o la differenza (addizionatore

sottrattore). Per fare la differenza, possiamo usare ancora un addizionatore realizzando

l’operazioni A+(-B). Quindi, prima di sommare, bisognerà cambiare segno all’operando B. Quindi,

dobbiamo complementare tutti i bit di B e aggiungere un LSB. Il circuito che realizza questa

operazione è a lato: si hanno un insieme di XOR

dove uno degli ingressi è l’iesimo bit di B e l’altro

ingresso è in comune e vale m (m ci dirà se

voglio fare la somma o la sottrazione). La Xor è

quindi un complementatore (vedi quad (a)). Se

m=1 faccio A-B, se m=0 faccio A+B.

Il blocco b-op realizza la tabella di verità sotto.

Se attivo l’invert e non 0, B sarà negato, se

attivo lo Zero e non l’invert tutte le uscite

saranno 0, se attivo sia invert che 1 tutte le

uscite saranno 1. Come possiamo realizzarlo? Usando un complementatore pilotato da Invert I

(ovvero un xor con I) ma non gli mando direttamente B, gli mando B and Zero negato.

Quali sono le operazioni aritmetiche realizzabili con

questo circuito?

Il nostro circuito di fatto somma A con B1 col riporto

c.La tabella a lato mostra i vari casi. Il secondo caso

non è molto utile, ma c’è e ce lo teniamo. Il terzo

caso è molto utile. Il quarto caso incrementa A. Il

quinto caso fa la sottrazione tra A e B e decrementa

(anche questa non è di grande interesse). Il sesto

caso fa effettivamente A B. Il caso successivo

decrementa A. L’ultimo caso restituisce ancora A.

Parte logica

La parte logica è il blocco booleano ed ha 4 bit di codice op. Il cuore di questa parte logica è

realizzata da multiplexer 4 a 1. Saranno

8 mux 4a1. Gli ingressi saranno f0f1f2f3

mentre i bit i-esimi di A e B saranno gli

ingressi di selezione. Con dei mux

possiamo realizzare qualsiasi funzione

logica degli ingressi perché sono blocchi

universali. Per dimostrarlo, usiamo la

Formula di Espansione di Shannon.

Supponiamo di avere una funzione

booleana (o logica) di n variabili. Questa

funzione, può essere scritta come in

slide. La dimostrazione è ovvia perché

se X1=1 sopravvive solo il primo termine

(x1*f(1,x2,x3,…,xn) mentre se è pari a 0 sopravvive solo il secondo termine.

Questa OR la posso vedere come un multiplexer. Se ho quindi una funzione booleana di n variabili

booleane la posso realizzare con un multiplexer e con 2 funzioni di n-1 variabili. Ragionando in via

iterativa:

Algebricamente accade quello visto in figura. In

pratica, si ottiene una OR a 4 ingressi ognuno dei

quali è di n-2 variabili. Circuitalmente si realizza

come in slide. In pratica, posso realizzare un

multiplexer grande semplicemente mettendo in

cascata tanti multiplexer semplici.

Nel nostro caso abbiamo funzioni a due variabili. I

termini f sono costanti. Cambiando i quattro ingressi

f, riesco a fare una generica funzione di x1 e x2 che

in questo caso sono gli ingressi di selezione del

mux.

Vediamo le operazioni realizzabili.

Per es, se voglio fare la funzione “A”,

devo mettere 1100 ad f3f2f1f0.

Vediamo come possiamo

complessivamente organizzare il

nostro codice operativo.

Abbiamo in totale 4 bit per la

booleana, 3 per l’aritmetica e una per

il multiplexer. Si hanno quindi 8 bit. In

modalità aritmetica il bit f3 è non influente (guardando già la seconda organizzazione di bit).

Il sistema viene organizzato così:

Useremo un approccio bit slice come quello visto nel caso dell’addizionatore. I bit di controllo Zero

e Invert saranno comuni a tutto l’array, quindi viaggeranno in verticale. Stesso discorso per f0f1f2f3

di selezione sel. L’ALU a n bit sarà realizzata sovrapponendo n istanze della bit-slice.

e per il bit I

dati viaggiano da sinistra a destra, i segnali di controllo dal basso verso l’alto.

L’uscita della alu verrà inviata ad un accumulatore, la cui uscita sarà la parte A dell’alu.

La cella “accumulatore” sfrutta l’uscita della ALU

ed il bus A.

Il bus B non è utilizzato dall’accumulatore.

Possiamo vedere a lato il layout della

cella accumulatore:

e il datapath complessivo: Sistemi sequenziali:

temporizzazione

(cap.10)

In una logica sequenziale i registri sono comandati da un clock. Esistono due modi per realizzare

un sistema di memoria:

Con feedback positivo

basato su carica

Per quanto riguarda le convenzioni sulle

denominazioni:

un latch è un sistema sensibile al livello del

clock,

un registro è sensibile ai fronti di

commutazione del clock.

In varie letterature un circuito sensibile ai fronti di commutazione del clock è chiamato anche flip-

flop. e una fase di memorizzazione: nella trasparenza l’uscita

Un latch ha una fase di trasparenza

segue l’ingresso. invece, l’ingresso viene campionato in

In un registro o in un flip-flop

corrispondenza del fronte e viene riportata in

uscita. L’uscita non segue più l’ingresso come

per il latch.

Esistono due tipi di latch:

positivo

negativo

quello che cambia il livello del clock su cui

sono in memorizzazione(e dualmente

trasparenti). Noi ci riferiamo ai registri: elementi attivi sui fronti

del clock. Questo perché i latch servono per

realizzare i registri ma come elementi di

sincronizzazione si usano i registri. Parliamo ora

della dinamica di un registro, ovvero dei tempi

caratteristici.

Supponiamo un registro attivo sui fronti di salita.

Nessun sistema è ideale, ovvero in grado di

campionare in maniera ideale il dato di ingresso,

devono essere rispettati dei vincoli temporali.

Innanzitutto, il dato di ingresso deve essere

stabile sia per un certo tempo PRIMA del fronte

del clock sia per un certo tempo DOPO del fronte

del clock. In particolare, il tempo richiesto di

stabilità prima del fronte viene chiamato tempo di

setup mentre il tempo richiesto dopo il fronte

L’uscita sarà

viene chiamato tempo di hold.

stabile dopo un certo tempo chiamato clock to q.

Quindi un registro è caratterizzato da questi 3 ritardi. Se non sono rispettati questi vincoli sul tempo

di setup e di hold, l’uscita sarà impredicibile! L’uscita diviene metastabile. Inoltre il clock to q

diviene imprecisato. Si ha un errore di sincronizzazione.

Un'altra applicazione tipica è quella in cui abbiamo un blocco combinatorio, un registro di ingresso

e un registro di uscita. In realtà i vincoli che ora

scriviamo sono validi in generale, sia per una

macchina a astati disegnata in alto sia per un

circuito aperto come quello in basso.

Quali sono questi vincoli da rispettare affinché il

circuito operi correttamente?

Nell’esempio, si ha un banco di registri a n bit, il

segnale X in uscita è ancora a n bit, viene

elaborato dal blocco combinatorio e poi l’uscita Y

viene memorizzata nel registro 2. I parametri

necessari sono quelli dei registri: il clock to q, il

setup e l’hold. Poi abbiamo bisogno dei parametri

del sistema combinatorio: ritardo combinatoriale

massimo e ritardo combinatoriale minimo. In figura

c’è una possibile evoluzione temporale. Il corrispondenza del primo pronte di discesa del clock il

dato X viene memorizzato

(osserviamo che X non cambia

subito dopo il clock, ma dopo

1pò). Quando X varia, dopo un po’

Y comincia a variare perché

lavora la logica combinatoria.

Dopo un po’ di tempo, la Y

smetterà di commutare e sarà

stabile, sarà a regime dopo un

ritardo massimo. A questo punto,

il nuovo valore di Y viene

memorizzato nel registro numero

2.

I vincoli sono sul:

tempo di setup: il nuovo valore deve assestarsi sufficientemente prima del fronte n+1 del

clock. Questo fronte lo abbiamo dopo un T

che deve essere sufficientemente grande

da consentire la commutazione del

registro, la commutazione di Y e deve

garantire il margine sul tempo di setup. Se

questa condizione non viene verificata, si

viola il tempo di setup. Si ha un errore di

sincronizzazione legato al tempo di setup.

Questo vincolo mi stabilisce la frequenza

massima del segnale di clock. Si osservi

che il periodo del clock è dettato dal ritardo

combinatoriale massimo. Per i registri, il

loro contributo in questo caso è dato dalla

somma di tq + ts. Questo parametro rappresenta la

velocità del registro! Quindi un registro veloce deve

avere un ritardo tq+ts il più piccolo possibile!

tempo di hold: vediamo cosa accade in corrispondenza del fronte n-esimo del clock e non

n+1 come prima. Quando avviene il fronte, contemporaneamente memorizzo il valore

precedente yn dell’uscita perché il clock agisce su entrambi i 2 registri. L’uscita, dopo il

fronte del clock, comincerà a commutare: dobbiamo fare in modo che ci sia un tempo

sufficiente in cui l’uscita rimane stabile anche dopo il fronte del clock altrimenti yn non verrà

memorizzato correttamente nel registro 2 di

uscita. Dopo quanto tempo l’uscita commuta?

Dopo il tq + il tcminimo. Affinché il circuito

funzioni bene allora, tq+tcmin deve essere

sufficientemente grande: l’uscita y deve

rimanere stabile per un tempo adeguato, pari al

tempo di hold. In questa osservazione non

entra il periodo del clock: può essere verificata

o meno indipendentemente dal periodo del

clock! Se il vincolo sul tempo di hold non viene

soddisfatto, non potrò mai fare in modo che il

circuito funzioni perché seppure abbassassi la

frequenza del clock, le cose non cambiano! Inoltre questo

vincolo è legato al ritardo minimo del sistema

combinatorio! Quanto maggiore è questo ritardo minimo,

meglio è. Inoltre, sono presenti due tempi caratteristici del registro: tq e th. Quanto vale il

ritardo minimo? Dipende dal sistema. Ci possono essere situazioni in cui il tcmin è nullo

(interconnessione): in questo caso il sistema funzionerà o meno soltanto se è verificata una

condizione che è legata soltanto i registri: tq>th.

Warning: quando vedremo la non idealità del clock queste relazioni dovranno essere

riviste.

Riepilogando avremo:

Vincolo sul tempo di setup:

Vincolo sul tempo di hold:

Questi vincoli impongono le seguenti condizioni:

Il vincolo sul tempo di setup determina la max frequenza di clock, che è limitata dal

massimo ritardo del sistema combinatorio;

La figura di merito del registro è la somma del tempo di setup+ritardo clock-to-q

Il vincolo sul tempo di hold dipende dal minimo ritardo del sistema combinatorio.

Condizione più critica per il tempo di hold: ritardo combinatoriale minimo

Il vincolo sul tempo di hold NON DIPENDE dal periodo del clock

Se per ogni registro: Tq > Th il vincolo sul tempo di hold sembra essere automaticamente

verificato.

Vediamo come valutare il ritardo minimo di un sistema combinatorio.

In altri capitoli abbiamo valutato il ritardo

massimo. Si procede in maniera simile. Per gli

ingressi associamo i tempi di arrivo minimi (in

genere diversi da quelli usati per il calcolo del

ritardo massimo), per le uscite si indicano i

tempi richiesti minimi (ancora una volta diversi

da quelli usati nel calcolo del ritardo max).

Si fa innanzitutto il grafo dei ritardi, poi

propaghiamo i tempi di arrivo e analogamente i

tempi richiesti.

I tempi di arrivo li propaghiamo da sinistra a destra. Al nodo

F ci sarà il tempo di arrivo minimo, in questo caso quindi

propaghiamo il minimo e non più il massimo dei ritardi!

Ricordiamo per tracciare il grafo dei ritardi:

Ad ogni nodo del circuito => un nodo del grafo

Un arco del grafo => corrisponde ad una coppia I/O

di una gate

Peso associato all’arco => delay

Vediamo cosa accade per i tempi richiesti: ci muoviamo da destra a sinistra e poi mettiamo il

massimo come valore su ogni nodo. →

Per ogni nodo abbiamo il tempo richiesto, il tempo di arrivo e lo slack questa volta definito come il

tempo di arrivo meno il tempo richiesto. Infatti

il segnale deve arrivare dopo il tempo

richiesto. Si chiama Early slack. Osserviamo

che su Y1 il vincolo sul tempo non è

rispettato, infatti lo slack è negativo!! Abbiamo

quindi questo nodo con uno slack pari a -30.

Andando a ritroso, vediamo che ci sono altri

nodi con stesso slack e che costituiscono un

cammino tra ingresso e uscita. Questo

insieme di nodi mi definisce il cammino critico:

è in sostanza il cammino più veloce del

circuito!! Quando ci sono vincoli non rispettati,

bisognerà cambiare il circuito in modo da rispettare questi vincoli.

Bisognerà rendere più lento quel cammino in verde.

Se Early slack>0 allora i vincoli di timing sono

rispettati

L’insieme di nodi con Early slack minimo rappresenta

il CAMMINO CRITICO PER IL VINCOLO DI HOLD.

Nel nostro caso abbiamo la cascata di una nand e di un invertitore. necessario aumentare il

È

cammino critico almeno di 30 Per rallentare, inserisco un

buffer! E ne aggiungo tanti in cascata fino a quando i

vincoli temporali vengono finalmente rispettati.

Con l'inserimento del buffer il vincolo di timing è

soddisfatto. Risolvere i problemi di timing sul ritardo

minimo è abbastanza semplice. Inserire questi buffer non

è a costo zero, poiché aumentano area e potenza

dissipata! Ovviamente un'altra strada è quella di fare un

down-sizing del circuito (faccio i dispositivi più piccoli). È ovvio che quando inseriamo dei buffer

inseriamo una logica ridondante. Bisognerà quindi segnalare che i due invertitori non devono

essere toccati perché stanno lì proprio per rallentare il cammino e non per fare logica.

buffer aumenta la lunghezza dell’interconnessione, aumenta anche la

Si noti che inserendo dei

capacità e nascono delle interazioni tra tempo di setup e tempo di hold.

Quindi in generale:

Il vincolo sul tempo di hold può essere soddisfatto in maniera relativamente semplice,

inserendo dei buffer per aumentare il ritardo sui cammini più veloci.

L'inserimento dei buffers aumenta l'area e la dissipazione di potenza

L'aumento dell'area aumenta la lunghezza media delle interconnessioni si può avere un

certo peggioramento anche dei cammini più lenti (setup).

Vediamo una tecnica che permette di aumentare la frequenza operativa.

Consideriamo un circuito come quello in figura a lato.

Un circuito così fatto fornirà un uscita per ogni clock,

nell’ipotesi che diamo dati validi in ingresso. Il periodo

minimo sarà pari al clocktoq+setup+sommaritardi massimi.

Ogni T secondi, otterremo un dato valido.

La versione pipelined è fatta da datapath più

piccoli: il singolo percorso è più piccolo.

Se supponiamo uguali i registri, otteniamo il

minimo periodo del clock come in slide. Il periodo a

destra è minore perché abbiamo un solo termine

relativo al ritardo combinatorio. Il circuito di destra

è più veloce: ovviamente il circuito di destra deve

restituire un risultato valido.

Supponiamo di mettere A1 e B1 in ingresso: dopo

un clock, l’addizionatore avrà calcolato la somma e

il primo registro potrà memorizzare. In questo ciclo

di clock possiamo sia calcolare la somma sia

mettere nuovi dati in ingresso. Nel clock successivo mettiamo i dati calcolati nel secondo registro,

calcoliamo la somma dei secondi dati e forniamo in ingresso anche altri dati A3 e B3. Dopo un

altro clock, tutto scala in avanti. Il circuito non è che è più veloce, semplicemente elabora più dati

contemporaneamente. A parte i primi clock iniziali, per

ogni clock abbiamo dati validi in uscita!! Quindi

perdiamo una latenza iniziale ma abbiamo il tutto più

veloce nel caso in cui dobbiamo elaborare molto! Il

pipelining come tecnica introduce una latenza ma

permette di far lavorare il circuito più velocemente. È

una tecnica generale che si può utilizzare per parecchie

tipologie di circuiti. Tiriamo fuori la regola generale per

implementarlo. Quello che si fa è:

piazzare registri nel percorso critico e tagliare a metà il

circuito per evitare di lasciare qualcosa fuori.

Se voglio applicarlo all’addizionatore carry ripple, qui non è facile capire come spezzare a metà il

pipeline. Nella seconda figura, ogni puntino rappresenta un livello della pipe, ovvero un registro!

Ogni linea deve tagliare a metà! In sostanza bisogna tagliare proprio praticamente a metà ogni

linea!! Poiché il full adder lo supponiamo come blocco atomico (non tagliabile), il periodo minimo

del clock è pari a quello dato dall’espressione in figura.

Quindi in pratica con la pipelining aumento la F ma introduco latenza.

clk

Possiamo considerare un esempio di pipelining per un adder carry-ripple.

Ogni punto corrisponde ad un registro e tutti i

registri hanno il clock in comune.

Avremo per il Tmin:

Elementi di non-idealità del clock

Immaginiamo il clock come segnale ideale: frequenza fissa e attiva simultaneamente tutti i registri

del circuito.

Non è così ovviamente, ecco

perché devo portare in conto varie

non idealità:

Clock skew: non idealità

dovuta al ritardo sul sistema

di distribuzione del clock, ha

una componente

deterministica(predicibili in

fase di progetto) ed una

casuale;

Clock jitter: Variazione temporale fra due fronti consecutivi del clock (frequenza non

perfettamente costante): modulation + random noise. Si distinguono:

o Jitter cycle-to-cycle (short-term) tJS, massima differenza del periodo tra due cicli di

clock successivi

o Jitter assoluto

Se consideriamo due clock che si trovano nel mio circuito, essi saranno sfalsati tra loro, inoltre ci

sarà una componente aleatoria nell’istante di commutazione.

Il clock non è ideale per molti motivi: normalmente ho un generatore di clock unico e una rete di

distribuzione che consiste in buffer, linee di interconnessione ecc. Ogni linea finirà su flip flop più

grandi o minori. Le cause quindi sono: generatore, incertezze legate ai dispositivi che pilotano le

linee, linee stesse, alimentazione che causa rimbalzi, accoppiamento capacitivo, temperatura, flip

flop di carico.

Quando si progetta l’albero di clock vorremmo

ottenere che il clock arrivi in maniera

SINCRONA a tutto il circuito. Non ci interessa

molto che ci sia ritardo tra il generatore e il pin

vero e proprio!

Tra le cause dello skew troviamo:

interconnessioni e buffer delle linee potrebbero non essere bilanciati: i percorsi alcuni

saranno più veloci di altri. Capiamo che è un fattore deterministico che in fase di

progettazione si può risolvere;

variazioni dei parametri dei dispositivi che causeranno differenti ritardi (casuale);

delle wire saranno più lunghe di altre quindi le C e le R possono variare rispetto ai valori

attesi(casuale).

Il problema del jitter è che il clock lo vedo come una componente media e una aleatoria a media

nulla. Il jitter assoluto quindi è uno scostamento assoluto mentre il jitter ciclo a ciclo è la differenza

del periodo tra due clock consecutivi ed è quello più importante.

Il periodo del clock non è costante: ha un valore medio T cui si somma una componente aleatoria

a media nulla (jitter):

jitter assoluto: massimo scostamento del periodo rispetto al valore medio

jitter cycle-to-cycle: massima variazione fra due periodi consecutivi del clock.

Le cause del jitter sono:

generatore che non dà una forma perfettamente quadra;

Vdd che può variare nel tempo a causa di rimbalzi e produrre differente ritardo nei buffer;

temperatura; accoppiamento capacitivo tra le linee del clock e le altre linee. Questo dà

fastidio perché è una capacità NON costante!! Se ho una commutazione su un nodo che è

accoppiato ad un altro nodo, a seconda delle commutazioni c’è un effetto capacitivo

diverso! L’abbiamo visto nell’accoppiamento capacitivo tra linee.

Variazioni dei ritardi dovute a variazioni della temperatura;

Variazioni dei ritardi dovute a cross-coupling con linee adiacente (effetto Miller).

Come si gestiscono queste 2 non idealità?

Clock skew

Lo skew ha alcune cause deterministiche: supponiamo di aver ottenuto le due situazioni in figura.

Nella prima figura abbiamo un delay crescente man mano che mi sposto lungo il datapath del

circuito, avremo quindi il cosiddetto Positive skew:

Nella figura in basso il delay decresce man mano che mi sposto lungo il datapath. La direzione di

riferimento è quella lungo cui si propagano i dati, avremo quindi il cosiddetto Negative skew:

Per quanto riguarda il

Positive skew la situazione

che si presenta è

rappresentata in figura:

È come se il periodo del

clock si fosse allungato!

Perché il tempo che la rete

combinatoria ha a

disposizione è quello che

va da un fronte all’altro (in rosso), in pratica il periodo è determinato dai fronti di salita 1 e 4.

Caso duale: se lo skew è

negativo, è come se il

periodo del clock si fosse

ridotto, come vediamo in

figura:

Vediamo gli effetti del positive skew: Per il vincolo sul tempo

di setup si ha un

beneficio con skew

positivo: la regola si

modifica infatti come in

slide. Al crescere del

ritardo delta il circuito

può andare più veloce o

comunque la

disuguaglianza è più

facile da verificare.

Per il tempo di hold, il delta deve essere minore di una certa quantità!

Se questa relazione non si verifica, il circuito non funziona

proprio!! Usare lo skew per andare più veloci quindi può

causare grossi problemi sul funzionamento del circuito

stesso!!

Ricapitolando:

Uno skew positivo (Δ>0) è benefico per le prestazioni (posso aumentare la frequenza di clock,

sebbene di poco) ma è MOLTO pericoloso per il funzionamento del sistema (vincolo di hold).

Uno skew negativo (Δ<0) peggiora di poco le prestazioni ma rende il sistema più immune a

problemi sul tempo di hold.

Rispetto ad un sistema senza clock skew, l'effetto del ritardo sul clock è equivalente ad una

variazione di tq.

Non sempre si può scegliere quale skew avere (sempre positivo o sempre negativo). Se ho dei

loop non posso fare nulla! Ecco perché consideriamo sempre che lo skew sia PEGGIORATIVO nei

casi. Consideriamo che:

peggiori sempre le prestazioni

renda il circuito meno robusto (renda più critico il vincolo di HOLD).

CLOCK JITTER

Non sapendo quando il periodo del clock sarà maggiore del valore nominale e quando sarà

minore, abbiamo entrambi i problemi evidenziati per lo skew:

peggiora le prestazioni

rende più critico il vincolo sul tempo di hold.

Le formule da usare quale saranno? Supponiamo di conoscere in linea di massima lo skew e jitter:

Devo ragionare sempre in via peggiorativa. Nella formula sottraggo 2 volte il jitter perché ho due

fronti del clock. Si vede che il periodo di clock peggiore.

Ci dobbiamo assicurare che il tempo combinatoriale

minimo sia abbastanza grande. Se non dovesse

esserlo, aggiungiamo dei buffer.

Immagineremo che la frequenza massima sia limitata anche da jitter e skew!

Spesso, per fare ciò, devo inserire della logica fittizia(buffer) per aumentare il ritardo

combinatoriale minimo:

Distribuzione del clock

Come distribuisco, quale strategia uso per distribuirlo in un circuito integrato con molti transistor e

molto estesi come superficie? La strategia deve ridurre lo skew nelle componenti note (non

aleatorie) e si può usare una: strategia con distribuzione ad albero in modo che il ritardo tra il

generatore e il flip flop sia sempre uguale. I flip flop sono le foglie. Per fare ciò, devo sapere dove

sono i flip flop sul silicio esattamente; una strategia con distribuzione a griglia: si cerca di fare i

ritardi quanto più piccoli è possibile. Si useranno dei buffer molto grossi in grado di erogare molta

corrente!

Immagino di avere 2 registri piazzati in due punti differenti. Dopo il buffer, ci saranno le 2 wire che

arrivano ai due registri. Avremo una C di carico dei registri diverse e quelle della linee diverse. Si

può schematizzare la linea con una rete a T.

Per calcolare lo skew tra le due foglie dell’albero, bisogna valutare il ritardo che il clock impiega per

arrivare nei due punti e farne la differenza.

Dal circuito di sinistra ricaviamo(Elmore delay):

lo skew avrà l’espressione:

Facendo la differenza tra le due espressioni,

Quanto vale? Non si capisce, però il ritardo skew che si ottiene dipende dalle capacità di carico e

soprattutto dalle capacità e dalle resistenze delle LINEE di interconnessione!

Per avere una idea, mettiamo dei numeri e

vediamo cosa otteniamo: supponiamo di

avere dei flip flop realizzati con latch a porte

di trasmissione (quindi sono 8 pmos e

8nmos).

Calcolate le C, portiamo in conto anche la

resistenza per fare due conti. Ho linee in

metal1, supponiamo che la prima linea sia

anche più corta e supponiamo di ottenere

quelle resistenze. Lo skew è di 25.50 ps! Se

usassimo un registro da 64 lo skew diventa veramente grosso!! Se scambiamo però le 2 linee,

possiamo andare molto meglio, e otteniamo uno skew che è più piccolo del primo caso!

Si vorrebbe quindi bilanciare tutti i ritardi, tutte le foglie dell’albero. Una topologia realizzativa

dell’albero è quello dell’albero ad h: ho il clock che tramite un buffer è collegato alla parte centrale

dell’h, poi alla fine di ogni linea verticale ho delle h, se si va a

vedere, i percorsi dal centro alla foglia sono sempre gli stessi! Se

sulla singola foglia dell’albero ho registri diversi, dovrò compensare

usando dei buffer diversi. Se i nodi cui distribuire il clock non sono

perfettamente identici, si può agire sul sizing degli invertitori e sulle

interconnessioni per bilanciare i ritardi.

Supponiamo queste 2 situazioni: il clock ha una capacità piuttosto

elevata (in alto) e l’invertitore è 4x. Le capacità indicate in basso

sono quelle delle linee di trasmissione. Per questo esempio e la

maggior parte dei progetti così si comportano, si trascurano le

resistenze. Calcoliamo allora il ritardo con l’elettrical effort (il logical

dovrebbe essere sempre 1 perché sono invertitori).

La capacità di gate di un invertitore 1X sia 10fF

Il tempo caratteristico della tecnologia (ritardo di un

inverter che pilota un altro inverter identico):

t =10ps

0

La figura riporta le sole capacità di

interconnessione, cui vanno aggiunte

la capacità di ingresso degli inverters e dei registri

Trascuriamo le resistenze delle interconnessioni,

per semplicità.

Valutiamo i ritardi:

Valutiamo la differenza: cambiare le dimensioni dell’invertitore in rosso. Lo porto da area

Per migliorare questo skew, basta

minima a 2x, così ottengo che il primo ritardo nella Ta

peggiora ma migliora di molto e complessivamente il

ritardo verso il punto a è diminuito quindi lo skew è

passato a 7.5ps! cambiando le dimensioni dei buffer

ottengo miglioramenti notevoli!

Abbiamo quindi un miglioramento:

Abbiamo detto che la seconda strategia per distribuire il clock

è quella in cui si vuole minimizzare il ritardo dal generatore di

clock verso tutte le foglie! Si fa una griglia con capacità molto

elevata perché copre tutto il chip: dissiperà molto. La

strategia dice che se minimizzo tutti i ritardi, questi saranno

uguali tra loro! Inoltre, poiché la griglia copre tutto, se in

ultima fase di progetto devo cambiare un mos o un qualcosa,

non devo toccare nulla perché alla fine la griglia sta ovunque

e sto coperto! Si noti come in questo esempio la capacità è dell’ordine

dei nF e la potenza dissipata è il 40 % della totale!!! Si

c’è un primo stadio di

usano due livelli di distribuzione:

buffer più piccoli che pilotano un secondo stadio di buffer

più grandi che pilotano tutto. Il driver misura 58mm

complessivamente!

Il driver centrale è quello che fa da carico al generatore del clock, e

poi ci sono le due SPINE (le due linee

fatte tutte di buffer).

Lo skew non è del tutto ottimizzato. Se

il ritardo massimo è basso, lo skew

complessivo è piccolo a piacere ma

ovviamente più abbasso l’immagine più

dissipo!

Esistono più strategie utilizzate: quella vista è la

centrale, si usa un solo driver centrale; nota i valori di

capacità diversi e i valori di potenza dissipata diversi.

Per capire quanto può essere grande lo skew in un

circuito integrato in funzione della frequenza del

processore, vediamo il grafico. Il valore percentuale

rientra SEMPRE nella fascia del 10% del periodo di

clock, ovviamente se aumenta la frequenza, in

valore assoluto questo skew diminuirà!

Con una distribuzione perfettamente bilanciata la

temperatura non è il fattore che incide di più, bensì

incide maggiormente in assoluto il mismatch dei

dispositivi! Altro esempio reale

che mostra come il

clock nel P4 viene

distribuito: è un

misto tra albero e

piccole griglie.

Nella tecnologia a 90nm (sempre P4) ci si mantiene sotto i 3-4 ps!

Sempre nel p4, si usano tecniche specifiche: una delle cause era l’alimentazione. Si filtrano allora

le variazioni sulle tensioni di alimentazioni. Quello che si sosteneva, è che se si ha un rimbalzo del

10% sulla tensione di alim. Il buffer vede solo una variazione del 2%.

Generazione del clock

Vediamo ora come si genera il clock. I circuiti moderni funzionano con clock di alcuni GHz.

Questo crea 2 problemi:

generazione (generatori a ridotto jitter basati sull’oscillatore

1. al quarzo non forniscono GHz

ma al max 100MHz);

2. se porto il clock on board a 3GHz, devo far commutare delle capacità enormi!! Quello che

si fa è generare un clock a frequenza più bassa e poi portarlo su in frequenza.

La prima strada per generare il segnale di clock è usare anelli ad aggancio di fase (PLL).

In pratica si utilizza un oscillatore a quarzo, per generare un segnale di riferimento a bassa

frequenza, poi degli anelli ad aggancio di fase (PLL) vengono utilizzati on-chip per moltiplicare il

segnale di riferimento esterno e generare il clock alla frequenza desiderata

Quindi il meccanismo degli anelli ad aggancio di fase permette di moltiplicare la frequenza di

un’onda quadra. Sono fatti così:

Sistema a ciclo chiuso. La frequenza prodotta dall’oscillatore controllato in tensione (VCO) viene

in condizioni di aggancio i segnali “reference clock” e “local clock”

controllata in modo tale che,

sono identici (stessa frequenza e fase).

Poiché la frequenza del “local clock” è pari a quella del “system clock”/N, in condizioni di aggancio

“system clock” è N volte quella del “reference clock”.

la frequenza del

I PLL sono sistemi misti Analogico-Digitali (la tensione di controllo del VCO è un segnale

analogico, il filtro di anello è un filtro RC ecc.).

Il filtro di anello deve essere progettato in modo da garantire la stabilità del sistema. Inoltre dal filtro

VCO, dipende il jitter del “system clock”.

di anello, oltre che dal

I PLL:

1. vengono messi in ingresso ai circuiti digitali per elevare la frequenza del clock;

2. serve per distribuire il clock a due dispositivi digitali ed avere un sincronismo. Il pll fa da

buffer senza ritardo. I due clock in ingresso dei sistemi digitali sono esattamente in fase! Il

buffer ovviamente mi servirà sempre, per rendere uguali i ritardi però annullo i ritardi dei

buffer con i pll.

3. posso usare il pll per sincronizzare il trasferimento dati tra 2 circuiti.

I PLL operano come dei buffer a ritardo nullo. Il trasferimento dati fra chip1 e chip2 avviene a

frequenza inferiore rispetto al system clock. I dati

trasmessi sono sincroni con il reference clock

Nel chip 2 si utilizza un PLL per annullare gli

effetti del ritardo del clock buffer (de-skewing): il

segnale di clock al registro del chip2 è

perfettamente allineato con il reference clock,

nonostante la presenza del clock buffer.

Oltre ai PLL posso usare i DLL, circuiti simili che

hanno una struttura simile ai pll ma non c’è

divisione di frequenza e invece di avere un oscillatore controllato in tensione ho una delay line

controllata in tensione. Vediamo il confronto degli schemi a blocchi:

Riferendoci allo schema del DLL possiamo dire che:

Un DLL non ha un oscillatore controllato in tensione, ma una linea di ritardo controllata in

tensione. In condizioni di aggancio, fo ed fREF sono

perfettamente allineati fra di loro (deskewing)

I DLL non consentono di moltiplicare la

frequenza di fREF

Sono sistemi incondizionatamente stabili ed

affetti da minore jitter.

Non posso usarli per moltiplicare il clock, ma

NEL circuito posso usare i DLL per la

temporizzazione/sincronizzazione!

Ecco un modo per avere un buffer a ritardo nullo (VCDL: voltage controlled delay line):

Progetto di Latch e Registri a

livello Transistor

Cap. 7

Ricordiamo la distinzione tra latch e registri:

un latch memorizza quando il clock è

basso (o dualmente alto)

un registro memorizza sul fronte del

clock, che sia di salita o di discesa.

Gli elementi di memoria saranno basati sulla

bistabilità. Non consideriamo elementi di

memoria dinamici.

Il latch lo vediamo riportato in questa figura sotto,

a porte di trasmissione. Le due porte di

trasmissione le possiamo schematizzare come due interruttori. Quando il clk è 1 la porta in alto è

spenta mentre quella in basso è accesa. Il segnale D si riporta in uscita. Siamo quindi in fase di

TRASPARENZA. Viceversa, quando il clock è 0, il sistema si riconfigura come due invertitori

collegati uno dietro

l’altro e siamo in fase

di hold. I due

invertitori

rappresentano

l’elemento di

memoria. Se ci serve

un latch che opera sui

livelli opposti, inverto

tra loro clock e clock negato. Nota che ci sono quattro dispositivi pilotati dal clock che danno una

certa capacità che comporta una Pdissipata e introduce delle problematiche per il clock skew

(maggiore è la capacità della linea, più difficile è controllare lo skew).

Come si può vedere vi è un elevato carico capacitivo sul clock (4 MOS), quindi:

Elevata Pd per pilotare il clock

Maggiori difficoltà per clock skew

Si osservi che queste due porte di trasmissione collegate in questo modo

realizzano un multiplexer. Il D-Latch lo possiamo vedere logicamente

come la struttura di destra. Abbiamo visto che è presente la cascata di un

invertitore con una porta di trasmissione.

Questa può essere vista come tristate.

Esiste allora una configurazione migliore per

realizzare una porta tristate? Si, è quello di figura

sotto.

A livello layout, è più compatto perché non dovendo

mettere un contatto tra due pmos e due nmos (quei

contatti necessari per fare il collegamento che poi ho

eliminato). Si legge che ha un ritardo maggiore, quindi

una resistenza leggermente maggiore! Come si vede dalla figura a lato il clocked

inverter presenta due contatti in meno nel

layout.

Con questo si può anche fare un multiplexer

con i clocked inverter(vedi figura sotto).

In basso metto un invertitore standard al posto del clock inverted. Si risparmia il carico sul clock,

non tanto l’area. Ottengo proprio un bistabile. In fase di memorizzazione non ci sono problemi.

Ora si alza il clock, siamo in fase di trasparenza. In questa fase c’è un problema di

DIMENSIONAMENTO!

Il W/L equivalente del clocked inverter (pilotato da D) deve essere più grande rispetto ai dispositivi

che stanno nell’invetitore di feedback. Nel conflitto al nodo P deve essere più forte il clocked

inverter!

Vediamo cosa deve accadere: questa situazione di errore

vista (che il livello resta a metà e abbiamo dissipazione di

potenza statica) si avrebbe solo se l’uscita dell’invrtitore in

alto fosse FISSATA A 0.

L’uscita dipende dal nodo P con un feedback.

potenziale di P si abbassa sufficientemente da essere visto come livello BASSO, l’invertitore

Se il

in alto commuta e l’uscita va ad 1. In questo modo, si spegne il pmos in basso e si alza l’nmos e il

nodo P va a 0!

Tutto si basa su un opportuno dimensionamento a rapporto: la serie dei due nmos deve essere

tale da far abbassare il potenziale P sufficientemente!

Quindi il pmos deve essere piccolo, i due nmos in serie devono essere grande.

E’ una delle poche applicazioni un cui si usa una L maggiore della Lminima! Questa è una rara

eccezione! Ora passiamo ai registri Master-

Slave. Il sistema complessivo non è

mai trasparente, non c’è mai un

collegamento diretto tra D e Q.

L’uscita Q cambia quando lo slave

diventa trasparente. Dunque, un

registro master slave è realizzato

con due latch attivi sul fronte di

salita (per es) collegati così. Se

volessi farlo attivo sui fronti di

discesa, devo togliere l’invertitore

dal primo latch e metterlo al

secondo.

In basso possiamo vedere la

realizzazione di un registro Master-

Slave con porte di trasmissione:

Si notino il numero di dispositivi pilotati!

Questa è la più semplice che possiamo realizzare. Cerchiamo di stimare in maniera

approssimativa i tempi caratteristici del registro: tsetup, thold, tcq. Quelli più influenti sono il tsetup

e il tcq.

Facciamo un stima del tempo di setup

tsetup: tempo prima del fronte del clock

nel quale il dato deve rimanere stabile.

Questo latch è attivo sul fronte alto del

clock (per capirlo, basta vedere quando

il secondo latch diventa trasparente,

ovvero quando la porta T3 è aperta!)

Inizialmente siamo nella condizione in

cui Clock=0. Se il clock è 0, il dato di ingresso fluisce attraverso T1 e I3 ed è disponibile a I4. Nota

che il dato di ingresso è disponibile anche a I2 ma T2 è spenta. Appena commuta il clock (diventa

1), la porta T2 si apre e se il dato è stabile da parecchio non ci sono problemi perché in ingresso e

in uscita alla T2 ho lo stesso livello logico!! Se invece il dato commuta in prossimità del clock, in

ingresso e in uscita di T2 posso avere segnali differenti e non so cosa succede! Il ritardo che si ha

sul cammino è pari a 3 volte il ritardo dell’invertitore più un ritardo della porta di trasmissione:

Ts=3Ti+Tm Vediamo il ritardo clock to q. Questo

si stima come il ritardo di T3+il

ritardo di I6 (in prima

approssimazione).

Clock to Q: in corrispondenza del

fronte di salita del clock il dato deve

propagarsi attraverso T3 ed I6 per

raggiungere Q

Tq=Ti+Tm

Infine, vediamo il tempo di hold. Durante il fronte di salita, T2 si chiude e T1 si apre (disattiva). Se

ciò accadesse istantaneamente, non avrei problemi.

Possiamo trarre 2 conclusioni:

1) la frazione di periodo consumata dal registro è estremamente grande!

tsetup+tc=4ti+2tm ovvero si mangia 4 volte il ritardo di un invertitore e 2 volte il ritardo di

una porta di trasmissione. Il tempo minimo è proprio il tempo di hold che però non rientra

nella figura di merito velocità del nostro sistema in esame.

2) Posso realizzare un registro a scorrimento? Il ritardo combinatoriale è praticamente 0

(tcmin=0) e la condizione diventa quello di figura. Se però c’è un ritardo sul clock, la

condizione cambia!

In definitiva, sul master slave ho grande carico, il sistema è lento perché il tempo di setup è grande

(ma anche il tcq), è robusto!

Possiamo vedere il grafico del ritardo Tcq:

e come la variabilità del segnale di ingresso

possa inficiare il corretto funzionamento del circuito: FUNZIONAMENTO CORRETTO

VIOLAZIONE DEL TEMPO DI

SETUP

C’è un'altra problematica che vediamo sul flip flop: Clock e clock

negato non sono esattamente uno l’inverso dell’altro, ci sono

degli istanti di tempo in cui si sovrappongono a causa proprio

dell’inserimento dell’invertitore sulla linea di clock!!

A causa di queste “finestre”, potrebbe accadere che:

sono trasparenti entrambi i latch e il dato di ingresso

potrebbe scappare verso l’uscita durante il fronte

sbagliato!

durante la fase di sovrapposizione 1-1, tutti gli nmos delle porte di trasmissione conducono!

Analogamente, se ci sono fasi in cui clock e clock negato sono entrambi 0, conducono tutti i

pmos! E cosa succede in questi casi?? Problema!!

L’unico modo che abbiamo per fare in modo che il circuito funzioni correttamente, è rendere

questa fasi brevissime: posiziono questo invertitore vicinissimo ai latch, le dimensioni vanno scelte

in maniera molto critica e soprattutto vanno fatte simulazioni da tutti i punti di vista!

Reset sincrono ed ascincrono

Il reset serve per inizializzare un registro, per portare tutte le uscite a 0. Non è sincrono.

Se il reset è alto, metto D a 0. Q non va a 0, andrà a 0 al successivo fronte del clock. Il reset

SINCRONO non ha problemi di sorta riguardo la realizzazione hardware. Il mux non è altro che

una and.

Il reset serve per portare il registro in uno stato predefinito (Q=0)

Reset sincrono: il comando di reset non è efficace

immediatamente, ma in corrispondenza del successivo fronte

attivo del clock

Reset asincrono: cambia lo stato del registro, portando Q=0, indipendentemente dal clock

Il reset asincrono deve funzionare anche

quando non c’è clock. Si deve modificare

quindi la struttura interna del registro.

Per effettuare il reset asincrono devo:

spezzare i loop di reazione

portare lo stato dei nodi interni ai valori

in figura al posto dell’altro invertitore che stava nel loop

La soluzione al problema è riportata in figura a lato:

di retroazione metto una NOR il cui ulteriore

ingresso è il reset. Se questo reset vale 0,

dobbiamo verificare che il sistema si comporti

normalmente: in questo caso,la NOR è a tutti gli

effetti un invertitore. Quando il reset è 1, i nodi

in uscita alle NOR si resettano e vanno a 0. Si

noti che rispetto a prima non ci sono invertitori

in serie, in questo modo ho fatto una struttura

NON invertente nel complesso data dalla

cascata di due blocchi invertenti. “enable” che consente, se attivo, di caricare il

Molto spesso è necessario introdurre un segnale di

registro.

La soluzione più intuitiva è il clock-gating che però:

RICHIEDE PARTICOLARE ATTENZIONE

Si introduce un clock skew rilevante

Il registro può acquisire i dati in corrispondenza delle commutazioni di

en, invece che del clock!

Il clock gating è utile per ridurre la dissipazione di potenza (lo

studieremo in quel contesto).

Caricamento condizionale di un registro: inserisco un nuovo segnale di

abilitazione che consente di caricare il registro o meno. Con la soluzione di figura, introduco un

ritardo sul clock e un problema relativo all’enable (leggi in rosso). Questa tecnica è però utile per

ridurre la dissipazione di potenza: sappiamo che il segnale di clock è uno dei più critici. In questo

modo, applicando per esempio l’enable ad un intero modulo, si riduce di molto la pd. Bisogna

comunque stare molto attenti quando si adotta tale soluzione.

Se voglio evitare di usare l’enable sulla linea di clock, uso un multiplexer

sul dato di ingresso!

In vhdl il caricamento condizionale segue proprio questo schema. Se ho un

processo, questo si attiva solo se cambia il clock. Avrò l’if prioritario che è

sul fronte attivo del clock e un if più interno che agisce sul dato iniziale.

Registri avanzati

Esistono altri tipi di registri:

SRAM-based

Sense-amplifier

Latch pulsate

SRAM-based Abbiamo un bistabile fatto con 2 invertitori, i due rami del bistabile

possono essere portati a 0: un ramo tramite D e clk e l’altro tramite

Dnegato e clk.

Il principio di funzionamento di questo circuito è:

per clock=0, spengo i due nmos e il bistabile sta in

memorizzazione.

per clock=1, vogliamo che il sistema sia trasparente. Se per

esempio D=0, l’nmos di sinistra è spento, quello di destra è acceso! Ho

la serie di 2nmos accesi e cercano di portare l’uscita Q a 0. Il circuito

deve essere dimensionato a rapporto! La serie dei due nmos Dnegato e

clock deve essere più forte del PMOS dell’invertitore in alto (che è quello che cercherebbe

di tenerlo ALTO nel caso in cui Q era 1). dell’invertitore deve “debole”

Si effettua un dimensionamento a rapporto, il PMOS essere rispetto

alla serie dei due NMOS.

Faccio un miglioramento sul registro sram ottenendo il LATCH

SINGLE TRANSISTOR CLOCKED. L’idea è semplice: metto in

comune l’nmos del clock. Ho ridotto il numero di transistor e

soprattutto ho ridotto il carico sul clock! Si può avere un

problema: poiché ci sono proprio D e Dnegato sui rami, tra D e

Dnegato ci possono essere interlap in cui per es valgono

entrambi 1! E qui è critico! Allora devo rendere questi interlap

brevi!


PAGINE

117

PESO

5.62 MB

AUTORE

Sara F

PUBBLICATO

+1 anno fa


DETTAGLI
Corso di laurea: Corso di laurea in ingegneria informatica
SSD:
A.A.: 2010-2011

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Sara F di informazioni apprese con la frequenza delle lezioni di ASI architetture sistemi integrati e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Napoli Federico II - Unina o del prof Strollo Maria.

Acquista con carta o conto PayPal

Scarica il file tutte le volte che vuoi

Paga con un conto PayPal per usufruire della garanzia Soddisfatto o rimborsato

Recensioni
Ti è piaciuto questo appunto? Valutalo!

Altri appunti di Asi architetture sistemi integrati

ASI architetture sistemi integrati – Cap. 1
Dispensa
ASI architetture sistemi integrati – Cap. 2
Dispensa
ASI architetture sistemi integrati – Cap. 4
Dispensa
ASI architetture sistemi integrati – Cap. 3
Dispensa