marco vanneschi, architettura degli elaboratori, edizioni ...vannesch/ae2009-10/appunti.pdf ·...

56
Sintesi di alcuni contenuti dei primi capitoli del libro: Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa, 2009 ***** Queste note, assieme ad una raccolta di testi di esercizi e quesiti, contengono il materiale strettamente indispensabile per seguire il corso in attesa dell’uscita del suddetto libro. 1 Strutturazione a livelli di interpretazione 1.1 Macchine virtuali e supporti a tempo di esecuzione Le funzionalità di un sistema di elaborazione nel suo complesso possono essere viste come ripartite, secondo un certo numero di livelli, o macchine virtuali {MV 0 , MV 1 , …,MV n }, come schematizzato in figura: Il livello MV 0 è tipicamente quello dei componenti fisici (elettronici) a partire dai quali viene costruita una astrazione, o virtualizzazione, sempre maggiore delle funzionalità di interesse per il sistema e degli oggetti su cui esso è destinato ad operare. Il livello MV n è quello che possiamo chiamare delle “applicazioni” in quanto fornisce la visione, di volta in volta ritenuta più opportuna degli oggetti e degli e degli strumenti mediante i quali il sistema viene utilizzato dall'esterno. Questo livello necessita normalmente, per potere essere effettivamente implementato, di un procedimento di concretizzazione, o emulazione ottenuto mediante uno o più livelli intermedi {MV j | j = 1, …, n-1}. Nel seguito il livello MV 0 , e solo quello, sarà detto della macchina hardware. Questa definizione potrà forse apparire riduttiva per chi è abituato a considerare “hardware” tutto ciò che riguarda la struttura ed il funzionamento interno di un calcolatore. In effetti, al di là della genericità dei termini “hardware” e “software”, ciò che si vuole evidenziare è che si assume l'esistenza di un livello (MV 0 ) le cui funzionalità sono assunte come non ulteriormente emulabili. In questa sede non siamo cioè interessati a definire il linguaggio L 0 , mentre riteniamo essenziale definire il linguaggio di tutti i rimanenti livelli, compresi quelli più vicini alla macchina hardware. In altri termini, la definizione di ogni livello coincide con la definizione del linguaggio in esso adottato: ciò caratterizza l'approccio ritenuto allo stesso tempo più opportuno e più rigoroso per lo studio dei sistemi di elaborazione. I livelli { MV 0 , …, MV n } sono ordinati secondo una relazione gerarchica. Ciò significa che ogni istruzione primitiva I k i , o meccanismo del linguaggio L i (i > 0) è implementata da un programma P k , o politica, scritto nel linguaggio L j , come mostrato in figura:

Upload: leduong

Post on 18-Feb-2019

229 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

Sintesi di alcuni contenuti dei primi capitoli del libro:

Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa, 2009

*****

Queste note, assieme ad una raccolta di testi di esercizi e quesiti, contengono il materiale strettamente

indispensabile per seguire il corso in attesa dell’uscita del suddetto libro.

1 Strutturazione a livelli di interpretazione

1.1 Macchine virtuali e supporti a tempo di esecuzione

Le funzionalità di un sistema di elaborazione nel suo complesso possono essere viste come ripartite, secondo

un certo numero di livelli, o macchine virtuali {MV0 , MV1, …,MVn

}, come schematizzato in figura:

Il livello MV0 è tipicamente quello dei componenti fisici (elettronici) a partire dai quali viene costruita una

astrazione, o virtualizzazione, sempre maggiore delle funzionalità di interesse per il sistema e degli oggetti

su cui esso è destinato ad operare. Il livello MVn è quello che possiamo chiamare delle “applicazioni” in

quanto fornisce la visione, di volta in volta ritenuta più opportuna degli oggetti e degli e degli strumenti

mediante i quali il sistema viene utilizzato dall'esterno. Questo livello necessita normalmente, per potere

essere effettivamente implementato, di un procedimento di concretizzazione, o emulazione ottenuto

mediante uno o più livelli intermedi {MVj | j = 1, …, n-1}.

Nel seguito il livello MV0, e solo quello, sarà detto della macchina hardware. Questa definizione potrà

forse apparire riduttiva per chi è abituato a considerare “hardware” tutto ciò che riguarda la struttura ed il

funzionamento interno di un calcolatore. In effetti, al di là della genericità dei termini “hardware” e

“software”, ciò che si vuole evidenziare è che si assume l'esistenza di un livello (MV0) le cui funzionalità

sono assunte come non ulteriormente emulabili. In questa sede non siamo cioè interessati a definire il

linguaggio L0, mentre riteniamo essenziale definire il linguaggio di tutti i rimanenti livelli, compresi quelli

più vicini alla macchina hardware.

In altri termini, la definizione di ogni livello coincide con la definizione del linguaggio in esso adottato: ciò

caratterizza l'approccio ritenuto allo stesso tempo più opportuno e più rigoroso per lo studio dei sistemi di

elaborazione.

I livelli { MV0, …, MVn} sono ordinati secondo una relazione gerarchica. Ciò significa che ogni istruzione

primitiva Iki, o meccanismo del linguaggio Li (i > 0) è implementata da un programma Pk, o politica, scritto

nel linguaggio Lj, come mostrato in figura:

Page 2: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

2

dove:

a) 0 ≤ j < i: anche se il caso più frequente è quello in cui j = i 1, talvolta possono esistere varie

ragioni, legate alle prestazioni del sistema e/o al costo dell'implementazione, per le quali conviene

che sia j < i 1;

b) se Ik1i e Ik2

i sono meccanismi distinti di Li , essi possono essere implementati da politiche scritte

rispettivamente con Lj1 e Lj2, dove j1 ≠ j2 , anche il caso più frequente è quello in cui j1 = j2:

valgono considerazioni analoghe al caso precedente.

In altri termini, il concetto che sta alla base della strutturazione a livelli è il seguente:

1. per ogni livello MVi (i > 0) l'insieme dei livelli {MVj | 0 ≤ j < i} premette di implementare

complessivamente il supporto a tempo di esecuzione di Li, STE (Li ), cioè una collezione di algoritmi e

strutture dati che provvedono all'interpretazione dei meccanismi di Li ;

2. tale supporto è a sua volta strutturato in modo gerarchico (per i > 1), riconoscendo un livello più alto

MVi-1 il cui supporto a tempo di esecuzione è implementato dai livelli {MVh | 0 < h < i-1} e così via.

Consideriamo inoltre che (come mostrato nella figura precedente):

i) l'insieme degli oggetti Ri di MVi è direttamente accessibile soltanto da parte dei meccanismi di Li, e

ii) ad un certo livello MVi non sono note le politiche adottate dai livelli inferiori per implementare STE

(Li).

Sempre con riferimento alla figura precedente, notiamo che per rendere possibile l'implementazione di un

meccanismo Iki, di MVi occorre definire con chiarezza una interfaccia nei confronti del livello MVj che lo

implementa. La natura di questa interfaccia sarà di volta in volta dipendente dallo specifico livello

considerato, e talvolta la sua definizione ed implementazione costituirà un problema tutt'altro che banale. Ciò

che per ora interessa è che essa deve permettere l'invocazione di Iki, con i relativi parametri, nei confronti di

STE (Li ) nei rispetti dei principi precedentemente enunciati.

Può risultare conveniente pensare il meccanismo di invocazione come chiamata di procedura. Vedremo

comunque in varie architetture altre modalità di interfacciamento dei livelli.

Page 3: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

3

1.2 Livelli tipici

Allo scopo di esemplificare i concetti introdotti nel paragrafo precedente, consideriamo la tipica

strutturazione a livelli di un sistema mostrata in figura:

MV4 : APPLICAZIONI

R4 = {oggetti astratti, qualunque tipo di dato definibile da utente}

L4 = {C, C++, Java, …, ML, …, linguaggi paralleli}

MV3 : SISTEMA OPERATIVO

R3 = {spazio di memoria principale e secondaria, processori, dispositivi di I/O, file,

programmi, …}

L3 = un linguaggio di programmazione concorrente per esprimere processi / un

linguaggio sequenziale arricchito da librerie che implementano meccanismi di

concorrenza

MV2 : MACCHINA ASSEMBLER

R2 = {locazioni di memoria e di I/O, registri generali, … }

L2 = linguaggio assembler

MV1 : MACCHINA FIRMWARE

R1 = {registri, operatori aritmetico-logici, strutture di interconnessione intra-unità e

inter-unità,…}

L1 = linguaggio di microprogrammazione (microlinguaggio)

MV0 : MACCHINA HARDWARE

R0 = {porte logiche implementate da componenti elettronici, collegamenti

fisici,…}

L0 = ?

1.2.1 Macchina firmware

Il livello MV1, della macchina “firmware”, è interpretato direttamente dall'hardware ed è quindi sempre

presente in qualunque tipo di sistema. A questo livello viene data la descrizione tanto del funzionamento

interno di ogni unità di elaborazione (ad esempio: un processore, un banco di memoria), quanto di quello più

unità interagenti (ad esempio: un calcolatore nel suo complesso).

D'ora in poi, quando studieremo una certa architettura al livello firmware, intenderemo riferirci allo schema

del sistema di elaborazione come costituito da un certo numero di unità interconnesse ed interagenti. Ad

esempio:

calcolatore uniprocessor = {Memoria Principale (M), Processore (P), Unità di Ingresso-Uscita (I/O1,

…, I/Ok), e relativi collegamenti};

multiprocessor = {Memoria principale condivisa M = {M1, …, Mm}, {Processori P1, …, Pn},

{Unità di ingresso-uscita o co-processori I/O1, …, I/Ok}};

rete di calcolatori = {N1, …, Nn}, dove ogni nodo di elaborazione Ni è costituito da un calcolatore

convenzionale o da un multiprocessore o a sua volta da una rete di calcolatori.

La macchina hardware viene virtualizzata mediante un insieme di microprogrammi, cioè di sequenze di

operazioni di trasferimento tra registri. Tali microprogrammi supportano l'esecuzione di istruzioni di

macchina (definite al livello MV2) e spesso anche di altri meccanismi, ad esempio di primitive di sistema

operativo o costrutti di linguaggi ad alto livello.

Page 4: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

4

1.2.2 Macchina assembler

Il livello MV2 è indicato, in genere, come macchina assembler. In effetti il linguaggio L2 (erroneamente

detto talvolta “linguaggio macchina”) è un sottoinsieme di un linguaggio assembler, decurtato dalle

dichiarazioni o pseudo-istruzioni per l’allocazione/gestione di risorse (ad esempio: aree di memoria

principale di I/O).

Si noti come il livello MV2 non è di per sé essenziale e, come approfondiremo nella prossima sezione, ha

come scopo fondamentale quello di fungere da linguaggio intermedio per la compilazione di programmi.

In effetti il “vero linguaggio macchina” va considerato il linguaggio di microprogrammazione a livello

firmware.

1.2.3 Sistema operativo

Il livello MV3, del sistema operativo, provvede a gestire le risorse fondamentali del sistema (spazi di

memorizzazione, processori, dispositivi di I/O, archivi) nei confronti dei programmi applicativi ottimizzando

l'uso di tali risorse nella maniera ritenuta più conveniente per una certa architettura ed il relativo campo di

applicazioni. Da questo punto di vista, il sistema operativo è un insieme di servizi, standard e preesistenti,

offerti alle applicazioni.

Nella figura seguente è mostrato un tipico schema di MV3, ottenuto mediante una ulteriore decomposizione

in livelli sul cui significato strutturale torneremo nel seguito.

MV3.2 Funzioni di supervisione / gestione programmi

MV3.1 Gestione delle risorse fondamentali, eccetto processori

MV3.0 Gestione di processi e processori

Il livello MV3.0, detto nucleo del sistema operativo, provvede alla gestione del processore nei confronti di

attività concorrenti (“processi “) sia di utente che di sistema. Mentre i livelli MV2 ed MV1 realizzano una

astrazione di MV0 mediante la quale il sistema è in grado di eseguire singoli programmi sequenziali

(scritti/tradotti in linguaggio macchina), il livello MV3.0 estende tali capacità per supportare l'esecuzione

concorrente di più programmi sulla data architettura firmware: questo allo scopo di aumentare le prestazioni

del sistema e/o di ottimizzare l'uso delle risorse.

Il nucleo del sistema operativo costituisce dunque un livello fondamentale per ogni sistema, e spesso le scelte

architettoniche saranno guidate dalle esigenze di ottenere un nucleo il più possibile efficiente ed affidabile.

In alcune situazioni particolarmente critiche, le funzionalità del nucleo sono implementate direttamente a

microprogramma e/o con l'aiuto di unità di elaborazione specializzate. Al livello MV3.1 (eventualmente

decomponibile a sua volta) ha luogo la gestione delle altre risorse fondamentali, su richiesta delle

funzionalità attive al livello MV3.2, usando i meccanismi implementati da MV3.0.

Il livello MV3.2 costituisce l'interfaccia nei confronti delle applicazioni. Esso ad esempio contiene

l'interprete del linguaggio dei comandi interattivo/batch, oppure realizza una macchina virtuale per ogni

linguaggio adottato dagli utenti del sistema, e spesso provvede alla “schedulazione” ad alto livello dei

processi derivanti dai programmi applicativi.

Page 5: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

5

1.3 Compilazione e interpretazione

Il concetto di supporto a tempo di esecuzione è legato alla comprensione di concetti fondamentali circa la

compilazione e l’interpretazione di linguaggi: anche se questi aspetti sono studiati in diversi altri corsi, si

ritiene conveniente riportare, in questa sede, alcune considerazioni che aiutino ad acquisire la necessaria

sensibilità.

Il fine ultimo di un calcolatore è quello di rendere possibile l’esecuzione di programmi. Cominciamo con il

caratterizzare questa generica affermazione:

1. i programmi vengono progettati mediante linguaggi ad alto livello. Per ragioni di efficienza e di

generalità, occorre prevedere una traduzione da linguaggio ad alto livello nella forma intermedia del

linguaggio assembler;

2. i calcolatori a cui ci riferiamo devono permettere l’esecuzione di qualunque programma: devono cioè

essere general-purpose. Come sempre accade, coniugare generalità ed efficienza è un problema

complesso: uno dei principali obiettivi dell’Architettura degli Elaboratori è dare soluzioni ragionevoli

a questo problema;

3. la traduzione dal programma sorgente (in gergo, “codice sorgente”) scritto in linguaggio ad alto

livello, nel programma oggetto o eseguibile (in gergo, “codice oggetto” o “codice eseguibile”),

espresso in linguaggio assembler, può essere effettuata secondo una delle due ben note tecniche, la

compilazione e l’interpretazione, o loro combinazioni. In entrambi i casi, il punto di partenza è una

sequenza di comandi, costituenti il programma scritto nel linguaggio ad alto livello, operanti su

determinati insiemi di dati. Un compilatore o un interprete sono essi stessi dei programmi, già

disponibili in forma eseguibile, che accettano come dato d’ingresso il programma sorgente (una

rappresentazione opportuna della sequenza di comandi e rispettivi dati) e producono come dato di

uscita il programma eseguibile;

4. un traduttore di tipo interprete scandisce tale sequenza sostituendo ogni singolo comando con una

sequenza di istruzioni assembler nota, detta l’interprete di quel comando. Questa forma di traduzione è

effettuata dinamicamente, cioè a tempo di esecuzione, da cui la dizione, equivalente a quella di

interprete di un linguaggio, di supporto a tempo di esecuzione di quel linguaggio;

5. un traduttore di tipo compilatore sostituisce l’intera sequenza del programma sorgente con una

sequenza di istruzioni assembler. Questa forma di traduzione è effettuata staticamente, cioè in fase di

preparazione prima che il programma passi in esecuzione. Anche il compilatore deve disporre di

regole per sostituire ogni comando del programma sorgente con il rispettivo supporto a tempo di

esecuzione, ma, a differenza dell’interpretazione:

la compilazione prende in esame tutto il programma sorgente,

per ogni comando del linguaggio sorgente, esistono più sequenze eseguibili, tra le quali

selezionare quella più indicata per tenere conto efficientemente del contesto in cui il comando si

trova ad essere inserito.

In generale nella traduzione da parte di un interprete, poiché questa avviene passo passo, non viene

considerato il contesto in cui si trova il comando da interpretare a ogni passo, applicando sempre la stessa

regola di traduzione per uno stesso comando; invece, la traduzione da parte di un compilatore prende in

considerazione una sequenza, più o meno ampia, in cui si trova inserito un comando e, per uno stesso

comando, sceglie tra regole di traduzione diverse allo scopo di ottimizzare le prestazioni (ad esempio, il

tempo di elaborazione del programma e/o l’occupazione di memoria). La fase di ottimizzazione è in effetti

quella che caratterizza più pesantemente un compilatore: allo stato attuale della tecnologia, nel confronto tra

due calcolatori di costruttori diversi, quello con il compilatore migliore può talvolta riuscire a colmare il gap

prestazionale dovuto ad un processore peggiore.

Una classe importante di ottimizzazioni a tempo di compilazione è quella relativa la miglior sfruttamento

delle caratteristiche architetturali, ad esempio la memoria cache e/o l’architettura internamente parallela di

processori.

Sulle caratteristiche di compilatori e interpreti torneremo frequentemente nei vari capitoli. Vale fin da ora la

pena di rimarcare che:

Page 6: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

6

a) anche nel caso della pura interpretazione, è sempre presente “un minimo di compilazione”, consistente

nelle rappresentazione del programma sorgente in un formato facilmente comprensibile all’interprete;

b) raramente siamo in presenza di linguaggi soggetti a compilazione pura o a interpretazione pura. Ad

esempio, anche in linguaggi che facciano soprattutto uso di compilazione, il supporto di eventuali

comandi per esprimere strutture dati dinamiche in modo primitivo (come new o malloc) è

necessariamente implementato mediante interpretazione;

c) a livello assembler ed a livello firmware l’unica forma di traduzione possibile è l’interpretazione. La

dimostrazione di questa importante affermazione emergerà dai concetti studiati nelle varie parti del

testo.

1.4 Livelli di interpretazione e livelli funzionali

È importante distinguere il caso in cui la gerarchia dei livelli è effettivamente riflessa nella loro

implementazione, in accordo alla strutturazione definita nella sez. 1.1, da quello in cui la gerarchia ha

soltanto uno scopo funzionale di comodo.

Si ha una gerarchia di interpretazione se, dato il livello MVi, non esiste alcun meccanismo di {Lj | j < i}

che viene implementato da MVi. Ciò equivale a dire che ogni livello sottostante ad MVi fa parte di STE(Li).

Si ha invece una gerarchia funzionale (in senso più lato) tra due livelli MVi ed MVj quando non esiste una

relazione di ordinamento tra Li ed Lj : alcuni meccanismi di Li sono implementati da politiche di MVj ,

mentre per altri vale il viceversa.

Quando questo avviene, si ha in pratica che i livelli MVi ed MVj adottano lo stesso linguaggio.

Riferiamoci ad esempio alla strutturazione di un sistema operativo. I livelli MV3.1 ed MV3.2 possono essere

progettati usando uno stesso linguaggio (di programmazione concorrente) supportato da MV3.0. Le

invocazioni da parte di funzioni (processi) di MV3.2 ad MV3.1 sono effettuate usando gli stessi meccanismi

mediante i quali avviene la cooperazione all'interno MV3.1 ed MV3.2. È poi in generale possibile che

funzioni di MV3.1 invochino funzioni di MV3.2. In questo caso, dunque, la decomposizione tra MV3.1 ed

MV3.2 è esclusivamente funzionale mentre MV3.0 rappresenta effettivamente un livello distinto. Una

gerarchia di interpretazione si avrebbe se il linguaggio di MV3.2 fosse realmente diverso da quello di

MV3.1, nel qual caso STE (L3.2) includerebbe MV3.1.

Un caso ancora più significativo è quello delle applicazioni: il livello MV4 può essere in relazione

funzionale con il livello MV3, invece che in relazione gerarchica. Come avremo modo di studiare trattando

la strutturazione a processi, le applicazioni vengono compilate in (uno o più) processi che interagiscono con

le funzionalità del sistema operativo ai livelli MV3.1 e MV3.2 allo scopo di utilizzarne i servizi offerti. In

altri termini, ai processi applicativi vengono “collegate” (linking) le necessarie funzionalità di sistema

operativo. Questo linking può essere implementato, nel modo più immediato ed efficiente, descrivendo i

processi applicativi ed i processi di sistema con lo stesso linguaggio concorrente. La “fotografia” di un

sistema ai livelli MV4 e MV3, ad un certo istante, consiste in una rete di processi tra loro interagenti, alcuni

di sistema (preesistenti e sempre presenti), altri applicativi (creati dinamicamente).

Adottando la soluzione ora introdotta (come vedremo, non l’unica possibile, ma certamente la più chiara

concettualmente), non esiste, dunque, gerarchia di interpretazione tra MV4 e MV3, ma solo un gerarchia

funzionale dovuta al fatto che la versione eseguibile dei processi applicativi sfrutta i servizi messi a

disposizione da parte dei processi di sistema mediante, e ciò avviene mediante interazioni con tali processi di

sistema.

Vale infine la pena di notare intuitivamente che la riduzione del numero dei livelli di interpretazione implica

in generale un aumento di prestazioni in termini di tempo di elaborazione.

Page 7: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

7

2 Rappresentazione binaria delle informazioni

Nei sistemi di elaborazione, i numeri e, in generale, tutte le informazioni sono rappresentate come stringhe di

bit mediante il sistema binario. I normali numeri decimali consistono di una stringa di cifre decimali e, a

volte, di una virgola per la separazione dei decimali. Il sistema di numerazione è basato sulla notazione

posizionale, ed il valore di un numero è ottenuto con uno sviluppo polinomiale; ad esempio, per un numero

naturale in base 10:

5738 = 5 103 + 7 10

2+ 3 10

1+ 8 10

0

Lavorando con i calcolatori, è spesso conveniente usare basi diverse da 10 e quelle più frequentemente usate

sono la base 2, ed anche 8 e 16. I sistemi di numerazione basati su questi numeri sono rispettivamente

chiamati binario, ottale ed esadecimale.

Un sistema a base k richiede k simboli differenti per rappresentare le cifre da 0 a k - 1. Così i numeri

decimali sono scritti usando le 10 cifre decimali: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Invece i numeri binari sono

costruiti esclusivamente con le due cifre binarie: 0, 1 (binary digit: bit). I numeri ottali sono costruiti con le

otto cifre ottali: 0, 1, 2, 3, 4, 5, 6, 7. Infine, per i numeri esadecimali, sono necessarie 16 cifre; così si

richiedono sei nuovi simboli e, convenzionalmente, vengono usate le lettere maiuscole dalla A alla F per i sei

simboli che seguono il simbolo 9: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. Il numero binario equivalente al

numero decimale 5738 (in breve nel seguito useremo l'espressione "5738 in binario" o il simbolo 57382) è:

1011001101010 = 1 212

+ 0 211

+ 1 210

+ 1 29 + 0 2

8 + 0 2

7 + 1 2

6 + 1 2

5 + 0 2

4 + 1 2

3 + 0 2

2 + 1

21 + 0 2

0 = 5738

2.1 Conversione decimale-binario e binario-decimale

Questi aspetti saranno di continua applicazione nei vari capitoli, ragion per cui è necessario che siano del

tutto familiari e che vengano utilizzati con disinvoltura e rapidità. Anzitutto, è necessario avere presente la

tabella delle potenze di 2 (funzione 2j, con j numero naturale):

j 2j j 2

j

0 1 11 21 2

10 = 2K

1 2 12 4K

2 4 20 210

210

= 1K 1K = 1M (Mega)

3 8 21 2M

4 16 30 210

220

= 1K 1M = 1G (Giga)

5 32 31 2G

6 64 32 4G

7 128 40 210

230

= 1K 1G = 1T (Tera)

8 256 41 2T

9 512 ecc. ecc.

10 1024 = 1K (Kilo) ecc. ecc.

È sufficiente ricordarsi le prime dieci righe e le potenze notevoli (Kilo, Mega, Giga, Tera, …), dopo di che

qualunque numero si ottiene mediante facili prodotti di potenze note.

La conversione da binario in decimale si effettua, nel modo più semplice, applicando lo sviluppo

polinomiale, come nell’esempio precedente di 57382.

La conversione da decimale in binario può essere fatta in due modi:

Page 8: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

8

1. il primo (del tutto generale) deriva direttamente dalla definizione di numero binario: dal numero

decimale viene sottratta la massima potenza di 2 minore del numero stesso e lo stesso processo è

ripetuto sulla differenza risultante. Una volta decomposto il numero in potenze di 2, si ottiene il

numero binario ponendo 1 nelle posizioni di bit corrispondenti alla potenza di 2 usata nella

decomposizione e 0 nelle restanti posizioni;

2. l'altro metodo (valido per i soli numeri interi) consiste nel dividere ripetutamente il numero decimale

per 2, considerando i resti, finché si ottiene come quoziente il numero 0. Il numero binario è dato

dalla stringa dei resti in ordine inverso rispetto a come sono stati ottenuti.

2.2 Prime nozioni di numeri binari con segno

Per la rappresentazione dei numeri con segno sono usati principalmente tre metodi. In tutti, il bit più

significativo è (anche) il bit del segno: 0 = +, 1 = .

a) Modulo e segno: i bit restanti, tolto il bit del segno, rappresentano il valore assoluto (modulo) del numero.

Ad esempio:

+ 25 = 011001

25 = 111001

Per quanto molto intuitivo, questo metodo non è sempre il più efficiente per l’aritmetica binaria. Più spesso

si usano gli altri due metodi, ed in particolare il metodo in complemento a due.

b) Complemento a uno: se il numero è positivo, il numero in complemento a uno è uguale a quello modulo

e segno, mentre, se il numero è negativo, si ottiene complementando bit a bit la rappresentazione modulo e

segno. Ad esempio:

+ 25 = 011001

25 = 100110

c) Complemento a due: se il numero è positivo, il numero in complemento a due è uguale a quello modulo e

segno, mentre, se il numero è negativo, si ottiene sommando uno alla rappresentazione in complemento a

uno. Ad esempio:

+ 25 = 011001

25 = 100110 + 1 = 100111

L'eventuale riporto sul bit più a sinistra è semplicemente ignorato.

Sia il sistema modulo e segno che quello del complemento ad uno hanno due rappresentazioni possibili per il

valore zero, cioè +0 e -0. Questa situazione è altamente indesiderata. Il sistema del complemento a due non

ha questo problema perché il complemento a due di +0 è ancora +0. Ma anche questo sistema presenta una

singolarità: il numero costituito da un 1 seguito da tutti 0 è il complemento di sé stesso e questo fatto rende

l'intervallo dei numeri positivi asimmetrico rispetto a quello dei negativi: esiste cioè un numero negativo

senza il corrispondente controvalore positivo. Qualsiasi insieme di numeri reali con tanti numeri negativi

quanti sono i positivi ed un solo zero è costituito da un numero dispari di elementi, mentre m bit consentono

di rappresentare un numero pari di elementi. Perciò ci sarà sempre o una configurazione di troppo o una di

meno, indipendentemente dal tipo di rappresentazione scelto. Questa configurazione in più potrà essere usata

per il valore per il massimo valore negativo, o per qualsiasi altra cosa, ma questo sarà sempre e solo una

convenzione.

2.3 Prime nozioni di aritmetica binaria

La seguente tabella fornisce, in modo analogo rispetto a quanto siamo abituati nella numerazione decimale,

la definizione della funzione addizione di due bit:

Page 9: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

9

addendo addendo somma riporto

0 0 0 0

0 1 1 0

1 0 1 0

1 1 0 1

Con questa regola, due numeri binari possono essere sommati, a partire dal bit più a destra, sommando i

corrispondenti bit nei due addendi. L'eventuale riporto è portato a sinistra di una posizione, proprio come

nella somma decimale.

Nell'aritmetica in complemento ad uno il riporto generato dall'addizione sul bit più a sinistra è aggiunto al bit

più a destra; questo processo e' chiamato di "riporto circolare". Nell'aritmetica in complemento a due il

riporto generato dall'addizione sul bit più a sinistra è semplicemente scartato.

Se due addendi sono di segno opposto non può capitare un errore di traboccamento (overflow), mentre se

sono di ugual segno e il risultato è di segno opposto significa che si è avuto un errore di overflow e il

risultato non è corretto. Nell'aritmetica sia del complemento ad uno che del complemento a due l'errore di

overflow può capitare se e solo se il riporto che arriva al bit di segno differisce dal riporto che esce dal bit di

segno. Normalmente in uscita da un addizionatore si ha anche sia il riporto sul bit del segno che uno speciale

bit di overflow.

Queste nozioni verranno integrate nei vari capitoli quando necessario o come esempio.

2.4 Proprietà fondamentali

Una proprietà fondamentale dei numeri binari è la seguente:

Con k bit si possono rappresentare tutti i numeri naturali che vanno da 0 a 2k – 1, estremi inclusi (cioè,

il massimo numero naturale esprimibile con k bit è uguale a 2k – 1).

Altrettanto fondamentale è la seguente proprietà:

Sia un insieme di m oggetti dello stesso tipo. Vogliamo denotare ogni oggetto con un numero naturale

distinto, cioè un identificatore unico dell’oggetto, rappresentato in binario. Il minimo numero di bit

necessario per rappresentare un qualunque identificatore è

mn 2lg

Queste proprietà saranno applicate, ad esempio, con riferimento alle memorie e agli indirizzi di memoria,

come vedremo in una prossima sezione. Ad esempio, per un insieme di 1K oggetti, occorrono (almeno) 10

bit per identificarli univocamente tutti; per un insieme di 3000 oggetti, occorrono 12 bit.

Si osservi che m2lg è il minimo numero di bit necessari per identificare un oggetto. In alcuni casi, potrà

capitare che il numero di bit per rappresentare gli identificatori sia un vincolo del problema e che sia

ridondante rispetto al numero di oggetti: in tal caso, un qualunque identificatore avrà un certo numero di bit

più significativi uguale a zero, oppure alcune configurazioni di bit non saranno significative.

2.5 Alcune proprietà utili

a) Quoziente e resto della divisione per potenze di 2

Siano A e B due numeri binari corrispondenti a numeri naturali, e sia B = 2h. In questa ipotesi, è molto facile

il calcolo del quoziente della divisione intera e del resto (modulo):

Page 10: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

10

il valore di A%B (A mod b) è dato dagli h bit meno significativi di A,

il valore di A/B (A div B) è dato dai rimanenti bit più significativi di A.

Ad esempio sia A = 723 (A2 = 1011010011), e B = 16 = 24, per cui A%B = 3 0011 (rappresentato dai 4 bit

meno significativi di A) e A/B = 45 101101 (rappresentato dai rimanenti 6 bit più significativi di A):

Come caso particolare notevole:

un numero binario pari (dispari) ha il bit meno significativo uguale a 0 (1).

b) Operazioni di traslazione (shift) e rotazione

Dato un numero binario naturale A, la sua traslazione destra (shift destro) di 1 bit

)(1 AshR

è il numero naturale che si ottiene spostando tutti i suoi bit a destra di una posizione e inserendo il valore 0

nel bit più significativo; il vecchio bit meno significativo viene perso.

Dato un numero binario naturale A, la sua traslazione sinistra (shift sinistro) di 1 bit

)(1 AshL

è il numero naturale che si ottiene spostando tutti i suoi bit a sinistra di una posizione e inserendo il valore 0

nel bit meno significativo; il vecchio bit più significativo viene perso.

Valgono le seguenti proprietà, facilmente dimostrabili (ad esempio, a partire dalla proprietà di mod e div):

1. 2/)(1 AAshR

2. n

L AAsh 2mod2*)(1 , dove n è il numero di bit di A.

Le proprietà sono generalizzabili alla traslazione di k posizioni, a destra )(Ashk

R ed a sinistra )(Ashk

L :

1. kk

R AAsh 2/)(

2. nkk

L AAsh 2mod2*)(

Quello finora definito è lo shift così detto logico, applicato di regola a numeri naturali. Se i numeri sono con

segno, lo shift aritmetico è quello che si applica a tutti i bit tranne il bit del segno.

L’operazione di rotazione (destra o sinistra) di k posizioni è definita spostando circolarmente di k posizioni

tutti i bit del numero naturale (rotazione logica; oppure rotazione aritmetica se non viene interessato il bit del

segno). L’operazione di rotazione non comporta perdita di bit né inserzione di nuovi bit

c) Concatenamento di numeri binari

Sia A un numero naturale di n bit e B un numero naturale di m bit. La concatenazione di A e B

BA

A % 24 A / 2

4

1 1 0 1 0 0 1 1 0 1

A

Page 11: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

11

è il numero naturale di n +m bit, che ha gli n bit più significativi uguali a quelli di A e gli m bit meno

significativi uguali a quelli di B.

Ad esempio: A = 100110, B = 01, BA = 10011001.

Per ricavare il valore di BA a partire dai valori di A e B, consideriamo le rappresentazioni di A e di B su n

+ m bit: quella di A (A’) ha gli m bit più significativi tutti uguali a 0, quella di B (B’) ha gli n bit più

significativi tutti uguali a zero:

A’ = 00 100110 , B’ = 000000 01

Trasliamo A’ a sinistra di m posizioni e sommiamo il risultato a B’:

)'(Ashm

L = 100110 00 +

B’ = 000000 01

ottenendo proprio BA . Dunque, in generale vale la seguente proprietà:

BABA m 2

d) Contatori

Nell’implementazione di loop a livello firmware, ci troveremo spesso nella situazione di valutare la

condizione di uscita da un for ripetuto per un numero di volte N.

Consideriamo prima il caso che N = 2n. Per scandire i passi del for, consideriamo una variabile I inizializzata

al valore 0 e incrementata ad ogni passo. I viene rappresentata su n + 1 bit. Quando I assume il valore 2n

significa che sono già stati effettuati gli N passi. Per cercare un predicato il più possibile semplice, abbiamo

che:

la condizione di uscita dal for è che il bit più significativo di I assuma il valore 1.

Se non vogliamo fare ipotesi su N, consideriamo I rappresentata su

N2lg bit

inizializziamo I al valore N-1, e decrementiamola ad ogni passo. La condizione di uscita dal for è che I

assuma il valore –1. Per cercare un predicato il più possibile semplice, abbiamo ancora che:

la condizione di uscita dal for è che il bit più significativo di I assuma il valore 1 (ora si tratta del bit

del segno).

Page 12: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

12

3 Reti logiche combinatorie

Una rete combinatoria è una rete logica che ha n ingressi binari x1, …, xn ed m uscite binarie z1, …, zm. A

ciascuna combinazione dei valori degli ingressi corrisponde una ed una sola combinazione dei valori delle

uscite. x1, …, xn e z1, …, zm sono dette variabili logiche, di ingresso e di uscita rispettivamente. Tutte le

combinazioni possibili delle variabili logiche sono dette stati, di ingresso (in numero di 2n) e di uscita (in

numero di 2m) rispettivamente.

Per descrivere le proprietà e la struttura interna delle reti combinatorie si usa un’algebra isomorfa all’algebra

della logica, chiamata algebra della commutazione.

3.1 Elementi di algebra booleana della commutazione

L’algebra della commutazione è un sistema algebrico in cui ogni variabile può assumere uno solo tra due

valori, 0 e 1, nel quale sono applicate alle variabili le operazioni binarie di moltiplicazione logica e somma

logica e l’operazione unaria di complementazione o negazione. Queste operazioni, anche dette funzioni

logiche base, sono chiamate AND (), OR () e NOT () e sono definite come indicato di seguito. Quando

non sorga ambiguità, al posto di A B (A B) verrà usata la notazione semplificata AB (A+B).

A B A B = AB

0 0 0

0 1 0

1 0 0

1 1 1

A B A B = A+B

0 0 0

0 1 1

1 0 1

1 1 1

A A

0 1

1 0

Queste definizioni costituiscono i postulati di base dell’algebra della commutazione. Altre proprietà

notevoli, tutte ricavabili da questi postulati, possono essere enunciate mediante i seguenti teoremi:

1. Complementazione: 01 AAAA

2. Involuzione: AA

3. Potenza identica: AAAAAA

4. Unione e intersezione 0011

10

AA

AAAA

5. Proprietà commutativa: BAABABBA

Page 13: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

13

6. Proprietà associativa: CABBCACBACBA )()()()(

7. Proprietà distributiva: ))(()()( CABABCAACABCBA

8. Teorema di De Morgan: BAABBABA

Il metodo più semplice per dimostrare tali teoremi è quello cosiddetto della “perfetta induzione” che consiste

nel verificare l’uguaglianza delle relazioni per tutte le combinazioni dei valori delle variabili. Questo metodo

si può facilmente applicare perché ogni variabile può assumere solo due valori.

Dalle relazioni che enunciano i teoremi precedenti notiamo che ciascuna di queste (tranne la seconda) è

affiancata da un’altra relazione che si ottiene dalla prima sostituendo AND con OR e viceversa, ed ogni 0

con 1 e viceversa. L’algebra della commutazione gode infatti della proprietà, insita nella simmetria delle

operazioni di AND e OR, di poter trasformare, con la regola ora enunciata, una data relazione in un’altra

relazione chiamata duale.

Una funzione logica può essere rappresentata sia da una tabella di verità, sia da una espressione algebrica.

Tuttavia, mentre c’è una sola tabella di verità per ogni funzione, vi sono molte espressioni che possono

rappresentare una stessa funzione.

Per esempio, le due espressioni:

yxxzyxzx

zyxzyx

rappresentano la stessa funzione, definita dalla seguente tabella di verità:

x y z f

0 0 0

0 1 0

1 0 0

1 1 0

0 0 1

0 1 1

1 0 1

1 1 1

0

1

1

0

1

1

1

1

Due espressioni che rappresentano la stessa funzione sono chiamate equivalenti.

Tra tutte le espressioni equivalenti di una stessa funzione ve ne sono due di particolare interesse che hanno

forme ben definite. Chiamiamo lettera una variabile affermata o complementata e termine un prodotto di

lettere (termine prodotto) o una somma di lettere (termine somma) che compare in un’espressione.

Chiamiamo mintermine un termine prodotto e maxtermine un termine somma che contengono un numero di

lettere di variabili distinte uguale al numero n delle variabili della funzione rappresentata dall’espressione.

Indichiamo con SP e PS un’espressione in Somma di termini Prodotto (o Somma di Prodotti) e Prodotti di

termini Somma (o Prodotti di Somma), rispettivamente. Chiamiamo infine forma normale la forma di

un’espressione SP.

Chiameremo forma canonica di una funzione in n variabili l’espressione in SP o PS in cui ogni termine è un

mintermine o un maxtermine. Per esempio, l’espressione

xyzzyxyzxzyxzyxzyx

è la forma canonica della funzione definita nella tabella precedente. Si può facilmente dimostrare che c’è una

sola forma canonica in SP ed una sola forma canonica in PS per ciascuna funzione.

Page 14: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

14

3.2 Definizione di reti combinatorie, loro formalizzazione e comportamento

Una volta ricavata l’espressione logica dalla tabella di verità, è immediato realizzare lo schema logico

utilizzando i componenti hardware elementari, detti anche porte logiche, AND, OR, NOT. I simboli

convenzionali di tali porte sono (è mostrato il caso AND, OR a due ingressi):

Partendo da una espressione logica in forma SP, la rete combinatoria ottenuta è “a due livelli di logica”, con

questo intendendo che esiste un primo livello di porte AND operanti in parallelo, seguite da una porta OR

finale. Ad esempio, la rete logica corrispondente all’espressione logica

caabf

è data da:

3.3 Specifica di reti combinatorie

La specifica di una funzione logica, da implementare mediante una rete combinatoria, può essere data

semplicemente “a parole”. Molto utile sarà abituarsi a definire una funzione, e quindi a dare la specifica del

comportamento di una rete combinatoria, mediante un formalismo di tipo linguaggio di programmazione. In

effetti, è agevole rendersi conto come la specifica in tale formalismo e l’espressione logica, derivante dal

procedimento di sintesi, rappresentino niente più che due diverse modalità sintattiche per dare la stessa

informazione. In più, la specifica data con un formalismo di programmazione avrà il vantaggio, essendo più

sintetica, di permettere di guidare la progettazione di molte reti come composizione di reti già note.

Le seguenti sono le specifiche di alcune reti combinatorie che supporremo standard, o primitive, cioè

componenti che è possibili usare (al pari delle porte AND, OR, NOT) come blocchi basici nella progettazione di

strutture più complesse:1:

confrontatore ( ) a due ingressi x, y ed una uscita z (z è vero se x, y sono diversi):

z = x y = not (x = y)

commutatore (K) a due ingressi primari x, y, un ingresso secondario o di controllo , ed una uscita z (z

assume il valore di x o di y a seconda che sia falso o vero rispettivamente):

z = if not then x else y

selezionatore, o selettore (S), a un ingresso primario x, un ingresso secondario o di controllo , e due

uscite z1, z2 (se è falso z1 assume il valore di x e z2 vale falso (0), se è vero z1 vale falso (0) e z2

assume il valore di x):

z1 = if not then x else 0

z2 = if not then 0 else x

1 Per il momento supporremo che ogni ingresso o uscita sia corrispondente ad una sola variabile logica booleana, cioè

che corrisponda ad una informazione di 1 bit.

Porta AND Porta OR

a ac

Porta NOT

a

b c = ab

f

a

b

c

a

b c = a+b

Page 15: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

15

oppure

if not then (z1 = x, z2 = 0) else (z1 = 0, z2 = x)

operatori aritmetico-logici: addizione, sottrazione, traslazione (shift), rotazione, incremento

decremento, ecc, la cui specifica è diretta. In questo testo interessa particolarmente considerare standard

anche reti aritmetico-logiche multifunzione, o ALU (Arithmetic Logic Unit), capaci di eseguire sulle

variabili di ingresso una delle operazioni suddette a seconda del valore assunto da un numero opportuno

(lg2 k, se k sono le operazioni previste) di variabili di controllo.

Ritorniamo sulla specifica del commutatore, e generalizziamola al caso di m ingressi, x0, x1, …, xm-1., con v =

lg2 m variabili di controllo 0, 1 , …, v-1.

La specifica è la seguente:

z = case 0, 1 , …, v-1 of

0 0 … 0 : x0

0 0 … 1 : x1

1 1 … 1 : xm-1

Questa scrittura è piuttosto significativa, in quanto esprime il concetto di indirizzamento o indiciamento: dati

m oggetti ordinati, x0, x1, …, xm-1, essi sono caratterizzati da altrettanti identificatori unici, detti indirizzi, aventi

valori decimali uguali agli indici loro assegnati (0, 1, … , m1); ogni indirizzo è espresso, in binario,

mediante lg2 m bit. Per conoscere il valore di un oggetto basta specificare il suo indirizzo o indice. Dunque:

ogni volta che avremo bisogno di implementare la funzione di indirizzamento o indiciamento per

conoscere una informazione, sarà sufficiente utilizzare un commutatore, senza bisogno di realizzare

ex-novo la funzione stessa.

In modo analogo si specifica e si interpreta un selezionatore a m uscite.

3.4 Procedimento di sintesi

Una volta data la specifica di una rete (di una funzione logica), nel caso più generale il procedimento di

sintesi della rete stessa è il seguente:

1. traduzione della specifica nella tabella di verità, per enumerazione di tutti i casi (2n, per n

variabili di ingresso);

2. per ogni variabile di uscita, scrittura della espressione logica in forma canonica SP (i termini

AND corrispondono agli stati d’ingresso per i quali la variabile di uscita assume valore vero);

3. eventuale riduzione delle espressioni logiche;

4. traduzione di ogni espressione logica in uno schema di rete a due livelli di logica.

Questo procedimento ha complessità O(2n), ed è quindi praticamente applicabile solo nei casi in cui il

numero degli ingressi n assuma un valore “contenuto”. Ad esempio, è impraticabile applicarlo quando gli

ingressi della rete siano costituiti da una o più parole. A maggior ragione, il passo 3 (riduzione o

minimizzazione) è, in generale, di complessità esponenziale: si conoscono solo delle buone euristiche in casi

limitati.

Per i nostri scopi, è sufficiente l’applicazione delle proprietà dell’algebra di Boole per la riduzione delle

espressioni logiche nella sintesi di reti standard, in quanto ogni altra rete verrà ricavata come composizione

di tali reti, oppure (come vedremo nella parte dedicata al firmware) utilizzando anche memorie viste esse

stesse come componenti standard.

Page 16: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

16

Esempio: sintesi di un commutatore a 2 ingressi

Partendo dalla specifica data in precedenza, si ricava la tabella di verità:

x y z

0 0 0 0

0 0 1 0

0 1 0 1

0 1 1 1

1 0 0 0

1 0 1 1

1 1 0 0

1 1 1 1

L’espressione della variabile di uscita z in forma canonica SP è:

xyyxxyyxz

Applicando le proprietà distributiva, della complementazione e dell’intersezione si ottiene:

yxxxyyyxz )()(

Si noti come, al di là delle diversa sintassi, si sia ottenuto esattamente quanto espresso con la specifica data

con un formalismo di programmazione.

A questo punto è immediato disegnare lo schema della rete a due livelli di logica.

Esempio: sintesi di un selezionatore a due uscite

Si ottiene subito:

xz 1

z2 = x

e quindi una rete ad un solo livello di logica.

Esempio: sintesi di un confrontatore

Anche in questo caso, senza bisogno di minimizzazioni, si ottiene:

yxyxz

cui corrisponde una rete a due livelli di logica.

Esempio: con riferimento ad un confrontatore, verificare che zz

L’espressione di z si ricava osservando, nella tabella di verità, tutti gli stati di ingresso cui corrisponde

uscita falsa:

xyyxz

da cui:

)()( xyyxz

Applicando due volte il Teorema di De Morgan si ottiene:

Page 17: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

17

))(())(()()( yxyxyxyxxyyxz

Applicando le proprietà distributiva, della complementazione e dell’unione, si ottiene:

zyxyxyyyxyxxxz

3.5 Comportamento temporale delle reti combinatorie

I segnali corrispondenti ai valori assunti dalle variabili logiche sono tutti del tipo a livelli, cioè subiscono

transizioni in istanti tra loro scorrelati 2.

Per valutare le prestazioni di un sistema, occorre cominciare a saper valutare le prestazioni di reti

combinatorie. Ogni rete reale è caratterizzata da un ritardo tr, necessario affinchè, in seguito ad una

variazione dello stato d’ingresso, si produca la corrispondente variazione dello stato di uscita. Solo dopo

questo tempo si dice che la rete si è stabilizzata: durante l’intervallo di durata tr, detto appunto anche tempo

di stabilizzazione, il comportamento della rete, in ogni suo punto, è impredicibile ed, in particolare, il valore

delle uscite non è significativo.

Se lo stato di ingresso varia durante l’intervallo tr, a partire dall’istante in cui si è verificata tale variazione

occorre attendere un tempo tr per avere la stabilizzazione.

Nel seguito supporremo che

a) le variazioni dello stato d’ingresso siano sincronizzate, cioè che avvengano ad istanti discreti, ed

equidistanti, di una sequenza temporale. Ciò significa che le eventuali variazioni delle variabili

d’ingresso avvengono contemporaneamente in tali istanti;

b) gli istanti di tale sequenza temporale siano distanziati di un periodo tr.

Per una porta logica, indichiamo con tp il tempo di stabilizzazione. Allo stato attuale della tecnologia esso

assume valori dell’ordine di 1 nsec fino ascendere a circa 0,1 nsec. Nel seguito supporremo che le porte NOT

abbiano ritardo nullo, o meglio inglobato nel ritardo delle porte AND/OR connesse alle usci delle porte NOT.

E’ importante ricordare che tp è il massimo valore che può assumere il tempo di stabilizzazione di una porta,

e che non è mai possibile ipotizzare di conoscere il valore preciso del ritardo entro tale massimo.

Dalle assunzioni a), b) deriva che il massimo tempo di stabilizzazione di una rete a L livelli di logica è dato

da

tr = L tp

Il valore di tp dipende dal numero di ingressi n della porta. La funzione tp(n) ha un andamento monotono

crescente; la crescita è relativamente lenta per n nc, tale da poter considerare tp costante, mentre è molto più

rapida per n > nc. Valori tipici di nc allo stato attuale variano da 4 a 8. Il valore di tp che si associa ad una

porta logica è quello per n nc.

La conseguenza di questa caratteristica è che, ove l’espressione logica di una variabile di uscita contenga un

termine AND con più di nc variabili d’ingresso, la porta AND della rete deve essere decomposta in più porte in

cascata, ognuna con al più nc ingressi. Lo stesso dicasi per una porta OR finale.

Ad esempio, il tempo di stabilizzazione di un commutatore è 2tp solo se il numero di variabili di controllo è

< nc.

Questa ora esposta è una delle ragioni per le quali può essere necessario realizzare reti mediante schemi a

più di due livelli di logica. L’altra ragione principale la vedremo nella sez. successiva.

2 Al contrario, in un segnale impulsivo ogni transizione da 0 a 1 è sempre seguita da una transizione da 1 a 0 a distanza

di un intervallo di tempo costante. Segnali impulsivi verranno usati solo per sincronizzare registri usati nelle reti

sequenziali.

Page 18: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

18

3.6 Reti combinatorie operanti su parola

Nell’applicazione pratica che faremo delle reti combinatorie sarà molto frequente il caso in cui le variabili di

ingresso e di uscita sono da considerare raggruppate in parole, cioè la funzione che definisce la rete è

applicata a parole di N bit (ad esempio, 32) invece che a semplici variabili booleane. Ne sono esempi:

commutatore a m ingressi ognuno dei quali a N bit. L’uscita è quindi su N bit, mentre le variabili di

controllo rimangono in numero di lg2 m;

analogamente per un selezionatore su parola di N bit;

confrontatore a N bit: il confronto è eseguito su ogni coppia di bit corrispondenti dei due ingressi a N

bit, generando un bit dell’uscita a N bit;

addizionatore a N bit: vengono sommati due numeri interi su N bit, ottenendo il valore della somma su

N bit ed un bit di riporto finale.

In tutti questi casi, la complessità del procedimento di sintesi delle reti combinatorie impedisce di ricorre al

metodo generale basato sulla tabella di verità. Si cerca invece di comporre reti ad 1 bit, del tipo

corrispondente, per ottenere la rete ad N bit; ad esempio, realizzare un commutatore ad N bit utilizzando

commutatori ad 1 bit.

La complessità del procedimento di sintesi è ora O(1), ovviamente ottimale a condizione che il risultato sia

accettabile in termini di prestazioni, cioè che il tempo di stabilizzazione della rete ad N bit sia confrontabile

con quello della rete corrispondente a 1 bit.

a. Per alcune reti la composizione è parallela: la rete ad N bit è composta da N reti ad 1 bit tutte

indipendenti, cioè nessuna utilizza in ingresso le uscite di altre. Il ritardo della rete ad N bit è dunque

uguale a quello della rete ad 1 bit. E’ il caso del commutatore, selezionatore, confrontatore. Nel seguito

queste reti saranno assunte come standard.

b. Per altre reti, la composizione è in cascata: la rete ad N bit è composta da N reti ad 1 bit tali che le uscite

dell’i-esima costituiscono ingressi della (i+1)-esima. Il ritardo della rete ad N bit è ora N volte quello

della rete ad 1 bit. E’ il caso dell’addizionatore, a causa della propagazione del riporto.

È possibile ottimizzare il ritardo dell’addizionatore usando la così detta tecnica del salto del riporto,

mediante la quale è possibile ridurre da N ad un valore relativamente basso e costante il fattore per cui

va moltiplicato il tempo di stabilizzazione dell’addizionatore ad 1 bit per ottenere il ritardo

dell’addizionatore ad N bit. In pratica, il tempo di stabilizzazione di un tale addizionatore è dell’ordine

di h tp, con h variabile tra 4 e 8. Nel seguito del testo assumeremo di disporre di addizionatori con salto

del riporto come reti standard.

La sintesi di ALU a N bit, esse stesse considerate standard nel seguito, si effettua applicando tutte le

conoscenze finora acquisite e la teoria sull’aritmetica binaria.

Page 19: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

19

4 Reti logiche sequenziali

4.1 Definizione di reti sequenziali, loro formalizzazione e comportamento

Un automa a stati finiti è una macchina caratterizzata da

n variabili logiche di ingresso, e corrispondentemente h = 2n stati d’ingresso X1, …, Xh;

m variabili logiche di uscita, e corrispondentemente k = 2m stati d’uscita Z1, …, Zk;

r variabili logiche dello stato interno, e corrispondentemente p = 2r stati interni S1, …, Sp;

una funzione di transizione dello stato interno:

SSX :

Tale funzione definisce la trasformazione dello stato interno dal valore presente al valore successivo in

corrispondenza del valore dello stato d’ingresso;

una funzione delle uscite:

ZSX :

Tale funzione definisce la trasformazione dello stato di uscita in corrispondenza del valore dello stato

d’ingresso e dello stato interno presente.

Una rete logica sequenziale implementa, a livello hardware, un automa a stati finiti.

In un modello strutturale ideale di rete sequenziale di tipo sincrono, le variazioni degli stati avvengono in

corrispondenza degli istanti di una sequenza temporale discreta to, t1, …, tn, … di intervallo (periodo)

costante ti+1 ti.

Si possono definire due distinti modelli matematici di automa, e quindi di rete sequenziale: il modello di

Mealy e il modello di Moore:

In entrambi i modelli, considerando il comportamento dell’automa al tempo t, lo stato interno

successivo S(t+1) 3 dipende tanto dallo stato d’ingresso al tempo t, X(t), quanto dallo stato interno

presente, S(t):

S(t+1) = (X(t), S(t))

Nel modello di Mealy, lo stato di uscita al tempo t, Z(t), dipende tanto dallo stato d’ingresso al tempo

t, X(t), quanto dallo stato interno presente, S(t):

Z(t) = (X(t), S(t))

Nel modello di Moore, Z(t) dipende solo da S(t):

Z(t) = (S(t))

Nel modello di Moore la dipendenza tra stati di uscita e stati di ingresso è quindi espressa da:

Z(t) = (S(t)) = ( (X(t1), S(t1))) = 1 (X(t1), S(t1))

Ne discende che, dati due automi di Mealy e di Moore equivalenti, con stati interni iniziali equivalenti e per

la stessa sequenza d’ingresso si ha che la sequenza di uscita dell’automa di Moore è ritardata, rispetto a

quella dell’automa di Mealy, di un intervallo della sequenza temporale.

4.2 Un esempio

Vediamo un esempio, tipico della problematica degli automi: un riconoscitore di sequenza.

3 Questo simbolo indica convenzionalmente lo stato interno successivo, che diverrà stato presente al tempo t+ .

Page 20: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

20

La specifica di un automa viene sempre data in termini di trasformazione da stati di ingresso a stati di uscita

e di caratteristiche dell’automa nei confronti delle sequenze di ingresso e di uscita; nel dare questa specifica è

implicito il concetto di memoria dell’automa, o stato interno, anche se, da essa, non è sempre

immediatamente evidente il numero ed il significato degli stati interni: questi devono essere ricavati durante

la sintesi dell’automa.

Consideriamo un automa avente una variabile di ingresso x ed una variabile di uscita z. L’uscita assume

valore 1 se e solo se nella sequenza d’ingresso si presentano due “1” consecutivi senza sovrapposizioni (ad

esempio: se si verifica la sottosequenza di ingresso 01110 la corrispondente sottosequenza di uscita è 00100;

se in ingresso si presenta 011110 in uscita si ha 001010).

Scegliamo inizialmente il modello matematico di Mealy.

Per realizzare l’automa, cominciamo a determinare gli stati interni 4. Abbiamo bisogno di ricordare le

seguenti situazioni: a) nella sequenza di ingresso si è presentato uno 0, oppure è lo stato iniziale; b) nella

sequenza di ingresso si è presentato un 1.

Indichiamo con S0, S1 gli stati interni corrispondenti alle situazioni a), b) rispettivamente.

L’evoluzione dell’automa può essere rappresentata dal grafo di stato della figura seguente, secondo le

seguenti convenzioni: i nodi corrispondono a stati interni; gli archi corrispondono a transizioni tra stati

interni, ed a questo scopo sono marcati con lo stato d’ingresso che provoca la transizione e con lo stato di

uscita corrispondente (X / Z).

Figura 1

Per realizzare l’automa mediante una rete sequenziale, diamo una codifica degli stati interni mediante il

minimo numero di variabili ( lg2 2 = 1 ) Indichiamo con y la variabile dello stato interno presente e con Y

la variabile dello stato interno successivo; una possibile codifica è:

stato int y

S0 0

S1 1

Dobbiamo ora esprimere, mediante espressioni logiche, le due funzioni:

funzione delle uscite:

z = (x, y)

funzione di transizione dello stato interno:

Y = (x, y)

4 E’ possibile che, con il ragionamento iniziale, si riconoscano più stati interni rispetto allo stretto necessario. Come

determinare formalmente eventuali stati equivalenti, e di conseguenza eliminare quelli ridondanti, è descritto nel testo di

Gerace.

x = 0 / z = 0

x = 1 / z = 0

x = 1 / z = 1

x = 0 / z = 0 S0 S1

x = 0 / z = 0

Page 21: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

21

La realizzazione di tali funzioni mediante reti combinatorie darà luogo alla parte combinatoria della rete

sequenziale cercata, che verrà completata con la “richiusura” dello stato interno per collegare Y a y (su

quest’ultimo aspetto torneremo in seguito):

Dal grafo di stato si ricava la seguente tabella di verità per e :

y x z Y

0 0 0 0

0 1 0 1

1 0 0 0

1 1 1 0

Si ricavano quindi le espressioni logiche che definiscono le funzioni delle uscite e di transizione dello stato

interno:

z = x y

Y = x y

A questo punto è immediato realizzare lo schema delle reti e (che, nel caso specifico, risultano ad un

solo livello di logica).

Realizziamo ora lo stesso riconoscitore di sequenza mediante un automa secondo modello matematico di

Moore. Il grafo di stato è mostrato in figura:

x

z

y Y

S2

z=1

x = 1

S0

z =0 x = 0

S1 z=0

x = 0

x = 0

x = 1

x = 1

Page 22: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

22

Poiché nel modello di Moore lo stato di uscita è univocamente associato allo stato interno presente, sono ora

necessari tre stati interni :

S0, con stato di uscita z = 0, del tutto equivalente a quello dell’automa di Mealy e considerato stato

iniziale;

S1, con stato di uscita z = 0, corrispondente allo stato S1 dell’automa di Mealy;

S2; con stato di uscita z = 1, corrispondente alla situazione in cui è stata riconosciuta la sottosequenza

d’ingresso “11”. Si noti che lo stato S1 aveva il significato “si è presentato un 1 nella sequenza di

ingresso”, ma, poiché a S1 è univocamente associato lo stato di uscita z = 0, nel caso si presenti in

ingresso ancora un 1, occorre passare ad uno stato interno cui corrisponda stato di uscita z = 1: questo è

appunto S2.

In generale, il numero di stati interni dell’automa di Moore è maggiore o uguale del numero di stati interni

dell’automa di Mealy equivalente. Nel nostro caso, si è verificata la relazione, piuttosto frequente, di

strettamente maggiore.

Per procedere nella sintesi della rete sequenziale, diamo una codifica degli stati interni mediante il minimo

numero di variabili ( lg2 3 = 2 ). Indichiamo con y1, y2 le variabili dello stato interno presente e con Y1, Y2

le variabili dello stato interno successivo; una possibile codifica è:

stato int y1 y2

S0 0 0

S1 0 1

S2 1

Ricaviamo le due funzioni che definiscono l’automa:

funzione delle uscite: z = (y1, y2)

funzione di transizione dello stato interno: (Y1, Y2) = (x, y1, y2)

La realizzazione di tali funzioni mediante reti combinatorie darà luogo alla parte combinatoria della rete

sequenziale cercata. Quest’ultima verrà completata con le “richiusure” dello stato interno per collegare Y1, Y2

a y1, y2 come mostrato in figira:

Dal grafo di stato si ricava la seguente tabella di verità per e :

x

z

y1

Y1

Y2

y2

Page 23: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

23

y1 y2 x z Y1 Y2

0 0 0 0 0 0

0 0 1 0 0 1

0 1 0 0 0 0

0 1 1 0 1

1 0 1 0 0

1 1 1 0 1

Si ricavano quindi le espressioni logiche che definiscono le funzioni delle uscite e di transizione dello stato

interno:

z = y1

Y1 = x 1y y2

Y2 = x 1y 2y + x y1

L’espressione per Y2 è stata ricavata specificando al valore 0 l’entrata non specificata. Scegliendo, invece, di

specificarla al valore 1, si ottiene:

Y2 = x 1y 2y + x 1y y2 + x y1 = x 1y ( 2y + y2 ) + x y1 = x ( 1y + y1 ) = x

A questo punto è immediato realizzare lo schema delle reti combinatorie e (nel caso specifico, la prima è

a zero livelli di logica; la seconda è a due livelli di logica usando la prima espressione di Y2, ad un solo

livello di logica usando la seconda espressione minimizzata).

Verifichiamo che, partendo da stati interni iniziali equivalenti e per la stessa sequenza d’ingresso, la

sequenza di uscita dell’automa di Moore è ritardata, rispetto a quella dell’automa di Mealy, di un intervallo

della sequenza temporale. Ad esempio, per la stessa sequenza d’ingresso:

t0 t1 t2 t3 t4

1 0 1 1

le sequenze di uscita sono:

t0 t1 t2 t3 t4

per la rete secondo il modello di Mealy: 0 0 0 1

per la rete secondo il modello di Moore: (0) 0 0 0 1

4.3 Reti sequenziali reali di tipo sincrono

In questo capitolo daremo una caratterizzazione della realizzazione di reti sequenziali sincrone limitata agli

scopi di questo testo (studio di sistemi costituiti dall’interconnessione di unità di elaborazione).

Il modello strutturale ideale

Nel modello ideale le uscite Yi (variabili dello stato interno successivo) della rete combinatoria sono

collegate agli ingressi yi (variabili dello stato interno presente) della rete combinatoria e della rete

mediante elementi di memoria temporanea che introducono un ritardo di valore si vedano gli esempi

precedenti): il valore di ogni yi diviene uguale al valore di Yi dopo un intervallo di tempo

Page 24: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

24

Nel modello ideale si assume che

a) le funzioni e abbiano ritardo nullo,

b) le variabili di ingresso della rete sequenziale varino, tra loro tutte contemporaneamente, a istanti

temporali discreti distanziati di

Di conseguenza, nel modello ideale tutti gli ingressi delle reti combinatorie e , siano essi di tipo xj

(variabili d’ingresso) che di tipo yi (variabili dello stato presente), variano contemporaneamente in

corrispondenza degli istanti della sequenza temporale, e solo in corrispondenza di questi.

Problemi del modello strutturale ideale

Il suddetto funzionamento deve fare i conti con il fatto che, nella realtà, la precedente assunzione a) non è

valida. Come discusso in F3, le reti combinatorie, come e nel nostro caso, sono caratterizzate da un certo

tempo di stabilizzazione, cioè da un ritardo non nullo necessario per avere le uscite in forma stabile

(significativa) a partire dall’istante in cui gli ingressi sono stabili. Abbiamo visto in F3 come questo ritardo

può essere valutato per ogni rete combinatoria.

Il problema della stabilizzazione è, nel caso delle reti sequenziali, molto più serio che per le reti

combinatorie.

Si parta dalla situazione in cui, ad un certo istante t, tutti gli ingressi esterni xj e tutti gli ingressi dello stato

presente yi sono stabili: le uscite delle reti combinatorie e saranno stabili all’istante t + tr, dove tr è il

tempo di stabilizzazione delle reti combinatorie stesse 5.

Se, invece, gli ingressi yi variassero in istanti diversi rispetto agli xj , le reti combinatorie e potrebbero

non stabilizzarsi mai, in quanto le uscite della rete sono esse stesse ingressi delle due reti combinatorie, e

della in particolare. Continuando a mantenere la precedente assunzione b), potremmo allora pensare di

scegliere il valore di tale che:

= tr

Purtroppo, nemmeno in questo modo viene risolto il problema della stabilizzazione: come sappiamo dalla

F3, tr è il massimo tempo di stabilizzazione di una rete combinatoria e non è mai possibile ipotizzare di

conoscere il valore preciso del ritardo entro tale massimo. Di conseguenza, gli ingressi yi delle reti e

variano in istanti temporali non coincidenti con gli istanti della sequenza temporale, in corrispondenza dei

quali (e solo di quelli) si assume che varino gli ingressi esterni xj.

Verso il modello strutturale reale

La soluzione, che permetta comunque di mantenersi aderenti al modello di funzionamento sincrono, deve

essere basata su ritardi nelle richiusure che, invece che costanti ad un certo valore come nel modello ideale,

siano variabili.

Continuiamo a mantenere l’assunzione b), caratterizzandola così: le variabili di ingresso della rete

sequenziale variano, tra loro tutte contemporaneamente, a istanti temporali discreti distanziati di un intervallo

tr

Nelle richiusure dello stato interno inseriamo degli elementi di memoria funzionanti come “cancelli

temporizzati”: in qualunque istante varino le uscite Yi della rete combinatoria , i valori di yi assumono i

valori degli Yi solo in istanti temporali ben determinati (“il cancello si apre solo in istanti ben determinati”).

Il problema della stabilizzazione è ora risolto imponendo che gli istanti della sequenza temporale siano

distanziati dello stesso intervallo di cui in precedenza.

5 Senza perdere in generalità, assumeremo che i ritardi delle due reti siano uguali. In realtà, è sufficiente considerare il

ritardo della rete .

Page 25: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

25

Registri impulsati

Un elemento di memoria funzionante come un “cancello temporizzato” è realizzato da un ulteriore

componente hardware standard, detto registro, o meglio registro impulsato.

Possiamo ora passare alla effettiva realizzazione del registro nella forma che verrà utilizzata nel seguito del

testo.

Un registro R di un bit è una rete sequenziale, assunta primitiva, avente un ingresso primario a, una uscita b,

ed un ingresso secondario p (l’ingresso enable). I segnali di a e b sono a livelli, il segnale di p è periodico e

impulsivo ed è detto comunemente impulso di clock. Il comportamento di R è il seguente:

when p do b:= a

cioè: quando sull’ingresso p è presente impulso (valore 1 del segnale impulsivo), allora l’uscita assume il

valore presente sull’ingresso; si dice anche che, quando è presente impulso, il valore di a viene scritto in R

(“apertura del cancello”).

Il simbolo ed il funzionamento di un registro sono illustrati nella figura seguente:

La funzione di “cancello temporizzato” è evidente dal fatto che non c’è nessuna relazione tra gli istanti in cui

varia l’ingresso a e quelli in cui varia l’uscita b; l’uscita, se varia, varia solo a istanti di tempo ben

determinati, e cioè in corrispondenza dell’impulso di clock. Precisamente, poiché la durata dell’impulso

non è nulla, la scrittura in R avviene sul fronte di discesa dell’impulso.

Esistono vari tipi di registri, o flip-flop. Quello definito in precedenza è di gran lunga il più usato ed è del

tutto sufficiente per i nostri scopi; è chiamato flip-flop F o, nella documentazione tecnica, latch.

Un registro a N bit è realizzato semplicemente mettendo in parallelo N registri da 1 bit, tutti impulsati dallo

stesso segnale di clock.

Corretta stabilizzazione dei registri

Come detto il segnale impulsivo p è periodico. Nel periodo va contata anche la durata dell’impulso (che

comunque è normalmente piuttosto piccola rispetto al periodo stesso). Occorre fare in modo che l’ingresso

del registro non vari durante l’intervallo se ciò avvenisse, l’uscita sarebbe indeterminata per un tempo

finito ma illimitato. Infatti, il registro è esso stesso una rete sequenziale (realizzata secondo il modello

asincrono) ed il suo periodo di stabilizzazione è proprio .

Il fenomeno è detto dello “stato metastabile” dei registri impulsati.

durata

impulso

livello 1

livello 0

R

a

b

p

a

p

b

fronte di discesa dell’impulso

Registro impulsato

con ingresso e uscita a livelli

periodo

commutazione: scrittura nel registro

Page 26: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

26

Reti sequenziali sincrone LLC

A questo punto disponiamo del modello strutturale di rete sequenziale sincrona reale, mostrato nella figura

seguente per il modello di Mealy (rete con n variabili di ingresso, m variabili di uscita, k variabili dello stato

interno).

Esso comprende le due reti combinatorie reali (funzione delle uscite) e (funzione di transizione dello

stato interno), e le richiusure dello stato interno sono realizzate con k registri in parallelo impulsati dallo

stesso segnale di clock (registro di k bit).

Il modello è detto LLC (Level input, Level output, Clocked), a significare che i segnali su cui si applicano le

funzioni e sono ancora a livelli, mentre l’unico segnale impulsivo è quello per la sincronizzazione dei

(per provocare la scrittura nei) registri.

Il periodo dell’impulso è detto ciclo di clock della rete sequenziale.

Come visto, deve essere tr. In realtà, per tenere conto della durata dell’impulso, e quindi per evitare il

fenomeno dello stato metastabile dei registri, si ha che il ciclo di clock della rete va determinato come

tr +

La durata dell’impulso di clock può essere assunta dello stesso ordine di grandezza del tempo di

stabilizzazione tp di una porta logica. Ad esempio, se = 2 nsec, il generatore di impulsi di clock ha una

frequenza f = 1/ = 500 MHz (0,5 GHz).

Sincronizzazione degli ingressi

Rimane da chiarire come assicurare la validità dell’assunzione sulla variabilità degli ingressi esterni solo in

corrispondenza di istanti ben determinati e distanziati di un intervallo .

1. In certi casi questa caratteristica è assicurata dal comportamento delle reti che producono i valori

d’ingresso alla rete in questione: esiste cioè una sincronizzazione implicita tra le reti interconnesse, che

assicura la reciproca stabilizzazione entro un intervallo di durata . Un caso notevole sarà costituito

dall’interazione tra Parte Controllo e Parte Operativa all’interno del ciclo di clock complessivo dell’unità

di elaborazione.

2. Quando non sia possibile adottare la soluzione precedente, si ricorre ancora all’uso di registri come

sincronizzatori: sugli ingressi della rete sequenziale sono disposti altrettanti registri impulsati con lo

stesso clock della rete stessa. E’ questo il caso degli ingressi esterni di una unità di elaborazione, ingressi

che fanno capo alla Parte Operativa in aggiunta quelli (citati in precedenza) provenienti dalla Parte

Controllo. In questo caso esiste la possibilità che si verifichi lo stato metastabile, a meno che non sia

possibile imporre precisi vincoli alle relazioni tra i cicli di clock delle reti sequenziali interconnesse;

altrimenti, esistono metodi per rilevare l’eventuale occorrenza di stati metastabili in modo da innescare

azioni di correzione degli errori.

R

x

p

z

Y y

n

m

k

Page 27: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

27

5 Componente logico memoria

5.1 Realizzazione logica

In versione RAM (lettura-scrittura) un componente logico memoria è definito come un array

unidimensionale M di registri su cui sono definite le seguenti operazioni fondamentali :

lettura sull’uscita out del contenuto della cella di indirizzo i: out = M [ i ];

scrittura del valore presente sull’ingresso in nella locazione di indirizzo i: M [ i ] = in.

Il simbolo convenzionale è il seguente :

Lo schema di implementazione è il seguente:

Il commutatore K di uscita, i cui ingressi primari sono le uscite dei registri ed i cui ingressi secondari sono i

bit dell’indirizzo, realizza l’operazione di lettura.

Il selezionatore S di ingresso, avente anch’esso come ingressi secondari i bit dell’indirizzo, ha come ingresso

il segnale di controllo per l'abilitazione alla scrittura; inoltre, l’ingresso in viene collegato a tutti gli ingressi

dei registri; di conseguenza, se = 1, il valore di in viene scritto solo nel registro indirizzato.

Nel caso di una memoria ROM, è ovviamente presente solo il commutatore di uscita.

Si possono avere memorie RAM a più ingressi e più uscite (ad esempio, 1 ingresso e 2 uscite), utilizzando il

numero corrispondente di selezionatori e commutatori.

R0

0

R1

1

Rn-1

n-1

. . .

K

S

in

out

indirizzo

R [0 .. n-1]

in out

indirizzo

Page 28: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

28

5.2 Realizzazione fisica e ritardi

Lo schema di principio ora introdotto viene adottato sia per memorie di registri di piccola capacità (32 - 256

celle), sia per memorie, di grande capacità (107 - 10

9 celle) da adottare all’interno dell’unità memoria

principale di un calcolatore general purpose. In tutti i casi, è improponibile una realizzazione del

commutatore di uscita e del selezionatore d’ingresso come reti a due livelli di logica, visto il numero troppo

elevato di ingressi.

In questa sezione studieremo il problema della realizzazione, e di conseguenza della determinazione del

tempo di accesso, come un caso particolare notevole delle reti a più livelli di logica.

Oltre alle modalità con cui verranno realizzati il commutatore ed il selezionatore per indirizzare le celle, il

tempo di accesso è influenzato in modo significativo dal tipo di tecnologia elettronica utilizzato:

le memorie RAM più economiche sono quelle così dette dinamiche (DRAM), in quanto, per ragioni

di potenza del segnale relativo al contenuto delle celle, ogni cella necessita di un “rinfresco”

periodico (la cella va letta e quindi riscritta con lo stesso valore letto) con cadenza dell’ordine dei

msec. Tipici tempi di accesso di memorie dinamiche sono attualmente dell’ordine delle decine di

nsec fino alle centinaia di nsec, con capacità dell’ordine delle migliaia di Mbit per chip ed oltre;

le memorie statiche (SRAM), che non necessitano di rinfresco, presentano tempi di accesso

decisamente più bassi, dell’ordine di pochi nsec (o frazioni di nsec) fino alle decine di nsec, ma, a

parità di generazione tecnologica, sono anche assai meno “dense” delle dinamiche e quindi

caratterizzate da una minore capacità per chip, dell’ordine delle centinaia di Mbit per chip.

Soluzioni intermedie, dette SDRAM, combinano alcuni vantaggi e svantaggi delle DRAM e SRAM,

permettendo di ottenere capacità di poco inferiori a quelle delle DRAM con tempi di accesso di poco

superiori a quelli delle SRAM.

5.2.1 Numero massimo di ingressi per porta nelle reti combinatorie

Ricordiamo che, in generale, per una porta logica AND/OR è fissato un numero massimo di ingressi, N0, ad

esempio N0 = 8. Il valore del massimo ritardo di stabilizzazione della porta, tp, vale per un numero di ingressi

N N0, in quanto per N > N0 il ritardo di stabilizzazione aumenterebbe linearmente con forte pendenza. In

pratica, non esistono porte con N > N0. Di questa caratteristica tecnologica occorre tenere conto nella

realizzazione di una qualunque rete combinatoria, in particolare, nella realizzazione di commutatori

(selezionatori) con un elevato numero di ingressi, come si ha anche (ma non solo) nell’implementazione dei

componenti logici memoria.

Se di una funzione è stata ricavata l’implementazione come rete combinatoria a due livelli di logica, questa

realizzazione vale sempre da un punto di vista concettuale, ma, dal punto di vista tecnologico, occorre tener

conto del vincolo che, per ogni porta, deve essere N N0. Se questa condizione non si verifica, occorre

sostituire la singola porta con una struttura ad albero di arietà N0, che, di tutte le possibili realizzazioni, è

quella che garantisce il minimo ritardo di stabilizzazione. In generale, quindi, il ritardo di stabilizzazione

comportato dalla realizzazione di un termine AND/OR varia in modo logaritmico con il numero delle sue

variabili d’ingresso.

5.2.2 Tempo di accesso

Si consideri un commutatore a n ingressi principali, x0, …, xn-1, m ingressi secondari (variabili di controllo)

0, …, m-1, con m = lg2 n, e uscita z. Ricordiamo che esso è definito dalla funzione:

z = case 0, 1, …, m-1 of

0 0 … 0 : x0

0 0 … 1 : x1

stringa binaria equivalente al valore naturale j : xj

1 1 ... 1 : xn-1

Page 29: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

29

Questo corrisponde alla realizzazione del commutatore come una rete combinatoria che, concettualmente, è a

due livelli di logica, dove:

il livello AND è costituito da n porte AND, la j-esima delle quali ha m + 1 ingressi: uno è xj e gli altri

m sono le variabili di controllo opportunamente affermate o complementate in modo da dare luogo alla

stringa binaria equivalente al valore naturale j;

il livello OR è costituito da un porta OR con n ingressi.

A questa realizzazione concettuale corrisponde una realizzazione effettiva in cui ogni porta AND/OR può

essere sostituita da una struttura ad albero se il suo numero di ingressi è > N0.

In particolare:

il livello AND è costituto da n alberi, ognuno di arietà N0 e di profondità:

lgNo ( m + 1 ) = lgNo ( lg2 n + 1 )

il livello OR è costituito da un albero di arietà N0 e di profondità:

lgNo ( n )

Indicando con tp il ritardo di una porta AND/OR con un numero di ingressi N N0, il ritardo di

stabilizzazione di un commutatore ad n ingressi è quindi dato da:

TK (n, N0, tp) = tp ( lgNo ( lg2 n + 1 ) + lgNo ( n ) )

Questa formula generale esprime, in particolare, il tempo di accesso di un componente logico memoria di

capacità C (= n), valutato come il massimo ritardo di stabilizzazione per l’operazione di lettura:

ta (C, tp) = TK (C, N0, tp) = tp ( lgNo ( lg2 C + 1 ) + lgNo ( C ) )

Come si vede, dei due addendi domina nettamente il secondo (ritardo livello OR, con ordine di grandezza

logaritmico): è questo che giustifica l’adozione di tecnologie ad hoc per realizzare la funzione OR a molti

ingressi, ma, indipendentemente dalla realizzazione elettronica di tali tecnologie, esse sono sempre

concettualmente riconducibili alla realizzazione di una rete combinatoria a più livelli di logica e la

valutazione effettuata con la formula di cui sopra risulta rigorosa.

Ovviamente, quando si abbia a che fare con numeri semplici il valore del ritardo può anche essere calcolato

semplicemente contando le profondità degli alberi dei livelli AND e OR.

Per un selezionatore (e quindi per l’operazione di scrittura di un componente logico memoria), avendo solo il

livello AND, si ha:

TS (n, N0, tp) = tp lgNo ( lg2 n + 1 )

Può convenire trasformare le formule di cui sopra utilizzando logaritmi in base 2:

TK (n, N0, tp) = tp ( lg2 ( lg2 n + 1 ) / lg2 (N0) + lg2 ( n ) / lg2 (N0) )

TS (n, N0, tp) = tp lg2 ( lg2 n + 1 ) / lg2 (N0)

Ad esempio, vediamo alcuni tempi di accesso di componenti logici memoria con diverse capacità C, con C

potenza di due e N0 = 8:

ta (C, tp) = tp ( lg2 ( lg2 C + 1 ) / 3 + lg2 ( C ) / 3 )

C = 64 ta = 3 tp

C = 256 ta = 5 tp

C = 512 ta = 5 tp

C = 1K ta = 6 tp

C = 64K ta = 8 tp

C = 1M ta = 9 tp

C = 64M ta = 11 tp

Page 30: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

30

C = 256M ta = 12 tp

C = 1G ta = 12 tp

C = 4G ta = 13 tp

Questi valori mostrano quanto sia efficiente la realizzazione ad albero.

L’effettivo valore di questi ritardi dipende, ovviamente, dal valore di tp, che è fortemente variabile con il tipo

di tecnologia adottata. Ad esempio, allo stato attuale, come ordine di grandezza si può avere per memorie

statiche tp 1 10 nsec, mentre per memorie dinamiche tp 10 100 nsec.

5.2.3 Memorie realizzate a partire da memorie preesistenti

Di regola, le memorie di grande capacità sono realizzate a partire da componenti logici base dati, che vanno

combinati opportunamente in quella che prende il nome di memoria modulare.

Ad esempio, supponiamo di voler realizzare una memoria M, di tipo ROM, avente capacità 64K parole, a

partire dalla disponibilità di memorie ROM di capacità 1K parole.

La realizzazione della memoria da 64K si ottiene mediante 64 moduli di memoria da 1K tra loro

indipendenti, ed ottenendo di M l’uscita mediante un commutatore a 64 ingressi, come mostrato nella figura

a pagina seguente.

Per una memoria RAM, analoga struttura va realizzata per il selezionatore d’ingresso.

È importante notare come è utilizzato l’indirizzo di 16 bit:

i 10 bit meno significativi (indirizzo all’interno del modulo di memoria) indirizzando le memorie da

1K operanti in parallelo,

i 6 bit più significativi (identificatore del modulo di memoria) comandano il commutatore di uscita.

M0

(1K)

10 M1

(1K)

10 M63

(1K)

10

. . .

K 6

indirizzo all’interno del modulo identificatore

del modulo

indirizzo:

6 bit 10 bit

M

(64K)

16

Page 31: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

31

I moduli di memoria da 1K hanno un loro tempo di accesso noto, tao. Il tempo di acceso complessivo si

ottiene come:

ta = tao + TK

Nell’esempio: TK = 3 tp. Se tao = 7 tp (si noti che tale valore non va ricavato utilizzando la formula della sez.

precedente, in quanto rappresenta un dato del problema associato alle memorie che vengono fornite; esso

viene espresso come multiplo di tp solo per comodità), si ottiene ta = 10 tp.

Page 32: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

32

Livello Firmware

6 Caratteristiche di un sistema a livello firmware

6.1 Unità di elaborazione

Un sistema di elaborazione a livello firmware è costituito da un certo numero di unità di elaborazione tra

loro interagenti, U1, ..., Un, , come mostrato genericamente in figura:

Ad ogni unità di elaborazione è affidato un certo sottoinsieme delle funzionalità dell’intero sistema.

Attraverso l’interazione tra unità viene realizzato il compito che globalmente si intende affidare all’intero

sistema. Ad esempio, in un calcolatore general-purpose si riconoscono molte unità, tra le quali il processore

centrale, la memoria principale, e le unità di ingresso-uscita includenti anche le memorie secondarie; ogni

unità è specializzata verso uno specifico compito, ma attraverso l’interazione tra le unità si realizza un

sistema avente la caratteristica di essere generale nei confronti del supporto fornito ai livelli superiori del

sistema; in particolare il funzionamento di ogni unità e l’interazione tra le varie unità realizza

l’interpretazione di qualunque programma espresso con il formalismo che definisce il livello assembler del

sistema.

Una unità di elaborazione svolge il proprio specifico compito in modo:

autonomo: l’unità è capace di controllare la propria elaborazione in modo del tutto indipendente,

pur ricavando informazioni sulle funzionalità da eseguire e valori dei dati attraverso l’interazione

con altre unità ;

sequenziale: il funzionamento dell’unità è descritto da un programma sequenziale. Chiameremo

microprogramma la descrizione del funzionamento dell’unità, e microlinguaggio il linguaggio

imperativo di programmazione sequenziale con cui esprimere il microprogramma.

6.2 Modello Parte Controllo - Parte Operativa

Il microprogramma di una unità di elaborazione è a sua volta interpretato dal livello hardware sottostante.

Questa interpretazione viene realizzata da due reti sequenziali LLC tra loro interagenti, dette Parte

Controllo (PC) e Parte Operativa (PO), come mostrato dal modello generale di unità di elaborazione di

figura seguente.

La PO provvede all’esecuzione delle operazioni previste dai comandi del microlinguaggio, o

microistruzioni, allo scopo disponendo delle tipiche risorse strutturali messe a disposizione dal livello

hardware:

commutatori,

selezionatori,

reti di calcolo mono-funzione o multi-funzione (ALU),

U1

U2

Un

U3

. . . . . .

. . .

Page 33: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

33

registri : tra questi si distinguono quelli visibili anche al livello superiore (in un calcolatore, i registri

generali del linguaggio assembler) e quelli visibili esclusivamente al livello firmware (i registri utilizzati

per le variabili del microprogramma).

PC provvede:

al controllo della sequenzializzazione delle microistruzioni, allo scopo utilizzando i valori delle variabili

di condizionamento {x} relative allo stato della PO. Ad esempio, in una certa microistruzione occorre

effettuare il test per zero del contenuto di un registro;

ad ordinare alla PO l’esecuzione di ogni microistruzione mediante i valori delle variabili di controllo

= {} {}, una parte delle quali {} abilita/disabilita la scrittura nei registri della PO, mentre l’altra

parte {} fornisce gli ingressi secondari di commutatori, selezionatori e reti di calcolo. Ad esempio, in

una certa microistruzione si deve ordinare alla ALU di eseguire l’operazione di addizione sui contenuti di

due specifici registri e di scrivere il risultato in uno specifico registro).

PC e PO sono reti sequenziali LLC (Level-input Level-output Clocked) impulsate dallo stesso segnale di

clock, e quindi aventi lo stesso ciclo di clock:

questo, detto ciclo di clock dell’unità, verrà determinato in modo tale da permettere la

stabilizzazione di entrambe le reti per l’esecuzione di una qualsiasi microistruzione.

Poiché la struttura PC-PO rappresenta l’interprete a livello hardware del microlinguaggio del livello

firmware, il modello di programmazione del livello firmware è dunque sincrono:

ogni microistruzione è eseguita in un tempo costante uguale al ciclo di clock.

Lo scopo di questa parte è di studiare la progettazione di unità di elaborazione mediante un procedimento

formale che, partendo dalla scrittura del microprogramma, permette di ricavare la struttura della PC e della

PO, e quindi di determinare la struttura dell’interprete a livello hardware. Inoltre, il procedimento risulterà di

bassa complessità rispetto ai parametri in gioco (come numero di microistruzioni, di registri, di ALU, ecc).

La metodologia che verrà fornita ha carattere di assoluta generalità nei confronti dei vari tipi di sistemi e nei

confronti della specifica tecnologia hardware: la metodologia permette di descrivere semplici unità da

utilizzare in sistemi specializzati, così come le unità di un calcolatore general-purpose incluso il processore

centrale. In questo capitolo, la metodologia verrà esemplificata nei confronti della progettazione di unità

“qualsiasi”, non necessariamente facenti parte di un calcolatore general-purpose. La sua applicazione allo

studio dell’architettura di un calcolatore general-purpose sarà oggetto di parti successive.

6.3 Il procedimento di progettazione delle unità

I passi essenziali nel procedimento formale di progettazione di una unità sono i seguenti :

0. specifica delle operazioni esterne affidate all’unità. Il termine operazioni esterne sta da indicare le

funzionalità del livello superiore che devono essere interpretate dall’unità. Solo nel caso di un processore

uscite esterne ingressi esterni

PC

PO

variabili

di condizionamento

{x}

variabili

di controllo

= {} {}

segnale di clock

Page 34: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

34

centrale le operazioni esterne corrispondono effettivamente alle istruzioni assembler; in tutti i casi che

vedremo in questo capitolo, le operazioni esterne vanno sempre pensate come le funzionalità che

dall’esterno (quindi da altre unità) vengono richieste all’unità in questione, considerata come “servente”.

La specifica delle operazioni esterne può essere data a parole o con un formalismo di volta in volta

ritenuto più adatto ;

1. scrittura del microprogramma che interpreta le operazioni esterne. In prima istanza, specie nei casi più

complessi, è conveniente dare una descrizione dell’interpretazione delle operazioni mediante un

formalismo ad alto livello (pseudo-codice) per poi passare ad una descrizione nel microlinguaggio

eseguibile (che verrà definito nel seguito);

2. derivazione formale della rete sequenziale Parte Operativa a partire dal microprogramma;

3. derivazione formale della rete sequenziale Parte Controllo a partire dal microprogramma;

4. valutazione del ciclo di clock dell’unità in funzione dei ritardi temporali delle risorse hardware adottate

(applicando opportune formule analitiche oggetto della trattazione);

5. valutazione del tempo medio di elaborazione di ogni operazione e/o relativo all’insieme delle operazioni

affidate all’unità.

È essenziale ribadire fin da ora che, ai passi 2 e 3, le strutture hardware della PC e della PO verranno ottenute

con procedimenti formali a partire dal microprogramma; in altri termini, la visione erronea secondo la quale i

sistemi di elaborazione vengono realizzati mediante approcci empirici, consistenti nel “mettere insieme” in

modo artigianale componenti hardware, collegamenti e clock, non appartiene alla metodologia adottata in

questo testo. Diversa cosa è che, specie in casi molto complessi (come lo stesso processore centrale),

l’ottimizzazione del progetto dell’unità (in termini di prestazioni e/o costo) potrà eventualmente richiedere

l’applicazione di ulteriori procedimenti, euristici o approssimati, ma pur sempre tali da poter essere

ricondotti alla metodologia complessiva ed al corredo di conoscenze ad essa associato.

6.4 Esempio 1

In questa sezione descriveremo in dettaglio un semplicissimo esempio di unità di elaborazione, allo scopo di

introdurre la metodologia di progettazione. Questa verrà poi formalizzata nella sezione successiva.

6.4.1 Specifica delle operazioni esterne

Si vuole progettare una unità di elaborazione U avente la seguente struttura esterna:

dove A è un registro, di 32 bit, visibile anche al livello superiore, e B è un ingresso esterno sul quale viene

inviata ad U una sequenza di valori, ognuno rappresentato in complemento a 2 su parola di 32 bit..

L’unità è capace di eseguire una sola operazione: per ogni valore B della sequenza d’ingresso, ad A viene

assegnato il valore assoluto della somma tra il contenuto corrente di A stesso ed il valore B. Si suppone A

inizializzato a 0: di regola, la condizione che tutti i registri assumano inizialmente il valore 0 è forzata, per

ragioni fisiche, all’atto dell’accensione del sistema.

La sequenza di valori B viene inviata ad U da un’altra unità, diciamo Ua, del sistema, e la sequenza di

risultati viene inviata da U ad una unità Ub, eventualmente coincidente con Ua. Occorre fare subito una

precisazione: per il momento non supporremo l’esistenza di alcun meccanismo di sincronizzazione per

distinguere se, ogni volta che viene calcolata una nuova operazione, il valore B è effettivamente un nuovo

valore inviato da Ua o è ancora il valore precedente della sequenza (ricordiamo che tutti i segnali, tranne

A

B

32 32

U

da Ua a Ub

Page 35: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

35

quello per realizzare il clock, sono a livelli). La semplificazione sottintende l’ipotesi che, ogni volta che

viene calcolata una nuova operazione, sia presente un nuovo valore di B, e che questa sincronizzazione sia

sotto la responsabilità di Ua. Allo stesso modo, si suppone che Ub sia capace di distinguere l’arrivo di un

nuovo risultato da U. A questa semplificazione, non realistica nella pratica, verrà posto rimedio in una

successiva sezione, nella quale verranno sviluppati i necessari meccanismi di comunicazione e

sincronizzazione per il corretto scambio di informazioni, in ingresso ed in uscita, tra le unità, senza imporre

vincoli dipendenti dal tempo.

6.4.2 Microprogramma

In un formalismo ad alto livello si può scrivere :

while true

A = A + B ;

if A < 0 then A = – A

Come di regola, una unità di elaborazione esegue un ciclo infinito, all’inizio del quale ricava le informazioni

necessarie, ed al termine del quale ritorna ad attendere tali informazioni. Questa strutturazione è un caso

particolare di quella tipica di un interprete; nel caso più generale di unità multi-operazione, l’interprete, dopo

essersi procurato le informazioni sull’operazione esterna da eseguire, provvede ad una fase di decodifica

dell’operazione stessa, dopo di che passa alla fase di esecuzione vera e propria.

Su questa base, il microprogramma eseguibile può essere espresso nel seguente modo :

0. A + B A, goto 1

1. if A0 = 1

then – A A , goto 0

else nop, goto 0 .

{con A0 si indica il bit più significativo del registro A ; d’ora in poi ci atterremo sempre a questa convenzione, che permette, quando ritenuto opportuno, di prescindere dalla conoscenza della lunghezza di parola).

Il microprogramma evolve attraverso una sequenza di passi, ognuno corrispondente ad una microistruzione.

Ogni microistruzione viene eseguita in un tempo costante uguale al valore del ciclo di clock dell’unità:

questa è infatti la condizione affinché le reti sequenziali PC e PO si stabilizzino, assicurando la corretta

esecuzione della microistruzione stessa prima dell’inizio della successiva.

Ogni microistruzione è caratterizzata da una etichetta, o indirizzo (come 0 per la prima microistruzione).

Trattandosi di un formalismo che deve evidenziare un funzionamento che evolve tra passi di una sequenza, il

microlinguaggio deve contenere, per ogni microistruzione, l’esplicita indicazione dell’indirizzo di

microistruzione successiva (da cui la presenza di strutture goto).

Una scrittura come

A + B A

esprime una operazione elementare di trasferimento tra registri. Il significato è quello di una espressione

di assegnamento, dove le variabili, trovandoci al livello firmware, corrispondono a registri: il risultato

dell’operazione di addizione tra il contenuto corrente (cioè, nel ciclo di clock durante il quale ha luogo

l’esecuzione della microistruzione di indirizzo 0) del registro A ed il contenuto corrente del registro B viene

assegnato al registro A. Ciò significa che prima della fine del ciclo di clock, in cui l’operazione elementare è

eseguita, il valore del risultato sarà presente in forma stabile all’ingresso del registro A; la scrittura di tale

valore nel registro A avverrà all’inizio del successivo ciclo di clock, cioè in corrispondenza del fronte di

Page 36: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

36

discesa del successivo impulso di clock, garantendo così che, durante tutta la durata del ciclo di clock , in

cui l’operazione elementare è eseguita, il contenuto del registro A rimanga inalterato.

Il significato dell’operatore “,” (come in A + B A, goto 1) sta ad indicare esecuzione parallela o

contemporanea all’interno dello stesso ciclo di clock: l’esecuzione dell’operazione elementare (A + B A)

e la determinazione dell’indirizzo successivo (goto 1) sono eventi indipendenti che possono avere luogo in

un qualsiasi ordine e quindi contemporaneamente purché all’interno dello stesso ciclo di clock.

La scrittura nop indica l’operazione elementare nulla, cioè l’operazione che non modifica alcun registro

della PO (lo stato interno della PO).

L’uscita di A0 rappresenta una (l’unica, nell’esempio) variabile di condizionamento, utilizzata dalla PC per

conoscere, nella microistruzione 1, il risultato dell’operazione elementare eseguita nella microistruzione 0 (A

+ B A).

6.4.3 Struttura della PO

La PO deve essere capace di eseguire le seguenti operazioni elementari:

A + B A

– A A

nop

La struttura della PO può allora essere la seguente:

dove si è realizzato sia l’operazione elementare di addizione che quella di negazione in complemento a 2

mediante una stessa ALU; il segnale di controllo , inviato dalla PC, indica, ad ogni ciclo di clock, quale

delle due operazioni deve eseguire la ALU.

Oltre al tipo di segnale di controllo, come necessario per comandare, da parte della PC, l’operazione che

deve eseguire una rete di calcolo, o per comandare l’instradamento attraverso commutatori (non necessari

nell’esempio, ma di regola presenti), la PO di una unità riceve dalla PC anche un altro tipo di segnale di

controllo: quello per abilitare/disabilitare la scrittura in ogni registro. Nel nostro caso si tratta del segnale .

Al riguardo, si osservi che la scrittura nel registro A non deve avvenire in ogni ciclo di clock: deve avvenire

solo in quelli in cui si esegue la microistruzione 0, o in quelli in cui si esegue la 1 con condizione (A0 = 1)

vera, mentre il contenuto A deve rimanere inalterato nei cicli di clock in cui si esegue la microistruzione 1

con condizione (A0 = 1) falsa.

Si ricorda che il segnale viene messo in AND con l’impulso di clock.

Nella figura seguente è riassunto lo schema dei collegamenti tra PC e PO.

alla PC

ALU : +, neg

A

B

A0

dalla PC

Page 37: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

37

La PO è una rete sequenziale avente come ingressi tutti i bit di B ed i segnali e ; il suo stato interno è

memorizzato nel registro A; le sue uscite sono tutti i bit del registro A stesso. Si noti come, anche in un caso

semplice come quello dell’esempio, una PO abbia un numero di stati interni molto elevato, dato da 2m con m

numero di bit complessivo di tutti i registri della PO stessa (nell’esempio, m = 32). La sintesi di una rete

sequenziale con un numero così elevato di stati interni sarebbe, in generale, un problema troppo arduo: esso

si rivela invece di bassa complessità (ordine: il prodotto del numero delle microistruzioni del

microprogramma per il numero di risorse hardware della PO) grazie al procedimento formale adottato

consistente nel derivare la struttura della PO direttamente dal microprogramma e nell’adottare componenti

hardware standard (registri, ALU, commutatori, ecc).

Si osserva inoltre che la PO è una rete sequenziale rispondente al modello matematico di Moore, in quanto

ad ogni ciclo di clock le sue uscite, sia verso l’esterno (A) che verso la PC (A0), sono funzione

esclusivamente dello stato interno (contenuto del registro A), e non del valore corrente delle variabili

d’ingresso. Come nell’esempio, la funzione delle uscite della PO, PO, è di regola molto semplice: in questo

caso di tratta della funzione identità. La funzione di transizione dello stato interno della PO, PO, è data dalla

stessa implementazione delle operazioni elementari :

A + B A

– A A

nop

Tale implementazione consiste infatti nel provocare, in ogni ciclo di clock, il passaggio dallo stato presente

(contenuto corrente di A) allo stato successivo (valore che l’ingresso di A assumerà alla fine del ciclo di

clock, e che quindi A assumerà all’inizio del successivo ciclo di clock) in funzione del valore dello stato

presente stesso e del valore dello stato d’ingresso (valori di B, , ).

6.4.4 Struttura della PC

Dal microprogramma di U si ricava che la PC deve avere 2 stati interni, corrispondenti biunivocamente alle

microistruzioni del microprogramma stesso. Infatti, ogni microistruzione indica come deve comportarsi la

PC dal punto di vista dell’interpretazione delle variabili di condizionamento e delle azioni da intraprendere in

conseguenza. La struttura complessiva della PC è quindi del tipo di quella mostrata in figura:

segnale di clock

PC

PO

A0

B A

RC

PC

PC

A0

1

segnale di clock

Page 38: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

38

Si tratta ora di definire la funzione delle uscite della PC, PC, e la funzione di transizione dello stato interno

della PC, PC, la realizzazione logica delle quali rappresenta la parte combinatoria della rete sequenziale PC.

Dal microprogramma e dallo schema della PO vediamo che:

nello stato interno 0, per qualunque stato d’ingresso, la PC deve generare i segnali e necessari ad

eseguire A + B A, cioè = 0 e = 1, e transire nello stato successivo 1 ;

nello stato interno 1, se lo stato d’ingresso è A0 = 1 allora la PC deve generare i segnali e necessari ad

eseguire – A A, cioè = 1 e = 1, e transire nello stato successivo 0 ; nello stesso stato interno 1, se

lo stato d’ingresso è A0 = 0, allora PC deve impedire la scrittura del registro A, quindi = 0, mentre è

indifferente il valore assunto da in quanto il risultato della ALU, durante il relativo ciclo di clock, non

verrà in alcun modo utilizzato, cioè non verrà scritto in alcun registro.

A questa descrizione a parole corrisponde la seguente tabella di verità delle funzioni PC e PC della PC:

y A0 Y

0 0 1 1

1 0 - 0 0

1 1 1 1 0

Si ricavano quindi le espressioni logiche per PC e PC :

PC : = y ; = y + y A0

PC : Y = y

Per unità “semplici”, cioè con basso numero di stati interni, d’ingresso e di uscita della PC, la progettazione

della PC può quindi essere ottenuta mediante il procedimento generale di sintesi delle reti sequenziali ed

adottando reti combinatorie, PC e PC, a due livelli di logica. Per unità molto complesse le reti combinatorie

potranno dover essere realizzate a più livelli di logica e/o verranno realizzate mediante memorie.

Si osserva che la PC è una rete sequenziale rispondente al modello matematico di Mealy, come è evidente

anche dal fatto che esiste almeno una microistruzione nella quale lo stato di uscita (la configurazione di ,

da inviare alla PO) dipende dal valore dello stato d’ingresso (variabile di condizionamento A0).

Diremo che l’unità di elaborazione risponde, nel suo complesso, al modello Mealy-Moore. Questo sarà il

modello che adotteremo di regola; sono possibili anche altri due modelli (Moore-Moore, Moore-Mealy).

Osservazione importante

In generale esistono diversi gradi di libertà nello scrivere il microprogramma. Nel nostro caso avremmo

anche potuto scrivere

0. A + B A, segno (A + B) S, goto 1

1. if S = 1 then – A A , goto 0 else nop, goto 0

dove S denota un registro di un bit destinato a contenere il valore del Flag all’uscita della ALU che fornisce

il segno dell’ultima operazione eseguita. La contemporaneità delle due operazioni elementari separate

dall’operatore virgola è ovvia, essendo realizzata da due uscite distinte di una stessa rete combinatoria.

Scegliendo questo microprogramma, nello schema della PO va quindi previsto questo registro. È importante

notare che il valore del Flag deve essere memorizzato in un registro di un bit, e che la variabile di

condizionamento S deve quindi essere l’uscita di tale registro. Se infatti avessimo prelevato la variabile di

condizionamento “segno” direttamente all’uscita della rete combinatoria ALU, il valore di tale variabile ad

ogni ciclo di clock

segno (A + B)

Page 39: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

39

sarebbe stato funzione non solo dello stato interno A, ma anche dello stato d’ingresso (valore di ; di

conseguenza, il modello matematico della PO sarebbe stato quello di Mealy. È agevole dimostrare (come

vedremo) che il modello complessivo di unità Mealy-Mealy non è ammissibile in quanto, in generale, non ha

un comportamento determinato all’interno del ciclo di clock.

6.4.5 Ciclo di clock

In seguito dimostreremo che la lunghezza del ciclo di clock nel modello Mealy-Moore è data da:

= TPO + max (TPC + TPO, TPC) +

dove TPO è il massimo ritardo della funzione delle uscite della PO, TPC quella della funzione delle uscite

della PC, TPO quello della funzione di transizione dello stato interno della PO, TPC quello della funzione di

transizione dello stato interno della PC, e la durata dell’impulso di clock. Per quanto riguarda i ritardi delle

funzioni della PO occorre considerare quelli massimi valutati su tutto l’insieme delle microistruzioni.

Assumiamo i seguenti valori dei massimi ritardi temporali delle risorse hardware:

singola porta logica AND, OR : tp = 0,1 nsec,

ALU : 5 tp,

durata dell’impulso di clock : = tp,

collegamenti e porte NOT : ~ 0, in quanto considerati inclusi nei ritardi delle porte logiche AND, OR.

Si ricava dunque che :

TPO = 0.

TPO = 5 tp (ritardo della ALU nella microistruzione 0 e nella 1 con condizione vera),

TPC = 2 tp (rete a due livelli di logica per la funzione di ),

TPC = 0 (nota : anche considerando un ritardo non nullo per la porta NOT, si avrebbe comunque

che TPC < TPC + TPO).

e di conseguenza

= 8 tp = 0,8 nsec

Il clock ha quindi una frequenza

f = 1 / = 109 * 10 / 8 = 1,25 GHz

un valore del tutto “tranquillo” con l’attuale tecnologia dei circuiti integrati.

6.4.6 Tempo medio di elaborazione

Il tempo medio di elaborazione di una unità viene calcolato come

T = k

dove k è il numero medio di cicli di clock necessari ad eseguire la generica operazione del

microprogramma. Nel nostro esempio si ha semplicemente : T = 2 = 1,6 nsec

La banda di elaborazione è definita come il numero medio di operazioni esterne che l’unità può eseguire

nell’unità di tempo. Espressa come numero di operazioni esterne al secondo (ops), la banda si calcola come :

B = 1 / T

Nel nostro esempio, B = 0,625 Gops.

Page 40: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

40

7 Formalizzazione del procedimento di progettazione

A partire dalla specifica delle operazioni esterne, il procedimento di progettazione ha lo scopo di realizzare la

struttura dell’unità di elaborazione secondo il modello PC - PO, e di valutarne le prestazioni (tempo medio di

elaborazione, banda di elaborazione).

7.1 Microlinguaggio

La formalizzazione del procedimento è basata sulla scrittura del microprogramma eseguibile, ogni passo del

quale (microistruzione) è eseguito esattamente in un ciclo di clock. Nel modello Mealy-Moore il

microlinguaggio è detto PS (Phrase Structured); la generica microistruzione ha la seguente struttura :

i. case xi1 xi2 ... xin of

00 ... 0 : op0, goto j0

00 ... 1 : op1, goto j1

...

11 ... 1 : op2n

-1, goto j2n-1

dove

a) i è l’etichetta o indirizzo della microistruzione ;

b) xi1 xi2 ... xin sono variabili di condizionamento, in numero arbitrario da zero fino al massimo della

cardinalità dell’insieme {x} ;

c) i valori delle guardie del case, date da tutte le possibili combinazioni delle variabili di condizionamento

testate xi1 xi2 ... xin, sono dette condizioni logiche della microistruzione : Cih, con h = 0 ... 2n-1 ;

d) opih è una microoperazione, che può essere :

d1. la microoperazione nulla, nop,

d2. una operazione non nulla di trasferimento tra registri,

d3. un insieme di operazioni non nulle di trasferimento tra registri eseguite in parallelo nello stesso

ciclo di clock.

e) jh è una etichetta di microistruzione successiva ;

f) la coppia “opih, goto jh” è detta frase ; la tripla “Cih: opih, goto jh” è detta frase condizionale.

Invece della precedente, nel seguito useremo la notazione più compatta :

i. (Ci0) p0, j0 ; (Ci1) p1, j1 ; ... ; (Ci2n

-1) p2n-1, j2n-1

con lo stesso significato e nomenclatura dei simboli.

Ad esempio :

3. (A0, Z = 0 0) A + B A, 4 ; (A0, Z = 01) M – N M, 5 ; (A0 Z = 1 ) shr1 (N) N, 0

o, visto che le variabili di condizionamento testate nelle condizioni logiche di una stessa microistruzione

sono sempre le stesse :

3. (A0, Z = 0 0) A + B A, 4 ; (= 01) M – N M, 5 ; (= 1 ) shr1 (N) N, 0

Si noti che, in alcune condizioni logiche, il valore di una o più variabili di condizionamento può essere non

specificato (nell’esempio precedente A0 Z = 1 -) : ciò significa che esistono più condizioni logiche della

stessa microistruzione cui corrisponde la stessa frase.

Page 41: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

41

7.2 Ottimizzazione delle micro operazioni

Esistono diverse modalità per scrivere microprogrammi efficienti, riguardanti tanto le micro operazioni

quanto le condizioni logiche. Iniziamo a vedere come scrivere le microoperazioni.

7.2.1 Eliminazione delle nop

Ogni volta che si esegue una nop, agli effetti del tempo di elaborazione viene perduto un ciclo di clock.

Ci rendiamo però subito conto che, scrivendo i microprogrammi con il microlinguaggio PS, è possibile

eliminare tutte le nop, tranne che nell’implementazione dei meccanismi di sincronizzazione che vedremo in

seguito. La tecnica di ottimizzazione, a partire dal microprogramma eseguibile in cui compaiono delle nop, è

il seguente : ogni frase del tipo

F : nop, j

con

j. opj, h

viene trasformata in

F : opj, h

Nel caso che j sia una microistruzione condizionale (contenente più di una frase), le stesse condizioni sono

replicate nella microistruzione in cui compare F congiungendole a quelle eventualmente già presenti.

Esempio

Il microprogramma dell’esempio 1 diviene :

0. A + B A, 1

1. (A0 = 1) – A A , 0 ; (A0 = 0) A + B A, 1

Nel caso che il risultato della somma sia positivo, è possibile iniziare la prossima elaborazione a distanza di

tempo di 1 (purché il nuovo valore di B sia già presente: condizione di “saturazione” dell’unità). Detta p la

probabilità che nell’operazione precedente si sia verificato l’evento (A0 = 1), si ha ora :

T = (1 – p) + p 2 = (1 + p)

con una guadagno relativo in prestazioni del (1 – p) / 2.

In generale, facciamo notare che, per applicare questa tecnica di ottimizzazione, non è necessario partire

dalla versione del microprogramma con nop : in tutte le occasioni in cui, nella scrittura del

microprogramma, verrebbe introdotta una fase con nop, questa deve essere direttamente sostituita con la

frase da eseguire successivamente.

7.2.2 Parallelismo nelle microoperazioni

Nel caso più generale una microoperazione consta di più operazioni elementari eseguite in parallelo nello

stesso ciclo di clock.

Un esempio di microoperazione parallela è il seguente :

A + B A, C + 1 C

Le operazioni elementari A + B A e C +1 C rappresentano computazioni completamente indipendenti,

cioè l’esecuzione di nessuna delle due dipende dal risultato dall’esecuzione dall’altra. Esse possono dunque

essere eseguite in qualsiasi ordine ed, in particolare, contemporaneamente durante lo stesso ciclo di clock.

Questo presuppone che la PO contenga risorse sufficienti all’esecuzione contemporanea delle due operazioni

elementari, cioè che, con riferimento all’esempio precedente, abbia una struttura del tipo della figura

seguente, in cui le operazioni di somma e di incremento sono realizzate da due distinte reti di calcolo (ALU).

Page 42: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

42

Se invece avessimo forzato le due operazioni ad essere eseguite da una stessa ALU, il parallelismo sarebbe

stato impossibile.

Nella trasformazione da una computazione espressa in sequenziale alla stessa computazione espressa in

parallelo, occorre ovviamente rispettare precise condizioni affinché le due computazioni siano equivalenti :

cioè, per uno stesso stato interno iniziale della PO, le due computazioni portino ad uno stesso stato interno

finale della PO.

Per ricavare le condizioni per trasformare una computazione sequenziale nella computazione parallela

equivalente, consideriamo prima i seguenti esempi, nel quali si indica con “;” l’operatore di

sequenziamento, e con “,” l’operatore di esecuzione in parallelo. In tutti gli esempi supporremo che la PO

contenga sufficienti risorse alla eventuale esecuzione in parallelo di operazioni elementari.

(1) A + B A ; C D è equivalente a A + B A , C D

(2) A + B A ; C A non è equivalente a A + B A , C A

il risultato sarebbe diverso, e comunque impredicibile ; ovviamente, nessuna struttura di PO può

permettere la scrittura nello stesso registro di due risultati diversi nello stesso ciclo di clock ;

(3) A + B A ; B D è equivalente a A + B A , B D

infatti l’uscita di uno stesso registro può essere utilizzata contemporaneamente da più operazioni (si

ricordi il significato di segnali a livelli) ;

(4) A + B A ; B + C D è equivalente a A + B A , B + C D

come sopra, e purché la PO disponga di due reti di calcolo indipendenti ;

(5) A + B A ; C B è equivalente a A + B A , C B

infatti, il contenuto di B, a cui si riferisce la A + B A, rimane stabile durante tutto il ciclo di clock in

quanto, durante l’esecuzione di C B, varia solo l’ingresso di B; il nuovo valore verrà scritto in B

all’inizio del successivo ciclo di clock ;

(6) A + B A ; A B non è equivalente a A + B A , A B

infatti, nella computazione sequenziale il valore di A in A B è il risultato di A + B A, mentre nella

computazione parallela il valore di A, durante il ciclo di clock, è lo stesso per le due operazioni

elementari.

Formalmente, valgono le seguenti condizioni di Bernstein per la trasformazione di equivalenza da una

computazione sequenziale ad una parallela :

A A

+

B

K11

. . .

K12

. . .

C C

+ 1

K21

. . . {}11

{}12 {}21

Page 43: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

43

data la computazione sequenziale

f1 : D1 R1 ; f2 : D2 R2

dove fi sono funzioni di dominio Di e codominio (rango) Ri, la computazione parallela

f1 : D1 R1, f2 : D2 R2

è equivalente se :

R1 D2 = e R1 R2 =

Inoltre, in un modello asincrono di computazione, nel quale non si fanno ipotesi sulla durata temporale delle

operazioni e sui loro istanti di inizio, deve valere anche la seguente terza condizione :

R2 D1 =

Questo NON è nel caso della microprogrammazione che utilizza un modello sincrono : di ogni operazione è

noto il tempo di esecuzione (lunghezza del ciclo di clock) e l’istante di inizio. Si veda allo scopo il caso (5).

Occorre ribadire che le condizioni di Bernstein vanno utilizzate per trasformare una descrizione sequenziale

del microprogramma in una descrizione parallela. In realtà, nella scrittura dei microprogrammi dovremo

abituarci a “saltare” la descrizione sequenziale e relativa trasformazione, e scrivere direttamente le

microoperazioni in parallelo.

Ad esempio (“swap di due variabili”) :

(7) A TEMP ; B A ; TEMP B è equivalente a A B , B A

questo non è un caso di trasformazione formale, bensì di una ulteriore ottimizzazione che permette di

risparmiare cicli di clock e risorse hardware. In effetti questo caso, così come il caso (5), si presenta

molto spesso quando si scrivono direttamente le microistruzioni in parallelo, senza passare attraverso

una fase di trasformazione a partire da una computazione sequenziale.

7.2.3 Parallelismo nelle condizioni logiche

Nel caso più generale, il microlinguaggio PS permette di esprimere, in ogni microistruzione, strutture

condizionali di tipo case che, rispetto alle più semplici strutture if then else, permettono un sensibile

risparmio di cicli di clock.

Una sequenza di N microistruzioni, in ognuna delle quali venga testata una sola variabile di

condizionamento, può essere trasformata in una singola microistruzione costituita da un case ad N vie.

Ad esempio, una computazione come :

while true

A := A + B ;

if OV = 1 then A := A - B else if A < 0 then A := – A

dove OV indica la presenza di traboccamento nell’operazione di addizione, viene scritta come :

0. A + B A, 1

1. (OV A0 = 0 1) – A A , 0 ; (= 0 0) A + B A, 1 ; (= 1 ) A B A, 0

7.2.4 Parallelismo nelle microoperazioni e nelle condizioni logiche

Le tecniche ora viste (parallelismo nelle microoperazioni e parallelismo nelle condizioni logiche) sono di

regola applicate congiuntamente allo scopo di ottimizzare i microprogrammi dal punto di vista del numero

dei cicli di clock impiegati.

Page 44: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

44

Spesso, l’applicazione di queste ottimizzazioni passa anche attraverso un opportuno spostamento di codice,

anche a costo di replicare operazioni elementari in più microoperazioni: a livello firmware, infatti, questa

replicazione non comporta alcun aumento di costo e dà solo vantaggi.

Un esempio è il seguente. Si consideri la computazione

A + B A ;

if M0 = 0 then C + 1 C else C 1 C ;

Poiché la condizione logica è indipendente dal risultato di A + B A, la computazione può essere

implementata mediante una sola microistruzione, posticipando A + B A nei due rami della struttura if

then else,:

i. (M0 = 0) A + B A , C + 1 C, i + 1 ; (M0 = 1) A + B A, C 1 C, i + 1

7.3 Struttura della PO

La struttura della PO, vista come rete sequenziale di Moore, viene ricavata formalmente dal

microprogramma mediante il seguente procedimento.

a1. Si individuano tante classi di operazioni elementari per quanti sono i registri destinazione (che

compaiono a destra dell’operatore Ciò permette di individuare i possibili ingressi di ogni registro.

Ad esempio se :

classe del registro A : A + B A ; A – B A ; M A, 31 A

gli ingressi possibili di A sono l’uscita di una ALU (indicata con ALU), l’uscita del registro M (indicata

con M) e la costante 31 (da considerare “cablata” ad hardware o presente in un registro in sola lettura) ;

a2. si ricava una sottostruttura indipendente per ogni registro, con il proprio segnale ; nel caso che gli

ingressi possibili IN siano in numero r > 1, sull’ingresso del registro viene inserito un commutatore,

comandato da lg2 r segnali di controllo ed i cui ingressi principali sono quelli di IN. Nell’esempio

precedente :

b1. Si individuano tante classi di operazioni elementari per quante sono le reti logiche dagli operatori che

compaiono nelle operazioni elementari. Ciò permette di individuare le possibili sorgenti di ingresso di

ogni rete logica. Ad esempio se :

classe di una ALU : A + B A ; A – B A ; M – N M ; sr1 (N) N

le possibili sorgenti di ingresso sono A, M, N a sinistra, e B, N a destra ;

b2. si ricava una sottostruttura indipendente per ogni rete logica ; se si tratta di una rete multifunzione,

come una ALU, con r funzioni, occorrono lg2 r segnali di controllo per comandare la scelta della

funzione ; per ogni ingresso principale, se è prevista più di una sorgente, si inserisce un commutatore

pilotato da opportuni segnali . Nell’esempio precedente :

A A

KA

ALU M 31

A1

A2

Page 45: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

45

Nel caso che non esistano microoperazioni parallele, è sufficiente realizzare tutte le funzioni di calcolo

del microprogramma mediante una sola ALU multifunzione.

Nel caso più generale di microoperazioni parallele, occorrono tante ALU per quanto è il numero di

operazioni elementari che fanno uso di ALU nella “microoperazione più parallela” (cioè in quella

contenente il massimo numero di operazioni elementari facenti uso di ALU).

Nel caso che la PO contenga componenti logici memoria, le tecniche a), b) si applicano anche agli

ingressi di dato e di indirizzo di tali componenti.

c1. Si implementano le variabili di condizionamento, come funzioni di uscite di registri o Flag di ALU

memorizzati in registri di 1 bit.

Per l’analisi della funzione delle uscite della PO (PO) e della funzione di transizione dello stato interno

della PO (PO), si utilizzano reti combinatorie realizzate con componenti standard.

7.4 Struttura della PC

La struttura della PC, vista come rete sequenziale di Mealy, viene ricavata formalmente dal microprogramma

mediante il seguente procedimento.

1. Gli stati interni corrispondono biunivocamente alle etichette delle microistruzioni del microprogramma.

Se m è il numero degli stati interni, il registro di stato del controllo (RC) è di s bit con s = lg2 m.

2. Gli stati di ingresso corrispondono biunivocamente alle possibili combinazioni di variabili di

condizionamento {x} per formare le condizioni logiche del microprogramma.

3. Gli stati di uscita corrispondono biunivocamente alle possibili combinazioni di segnali di controllo =

{} {} necessari ad eseguire tutte le microoperazioni del microprogramma.

4. La tabella di verità della funzione delle uscite PC e della funzione di transizione dello stato interno PC

viene ricavata in base alle tre corrispondenze suddette ed alla struttura del microprogramma. Da questa

tabella è possibile sintetizzare PC con parte combinatoria a due o più livelli di logica.

Si osservi che tutti i segnali devono sempre essere specificati per ogni possibile combinazione (stato

d’ingresso, stato interno), mentre i segnali potranno eventualmente essere non specificati per qualche

combinazione (stato d’ingresso, stato interno).

7.5 Modello Mealy – Moore

Consideriamo la funzione delle uscite PC dell’unità. Partendo dallo stato presente (contenuto di RC) e con

stato d’ingresso definito univocamente dal valore delle variabili di condizionamento, PC deve produrre i

valori delle variabili di controllo che permettono l’esecuzione della microperazione nella PO: si tratta dei

valori di eventuali (in numero di zero o più) variabili , per controllare ALU e commutatori, ed il valore di

una o più variabili che abilitano la scrittura nei registri. Questi valori , sono uscite della rete

combinatoria PC, che implementa la funzione delle uscite dell’automa PC. Tale rete ha come ingressi le

ALU : +, , shr1

a1

a2

K1

11

12

K2

2

Page 46: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

46

variabili dello stato interno presente di PC (uscite di RC) e le variabili di condizionamento, e come uscite le

variabili di controllo.

Il fatto che PC sia un automa di Mealy è, quindi, una conseguenza della struttura di frase delle

microistruzioni.

Complessivamente, lo schema della rete sequenziale PC è del tipo mostrato in figura seguente:

Si consideri la funzione delle uscite di PO, che implementata da una rete combinatoria PO.

Alcune uscite di PO sono ovvie: si tratta delle uscite esterne dell’unità che sono sempre uscite di appositi

registri. Per tali uscite, la funzione PO è quindi la funzione identità rispetto ai contenuti dei registri di uscita.

È importante notare che, per quanto riguarda le uscite esterne, la rete combinatoria PO non ha in ingresso

nessun altra variabile tranne le uscite di detti registri: in altre parole, il risultato della funzione PO dipende,

ad ogni ciclo di clock, solo dallo stato interno di PO e non dallo stato d’ingresso costituito dalla

configurazione delle variabili di controllo.

Agli effetti della funzione delle uscite di PO, assai più significativa è la parte relativa alle variabili di

condizionamento. Il loro valore dipende, ad ogni ciclo di clock, solo dallo stato interno di PO e non dallo

stato d’ingresso costituito dalla configurazione delle variabili di controllo.

Mentre, come detto, la funzione identità è la regola per le uscite esterne, non è detto che ciò avvenga sempre

per le variabili di condizionamento. Ad esempio, il microprogramma può prevedere l’uso di variabili di

condizionamento più complesse come:

segno (A + B)

zero (M – N)

A[J]

or (C)

and (J)

or (E F)

In tali casi, PO è data dalle funzioni, rispettivamente: segno o zero del risultato di una operazione di una

ALU, commutazione del bit J-esimo del registro A con J uscita di registro, OR o AND bit-a-bit dei bit di un

registro, OR bit-a-bit applicato al risultato di una operazione aritmetico-logica o di commutazione

clock

variabili dello stato interno

presente

variabili dello stato interno

successivo

variabili di controllo variabili di condizionamento

PC

PC

R

C

Page 47: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

47

(nell’esempio, OR esclusivo). Le reti combinatorie corrispondenti devono operare, ad ogni ciclo di clock,

solo su uscite di registri.

La condizione:

“lo stato di uscita di PO dipende, ad ogni ciclo di clock, solo dallo stato interno presente e non dallo

stato d’ingresso”

deve valere in generale, qualunque sia la funzione che produce i valori delle variabili di condizionamento.

Le considerazioni precedenti costituiscono la dimostrazione del seguente teorema:

in una unità di elaborazione descritta da un microprogramma con microistruzioni a struttura di frase

1) PC è un automa di Mealy,

2) è necessario che PO sia realizzata come un automa di Moore.

Come detto, il punto 1) è una conseguenza della struttura di frase delle microistruzioni. Il punto 2) è una

condizione necessaria per una realizzazione corretta di PO.

Questo teorema ha quindi implicazioni sulla progettazione di PO. Nel seguito vedremo delle regole in base

alle quali costruire sempre una PO corretta, senza bisogno di addentrarsi nella trattazione dei modelli

matematici di automi.

Concettualmente, lo schema della rete sequenziale PO è sempre del tipo:

dove R denota l’insieme di tutti i registri di PO (A, B, …), inclusi i registri d’ingresso. L’impulso di clock è

messo in AND con i segnali () di abilitazione alla scrittura. Le reti combinatorie PO e PO sono costruite a

partire da componenti standard come ALU, commutatori, memorie, eventuali selezionatori, porte logiche.

7.6 Ciclo di clock

A differenza di una rete sequenziale isolata, per una unità di elaborazione PC-PO occorre ricavare la

condizione di stabilizzazione di entrambe le reti sequenziali PC e PO. Il ciclo di clock non può dunque

concludersi prima che siano stabili le funzioni di transizione della PC e della PO, cioè prima che siano

stabili, rispettivamente, gli ingressi del registro di stato del controllo RC e di tutti i registri della PO.

Nella figura seguente è mostrato come ricavare la lunghezza del ciclo di clock attraverso una sequenza di

eventi temporali. Le frecce indicano eventi “stabilizzazione di funzioni”, gli intervalli temporali i ritardi

massimi di stabilizzazione.

clock

variabili dello stato interno

presente

variabili dello stato interno

successivo

variabili di controllo

variabili di condizionamento

PO

PO

R

e ingressi esterni

e uscite esterne

Page 48: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

48

Poiché la PO è una rete di Moore, la sua uscita è disponibile in forma stabile all’inizio del ciclo di clock ;

dopo un tempo TPO sono quindi stabili le variabili di condizionamento. Solo a questo punto, poiché la PC è

una rete di Mealy, può iniziare, per l’ultima volta all’interno di questi ciclo di clock, la stabilizzazione della

funzione PC e della funzione PC in parallelo (nella figura si è assunto che la seconda abbia un ritardo

maggiore della prima, ma ciò non è influente nella valutazione complessiva). Una volta che PC si è

stabilizzata definitivamente, dopo un intervallo TPC, può quindi iniziare, per l’ultima volta all’interno di

questi ciclo di clock, la stabilizzazione della funzione PO ; il ciclo di clock si può concludere quando si sono

stabilizzate definitivamente tanto la PC quanto la PO.

Di conseguenza, la lunghezza del ciclo di clock è data da :

= TPO + max (TPC + TPO, TPC) +

con ampiezza dell’impulso di clock. Nella formula di , spesso è il termine TPC + TPO a predominare,

fornendo una buona approssimazione del valore di nei casi in cui TPO sia nullo o trascurabile.

Dal ragionamento fatto per ricavare il ciclo di clock, ci si può rendere conto, pur informalmente, della

dimostrazione del teorema “poiché PC è di Mealy, allora PO deve essere di Moore”: infatti, se anche PO

fosse di Mealy, nessuna delle quattro funzioni potrebbe iniziare a stabilizzarsi senza che anche le altre si

siano già stabilizzate; ciò provocherebbe un circolo vizioso che porterebbe (tranne casi particolarissimi) ad

una ri-inizializzazione indefinita della stabilizzazione delle quattro funzioni, con l’impossibilità di

determinare un valore finito per .

7.7 Tempo medio di elaborazione

Il tempo medio di elaborazione di una unità viene calcolato come

T = k

dove k è il numero medio di cicli di clock necessari ad eseguire la generica operazione del microprogramma.

A partire da quando sono presenti i (nuovi) dati in ingresso, si valuta la durata media del corpo del costrutto

più esterno while true ….

In generale, in un microprogramma sono presenti più sottosequenze di microistruzioni eseguite con una certa

probabilità pi, dove:

(i = 0...n-1) pi = 1

Di ogni sottosequenza si calcola il numero di cicli di clock ki necessario ed eseguirla e quindi si ricava il

valore di T come media pesata

T = * (i = 0...n-1) pi * ki

TPC

PC

PO

TPO TPO

TPC

{x} {}

Page 49: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

49

Quando non siano note le pi, si assume che tutte le sottosequenze siano equiprobabili, calcolando perciò T

come media aritmetica dei ki.

La banda di elaborazione è definita come il numero medio di operazioni esterne che l’unità può eseguire

nell’unità di tempo, nella situazione in cui, all’inizio di ogni iterazione, sia già presente un nuovo insieme di

dati d’ingresso (unità saturata, cioè “sollecitata” al massimo). Espressa come numero di operazioni esterne

al secondo (ops), la banda si calcola come :

B = 1 / T

7.8 Esempio 2

Consideriamo una unità di elaborazione U così definita:

contiene una memoria A, di capacità N = 4K parole (32 bit) e tempo di accesso 3tp;

ha un ingresso esterno IN di 32 bit ed una uscita esterna OUT di 13 bit;

per ogni IN, invia su OUT il numero di volte che il valore di IN compare in A.

Progettare l’unità e valutarne il tempo medio di elaborazione in funzione del ritardo tp di una porta logica con

al più 8 ingressi, supponendo che una ALU abbia ritardo 5tp e la durata dell’impulso di clock sia uguale a tp.

Il microprogramma ad alto livello può essere:

while true

B = IN; C = 0;

for (J = 0; J < N; J ++)

if ( A[ J ] = B) then C = C + 1;

OUT = C

Il registro B è usato per mantenere stabile il valore ricevuto su IN per tutta la durata del microprogramma. Il

registro C (13 bit) contiene il valore temporaneo del risultato, che verrà scritto nel registro di uscita OUT

solo alla fine del microprogramma: in tal modo, i valori intermedi di C non sono inviati all’unità

destinazione.

Scriviamo il microprogramma eseguibile, controllando il loop for mediante un registro J (13 bit) inizializzato

a 0 e incrementato via via; la condizione di terminazione del loop è data da (J = N), la cui implementazione

in una condizione logica ammissibile a livello firmware è (J0 = 1). Inoltre, implementiamo la condizione if

A[ J ] = B mediante sottrazione dei valori da confrontare e test per zero del risultato, utilizzando il Flag Zero

di una ALU (ricordiamo che, se il risultato è uguale a zero, allora Zero = 1).

Una prima versione del microprogramma è la seguente:

0. IN B, 0 C, 0 J, 1

1. (J0 = 0) zero (A[Jm] – B) Z, 2;

( = 1) C OUT, 0

2. (Z = 0) J + 1 J, 1;

(Z = 1) J + 1 J, C + 1 C, 1

dove Jm è dato dai 12 bit meno significativi di J.

In questa versione, sono state applicate le tecniche di ottimizzazione dei microprogrammi, anche se non in

maniera intensiva come invece faremo in versioni successive.

Page 50: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

50

Il tempo medio di elaborazione, in funzione del ciclo di clock, è ottenibile dal seguente grafo relativo

all’evoluzione delle microistruzioni:

L’intero associato ad un arco indica il numero delle volte che l’arco stesso viene attraversato. Il numero k di

cicli di clock si ottiene valutando la somma degli interi associati agli archi percorsi per eseguire

completamente il microprogramma:

T = k = ( 2 + 2 N ) 2 N

Per realizzare la PO, riconosciamo le classi di operazioni elementari per registro destinazione:

B: IN B

C: 0 C, C + 1 C

J: 0 J, J + 1 J

Z: zero (A[Jm] – B) Z

OUT: C OUT

Le operazioni che riguardano le risorse combinatorie sono:

memoria A (nessun ingresso per scrittura):

indirizzo Jm;

reti ALU:

A[J] – B

J + 1 J, C + 1 C.

Nel caso delle ALU, è stata messo in evidenza il massimo parallelismo richiesto. Essendo necessarie due

ALU (numero minimo uguale al massimo parallelismo nelle microoperazioni)

Lo schema della PO è quindi il seguente:

N

1

0 1 2 N

1

ALU1 : , +1

Alu2

KALU1

Alu1

outA C

Alu1

ALU2 : +1

Alu2

J

Z Z

x1 = Z

Page 51: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

51

La funzione delle uscite PO è definita come:

out (13 bit) = OUT

x0 = J0

x1 = Z

Il suo ritardo (relativo alle variabili di condizionamento) è dato da:

TPO = 0

La funzione di transizione dello stato interno PO è definita come:

1) inB = when B = 1 do IN

2) inZ = when Z = 1 do

case Alu1 Alu2 of

0 0 : zero (A[Jm] – B)

0 1 : zero (A[Jm] +1)

1 0 : zero (C – B)

1 1 : zero (C + 1)

3) inC = when C = 1 do

if C = 0 then 0 else

case Alu1 Alu2 of

0 0 : A[Jm] – B

0 1 : A[Jm] +1

1 0 : C – B

1 1 : C + 1

4) inJ = when J = 1 do

if J = 0 then 0 else J + 1

5) inOUT = when OUT = 1 do C

B B

IN

C C

KC C

0 Alu1

J J

KJ J

0 Alu2

OUT OUT

C

x0 = J0

A [4K] outA

Jm

Jm

Page 52: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

52

Il massimi ritardi associati valgono:

1) TPO/B = 0

2) TPO/Z = TA + TK + TALU = 3tp + 2tp + 5tp = 10 tp

3) TPO/C = TK + TALU + TK = 2tp + 5tp + 2tp = 9 tp

nota: valutati i ritardi degli unici casi possibili per la modifica di C

4) TPO/J = TALU + TK = 5tp + 2tp = 7 tp

5) TPO/OUT = 0

da cui il massimo ritardo di stabilizzazione della PO:

TPO = 10 tp

La PC ha tre stati interni (microistruzioni 0, 1, 2) codificabili mediante due variabili dello stato interno al

seguente modo:

stato y0 y1

0 0 0

1 0 1

2 1

Le due funzioni della PC sono definite attraverso la seguente tabella:

PC PC

y0 y1 J0 Z Alu1 Alu2 Z B C C J J OUT Y0 Y1

0 0 0 1 0 1 0 1 0 0 1

0 1 0 0 0 1 0 0 0 0 1 0

0 1 1 0 0 0 0 1 0 0

1 0 0 0 0 1 1 0 0 1

1 1 1 1 0 0 1 1 1 1 0 0 1

dalla quale si ricavano le espressioni logiche delle variabili di controllo:

Alu1 = y0 Z

Alu2 = y0 Z

𝛽𝑍 = 𝑦0 𝑦1 𝐽0

C = y0 Z

𝛽𝐶 = 𝑦0 𝑦1 + 𝑦0 𝑍

𝛽𝐶 = 𝑦0 𝑦1 + 𝑦0 𝑍

𝛽𝑂𝑈𝑇 = 𝑦0 𝑦1 𝐽0

Page 53: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

53

e delle variabili dello stato interno successivo:

È immediato passare allo schema a due livelli di logica. I ritardi di stabilizzazione valgono:

TPC = 2 tp

TPC = 2 tp

Il ciclo di clock vale:

= TPO + max (TPC + TPO, TPC) + 2 tp + 10 tp + tp = 13 tp

Il tempo medio di elaborazione:

T 2 N tp 1,06 105 tp

La banda di elaborazione:

7.9 Esempio 3

Consideriamo una versione alternativa dell’unità dell’Esempio 2. Stavolta il microprogramma viene scritto

come segue:

0. IN B, 0 C, 0 J, 1

1. (J0 , zero (A[Jm] – B) = 0 0) J + 1 J, 1;

( = 0 1) J + 1 J, C + 1 C, 1;

( = 1 ) C OUT, 0

In questa versione abbiamo adottato come variabile di condizionamento direttamente il valore di zero (A[Jm]

– B) all’uscita di una ALU, invece che memorizzare tale valore in un registro (Z) e testarlo nella successiva

microistruzione. Come studiato, questo è lecito purché PO sia realizzata in modo tale da soddisfare la

condizione, di essere un automa di Moore, necessaria per la correttezza. Vedremo tra breve come questo può

essere sempre ottenuto.

Notiamo alcuni altri aspetti:

1. il numero di cicli di clock impiegati è decisamente minore rispetto alla versione dell’Esempio 2:

k N

d’altra parte, il ciclo di clock t risulterà maggiore, in quanto ora TPO è tutt’altro che nullo: si tratta

del ritardo di stabilizzazione della funzione zero (A[Jm] – B). Il tempo medio di elaborazione:

T = k

potrà risultare maggiore o minore a seconda dei nuovi valori assunti da k e . Torneremo su questo

importante aspetto nella sez. successiva;

2. si noti l’applicazione più significativa delle tecniche di ottimizzazione studiate in precedenza.

Anzitutto, si ha parallelismo anche nelle condizioni logiche. Inoltre, dal punto di vista

dell’applicazione delle condizioni di Bernstein, vale la pena di notare che, nella stessa

microistruzione, viene letto il contenuto corrente di J (nella condizione logica) e viene prodotto il

nuovo valore di J (nella microoperazione): come visto nel caso (5) dei casi di ottimizzazione, questo

è corretto grazie al modello sincrono di microprogrammazione.

Page 54: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

54

Per realizzare la PO come automa di Moore, ora non è più possibile usare una stessa ALU per eseguire

zero(A[Jm] – B) e C + 1 C: infatti, se così fosse, la variabile di condizionamento x1 = zero(A[Jm] – B)

verrebbe a dipendere, ad ogni ciclo di clock, anche dal valore di variabili di controllo (controllo dei

commutatori d’ingresso della ALU, controllo dell’operazione comandata alla ALU). La soluzione corretta

consiste nell’adottare una terza ALU dedicata esclusivamente a produrre zero(A[Jm] – B), distinta dalla ALU

che (analogamente a quella per l’incremento di J) provvede all’incremento di C.

Ora si ha:

TPO = TA + TALU = 8 tp

TPO = TALU + TK = 7 tp

In questo caso, il ritardo maggiore è quello per l’esecuzione dell’operazione elementare C +

1 C o di J + 1 J

TPC = TPC =2 tp

Questa valutazione è da verificare (si lascia come esercizio), in quanto anche la struttura della PC è

diversa rispetto all’Esempio 2, in particolare perché ora si ha una sola variabile dello stato interno

invece di due (al limite, in casi simili è possibile che uno o entrambi i ritardi valga tp).

Quindi:

= TPO + max (TPC + TPO, TPC) + 8 tp2 tp + 7 tp + tp = 18 tp

Complessivamente, il tempo medio di elaborazione è diminuito:

T = k = N tp 0,74 105 tp

come era naturale attendersi, in quanto, a fronte della riduzione di k alla metà, è aumentato decisamente

meno del doppio.

Quindi, in questo esempio abbiamo mostrato che:

a) una versione del microprogramma con almeno una variabile di condizionamento complesse (PO

diversa dalla funzione identità) può portare ad una ulteriore ottimizzazione delle prestazioni rispetto

alla versione con tutte variabili di condizionamento che siano direttamente uscite di registri;

b) variabili di condizionamento complesse sono sempre realizzabili in modo da rispettare la condizione

necessaria per la correttezza (PO di Moore).

7.10 Ottimizzazione di T = k

Quanto visto con gli Esempi 2 e 3, relativamente alla ricerca del miglior compromesso tra k e con

l’obiettivo di ottimizzare il tempo medio di elaborazione T, è un problema a carattere generale della massima

importanza, specie in unità descritte da microprogramma che contengano loop ripetuti molte volte.

Come tutti i problemi di ottimizzazione di questa classe, esso risulta NP-arduo in generale. Infatti, da una

parte è vero che, usando variabili di condizionamento complesse, molto spesso (quasi sempre) la

diminuzione di k è percentualmente maggiore dell’aumento di rispetto alla soluzione con variabili di

condizionamento semplici, ma questo non può essere dimostrato in generale, in quanto il valore di T = k dipende, oltre che dalla capacità di scrivere il microprogramma, dalla realizzazione della PC e della PO nelle

due soluzioni. Di conseguenza, formalmente si può solo decidere la soluzione migliore dopo averle

implementate tutte.

Inoltre, è importante notare come la complessità della scelta della soluzione, in relazione alla scelta delle

variabili di condizionamento, sia influenzata anche dal numero e probabilità di occorrenza delle operazioni

esterne: se è presente più di una operazione esterna, una ottimizzazione valida per una operazione esterna

può non esserlo per altre; ad esempio, in seguito all’aumento del ciclo di clock che si riveli ottimale per una

operazione esterna, ma che vada a detrimento di altre.

Page 55: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

55

Esiste anche la possibilità di migliorare ulteriormente le prestazioni, ottenendo un valore più basso di k senza

aumentare (apprezzabilmente) il valore di , quindi cercando di recepire il meglio delle due soluzioni. A

maggiore ragione, non è dimostrabile in generale, anche se molto spesso si rivela la soluzione migliore.

Per realizzare questa terza soluzione, occorre agire soprattutto

sulla fase di inizializzazione e di terminazione del microprogramma,

sul parallelismo nelle microoperazioni e nelle condizioni logiche.

Con riferimento all’unità degli Esempi 2 e 3, la soluzione consiste nello scrivere il microprogramma nel

modo seguente:

0. IN B, 0 C, zero (A[0] – IN) Z, 1 J, 1

1. (J0 , Z = 0 0) J + 1 J, zero (A[Jm] – B) Z, 1;

( = 0 1) J + 1 J, C + 1 C, zero (A[Jm] – B) Z, 1;

( = 1 0) C OUT, 0;

( = 1 1) C + 1 OUT, 0

Adottando la variabile di condizionamento zero (…) prelevata direttamente dall’uscite di un registro (Z),

l’inizializzazione di tale variabile viene anticipata nella microistruzione 0, usando direttamente anche alcuni

valori d’ingresso e valori costanti, contestualmente all’inizializzazione del contatore di passi J al secondo

valore:

zero (A[0] – IN) Z, 1 J

Durante il loop, viene prodotto il valore successivo della variabile di condizionamento Z in parallelo al

calcolo già presente nelle versioni precedenti (si tratta di una applicazione significativa del caso (5) delle

ottimizzazioni nelle micro operazioni):

J + 1 J, … , zero (A[Jm] – B) Z

L’anticipo di alcune variabili all’atto dell’inizializzazione ha, in genere, come conseguenza una modifica

dell’ultimo passo; nel nostro caso, quando si verifica la condizione di terminazione deve ancora essere

eseguito l’ultimo calcolo

C + 1 OUT

nel caso che Z = 1. Utilizzando ancora tre ALU, si ha:

TPO = 0

TPO = TK + TA + TALU = 10 tp

Il ritardo TK è ora quello di un commutatore posto sull’ingresso di indirizzo della memoria A,

dovendo questa essere indirizzata sia con la costante 0 che con Jm

TPC = TPC =2 tp (da verificare)

Quindi:

= TPO + max (TPC + TPO, TPC) + 02 tp + 10 tp + tp = 13 tp

Complessivamente, il tempo medio di elaborazione è dimezzato rispetto alla versione dell’Esempio 2:

T = k = N tp 0,53 105 tp

Page 56: Marco Vanneschi, Architettura degli Elaboratori, Edizioni ...vannesch/AE2009-10/Appunti.pdf · Marco Vanneschi, Architettura degli Elaboratori, Edizioni PLUS, Università di Pisa,

56

7.11 Risorse in cascata

Ottimizzazioni analoghe a quelle ora studiate si possono avere in tutti quei casi in cui nella PO esiste la

possibilità di disporre risorse combinatorie in cascata. Ad esempio, supponiamo di volere eseguire un calcolo

del tipo:

A = F1 (B, F2 (C, D)

dove F1 e F2 sono funzioni implementabili mediante ALU. Il microprogramma può essere scritto eseguendo

il calcolo in una singola microistruzione, oppure spezzandolo in due microistruzioni, la prima che memorizza

F2 (C, D) in un registro temporaneo E, la seconda che esegue F1 (B, E) A.

La dicotomia è ancora tra lunghezza del ciclo di clock, che è maggiore nel caso di singola microistruzione

(maggior ritardo di stabilizzazione di PO), rispetto al numero di cicli di clock, che è maggiore nel caso di

microistruzioni più semplici.

Spesso, anche se non è dimostrabile in generale, la soluzione con ciclo di clock più lungo minimizza il tempo

medio di elaborazione.