Salta al contenuto
Note per Studenti Formulario · Architettura degli Elaboratori

FormularioArchitettura degli Elaboratori: definizioni, teoremi e formule delle note, in ordine di capitolo

In questa pagina 10

I. Struttura del calcolatore

Architettura e organizzazione di un calcolatore

Definizione (architettura e organizzazione)

Architettura Organizzazione
Che cos'è gli attributi visibili al programmatore, che influenzano l'esecuzione logica di un programma le unità operative e le loro connessioni che realizzano l'architettura
Esempi insieme delle istruzioni, numero di bit per i dati, modalità di indirizzamento, meccanismi di I/O segnali di controllo, tecnologia della memoria, interfacce con le periferiche, circuiti usati
Domanda tipo c'è un'istruzione di moltiplicazione? la moltiplicazione è fatta da un circuito dedicato o da somme ripetute?

Esempio. L'esistenza di una istruzione di moltiplicazione appartiene all'architettura; realizzarla con un circuito dedicato o con somme ripetute è una scelta di organizzazione.

Definizione (macchina di von Neumann). I primi calcolatori (ENIAC, 1946) si programmavano cambiando i collegamenti: programma cablato. L'idea di von Neumann è un hardware generico che esegue operazioni diverse a seconda dei segnali di controllo ricevuti, e di scrivere questi comandi come istruzioni memorizzate in memoria insieme ai dati (programma memorizzato).

Caratteristiche:

  1. dati e istruzioni nella stessa memoria, scrivibile e leggibile;
  2. la memoria è indirizzata per posizione, indipendentemente dal contenuto;
  3. le istruzioni si eseguono in sequenza, salvo salti espliciti.

Esempio. Nell'IAS una parola da 4040 bit contiene due istruzioni da 2020 bit (8 bit di codice operativo + 12 di indirizzo): con 212=4096≥10002^{12}=4096\ge1000 si indirizzano tutte le parole.

Legge di Moore: il numero di transistor integrabili su un chip raddoppia a intervalli regolari (circa ogni 18–24 mesi). Componenti più piccoli e vicini significano segnali che percorrono distanze minori (sono limitati dalla velocità della luce), quindi clock più alti, consumi minori per operazione e costo minore.

Esempio. Con un raddoppio ogni 2424 mesi, in 1212 anni i transistor per chip aumentano di 212/2=642^{12/2}=64 volte.

Ciclo fetch-execute

Definizione (ciclo fetch-execute)

  1. Fetch (prelievo): MAR←PC\text{MAR} \leftarrow \text{PC}; la memoria legge; MBR←M[MAR]\text{MBR} \leftarrow M[\text{MAR}]; IR←MBR\text{IR} \leftarrow \text{MBR}; PC←PC+\text{PC} \leftarrow \text{PC} + lunghezza dell'istruzione (in ARM e MIPS: +4+4 byte).
  2. Execute (esecuzione): l'unità di controllo decodifica l'IR e svolge l'azione.

Esempio. Con PC=300\text{PC}=300 la fase di fetch porta IR=1940\text{IR}=1940 e PC=301\text{PC}=301; l'execute carica in AC il contenuto della cella 940940.

Bus e interconnessione

Proprietà (ampiezza delle linee del bus)

Linee Cosa trasportano Effetto della loro ampiezza
dati i dati e le istruzioni trasferiti con 32 linee si trasferiscono 4 byte per ciclo; con un bus da 8 bit una parola da 32 bit richiede 4 trasferimenti
indirizzi la sorgente o la destinazione del dato (cella di memoria o porta di I/O) con kk linee si indirizzano 2k2^k locazioni: 24 linee → 16 M locazioni, 32 linee → 4 G
controllo comandi e temporizzazione —

Esempio. Con k=24k=24 linee di indirizzo si indirizzano 224=16M2^{24}=16\mathrm M locazioni; con 3232 linee di dati si trasferiscono 44 byte per ciclo.

Definizione (temporizzazione sincrona e asincrona del bus)

  • Sincrona: un clock comune scandisce gli eventi; ogni operazione dura un numero intero di cicli. Semplice, ma tutti si adeguano al dispositivo più lento.
  • Asincrona: un evento segue il precedente tramite segnali di handshake (es. il master alza "lettura", lo slave risponde "dato pronto"). Dispositivi lenti e veloci convivono.

Esempio. Con un bus sincrono a 100100 MHz (ciclo di 1010 ns) una operazione di 33 cicli dura 3030 ns.

II. Rappresentazione dell'informazione

Sistemi di numerazione posizionali

Definizione (notazione posizionale in base bb). In base bb si usano le cifre 0,…,b−10, \dots, b-1 e ogni cifra pesa una potenza di bb che dipende dalla posizione:

(cn−1…c1c0,c−1…c−m)b=∑i=−mn−1ci bi(c_{n-1} \dots c_1 c_0 , c_{-1} \dots c_{-m})_b = \sum_{i=-m}^{n-1} c_i \, b^i

Esempio. (2F)16=2⋅16+15=4710(2\mathrm F)_{16}=2\cdot16+15=47_{10} e 1578=1⋅64+5⋅8+7=11110157_8=1\cdot64+5\cdot8+7=111_{10}.

Proprietà (conversione della parte intera per divisioni successive). Divisioni successive per bb: i resti, letti dall'ultimo al primo, sono le cifre da sinistra a destra. Funziona perché N=q⋅b+c0N = q \cdot b + c_0: il primo resto è la cifra meno significativa.

Esempio. 3737 in base 22: 37→1837\to18 r 11, 18→918\to9 r 00, 9→49\to4 r 11, 4→24\to2 r 00, 2→12\to1 r 00, 1→01\to0 r 11; letti dal basso 37=100101237=100101_2.

Proprietà (conversione della parte frazionaria per moltiplicazioni successive). Moltiplicazioni successive per bb: a ogni passo la parte intera del prodotto è la cifra successiva dopo la virgola, e si prosegue con la sola parte frazionaria.

Esempio. 0,625⋅2=1,250{,}625\cdot2=1{,}25 (cifra 11), 0,25⋅2=0,50{,}25\cdot2=0{,}5 (cifra 00), 0,5⋅2=1,00{,}5\cdot2=1{,}0 (cifra 11): 0,625=0,10120{,}625=0{,}101_2.

Proprietà (conversione tra basi potenze di 2). Poiché 8=238 = 2^3 e 16=2416 = 2^4, ogni cifra ottale corrisponde a 3 bit e ogni cifra esadecimale a 4 bit. Si raggruppano i bit a partire dalla virgola (a sinistra per la parte intera, a destra per la frazionaria), completando con zeri.

Esempio. 1011 01112=B716=183101011\,0111_2=\mathrm B7_{16}=183_{10} e 010 110 1112=2678010\,110\,111_2=267_8.

Rappresentazione dei numeri interi con segno

Definizione (modulo e segno). Il bit più significativo è il segno (0 = positivo, 1 = negativo), gli altri n−1n-1 bit sono il modulo.

Esempio. A 44 bit +5=0101+5=0101 e −5=1101-5=1101 in modulo e segno.

Definizione (complemento a 1). Il negativo −x-x si ottiene invertendo tutti i bit di xx.

Esempio. A 44 bit +5=0101+5=0101 e −5=1010-5=1010 in complemento a 1.

Definizione (complemento a 2). È la rappresentazione usata da tutti i processori. Il bit più significativo ha peso negativo:

x=−cn−1 2n−1+∑i=0n−2ci 2ix = -c_{n-1}\, 2^{n-1} + \sum_{i=0}^{n-2} c_i \, 2^i

Equivalentemente: un negativo −x-x è rappresentato dal numero senza segno 2n−x2^n - x.

Esempio. 1110 11001110\,1100 a 88 bit vale −128+64+32+8+4=−20-128+64+32+8+4=-20, ed è anche 28−20=2362^8-20=236.

Proprietà (opposto in complemento a 2). Opposto (vale in entrambi i versi): si invertono tutti i bit e si somma 1.

+20=0001 0100 →inverto 1110 1011 →+1 1110 1100=−20+20 = 0001\,0100 \ \xrightarrow{\text{inverto}}\ 1110\,1011 \ \xrightarrow{+1}\ 1110\,1100 = -20

Esempio. A 44 bit l'opposto di 00110011 (+3+3) è 1100+1=11011100+1=1101 (−3-3).

Proprietà (estensione del segno). Per passare da nn a m>nm > n bit si replica il bit di segno a sinistra: −20-20 su 8 bit 1110 11001110\,1100 diventa su 16 bit 1111 1111 1110 11001111\,1111\,1110\,1100; +20+20 diventa 0000 0000 0001 01000000\,0000\,0001\,0100. Serve per esempio quando il processore carica un byte con segno in un registro a 32 bit.

Esempio. 11011101 (−3-3 su 44 bit) diventa 1111 11011111\,1101 su 88 bit, ancora −3-3.

Definizione (rappresentazione in eccesso K). Si memorizza x+Kx + K come intero senza segno; di solito K=2n−1K = 2^{n-1} o 2n−1−12^{n-1}-1.

Esempio. A 44 bit con K=8K=8 il valore −3-3 si memorizza come −3+8=5=0101-3+8=5=0101.

Aritmetica binaria

Definizione (somma binaria). In colonna come in base 10, con le regole 0+0=00+0=0, 0+1=10+1=1, 1+1=01+1=0 con riporto 1, 1+1+1=11+1+1 = 1 con riporto 1.

Esempio. 1+1+1=11+1+1=1 con riporto 11: 011+001=100011+001=100 (3+1=43+1=4).

Formula (sottrazione in complemento a 2). a−b=a+(−b)a - b = a + (-b): si calcola l'opposto di bb (inverti i bit, +1; vedi Rappresentazione dei numeri interi con segnoInteri con segno su n bit: modulo e segno, complemento a 1, complemento a 2 ed eccesso K; intervalli rappresentabili, calcolo dell'opposto, estensione del segno.Rappresentazione dei numeri interi con segno →) e si somma. In hardware: si invertono i bit di bb e si porta a 1 il riporto in ingresso del sommatore, così non serve un sottrattore.

Esempio. A 44 bit 5−35-3: 0101+1101=(1) 0010=20101+1101=(1)\,0010=2, con il riporto scartato.

Proprietà (overflow con e senza segno). Il risultato non sta negli nn bit. La regola dipende da come si interpretano i bit:

Interpretazione Overflow quando Bit che lo segnala
senza segno esce un riporto dal MSB nella somma (nella sottrazione: manca il prestito) C (carry)
complemento a 2 due operandi dello stesso segno danno un risultato di segno opposto V (overflow)

Sommando due numeri di segno diverso non c'è mai overflow in complemento a 2. Equivalente: V=V = riporto entrante nel MSB ⊕\oplus riporto uscente dal MSB.

Esempio. A 88 bit 0111 0000+0101 0000=1100 00000111\,0000+0101\,0000=1100\,0000 (112+80112+80): C=0C=0 (senza segno vale 192192, corretto) e V=1V=1 (in complemento a 2 sarebbe −64-64).

Proprietà (algoritmo di Booth). Si esaminano le coppie (Q0,Q−1)(Q_0, Q_{-1}) con Q−1Q_{-1} inizialmente 0:

Q0 Q−1Q_0\,Q_{-1} Azione
1 0 A←A−MA \leftarrow A - M
0 1 A←A+MA \leftarrow A + M
0 0, 1 1 niente

poi scorrimento aritmetico a destra di A, Q, Q−1Q_{-1}. Una sequenza di 1 consecutivi nel moltiplicatore costa una sottrazione all'inizio e una somma alla fine invece di una somma per bit.

Esempio. Con M=0111M=0111 e Q=0011Q=0011 (4 bit) l'algoritmo di Booth dà A:Q=0001 0101=21=7⋅3A:Q=0001\,0101=21=7\cdot3.

Definizione (divisione senza segno). Senza segno, come in colonna: a ogni passo si prova a sottrarre il divisore dal resto parziale; se il risultato è ≥0\ge 0 il bit del quoziente è 1, altrimenti è 0 e si ripristina il resto. Esempio 13:313 : 3: 1101:111101 : 11 → quoziente 100=4100 = 4, resto 11.

Esempio. 13:313:3 ha quoziente 1002=4100_2=4 e resto 11, perché 13=3⋅4+113=3\cdot4+1.

Definizione (scorrimenti logici, aritmetici e rotazioni)

Operazione Effetto Esempio su 8 bit
shift logico a sinistra di kk moltiplica per 2k2^k (se non c'è overflow) 0000 0101≪2=0001 01000000\,0101 \ll 2 = 0001\,0100 (5 → 20)
shift logico a destra di kk divide per 2k2^k un senza segno (entra 0) 1111 0000≫1=0111 10001111\,0000 \gg 1 = 0111\,1000 (240 → 120)
shift aritmetico a destra di kk divide per 2k2^k un numero in complemento a 2 (entra il bit di segno), arrotondando verso −∞-\infty 1111 0000≫1=1111 10001111\,0000 \gg 1 = 1111\,1000 (−16 → −8)
rotazione i bit che escono rientrano dall'altro lato 1000 0001→0000 00111000\,0001 \to 0000\,0011 (a sinistra)

Esempio. Su 88 bit, 1111 0000≫11111\,0000\gg1 dà 0111 10000111\,1000 (logico, 240→120240\to120) oppure 1111 10001111\,1000 (aritmetico, −16→−8-16\to-8).

Numeri in virgola mobile IEEE 754

Definizione (normalizzazione). Un numero si normalizza spostando la virgola finché resta una sola cifra 1 a sinistra: 1101,01=1,10101⋅231101{,}01 = 1{,}10101 \cdot 2^3; 0,00101=1,01⋅2−30{,}00101 = 1{,}01 \cdot 2^{-3}.

Esempio. 101,12=5,5=1,0112⋅22101{,}1_2=5{,}5=1{,}011_2\cdot2^2.

Formula (valore di un numero IEEE 754)

x=(−1)S⋅1,M⋅2 E−biasx = (-1)^S \cdot 1{,}M \cdot 2^{\,E - \text{bias}}

Formato Bit Segno SS Esponente EE Mantissa MM Bias Cifre decimali
singola precisione 32 1 8 23 127 ≈ 7
doppia precisione 64 1 11 52 1023 ≈ 16

Esempio. 42C8000016\mathrm{42C80000}_{16}: S=0S=0, E=133E=133, 1,M=1,100121{,}M=1{,}1001_2, quindi x=1,10012⋅2133−127=11001002=100x=1{,}1001_2\cdot2^{133-127}=1100100_2=100.

Proprietà (valori speciali IEEE 754)

Esponente EE Mantissa MM Significato
00 00 ±0\pm 0
00 ≠0\neq 0 denormalizzato: (−1)S⋅0,M⋅2−126(-1)^S \cdot 0{,}M \cdot 2^{-126}
1…2541 \dots 254 qualsiasi normalizzato
255255 (tutti 1) 00 ±∞\pm\infty (es. 1/01/0, overflow)
255255 ≠0\neq 0 NaN (es. 0/00/0, −1\sqrt{-1})

Esempio. In singola precisione 7F80000016\mathrm{7F800000}_{16} (E=255E=255, M=0M=0) è +∞+\infty e 0000000016\mathrm{00000000}_{16} è +0+0.

Formula (massimo e minimo normalizzato in singola precisione)

  • Massimo normalizzato: (2−2−23)⋅2127≈3,4⋅1038(2 - 2^{-23}) \cdot 2^{127} \approx 3{,}4 \cdot 10^{38}.
  • Minimo normalizzato positivo: 2−126≈1,18⋅10−382^{-126} \approx 1{,}18 \cdot 10^{-38}.

Esempio. Il pattern 0080000016\mathrm{00800000}_{16} (E=1E=1, M=0M=0) vale 21−127=2−126≈1,18⋅10−382^{1-127}=2^{-126}\approx1{,}18\cdot10^{-38}.

Formula (distanza tra float consecutivi)

  • Distanza tra due float consecutivi con esponente ee: 2e−232^{e-23}. Vicino a 1 è 2−23≈1,2⋅10−72^{-23} \approx 1{,}2 \cdot 10^{-7} (epsilon di macchinadistanza tra 1 e il float successivo); vicino a 224≈1,7⋅1072^{24} \approx 1{,}7 \cdot 10^7 è 2: da lì in poi non tutti gli interi sono rappresentabili.

Esempio. Vicino a 11 la distanza è 2−23≈1,19⋅10−72^{-23}\approx1{,}19\cdot10^{-7}; a 2242^{24} vale 22, quindi in singola 224+1=2242^{24}+1=2^{24}.

Codifiche binarie e informazione non numerica

Formula (bit per codificare NN oggetti)

  • Con nn bit si codificano 2n2^n oggetti distinti; per NN oggetti servono ⌈log⁡2N⌉\lceil \log_2 N \rceil bit (26 lettere → 5 bit).

Esempio. Per 2626 lettere servono ⌈log⁡226⌉=5\lceil\log_2 26\rceil=5 bit, perché 24=16<26≤25=322^4=16<26\le2^5=32.

Formula (bit di indirizzo di una memoria). Per memorie e indirizzi si usano le potenze di 2 (spesso scritte K, M, G). Conti tipici: 16 MB=24⋅220=22416\ \text{MB} = 2^4 \cdot 2^{20} = 2^{24} byte, quindi servono 24 bit di indirizzo se ogni byte ha il suo indirizzo; 4 GB=2324\ \text{GB} = 2^{32} byte → 32 bit.

Esempio. 64 KB=26⋅210=21664\ \text{KB}=2^6\cdot2^{10}=2^{16} byte: servono 1616 bit di indirizzo.

Definizione (codice BCD). BCD (Binary Coded Decimal): ogni cifra decimale su 4 bit. 259=0010 0101 1001BCD259 = 0010\,0101\,1001_{\text{BCD}} (in binario puro sarebbe 1 0000 00111\,0000\,0011). Spreca 6 configurazioni su 16 ma evita le conversioni: si usa in display e calcolatrici.

Esempio. 4710=0100 0111BCD47_{10}=0100\,0111_{\text{BCD}}, mentre in binario puro è 1011112101111_2.

Formula (codice Gray). Codice Gray: due numeri consecutivi differiscono per un solo bit. Si ottiene da bb binario come g=b⊕(b≫1)g = b \oplus (b \gg 1).

Esempio. b=110b=110 (66): g=110⊕011=101g=110\oplus011=101.

Definizione (ASCII, Unicode e UTF-8)

  • ASCII: 7 bit, 128 simboli. '0'–'9' = 48–57 (0x30–0x39), 'A' = 65 (0x41), 'a' = 97 (0x61). Maiuscola e minuscola differiscono solo per il bit 5 (valore 32); la cifra dd ha codice 48+d48 + d.
  • Unicode: assegna un numero (code point) a ogni carattere di tutte le scritture, da U+0000 a U+10FFFF.
  • UTF-8: codifica i code point in 1–4 byte; i caratteri ASCII restano su 1 byte identico. 'è' = U+00E8 → 2 byte C3 A8.

Esempio. La cifra 77 ha codice ASCII 48+7=55=0x3748+7=55=\mathrm{0x37}; è (U+00E8) in UTF-8 è C3 A8.

Definizione (little e big endian). Una parola di 4 byte occupa 4 indirizzi consecutivi. Per 0x12345678 all'indirizzo 100:

Indirizzo 100 101 102 103
Big endian (byte più significativo all'indirizzo minore) 12 34 56 78
Little endian (byte meno significativo all'indirizzo minore) 78 56 34 12

Esempio. 0x12345678 in little endian occupa, a partire dall'indirizzo più basso, i byte 78 56 34 12.

Definizione (bit di parità). Bit di parità (k=1k = 1): si sceglie il bit in modo che il numero totale di 1 sia pari. Rileva un numero dispari di errori, non li corregge. Dati 1011 00101011\,0010 (quattro 1) → parità 0.

Esempio. 1011 0010 ha quattro 1 (parità 00); 1011 0011 ne ha cinque (parità 11).

Formula (bit di controllo del codice di Hamming). Codice di Hamming (correzione di un errore singolo, SEC). Servono kk bit di controllo con

2k−1≥m+k2^k - 1 \ge m + k

perché la sindrome di kk bit deve distinguere "nessun errore" e ciascuna delle m+km + k posizioni.

Esempio. Per m=8m=8 bit di dati k=4k=4, perché 24−1=15≥8+4=122^4-1=15\ge8+4=12 mentre k=3k=3 darebbe 7<117<11.

Definizione (sindrome di Hamming)

  1. In lettura si ricalcolano i bit di controllo dai dati letti e si fa lo XOR con quelli memorizzati: la sindrome. Se è 00 non ci sono errori; altrimenti il suo valore è la posizione del bit sbagliato, che si inverte.

Esempio. Con sindrome C8C4C2C1=0110C_8C_4C_2C_1=0110 è sbagliato il bit in posizione 66, che va invertito.

III. Reti logiche

Algebra di Boole e porte logiche

Definizione (porte AND, OR, NAND, NOR, XOR e XNOR)

AA BB AND ABAB OR A+BA+B NAND AB‾\overline{AB} NOR A+B‾\overline{A+B} XOR A⊕BA \oplus B XNOR A⊕B‾\overline{A\oplus B}
0 0 0 0 1 1 0 1
0 1 0 1 1 0 1 0
1 0 0 1 1 0 1 0
1 1 1 1 0 0 0 1

Esempio. Con A=1A=1 e B=0B=0: AND =0=0, OR =1=1, NAND =1=1, NOR =0=0, XOR =1=1, XNOR =0=0.

Proprietà (algebra di Boole e De Morgan)

Proprietà Forma AND Forma OR
identità A⋅1=AA \cdot 1 = A A+0=AA + 0 = A
elemento nullo A⋅0=0A \cdot 0 = 0 A+1=1A + 1 = 1
idempotenza AA=AAA = A A+A=AA + A = A
complemento AA‾=0A\overline{A} = 0 A+A‾=1A + \overline{A} = 1
commutativa AB=BAAB = BA A+B=B+AA + B = B + A
associativa (AB)C=A(BC)(AB)C = A(BC) (A+B)+C=A+(B+C)(A+B)+C = A+(B+C)
distributiva A(B+C)=AB+ACA(B + C) = AB + AC A+BC=(A+B)(A+C)A + BC = (A+B)(A+C)
assorbimento A(A+B)=AA(A + B) = A A+AB=AA + AB = A
De Morgan AB‾=A‾+B‾\overline{AB} = \overline{A} + \overline{B} A+B‾=A‾ B‾\overline{A+B} = \overline{A}\,\overline{B}

Esempio. A+B‾=A‾ B‾\overline{A+B}=\overline A\,\overline B: per A=0A=0 e B=1B=1 entrambi i membri valgono 00.

Proprietà (completezza della NAND). {AND, OR, NOT} basta per scrivere qualsiasi funzione (vedi le forme canoniche in Reti combinatorie e mappe di KarnaughRete combinatoria (uscite funzione dei soli ingressi attuali); mintermini e maxtermini, forme canoniche SOP e POS; mappe di Karnaugh a 3 e 4 variabili con esempi svolti; condizioni di indifferenza; costo e ritardo di una rete a due livelli.Reti combinatorie e mappe di Karnaugh →). Anche la sola NAND basta, e così la sola NOR:

  • NOT: A‾=AA‾\overline{A} = \overline{AA} (NAND con gli ingressi uniti);
  • AND: AB=AB‾‾AB = \overline{\overline{AB}} (NAND seguita da un NOT fatto con NAND);
  • OR: A+B=A‾ B‾‾A + B = \overline{\overline{A}\,\overline{B}} (De Morgan: NAND degli ingressi negati).

Esempio. A+B=A‾ B‾‾A+B=\overline{\overline A\,\overline B}: per A=1A=1 e B=0B=0 si ha 0⋅1‾=1\overline{0\cdot1}=1.

Reti combinatorie e mappe di Karnaugh

Definizione (mintermine, SOP, maxtermine e POS)

  • Mintermine: prodotto (AND) di tutte le variabili, dirette o negate, che vale 1 su una sola riga. Per la riga A=0,B=1,C=1A=0, B=1, C=1 è A‾BC\overline{A}BC (m3m_3, dal numero binario 011).
  • Somma di prodotti (SOP): OR dei mintermini delle righe in cui F=1F = 1.
  • Maxtermine: somma (OR) che vale 0 su una sola riga: per A=0,B=1,C=1A=0,B=1,C=1 è A+B‾+C‾A + \overline{B} + \overline{C}.
  • Prodotto di somme (POS): AND dei maxtermini delle righe in cui F=0F = 0.

Esempio. Per la riga A=0,B=1,C=0A=0,B=1,C=0 (m2m_2): mintermine A‾ B C‾\overline A\,B\,\overline C e maxtermine A+B‾+CA+\overline B+C.

Definizione (mappa di Karnaugh e regole di raggruppamento). La tabella di verità disposta in una griglia in cui righe e colonne seguono il codice Gray (00, 01, 11, 10): due celle adiacenti differiscono per una sola variabile, e sono adiacenti anche i bordi opposti (la mappa "si chiude" a cilindro e a toro).

Regole:

  1. si raggruppano gli 1 in rettangoli di 1, 2, 4, 8, … celle adiacenti (potenze di 2);
  2. gruppi più grandi possibile e meno gruppi possibile; un 1 può stare in più gruppi;
  3. ogni gruppo dà un prodotto con le sole variabili che non cambiano nel gruppo; un gruppo di 2k2^k celle elimina kk variabili.

Esempio. A 44 variabili le celle 0,2,8,100,2,8,10 (k=2k=2) hanno costanti B=0B=0 e D=0D=0: il gruppo dà B‾ D‾\overline B\,\overline D.

Proprietà (condizioni di indifferenza e POS). Se alcune combinazioni di ingresso non possono presentarsi (es. i codici 1010–1111 in BCD), in quelle celle si mette una X (don't care) e si usa come 1 o 0, a seconda di cosa allarga i gruppi.

Per la forma POS si raggruppano gli 0 nello stesso modo e si scrive il prodotto di somme (variabile negata se nel gruppo vale 1).

Esempio. Con una cifra BCD le celle 1010–1515 sono X e si possono usare come 11 per allargare i gruppi.

Proprietà (ritardo di una SOP). Una SOP si realizza con due livelli di porte (AND poi OR): il ritardo è di circa due porte, qualsiasi sia la funzione. Semplificare riduce il numero di porte e di ingressi, cioè area e consumo. Con molte variabili (più di 5–6) le mappe diventano scomode e si usano algoritmi (Quine-McCluskey, strumenti di sintesi).

Esempio. Con porte da 2020 ps una SOP a due livelli ritarda circa 2⋅20=402\cdot20=40 ps, qualunque sia la funzione.

Circuiti combinatori notevoli

Formula (multiplexer 2:1). Sceglie uno tra 2n2^n ingressi dati in base a nn ingressi di selezione. MUX 2:1:

Y=S‾ I0+S I1Y = \overline{S}\,I_0 + S\,I_1

Esempio. Con I0=0I_0=0, I1=1I_1=1 e S=1S=1: Y=1‾⋅0+1⋅1=1Y=\overline1\cdot0+1\cdot1=1.

Formula (multiplexer 4:1). MUX 4:1 con selezione S1S0S_1S_0: Y=S1‾ S0‾I0+S1‾S0I1+S1S0‾I2+S1S0I3Y = \overline{S_1}\,\overline{S_0} I_0 + \overline{S_1}S_0 I_1 + S_1\overline{S_0} I_2 + S_1 S_0 I_3. Con un MUX a 2n2^n ingressi si realizza qualsiasi funzione di nn variabili, mettendo sugli ingressi dati i valori della tabella di verità. Un MUX a 32 bit sono 32 MUX in parallelo con la stessa selezione: nel datapath sceglie per esempio se il secondo operando dell'ALU è un registro o una costante.

Esempio. Con S1S0=10S_1S_0=10 resta solo il termine S1S0‾I2S_1\overline{S_0}I_2, quindi Y=I2Y=I_2.

Definizione (decoder ed encoder)

  • Decoder n→2nn \to 2^n: attiva una sola delle 2n2^n uscite, quella il cui numero è l'ingresso. Decoder 2→4: D0=A1‾ A0‾D_0 = \overline{A_1}\,\overline{A_0}, D1=A1‾A0D_1 = \overline{A_1}A_0, D2=A1A0‾D_2 = A_1\overline{A_0}, D3=A1A0D_3 = A_1A_0. Usi: selezionare la cella di memoria o il chip dall'indirizzo, il registro di destinazione dal campo dell'istruzione.
  • Encoder 2n→n2^n \to n: l'inverso, dà il numero dell'unico ingresso attivo. L'encoder con priorità dà il numero dell'ingresso attivo più importante (usato per scegliere tra più richieste di interrupt).

Esempio. Decoder 2→42\to4 con A1A0=10A_1A_0=10: D2=1D_2=1 e D0=D1=D3=0D_0=D_1=D_3=0.

Formula (semisommatore). Semisommatore (half adder): somma due bit.

S=A⊕BC=ABS = A \oplus B \qquad C = AB

Esempio. Con A=B=1A=B=1: S=1⊕1=0S=1\oplus1=0 e C=1⋅1=1C=1\cdot1=1, cioè 1+1=1021+1=10_2.

Formula (sommatore completo)

S=A⊕B⊕CinCout=AB+Cin(A⊕B)=AB+ACin+BCinS = A \oplus B \oplus C_{in} \qquad C_{out} = AB + C_{in}(A \oplus B) = AB + AC_{in} + BC_{in}

Esempio. Con A=B=Cin=1A=B=C_{in}=1: S=1S=1 e Cout=1C_{out}=1, cioè 1+1+1=1121+1+1=11_2.

Formula (ritardo del sommatore a propagazione del riporto). Sommatore a propagazione del riporto (ripple carry) a nn bit: nn full adder in cascata, il CoutC_{out} di ognuno è il CinC_{in} del successivo. Il bit ii è corretto solo quando è arrivato il riporto dal bit i−1i-1: il ritardo cresce linearmente con nn (circa 2n2n porte). Se una porta ritarda 20 ps, a 32 bit servono circa 64⋅20=128064 \cdot 20 = 1280 ps, cioè più di un ciclo di un clock a 1 GHz.

Esempio. A 1616 bit con porte da 2020 ps il ritardo è circa 2⋅16⋅20=6402\cdot16\cdot20=640 ps.

Definizione (anticipo del riporto). Anticipo del riporto (carry lookahead): si definiscono per ogni bit gi=AiBig_i = A_iB_i (il bit genera un riporto) e pi=Ai+Bip_i = A_i + B_i (lo propaga), e si calcolano i riporti direttamente dagli ingressi:

c1=g0+p0c0,c2=g1+p1g0+p1p0c0,…c_1 = g_0 + p_0c_0, \quad c_2 = g_1 + p_1g_0 + p_1p_0c_0, \quad \dots

Esempio. Se g0=1g_0=1 (cioè A0=B0=1A_0=B_0=1) allora c1=g0+p0c0=1c_1=g_0+p_0c_0=1 qualunque sia c0c_0.

Proprietà (sommatore-sottrattore). Un solo sommatore fa anche la sottrazione in complemento a 2 (vedi Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →): ogni bit di BB passa per una XOR con il segnale SUB\text{SUB}, che è anche il riporto iniziale.

  • SUB=0\text{SUB} = 0: B⊕0=BB \oplus 0 = B, c0=0c_0 = 0 → A+BA + B.
  • SUB=1\text{SUB} = 1: B⊕1=B‾B \oplus 1 = \overline{B}, c0=1c_0 = 1 → A+B‾+1=A−BA + \overline{B} + 1 = A - B.

Esempio. A 44 bit con SUB=1\text{SUB}=1: 0110−0011=0110+1100+1=(1) 0011=30110-0011=0110+1100+1=(1)\,0011=3.

Formula (overflow in complemento a 2). Overflow (complemento a 2): V=cn⊕cn−1V = c_n \oplus c_{n-1}, XOR tra il riporto che entra e quello che esce dal bit di segno.

Esempio. A 44 bit 0101+01000101+0100: il riporto entrante nel segno è 11, quello uscente 00, quindi V=1V=1.

Formula (comparatore di uguaglianza). Uguaglianza di due numeri di nn bit: E=(A0⊕B0)+(A1⊕B1)+…‾E = \overline{(A_0 \oplus B_0) + (A_1 \oplus B_1) + \dots}, cioè NOR delle XOR bit a bit. Il confronto di ordine si fa di solito con una sottrazione guardando i flag N, Z, C, V.

Esempio. Con A=B=1010A=B=1010 tutte le XOR valgono 00, quindi E=1E=1.

Latch e flip-flop

Definizione (latch SR). Due porte NOR incrociate: Q=R+Q‾‾Q = \overline{R + \overline{Q}}, Q‾=S+Q‾\overline{Q} = \overline{S + Q}.

SS RR Qt+1Q_{t+1} Effetto
0 0 QtQ_t mantiene lo stato (memoria)
1 0 1 set
0 1 0 reset
1 1 — proibito: entrambe le uscite a 0, e al ritorno a 00 lo stato è imprevedibile

Esempio. Con S=1S=1, R=0R=0 si ha Qt+1=1Q_{t+1}=1 (set); con S=R=0S=R=0 il latch conserva QtQ_t; con S=R=1S=R=1 la combinazione è proibita.

Definizione (latch D). Latch D (data): un solo ingresso, S=DS = D e R=D‾R = \overline{D}, così lo stato proibito non può presentarsi.

Esempio. Con C=1C=1 e D=1D=1 si ha S=1S=1, R=0R=0 e quindi Q=1Q=1; con C=0C=0 lo stato non cambia.

Definizione (flip-flop D master-slave). Cambia stato solo sul fronte del clock (di salita o di discesa). Realizzazione master-slave: due latch D in cascata con clock opposti.

  • C=1C = 1: il master è trasparente e segue DD; lo slave è bloccato.
  • Quando CC scende: il master si blocca e lo slave copia il suo valore.

Risultato: QQ prende il valore che DD aveva all'istante del fronte, e resta fermo per tutto il ciclo.

Qt+1=DtQ_{t+1} = D_t

Esempio. Se D=1D=1 al fronte attivo, dopo il fronte Q=1Q=1 e resta tale per tutto il ciclo anche se DD torna a 00.

Formula (flip-flop JK). Il JK è un SR in cui la combinazione 11 fa commutare lo stato invece di essere proibita: Qt+1=JQt‾+K‾QtQ_{t+1} = J\overline{Q_t} + \overline{K}Q_t.

Esempio. Con J=K=1J=K=1 e Qt=0Q_t=0: Qt+1=1⋅0‾+1‾⋅0=1Q_{t+1}=1\cdot\overline0+\overline1\cdot0=1 (commuta).

Formula (flip-flop T). Il flip-flop T (toggle) è un JK con J=K=TJ = K = T: se T=1T = 1 commuta a ogni fronte, se T=0T = 0 mantiene. Qt+1=T⊕QtQ_{t+1} = T \oplus Q_t. È la base dei contatoriRegistro parallelo a n bit con caricamento abilitato; banco dei registri con due porte di lettura e una di scrittura; registri a scorrimento; contatori sincroni e asincroni (ripple), contatore modulo N con esempio svolto.Registri e contatori →.

Esempio. Con T=1T=1 e Qt=1Q_t=1: Qt+1=1⊕1=0Q_{t+1}=1\oplus1=0.

Formula (periodo minimo di clock). In un sistema sincrono tutti i flip-flop ricevono lo stesso clock. Tra due flip-flop c'è una rete combinatoria: il segnale deve attraversarla prima del fronte successivo.

Tclock≥tclk→Q+tcombinatoria,max⁡+tsetupT_{clock} \ge t_{clk \to Q} + t_{combinatoria,\max} + t_{setup}

Esempio. Con tclk→Q=50t_{clk\to Q}=50 ps, percorso combinatorio 800800 ps e setup 3030 ps: T≥880T\ge880 ps, cioè fmax≈1,14f_{max}\approx1{,}14 GHz.

Reti sequenziali e automi a stati finiti

Definizione (rete sequenziale sincrona). Una rete sequenziale sincrona è fatta di:

A ogni fronte del clock lo stato diventa S′S'. Il comportamento si descrive con un automa a stati finiti (diagramma degli stati: un nodo per stato, un arco per ogni transizione etichettato con l'ingresso).

Esempio. Con k=3k=3 flip-flop D il registro di stato può ricordare fino a 23=82^3=8 stati.

Definizione (automi di Moore e di Mealy)

Tipo Uscita Conseguenza
Moore dipende solo dallo stato: Z=λ(S)Z = \lambda(S) uscita stabile per tutto il ciclo, cambia solo dopo il fronte
Mealy dipende da stato e ingressi: Z=λ(S,X)Z = \lambda(S, X) di solito servono meno stati, ma l'uscita risente subito degli ingressi

Esempio. Per riconoscere due 11 consecutivi un automa di Moore usa 33 stati (S0,S1,S2S_0,S_1,S_2) con Z=1Z=1 solo in S2S_2.

Proprietà (procedimento di sintesi)

  1. Diagramma degli stati dalla specifica.
  2. Tabella degli stati (stato attuale, ingresso → stato prossimo, uscita).
  3. Codifica degli stati in binario (k=⌈log⁡2N⌉k = \lceil \log_2 N \rceil flip-flop per NN stati).
  4. Tabella di verità delle funzioni di stato prossimo e di uscita, semplificazione con le mappe di KarnaughRete combinatoria (uscite funzione dei soli ingressi attuali); mintermini e maxtermini, forme canoniche SOP e POS; mappe di Karnaugh a 3 e 4 variabili con esempi svolti; condizioni di indifferenza; costo e ritardo di una rete a due livelli.Reti combinatorie e mappe di Karnaugh →.
  5. Disegno: flip-flop + reti combinatorie.

Esempio. Per N=3N=3 stati servono k=⌈log⁡23⌉=2k=\lceil\log_23\rceil=2 flip-flop.

Formula (riconoscitore di due 1 consecutivi)

Q1′=X(Q1+Q0)Q0′=X Q1‾ Q0‾Z=Q1Q_1' = X(Q_1 + Q_0) \qquad Q_0' = X\,\overline{Q_1}\,\overline{Q_0} \qquad Z = Q_1

Esempio. Con Q1Q0=01Q_1Q_0=01 (S1S_1) e X=1X=1: Q1′=1⋅(0+1)=1Q_1'=1\cdot(0+1)=1 e Q0′=1⋅0‾⋅1‾=0Q_0'=1\cdot\overline0\cdot\overline1=0, nuovo stato 1010 (S2S_2) con Z=1Z=1.

Registri e contatori

Definizione (registro parallelo con Load). nn flip-flop D (vedi Latch e flip-flopReti sequenziali e retroazione; latch SR con porte NOR e stato proibito; latch SR e D abilitati dal clock; flip-flop D master-slave sensibile al fronte; flip-flop JK e T; tempi di setup e hold; clock e periodo minimo.Latch e flip-flop →) con lo stesso clock memorizzano una parola di nn bit. Per caricare solo quando serve si aggiunge un segnale Load: davanti a ogni flip-flop un multiplexerMultiplexer, decodificatore e codificatore; semisommatore e sommatore completo; sommatore a propagazione del riporto e suo ritardo, idea dell'anticipo del riporto; sommatore-sottrattore in complemento a 2 con rilevazione dell'overflow; comparatore.Circuiti combinatori notevoli → sceglie tra il nuovo dato (Load = 1) e il valore attuale QQ (Load = 0). PC, IR, MAR, MBR sono registri di questo tipo.

Esempio. Con Load=1\text{Load}=1 e dato 10111011 il registro a 44 bit contiene 10111011 dopo il fronte; con Load=0\text{Load}=0 conserva il valore.

Definizione (registro a scorrimento). L'uscita di ogni flip-flop è l'ingresso del successivo: a ogni fronte il contenuto scorre di una posizione.

Esempio. Da 00000000 con ingresso seriale 1,0,1,11,0,1,1: 0001→0010→0101→10110001\to0010\to0101\to1011.

Definizione (contatore asincrono ripple). Contatore asincrono (ripple): flip-flop T con T=1T = 1; il clock del primo è il clock del sistema, quello di ognuno dei successivi è l'uscita del precedente. Semplice, ma i bit cambiano uno dopo l'altro: per un attimo compaiono valori intermedi sbagliati, e il ritardo cresce con il numero di bit.

Esempio. In un ripple a 33 bit il passaggio 011→100011\to100 attraversa per un attimo 010010 e 000000.

Formula (contatore sincrono). Contatore sincrono: tutti i flip-flop hanno lo stesso clock. Il bit ii commuta quando tutti i bit meno significativi valgono 1:

T0=1,T1=Q0,T2=Q1Q0,T3=Q2Q1Q0T_0 = 1, \quad T_1 = Q_0, \quad T_2 = Q_1Q_0, \quad T_3 = Q_2Q_1Q_0

Esempio. Da Q2Q1Q0=011Q_2Q_1Q_0=011: T0=T1=T2=1T_0=T_1=T_2=1, commutano tutti i bit e si passa a 100100.

Proprietà (contatore modulo N). Per contare da 0 a N−1N-1 si riporta a zero il contatore quando arriva a N−1N - 1 (sincrono) o si progetta come automa (vedi Reti sequenziali e automi a stati finitiModello di una rete sequenziale sincrona (stato in flip-flop, logica di stato prossimo e di uscita); automi di Moore e di Mealy; procedimento di sintesi con esempio svolto di un riconoscitore della sequenza 11.Reti sequenziali e automi a stati finiti →).

Esempio. Per contare da 00 a 55 (N=6N=6) servono ⌈log⁡26⌉=3\lceil\log_26\rceil=3 bit e dopo 101101 si torna a 000000.

Formula (frequenza del bit QiQ_i di un contatore). Usi: contatore di programma (il PC è un registro con incremento), divisori di frequenza (il bit QiQ_i di un contatore binario ha frequenza fclock/2i+1f_{clock}/2^{i+1}), temporizzatori.

Esempio. Con clock a 11 MHz il bit Q2Q_2 di un contatore binario ha frequenza 1/23=1251/2^3=125 kHz.

IV. Architettura del processore

Struttura interna della CPU e registri

Proprietà (numero di registri e bit nell'istruzione). Più registri significa meno accessi alla memoria, ma più bit nell'istruzione per indicarli (con 16 registri servono 4 bit per operando, con 32 ne servono 5) e più stato da salvare a ogni chiamata o interruzione. Le architetture RISC ne hanno tipicamente 16–32 (vedi Architetture RISC e CISCMotivazioni del CISC (divario semantico) e dati sull'esecuzione dei programmi; caratteristiche delle architetture RISC; finestre di registri; allocazione dei registri con colorazione di un grafo; confronto e situazione attuale (MIPS, ARM, x86).Architetture RISC e CISC →); ARM a 32 bit ne ha 16, MIPS 32.

Esempio. Con 1616 registri servono log⁡216=4\log_216=4 bit per operando, con 3232 registri 55 bit.

Formula (ampiezza dei registri e spazio di indirizzamento). Ampiezza: i registri per gli indirizzi devono contenere un indirizzo intero: con registri a 32 bit si indirizzano 2322^{32} byte = 4 GB, a 64 bit 2642^{64}.

Esempio. Registri a 3232 bit indirizzano 2322^{32} byte =4=4 GB.

Definizione (parola di stato PSW). Contenuto tipico della PSW:

Esempio. A 88 bit in complemento a 2, 127+1=1000 0000127+1=1000\,0000 dà N=1N=1, Z=0Z=0, C=0C=0, V=1V=1.

Instruction Set Architecture

Definizione (ISA). L'insieme delle istruzioni (ISA, Instruction Set Architecture) è il confine tra hardware e software: è tutto ciò che un programma in linguaggio macchina può usare. Due processori con la stessa ISA eseguono lo stesso codice, anche se sono organizzati in modo diverso (vedi Architettura e organizzazione di un calcolatoreDifferenza tra architettura (ciò che vede il programmatore) e organizzazione (come è realizzata); struttura e funzione; le quattro funzioni e i quattro componenti; macchina di von Neumann e IAS; generazioni tecnologiche e legge di Moore.Architettura e organizzazione di un calcolatore →).

Esempio. ADD r1, r2, r3 con r2=5 e r3=7 lascia r1=12: è un'istruzione dell'ISA ARM, qualunque sia la sua organizzazione interna.

Definizione (istruzioni a 0, 1, 2 e 3 indirizzi). Quanti operandi espliciti ha un'istruzione aritmetica. Esempio: Y=(A−B)/(C+D⋅E)Y = (A - B) / (C + D \cdot E), variabili in memoria.

Esempio. SUB Y, A, B ha 3 indirizzi (destinazione e due sorgenti); SUB A, B ne ha 2, perché la destinazione coincide con il primo operando.

Definizione (architettura load/store). In ARM e MIPS solo le istruzioni di load e store accedono alla memoria; tutte le operazioni aritmetiche e logiche lavorano tra registri. Lo stesso calcolo in ARM (variabili già caricate in r1–r5):

SUB r0, r1, r2      @ r0 = A - B
MUL r6, r4, r5      @ r6 = D * E
ADD r6, r6, r3      @ r6 = C + D*E
SDIV r0, r0, r6     @ r0 = Y (SDIV esiste solo nelle versioni più recenti dell'ISA)

Esempio. Se r2 punta a una cella che contiene 77, LDR r1, [r2] carica 77 in r1 e ADD r0, r1, r1 lascia r0=14.

Formato delle istruzioni e modalità di indirizzamento

Definizione (modalità di indirizzamento). L'indirizzo effettivo (EA) è l'indirizzo in memoria dell'operando. Notazione: AA = campo indirizzo dell'istruzione, RR = registro indicato, (X)(X) = contenuto di XX.

Modalità Operando Pro Contro
immediato AA stesso nessun accesso alla memoria valore limitato dai bit del campo
diretto (A)(A), EA = AA semplice spazio di indirizzamento limitato dal campo
indiretto ((A))((A)), EA = (A)(A) spazio ampio due accessi alla memoria
a registro (R)(R) veloce, pochi bit pochi registri
indiretto a registro ((R))((R)), EA = (R)(R) spazio ampio, un solo accesso serve caricare prima il registro
con spiazzamento (base + offset) EA = (R)+A(R) + A flessibile somma in più
relativo al PC EA = (PC)+A(\text{PC}) + A codice rilocabile, salti corti portata limitata
indicizzato e scalato EA = (Rb)+(Ri)⋅s+A(R_b) + (R_i) \cdot s + A accesso ad array con elementi di ss byte più complesso
a pila operando in cima allo stack, implicito istruzioni corte accesso solo alla cima

Esempio. Con M[200]=500M[200]=500, M[500]=800M[500]=800 e A=200A=200: immediato =200=200, diretto =M[200]=500=M[200]=500, indiretto =M[M[200]]=800=M[M[200]]=800.

Formula (indice scalato). Indice scalato (es. Pentium): il fattore s∈{1,2,4,8}s \in \{1, 2, 4, 8\} permette di scorrere in modo uniforme array di byte, mezze parole, parole, doppie parole. In ARM: LDR r0, [r1, r2, LSL #2] legge l'elemento r2 di un array di parole che inizia a r1.

Esempio. Con r1=0x2000 e r2=3, LDR r0, [r1, r2, LSL #2] legge la parola all'indirizzo 0x2000+3⋅4=0x200C\mathrm{0x2000}+3\cdot4=\mathrm{0x200C}.

Definizione (formato fisso e variabile)

Esempio. ARM e MIPS usano istruzioni fisse di 3232 bit (una ogni 44 byte), x86 istruzioni da 11 a 1515 byte.

Definizione (formati MIPS R, I e J)

Formato Campi (bit) Uso
R op (6) · rs (5) · rt (5) · rd (5) · shamt (5) · funct (6) operazioni tra registri: add $1, $2, $3
I op (6) · rs (5) · rt (5) · immediato (16) immediati, load/store, salti condizionati: lw $8, 0x1200($9)
J op (6) · indirizzo (26) salto incondizionato

Esempio. Nel formato R 6+5+5+5+5+6=326+5+5+5+5+6=32 bit; ogni registro usa 55 bit perché i registri sono 25=322^5=32.

Definizione (formato ARM delle istruzioni di elaborazione dati)

cond (4) 00 I (1) opcode (4) S (1) Rn (4) Rd (4) operando 2 (12)

Esempio. MOV r0, #0xFF000000 è codificabile: 0xFF ruotato a destra di 88 posizioni (campo di rotazione 44, 4⋅2=84\cdot2=8) e dà r0=0xFF000000.

Architetture RISC e CISC

Definizione (CISC). Negli anni '70 i linguaggi ad alto livello si allontanavano dal linguaggio macchina (divario semantico). La risposta CISC (Complex Instruction Set Computer, es. VAX, x86): molte istruzioni, molte modalità di indirizzamento, istruzioni che fanno direttamente operazioni da linguaggio ad alto livello (copie di stringhe, chiamate di procedura con salvataggio del contesto). Obiettivi: compilatori più semplici, programmi più corti, più funzioni in microcodice (vedi Unità di controlloCompiti dell'unità di controllo e micro-operazioni; segnali di controllo del datapath con tabella per le classi di istruzioni; controllo cablato (combinatorio o a stati finiti) e controllo microprogrammato (memoria di controllo, microistruzioni orizzontali e verticali); confronto.Unità di controllo →).

Esempio. In x86 una sola istruzione somma un operando in memoria a un registro; in ARM servono LDR r2, [r1] e ADD r0, r0, r2 (con r0=3 e [r1]=5 si ottiene r0=8).

Definizione (architettura RISC). Reduced Instruction Set Computer (es. MIPS, ARM, RISC-V):

  1. un'istruzione per ciclo (a regime, in PipelineIdea della catena di montaggio; pipeline a 5 stadi IF, ID, EX, MEM, WB; tempo di ciclo, tempo per n istruzioni in una pipeline a k stadi e speedup con esempi svolti; registri di pipeline; scrittura e lettura dei registri nello stesso ciclo; limiti (stadi sbilanciati, hazard).Pipeline →);
  2. operazioni registro-registro, solo load e store accedono alla memoria (architettura load/store);
  3. poche modalità di indirizzamento semplici;
  4. formato fisso (32 bit) e pochi formati, decodifica semplice;
  5. molti registri (16–32 o più);
  6. unità di controllo cablata;
  7. il lavoro di ottimizzazione passa al compilatore (allocazione dei registri, riordino delle istruzioni).

Esempio. In un RISC a formato fisso di 3232 bit con 3232 registri ogni campo registro occupa log⁡232=5\log_232=5 bit.

Definizione (allocazione dei registri con colorazione di un grafo). Soluzione software: il compilatore assegna le variabili ai registri fisici. Costruisce un grafo in cui ogni nodo è una variabile (o valore temporaneo) e un arco collega due variabili vive contemporaneamente. Assegnare kk registri = colorare il grafo con kk colori in modo che nodi adiacenti abbiano colori diversi. Le variabili che non si riescono a colorare vengono tenute in memoria (spill).

Esempio. Se aa-bb e bb-cc sono in conflitto ma aa-cc no, bastano 22 colori: a,c→R1a,c\to R_1 e b→R2b\to R_2.

L'architettura ARM

Definizione (registri ARM a 32 bit). 16 registri da 32 bit visibili, r0–r15:

Registro Nome Uso
r0–r3 argomenti e valore di ritorno delle funzioni, temporanei
r4–r11 variabili; vanno preservati dalle funzioni chiamate
r12 IP temporaneo
r13 SP stack pointer
r14 LR link register: indirizzo di ritorno dopo BL
r15 PC program counter

Esempio. Chiamando f(5, 7) gli argomenti arrivano in r0=5 e r1=7; r13 è lo stack pointer, r14 il link register e r15 il program counter.

Definizione (registro di stato CPSR). CPSR (Current Program Status Register): flag N, Z, C, V nei bit 31–28 (vedi Aritmetica binariaSomma e sottrazione in binario, overflow per senza segno (riporto) e per complemento a 2 (segni), flag del processore, moltiplicazione per somme e scorrimenti, algoritmo di Booth, divisione, shift logici e aritmetici.Aritmetica binaria →), bit di disabilitazione delle interruzioni, bit del modo corrente.

Esempio. Dopo CMP r0, r0 il flag ZZ (bit 3030 del CPSR) vale 11.

Definizione (modello di memoria ARM)

Esempio. Con indirizzi di 3232 bit al byte si indirizzano 2322^{32} byte =4=4 GB; una parola allineata sta a un indirizzo multiplo di 44 (per esempio 100100).

Definizione (esecuzione condizionata)

  • Esecuzione condizionata: quasi ogni istruzione può avere un suffisso di condizione e viene eseguita solo se i flag la soddisfano: ADDEQ r0, r0, #1 somma solo se Z = 1. Evita molti salti brevi.

Esempio. Dopo CMP r1, r1 il flag ZZ vale 11 e ADDEQ r0, r0, #1 porta r0 da 44 a 55; con Z=0Z=0 non farebbe nulla.

Definizione (secondo operando flessibile)

Esempio. Con r1=100 e r2=3, ADD r0, r1, r2, LSL #2 calcola 100+4⋅3=112100+4\cdot3=112.

V. Programmazione assembly ARM

Istruzioni ARM di elaborazione dati

Definizione (istruzioni aritmetiche e logiche ARM)

Istruzione Effetto
ADD Rd, Rn, Op2 Rd=Rn+Op2Rd = Rn + Op2
ADC Rd, Rn, Op2 Rd=Rn+Op2+CRd = Rn + Op2 + C (somma con riporto)
SUB Rd, Rn, Op2 Rd=Rn−Op2Rd = Rn - Op2
SBC Rd, Rn, Op2 Rd=Rn−Op2−C‾Rd = Rn - Op2 - \overline{C}
RSB Rd, Rn, Op2 Rd=Op2−RnRd = Op2 - Rn (sottrazione inversa)
AND Rd, Rn, Op2 AND bit a bit
ORR Rd, Rn, Op2 OR bit a bit
EOR Rd, Rn, Op2 XOR bit a bit
BIC Rd, Rn, Op2 Rd=Rn AND NOT Op2Rd = Rn \text{ AND NOT } Op2 (azzera i bit indicati)
MOV Rd, Op2 Rd=Op2Rd = Op2
MVN Rd, Op2 Rd=NOT Op2Rd = \text{NOT } Op2
MUL Rd, Rm, Rs Rd=Rm⋅RsRd = Rm \cdot Rs (32 bit bassi del prodotto)
MLA Rd, Rm, Rs, Rn Rd=Rm⋅Rs+RnRd = Rm \cdot Rs + Rn

Esempio. Con r1=10 e r2=3: SUB r0, r1, r2 dà 77, RSB r0, r1, r2 dà −7-7 (0xFFFFFFF9) e BIC r0, r1, #2 dà 88.

Definizione (secondo operando delle istruzioni ARM)

Esempio. Con r1=6, ADD r0, r1, r1, LSL #2 calcola 6+4⋅6=306+4\cdot6=30 in una sola istruzione.

Definizione (aggiornamento dei flag: S, CMP e TST)

  • Con il suffisso S l'istruzione aggiorna N, Z, C, V: SUBS r0, r0, #1 decrementa e imposta Z quando arriva a 0.
  • CMP Rn, Op2 calcola Rn−Op2Rn - Op2 e aggiorna i flag senza salvare il risultato; CMN fa lo stesso con Rn+Op2Rn + Op2.
  • TST Rn, Op2 fa l'AND e aggiorna N e Z (verifica di bit); TEQ fa lo XOR (uguaglianza).

Esempio. Con r0=0x7FFFFFFF, ADDS r1, r0, #1 dà r1=0x80000000 con N=1N=1, Z=0Z=0, C=0C=0, V=1V=1.

Proprietà (operazioni sui bit con ORR, BIC e EOR). Operazioni sui bit: impostare il bit 3 di r0 → ORR r0, r0, #8; azzerarlo → BIC r0, r0, #8; invertirlo → EOR r0, r0, #8; estrarre il byte 1 → AND r1, r0, #0xFF00 poi MOV r1, r1, LSR #8.

Esempio. Con r0=5 (0101) ORR r0, r0, #8 dà 1313; con r0=13 (1101) BIC r0, r0, #8 dà 55 ed EOR r0, r0, #8 dà 55.

Istruzioni ARM di accesso alla memoria

Definizione (istruzioni LDR e STR)

Istruzione Effetto
LDR Rd, [ind] carica una parola (4 byte)
STR Rd, [ind] salva una parola
LDRB / STRB byte; LDRB estende con zeri a 32 bit
LDRSB byte con segno, esteso con il segno
LDRH / STRH mezza parola (16 bit), estesa con zeri
LDRSH mezza parola con segno

Esempio. Se il byte in memoria è 0xF0: LDRB r0, [r1] dà r0=0x000000F0 e LDRSB r0, [r1] dà r0=0xFFFFFFF0.

Definizione (modalità di indirizzamento di LDR e STR)

Sintassi Indirizzo effettivo r1 dopo
[r1] 0x1000 invariato
[r1, #8] 0x1008 invariato
[r1, #-4] 0x0FFC invariato
[r1, r2] 0x1003 invariato
[r1, r2, LSL #2] 0x1000 + 12 = 0x100C invariato
[r1, #4]! (pre-indicizzato con write-back) 0x1004 0x1004
[r1], #4 (post-indicizzato) 0x1000 0x1004
  • L'offset immediato per LDR/STR di parola o byte è di 12 bit (±4095).
  • Pre-indicizzato !: calcola l'indirizzo, accede, poi aggiorna la base.
  • Post-indicizzato: accede all'indirizzo della base, poi la aggiorna. Comodo per scorrere un array: LDR r0, [r1], #4 legge l'elemento e fa avanzare il puntatore.
  • LSL #2 sull'indice moltiplica per 4: indice di elemento → offset in byte per un array di parole.

Esempio. Con r1=0x1000: LDR r0, [r1, #4]! legge a 0x1004 e lascia r1=0x1004; LDR r0, [r1], #4 legge a 0x1000 e lascia r1=0x1004.

Definizione (trasferimenti multipli LDM e STM). LDM/STM caricano o salvano una lista di registri in posizioni consecutive. Suffissi: IA (increment after), IB, DA, DB (decrement before).

Esempio. STMDB sp!, {r4-r6, lr} salva 44 registri e sottrae 4⋅4=164\cdot4=16 da sp.

Strutture di controllo in assembly ARM

Definizione (salti B e B{cond})

Esempio. Dopo CMP r0, r1, BEQ fine salta solo se r0=r1; con r0=3 e r1=4 l'istruzione successiva viene eseguita.

Definizione (codici di condizione con e senza segno)

Suffisso Significato Flag Tipo
EQ / NE uguale / diverso Z = 1 / Z = 0 entrambi
GT / GE maggiore / maggiore o uguale Z = 0 e N = V / N = V con segno
LT / LE minore / minore o uguale N ≠ V / Z = 1 o N ≠ V con segno
HI / HS (= CS) maggiore / maggiore o uguale C = 1 e Z = 0 / C = 1 senza segno
LO (= CC) / LS minore / minore o uguale C = 0 / C = 0 o Z = 1 senza segno
MI / PL negativo / positivo o zero N = 1 / N = 0
VS / VC overflow / niente overflow V = 1 / V = 0

Esempio. Con r0=0xFFFFFFFF e r1=1, CMP r0, r1 rende vere LT (−1<1-1<1 con segno) e HI (4 294 967 295>14\,294\,967\,295>1 senza segno).

Stack e chiamata di funzioni in ARM

Definizione (BL e BX LR)

  • BL funzione (branch with link): salva in LR (r14) l'indirizzo dell'istruzione successiva e salta.
  • BX LR (o MOV pc, lr): torna al chiamante.

Esempio. Se BL f sta all'indirizzo 0x1000, LR riceve 0x1004 (l'istruzione successiva) e BX lr in f riporta il controllo lì.

Definizione (convenzione di chiamata AAPCS)

Registri Regola
r0–r3 primi 4 argomenti; r0 (e r1 per valori a 64 bit) contiene il risultato. La funzione chiamata può modificarli liberamente (caller-saved: se il chiamante ne ha bisogno dopo la chiamata, li salva lui)
r4–r11 callee-saved: se la funzione li usa, deve salvarli all'inizio e ripristinarli prima di tornare
r12 temporaneo
sp deve avere lo stesso valore all'ingresso e all'uscita; allineato a 8 byte alle chiamate
lr indirizzo di ritorno

Dal quinto argomento in poi si passano sullo stack.

Esempio. Per somma3(1, 2, 3): r0=1, r1=2, r2=3, e il risultato torna in r0=6.

Definizione (stack discendente pieno: PUSH e POP). Area di memoria gestita come pila. In ARM è discendente pieno (full descending): cresce verso indirizzi minori e sp punta all'ultimo elemento inserito.

  • PUSH {r4, lr} = STMDB sp!, {r4, lr}: sp←sp−8sp \leftarrow sp - 8, poi salva r4 in [sp][sp] e lr in [sp+4][sp+4].
  • POP {r4, pc} = LDMIA sp!, {r4, pc}: ricarica r4 e mette in pc il vecchio lr (quindi ritorna), sp←sp+8sp \leftarrow sp + 8.

Esempio. Con sp=0x8000, PUSH {r4, lr} porta sp a 0x7FF8, salva r4 in [0x7FF8] e lr in [0x7FFC].

Array e strutture dati in assembly ARM

Formula (indirizzo dell'elemento di un array). Un array di nn elementi di ss byte occupa n⋅sn \cdot s byte consecutivi. L'elemento ii sta all'indirizzo

base+i⋅s\text{base} + i \cdot s

Esempio. Con a = {3, -1, 7, 2, 5} all'indirizzo 0x2000, LDR r0, [r1, r2, LSL #2] con r2=3 legge l'indirizzo 0x2000+3⋅4=0x200C\mathrm{0x2000}+3\cdot4=\mathrm{0x200C} e porta r0=2.

Definizione (stringa C e lunghezza). Una stringa C è un array di byte terminato da 0. Lunghezza (strlen):

strlen: MOV   r1, r0          @ r1 scorre la stringa, r0 = inizio
ciclo:  LDRB  r2, [r1], #1
        CMP   r2, #0
        BNE   ciclo
        SUB   r0, r1, r0
        SUB   r0, r0, #1      @ r1 ha superato anche il terminatore
        BX    lr

Esempio. Con la stringa "ciao" il ciclo di strlen legge 55 byte (terminatore compreso) e restituisce 5−1=45-1=4.

Formula (indirizzo di un elemento di una matrice per righe). Una matrice int m[R][C] è memorizzata per righe: l'elemento (i,j)(i, j) sta a

base+(i⋅C+j)⋅4\text{base} + (i \cdot C + j) \cdot 4

Esempio. Con C = 3, m[2][1] sta a base + (2⋅3+1)⋅4=(2 \cdot 3 + 1) \cdot 4 = base + 28.

Definizione (campi di una struct). Dimensione totale 12 byte. Con r0 = indirizzo della struct: LDRB r1, [r0] legge tipo, LDR r2, [r0, #4] legge x, STR r3, [r0, #8] scrive y. Un array di struct si scorre con passo 12.

Esempio. Con r0=0x2000, LDR r2, [r0, #4] legge il campo x all'indirizzo 0x2004 e STR r3, [r0, #8] scrive y a 0x2008.

Dal programma C all'eseguibile ARM

Definizione (compiti del linker)

  1. Mette uno dopo l'altro i segmenti testo e dati di tutti i file.
  2. Risolve i simboli esterni: una BL printf in main.o viene collegata alla definizione di printf nella libreria.
  3. Corregge gli indirizzi segnati come rilocabili.

Esempio. Se main.o ha 100100 byte di testo e max.o ne ha 6060, nell'eseguibile max.o parte 100100 byte dopo l'inizio del testo e gli indirizzi rilocabili di max.o si correggono di 100100.

Proprietà (funzione assembly chiamabile da C). Una funzione assembly è chiamabile da C se rispetta la convenzione di chiamata (argomenti in r0–r3, risultato in r0, r4–r11 preservati).

Esempio. Con massimo(3, 8) il C pone r0=3 e r1=8 e la funzione di max.s restituisce r0=8.

VI. Organizzazione del processore

Unità aritmetico-logica (ALU)

Definizione (ALU a 1 bit). Per il bit ii: una porta AND, una porta OR, un sommatore completo (vedi Circuiti combinatori notevoliMultiplexer, decodificatore e codificatore; semisommatore e sommatore completo; sommatore a propagazione del riporto e suo ritardo, idea dell'anticipo del riporto; sommatore-sottrattore in complemento a 2 con rilevazione dell'overflow; comparatore.Circuiti combinatori notevoli →) e un multiplexer che sceglie quale risultato mandare in uscita.

  • ingressi: aia_i, bib_i, riporto cic_i, selezione dell'operazione;
  • uscite: risultato rir_i, riporto ci+1c_{i+1}.

Esempio. Con ai=1a_i=1, bi=1b_i=1, ci=0c_i=0 il sommatore completo dà ri=0r_i=0 e ci+1=1c_{i+1}=1; il multiplexer sceglie se mandare in uscita AND, OR o somma.

Definizione (ALU a nn bit: sottrazione, NOR, slt, zero e overflow). nn ALU a 1 bit con i riporti in cascata (o con anticipo del riporto). Aggiunte:

Esempio. A 88 bit, 80−11280-112 con Binvert=1Binvert=1 e c0=1c_0=1: 0101 0000+1000 1111+1=1110 00000101\,0000+1000\,1111+1=1110\,0000, cioè −32-32, con Z=0Z=0.

Datapath e microarchitettura

Definizione (percorso delle istruzioni nel datapath). Aritmetica (add rd, rs, rt): PC → memoria istruzioni → lettura di rs e rt → ALU → scrittura in rd. Il PC diventa PC + 4.

Load (lw rt, off(rs)): lettura di rs → ALU calcola rs + estensione(off) → memoria dati in lettura → scrittura in rt. È l'istruzione più lunga: usa tutti gli elementi.

Store (sw rt, off(rs)): come la load fino all'indirizzo; il dato letto da rt va alla memoria dati in scrittura; nessuna scrittura nei registri.

Salto condizionato (beq rs, rt, off): l'ALU sottrae rs - rt; se l'uscita Zero vale 1 il PC diventa PC + 4 + (off · 4), altrimenti PC + 4. Serve un secondo sommatore per il bersaglio.

Esempio. Per beq rs, rt, off con off=3 e Zero =1=1, il PC diventa PC+4+3⋅4=PC+16\text{PC}+4+3\cdot4=\text{PC}+16.

Formula (periodo di clock del ciclo singolo). Ogni istruzione si esegue in un ciclo di clock. Il periodo deve bastare per l'istruzione più lenta. Con ritardi: memoria 200 ps, banco registri 100 ps, ALU 200 ps:

Istruzione Mem. istr. Lettura reg. ALU Mem. dati Scrittura reg. Totale
aritmetica 200 100 200 — 100 600 ps
load 200 100 200 200 100 800 ps
store 200 100 200 200 — 700 ps
salto cond. 200 100 200 — — 500 ps

Periodo = 800 ps (1,25 GHz) per tutte le istruzioni: un'aritmetica spreca 200 ps. Inoltre servono memorie istruzioni e dati separate e più sommatori, perché ogni unità si può usare una sola volta per ciclo.

Esempio. La load impiega 200+100+200+200+100=800200+100+200+200+100=800 ps, quindi f=1/800 ps=1,25f=1/800\ \mathrm{ps}=1{,}25 GHz per tutte le istruzioni.

Definizione (esecuzione multiciclo). L'esecuzione si divide in passi di un ciclo ciascuno (prelievo, decodifica e lettura registri, esecuzione, accesso alla memoria, scrittura); ogni istruzione usa solo i passi che le servono. Il clock è dettato dal passo più lento (qui 200 ps) e:

  • aritmetica 4 cicli = 800 ps, load 5 cicli = 1000 ps, store 4, salto 3;
  • un'unica memoria e un'unica ALU possono servire più passi (con registri intermedi tra i passi);
  • l'unità di controllo diventa un automa a stati finiti.

Esempio. Con clock di 200200 ps, una aritmetica da 44 cicli dura 4⋅200=8004\cdot200=800 ps e una load da 55 cicli 10001000 ps.

Unità di controllo

Definizione (micro-operazioni). Ogni fase del Ciclo fetch-executeRegistri PC, IR, MAR e MBR; ciclo dell'istruzione diviso in fetch ed execute; i quattro tipi di operazioni; diagramma degli stati del ciclo con calcolo degli indirizzi degli operandi e controllo delle interruzioni; esempio su una macchina ad accumulatore.Ciclo fetch-execute → è una sequenza di micro-operazioni, trasferimenti elementari tra registri che avvengono in un ciclo di clock. Prelievo:

  1. t1t_1: MAR←PC\text{MAR} \leftarrow \text{PC}
  2. t2t_2: MBR←M[MAR]\text{MBR} \leftarrow M[\text{MAR}], PC←PC+4\text{PC} \leftarrow \text{PC} + 4
  3. t3t_3: IR←MBR\text{IR} \leftarrow \text{MBR}

Micro-operazioni senza conflitti (che non usano la stessa risorsa) possono stare nello stesso ciclo.

Esempio. In t2t_2 la lettura MBR←M[MAR]\text{MBR}\leftarrow M[\text{MAR}] e l'incremento PC←PC+4\text{PC}\leftarrow\text{PC}+4 non usano la stessa risorsa e stanno nello stesso ciclo: il prelievo dura 33 cicli.

Definizione (segnali di controllo del datapath a ciclo singolo)

Istruzione RegDst ALUSrc MemtoReg RegWrite MemRead MemWrite Branch ALUOp
aritmetica (R) 1 0 0 1 0 0 0 dal campo funct
load 0 1 1 1 1 0 0 somma
store X 1 X 0 0 1 0 somma
salto cond. X 0 X 0 0 0 1 sottrazione

X = indifferente (il valore non conta perché il risultato non viene usato: per la store non si scrive nessun registro). Ogni colonna è una funzione booleana dei bit del codice operativo: è una rete combinatoria (vedi Reti combinatorie e mappe di KarnaughRete combinatoria (uscite funzione dei soli ingressi attuali); mintermini e maxtermini, forme canoniche SOP e POS; mappe di Karnaugh a 3 e 4 variabili con esempi svolti; condizioni di indifferenza; costo e ritardo di una rete a due livelli.Reti combinatorie e mappe di Karnaugh →).

Esempio. Per la store si ha RegWrite =0=0 e MemWrite =1=1: nessun registro viene scritto, la memoria dati sì; RegDst e MemtoReg sono X.

Proprietà (controllo cablato). I segnali sono prodotti da circuiti logici:

Veloce, ma difficile da progettare e da modificare quando le istruzioni sono molte e complesse. Usato nei processori RISC.

Esempio. Nel ciclo singolo RegWrite è una funzione booleana del codice operativo: vale 11 per aritmetica e load, 00 per store e salto.

Definizione (controllo microprogrammato). Idea (Wilkes, 1951): i segnali di ogni passo sono una parola di bit, la microistruzione, memorizzata in una memoria di controllo (ROM). Ogni istruzione macchina corrisponde a un microprogramma.

Funzionamento: un microsequenziatore con un registro indirizzo di controllo legge una microistruzione, ne manda i bit come segnali al datapath e calcola l'indirizzo della successiva (sequenziale, salto condizionato, oppure salto all'inizio del microprogramma indicato dal codice operativo).

Formato Caratteristiche
orizzontale un bit per segnale: molti bit (anche centinaia), massimo parallelismo, nessuna decodifica
verticale segnali codificati in campi (es. 4 bit per scegliere una tra 16 operazioni ALU): microistruzioni corte, serve decodifica, meno parallelismo

Esempio. Per scegliere una tra 1616 operazioni dell'ALU una microistruzione verticale usa log⁡216=4\log_216=4 bit, una orizzontale 1616 bit (uno per operazione).

VII. Gerarchia delle memorie

Gerarchia di memoria e principio di località

Definizione (località temporale e spaziale)

  • località temporale: un dato usato da poco sarà probabilmente riusato presto (variabili di un ciclo, istruzioni del corpo di un ciclo);
  • località spaziale: dopo un indirizzo è probabile che si usino quelli vicini (istruzioni in sequenza, elementi consecutivi di un array).

Esempio. In for (i = 0; i < n; i++) s += a[i]; la variabile s ha località temporale e gli elementi a[i] località spaziale.

Definizione (hit, miss e hit rate)

  • Hit: il dato è nel livello superiore; miss: non c'è e va prelevato dal livello inferiore.
  • Hit rate hh: frazione degli accessi che sono hit; miss rate 1−h1 - h.

Esempio. Su 100100 accessi con 9595 hit si ha h=0,95h=0{,}95 e miss rate 1−h=0,051-h=0{,}05.

Formula (tempo medio di accesso con cache). Se un miss costa l'accesso alla cache più quello alla memoria:

Tmedio=h⋅T1+(1−h)(T1+T2)=T1+(1−h) T2T_{medio} = h \cdot T_1 + (1 - h)(T_1 + T_2) = T_1 + (1 - h)\,T_2

Esempio. Con T1=1T_1=1 ns, T2=100T_2=100 ns e h=0,95h=0{,}95: Tmedio=1+0,05⋅100=6T_{medio}=1+0{,}05\cdot100=6 ns; con h=0,99h=0{,}99 diventa 22 ns.

Formula (tempo medio con due livelli di cache). Con due livelli di cache: Tmedio=TL1+mL1 (TL2+mL2 Tmem)T_{medio} = T_{L1} + m_{L1}\,(T_{L2} + m_{L2}\,T_{mem}), con mm i miss rate locali.

Esempio. Con TL1=1T_{L1}=1 ns, mL1=0,1m_{L1}=0{,}1, TL2=10T_{L2}=10 ns, mL2=0,2m_{L2}=0{,}2 e Tmem=100T_{mem}=100 ns: Tmedio=1+0,1 (10+0,2⋅100)=4T_{medio}=1+0{,}1\,(10+0{,}2\cdot100)=4 ns.

Memoria cache

Definizione (campo parola e indirizzo del blocco). Se K=2wK = 2^w, gli ultimi ww bit dell'indirizzo indicano la parola dentro il blocco (campo parola), gli altri bit sono l'indirizzo del blocco. Il primo indirizzo di un blocco ha il campo parola a zero.

Esempio. Con blocchi di K=4K=4 parole (w=2w=2), l'indirizzo 13=1101213=1101_2 ha campo parola 0101 e indirizzo del blocco 112=311_2=3.

Formula (associazione diretta). Ogni blocco può andare in una sola linea:

linea=(indirizzo del blocco) mod m\text{linea} = (\text{indirizzo del blocco}) \bmod m

Indirizzo: | tag | linea (log⁡2m\log_2 m bit) | parola (ww bit) |

Esempio. Con m=8m=8 linee, il blocco 1919 va nella linea 19 mod 8=319\bmod8=3.

Definizione (associazione completa). Un blocco può andare in qualsiasi linea. Indirizzo: | tag | parola |. Si confronta il tag con tutte le linee in parallelo (memoria associativa): costosa, usata solo per cache piccolissime (es. il TLB, vedi Memoria virtualeIndirizzi virtuali e fisici, pagine e frame; traduzione con la tabella delle pagine e calcolo dei campi; page fault e sostituzione delle pagine; TLB e tempo di accesso effettivo; protezione e condivisione; confronto con la cache.Memoria virtuale →).

Esempio. Con indirizzi di 1212 bit e blocchi di 22 byte il tag è l'indirizzo del blocco (1111 bit) e il campo parola è di 11 bit.

Formula (associazione a insiemi a nn vie). Le mm linee sono divise in v=m/nv = m/n insiemi (set) di nn linee. Un blocco va in un insieme fisso, in una linea qualsiasi dell'insieme:

insieme=(indirizzo del blocco) mod v\text{insieme} = (\text{indirizzo del blocco}) \bmod v

Indirizzo: | tag | insieme (log⁡2v\log_2 v bit) | parola |

Esempio. Con m=8m=8 linee a 22 vie: v=8/2=4v=8/2=4 insiemi; il blocco 1919 va nell'insieme 19 mod 4=319\bmod4=3.

Formula (campi dell'indirizzo di una cache). Con capacità CC, linea (= blocco) di KK byte, nn vie e memoria indirizzata al byte:

linee=CK,insiemi=lineen,parola=log⁡2K,set=log⁡2(insiemi),etichetta=bit dell’indirizzo−set−parola.\text{linee} = \frac{C}{K}, \quad \text{insiemi} = \frac{\text{linee}}{n}, \quad \text{parola} = \log_2 K, \quad \text{set} = \log_2(\text{insiemi}), \quad \text{etichetta} = \text{bit dell'indirizzo} - \text{set} - \text{parola}.

Esempio. Con C=16C=16 byte, K=2K=2 byte, n=2n=2 vie e indirizzi di 1212 bit: linee =8=8, insiemi =4=4, parola =1=1 bit, set =2=2 bit, etichetta =12−2−1=9=12-2-1=9 bit.

Memoria principale a semiconduttore

Definizione (RAM dinamica e statica)

DRAM (dinamica) SRAM (statica)
cella un condensatore e un transistor di accesso un flip-flop (tipicamente 6 transistor)
bit carica presente/assente stato del flip-flop
refresh necessario: la carica si disperde, va riletta e riscritta periodicamente (ogni pochi ms) non serve finché c'è alimentazione
densità e costo alta densità, basso costo per bit bassa densità, alto costo
velocità più lenta più veloce
uso memoria principale cache

Esempio. Una cella SRAM usa circa 66 transistor, una DRAM un transistor e un condensatore: a parità di area la DRAM contiene più bit.

Definizione (chip di memoria N×bN\times b). Un chip N×bN \times b contiene NN parole di bb bit: ha log⁡2N\log_2 N linee di indirizzo e bb linee dati. Internamente le celle sono una matrice: l'indirizzo è diviso in riga e colonna, decodificate separatamente. Nelle DRAM riga e colonna arrivano in due tempi sulle stesse linee (segnali RAS e CAS), dimezzando i piedini.

Esempio. Memoria di 1 MB, parola di 1 byte, con chip 256K×1256\text{K} \times 1 bit.

Memoria esterna - dischi, RAID e memorie ottiche

Formula (capacità di un disco). Capacità = facce × tracce per faccia × settori per traccia × byte per settore.

Esempio. 22 facce, 10001000 tracce per faccia, 100100 settori per traccia e 512512 byte per settore danno 2⋅1000⋅100⋅512=102 400 0002\cdot1000\cdot100\cdot512=102\,400\,000 byte.

Formula (tempo di accesso al disco)

Taccesso=Tseek+Tlatenza+TtrasfT_{accesso} = T_{seek} + T_{latenza} + T_{trasf}

  • Posizionamento (seek): portare la testina sulla traccia; dato del disco (valore medio).
  • Latenza rotazionale: attesa che il settore passi sotto la testina; in media mezzo giro: Tlatenza=12⋅60giri al minuto⋅1000 msT_{latenza} = \frac{1}{2} \cdot \frac{60}{\text{giri al minuto}} \cdot 1000 \ \text{ms}
  • Trasferimento di DD byte su una traccia di NN byte (frazione di giro): Ttrasf=DN⋅TgiroT_{trasf} = \frac{D}{N} \cdot T_{giro}

Esempio. A 72007200 giri/min la latenza rotazionale media è 12⋅607200⋅1000=4,17\tfrac12\cdot\tfrac{60}{7200}\cdot1000=4{,}17 ms.

Definizione (scheduling del disco: FCFS, SSTF e ascensore)

Algoritmo Regola Caratteristiche
FCFS (FIFO) ordine di arrivo equo, spesso il più lento
SSTF (shortest seek time first) la richiesta più vicina al cilindro attuale spostamento minimo, ma può far attendere a lungo le richieste lontane e fa molte inversioni
ascensore (SCAN) continua nella direzione corrente servendo le richieste che incontra, inverte quando non ce ne sono più poche inversioni del braccio (meno usura meccanica), buone prestazioni

Esempio. Con la testina sul cilindro 5050 e richieste 90,52,10,5590,52,10,55 (in ordine di arrivo) FCFS percorre 40+38+42+45=16540+38+42+45=165 cilindri, SSTF (52,55,90,1052,55,90,10) percorre 2+3+35+80=1202+3+35+80=120.

Proprietà (parità e ricostruzione nel RAID). La parità permette la ricostruzione: se un disco si guasta, ogni suo blocco è lo XOR dei blocchi corrispondenti degli altri dischi.

Esempio. Con blocchi 10101010, 01100110, 11111111 la parità è 00110011; se il secondo disco si guasta, 0110=1010⊕1111⊕00110110=1010\oplus1111\oplus0011.

Memoria virtuale

Definizione (pagine, frame e indirizzo virtuale)

  • Lo spazio virtuale è diviso in pagine di dimensione fissa (tipicamente 4 KB); la memoria fisica in frame (cornici) della stessa dimensione.
  • Indirizzo virtuale = | numero di pagina virtuale | offset |; l'offset ha log⁡2(dimensione pagina)\log_2(\text{dimensione pagina}) bit e non cambia nella traduzione.

Esempio. Con pagine di 44 KB l'offset è di log⁡24096=12\log_24096=12 bit; un indirizzo virtuale di 3232 bit ha 32−12=2032-12=20 bit di numero di pagina.

Definizione (tabella delle pagine). Per ogni processo una tabella delle pagine in memoria, indicizzata dal numero di pagina virtuale. Ogni voce contiene: bit di validità (pagina in memoria o no), numero di frame, bit di protezione (lettura, scrittura, esecuzione, utente/supervisore), bit di riferimento e bit sporco.

Esempio. Se la voce della pagina 0x00403 indica il frame 0x1F2, l'indirizzo virtuale 0x00403A7C diventa l'indirizzo fisico 0x1F2A7C.

Definizione (TLB). Ogni accesso richiederebbe un accesso in più alla tabella in memoria. Il TLB (Translation Lookaside Buffer) è una piccola cache associativa delle traduzioni recenti (decine–centinaia di voci). TLB hit: traduzione in un ciclo; TLB miss: si legge la tabella e si aggiorna il TLB.

Esempio. Con accesso alla memoria di 100100 ns, TLB di 11 ns e hit rate 98%98\%: T=0,98⋅101+0,02⋅201=103T=0{,}98\cdot101+0{,}02\cdot201=103 ns, contro 200200 ns senza TLB.

VIII. Sistemi di input/output

Moduli di input-output e input-output programmato

Definizione (I/O mappato in memoria e I/O isolato)

I/O mappato in memoria I/O isolato
spazio di indirizzi unico: i registri dei moduli occupano indirizzi di memoria separato per l'I/O
istruzioni le stesse load/store della memoria istruzioni dedicate (IN, OUT in x86)
pro nessuna istruzione speciale; tutte le modalità di indirizzamento disponibili lo spazio di memoria resta tutto per la memoria
contro consuma indirizzi di memoria insieme di istruzioni di I/O limitato

Esempio. In ARM (I/O mappato) il registro dati della UART a 0x101F1000 si scrive con STRB r0, [r1], la stessa istruzione di una store in memoria.

Definizione (I/O programmato con polling). La CPU esegue tutto: dà il comando, poi interroga ripetutamente il registro di stato (polling) finché il dispositivo è pronto, poi trasferisce il dato.

Esempio. Con una stampante da 10001000 caratteri/s e una CPU da 10910^9 istruzioni/s, per ogni carattere si sprecano circa 109/1000=10610^9/1000=10^6 istruzioni di polling.

Definizione (I/O programmato, a interrupt e DMA)

Esempio. Per un blocco di 10241024 parole l'I/O con interrupt richiede 10241024 interruzioni, il DMA una sola, alla fine del blocco.

Interrupt

Definizione (interruzione). Un'interruzione sospende il programma in esecuzione per far eseguire una routine di servizio (interrupt handler), poi lo fa riprendere come se nulla fosse successo.

Classe Causa
I/O un modulo segnala la fine di un'operazione o una richiesta
timer allo scadere di un intervallo (base per il multitasking del sistema operativo)
guasto hardware errore di parità della memoria, calo di alimentazione
programma (eccezioni) overflow, divisione per zero, istruzione non valida, accesso a memoria protetta, page fault (vedi Memoria virtualeIndirizzi virtuali e fisici, pagine e frame; traduzione con la tabella delle pagine e calcolo dei campi; page fault e sostituzione delle pagine; TLB e tempo di accesso effettivo; protezione e condivisione; confronto con la cache.Memoria virtuale →), chiamata esplicita al sistema operativo (SVC in ARM)

Esempio. Una divisione per zero è una eccezione di programma; lo scadere di un timer è una interruzione di timer; la fine di una lettura da disco è una interruzione di I/O.

Definizione (sequenza di gestione di una interruzione). Hardware:

  1. il dispositivo invia la richiesta;
  2. la CPU finisce l'istruzione corrente (il controllo delle interruzioni è l'ultima fase del Ciclo fetch-executeRegistri PC, IR, MAR e MBR; ciclo dell'istruzione diviso in fetch ed execute; i quattro tipi di operazioni; diagramma degli stati del ciclo con calcolo degli indirizzi degli operandi e controllo delle interruzioni; esempio su una macchina ad accumulatore.Ciclo fetch-execute →);
  3. la CPU controlla se ci sono richieste abilitate e invia la conferma (acknowledge);
  4. salva sullo stack (o in registri dedicati) PC e PSW;
  5. carica nel PC l'indirizzo della routine di servizio.

Software (routine di servizio):

  1. salva gli altri registri che userà;
  2. serve il dispositivo;
  3. ripristina i registri;
  4. esegue l'istruzione di ritorno da interruzione, che ripristina PSW e PC.

Esempio. Con SP=TSP=T prima dell'interruzione, dopo il salvataggio di PC e PSW si ha SP=T−2SP=T-2; se la routine salva altri m=3m=3 registri, SP=T−5SP=T-5, e al ritorno SP=TSP=T.

Definizione (identificazione della sorgente di una interruzione)

  • linee di interrupt multiple: una linea per dispositivo (le linee sono poche);
  • polling software: un'unica routine interroga i registri di stato di tutti i moduli (lento);
  • daisy chain (polling hardware): il segnale di conferma passa da un modulo all'altro in catena; il primo che ha una richiesta pendente lo blocca e mette sul bus il proprio vettore (un numero che identifica la routine);
  • arbitraggio del bus: il modulo deve ottenere il bus prima di richiedere l'interrupt.

Esempio. Con tre moduli M1,M2,M3M_1,M_2,M_3 in daisy chain che richiedono insieme l'interrupt, il segnale di conferma si ferma in M1M_1, che mette sul bus il proprio vettore.

Accesso diretto alla memoria (DMA)

Definizione (funzionamento del DMA)

  1. La CPU programma il modulo DMA indicando: lettura o scrittura, indirizzo del dispositivo, indirizzo iniziale in memoria, numero di parole da trasferire.
  2. La CPU prosegue con altro lavoro.
  3. Il DMA trasferisce il blocco una parola alla volta, usando il bus: per ogni parola incrementa l'indirizzo e decrementa il contatore.
  4. Alla fine invia un solo interrupt alla CPU.

Esempio. Per 10241024 parole il DMA incrementa l'indirizzo e decrementa il contatore 10241024 volte, poi invia un solo interrupt.

Definizione (furto di cicli e burst)

  • furto di cicli (cycle stealing): il DMA prende il bus per un ciclo, trasferisce una parola e lo rilascia. La CPU rallenta di poco;
  • burst (a blocco): il DMA tiene il bus per tutto il blocco. Trasferimento più veloce, ma la CPU non può accedere alla memoria nel frattempo.

Esempio. Per 10241024 parole, con furto di cicli il DMA prende il bus per 11 ciclo alla volta (10241024 volte); in burst lo tiene per 10241024 cicli di seguito.

Formula (confronto tra interrupt e DMA). Trasferire 4 KB in parole da 4 byte = 1024 parole.

  • Interrupt: 1024 interruzioni; se ognuna costa 200 cicli tra salvataggio del contesto, routine e ritorno → circa 205 000 cicli di CPU.
  • DMA: programmazione iniziale (es. 100 cicli) + un interrupt finale (200 cicli) ≈ 300 cicli di CPU, più gli eventuali cicli sottratti sul bus.

Esempio. Con un interrupt per parola servono circa 1024⋅200≈205 0001024\cdot200\approx205\,000 cicli di CPU, con il DMA 100+200=300100+200=300 cicli.

IX. Tecniche avanzate di progettazione

Pipeline

Definizione (pipeline a 5 stadi)

Stadio Cosa fa
IF (instruction fetch) preleva l'istruzione all'indirizzo PC; PC ← PC + 4
ID (instruction decode) decodifica, legge i registri, genera i segnali di controllo, rileva le dipendenze
EX (execute) ALU: operazione, oppure calcolo dell'indirizzo per load/store e salti
MEM accesso alla memoria dati (solo load e store)
WB (write back) scrive il risultato nel banco dei registri

Esempio. Al ciclo 33 I1 è in EX, I2 in ID e I3 in IF: tre istruzioni in volo, ciascuna in uno stadio diverso.

Formula (tempo di ciclo della pipeline). Tempo di ciclo: lo stadio più lento più il ritardo dei registri di pipeline dd:

τ=max⁡iτi+d\tau = \max_i \tau_i + d

Esempio. Con stadi da 200,100,200,200,100200,100,200,200,100 ps e d=20d=20 ps: τ=200+20=220\tau=200+20=220 ps.

Formula (tempo per eseguire nn istruzioni). Tempo per eseguire nn istruzioni con kk stadi, senza stalli: la prima istruzione esce dopo kk cicli, poi ne esce una per ciclo:

Tk=(k+n−1) τT_k = (k + n - 1)\,\tau

Esempio. Con n=9n=9 istruzioni e k=6k=6 stadi servono k+n−1=14k+n-1=14 cicli, contro 9⋅6=549\cdot6=54 senza pipeline.

Formula (speedup della pipeline). Speedup rispetto all'esecuzione senza pipeline (che richiede kτk\tau per istruzione):

Sk=n k τ(k+n−1) τ=nkk+n−1→n→∞kS_k = \frac{n\,k\,\tau}{(k + n - 1)\,\tau} = \frac{nk}{k + n - 1} \xrightarrow{n \to \infty} k

Esempio. Con k=5k=5 e n=100n=100: S=500/104≈4,8S=500/104\approx4{,}8.

Formula (speedup con stalli)

S=k1+frazione di cicli di stallo per istruzioneS = \frac{k}{1 + \text{frazione di cicli di stallo per istruzione}}

Esempio. Con k=5k=5 e 0,250{,}25 cicli di stallo per istruzione: S=5/1,25=4S=5/1{,}25=4.

Hazard nella pipeline

Definizione (dipendenze RAW, WAR e WAW). Un'istruzione JJ usa un registro coinvolto in un'istruzione II precedente.

Dipendenza Significato Esempio
RAW (read after write) JJ legge un registro che II scrive: deve leggere il valore nuovo add $1,$2,$3 poi sub $4,$1,$5
WAR (write after read) JJ scrive un registro che II legge: II deve leggere il valore vecchio sub $4,$1,$5 poi add $1,$2,$3
WAW (write after write) JJ e II scrivono lo stesso registro: deve restare il valore di JJ add $1,… poi lw $1,…

Esempio. In add $1,$2,$3 seguita da sub $4,$1,$5, la sub legge $1 scritto dalla add: dipendenza RAW.

Definizione (data forwarding). Il risultato esiste già prima di WB: per un'istruzione aritmetica alla fine di EX, per una load alla fine di MEM. Il forwarding (bypass) lo porta direttamente all'ingresso dell'ALU dai registri di pipeline EX/MEM o MEM/WB, tramite multiplexer comandati da un'unità che confronta i numeri dei registri.

Esempio. Con add $1,$2,$3 seguita da sub $4,$1,$5, il risultato della add (fine di EX) arriva direttamente all'ingresso dell'ALU della sub: nessuno stallo.

Formula (stalli per istruzione dovuti ai salti). Esempio di costo: 15% di salti condizionati di cui il 60% presi, 1% di salti incondizionati, 2 cicli persi per ogni salto preso, si prevede "non preso":

stalli per istruzione=0,01⋅2+0,15⋅0,6⋅2+0,15⋅0,4⋅0=0,2S=51,2≈4,17\text{stalli per istruzione} = 0{,}01 \cdot 2 + 0{,}15 \cdot 0{,}6 \cdot 2 + 0{,}15 \cdot 0{,}4 \cdot 0 = 0{,}2 \qquad S = \frac{5}{1{,}2} \approx 4{,}17

Esempio. Con 0,20{,}2 stalli per istruzione e k=5k=5 stadi: S=5/(1+0,2)≈4,17S=5/(1+0{,}2)\approx4{,}17.

Branch prediction

Definizione (tecniche contro i control hazard senza predizione)

  • Stallo: appena in ID si riconosce un salto, si ferma il prelievo finché non si sa dove andare. Semplice ma sempre costoso.
  • Flussi multipli: si prelevano entrambe le strade e si scarta quella sbagliata. Richiede risorse doppie e non regge salti a breve distanza l'uno dall'altro.
  • Prelievo anticipato del bersaglio: si preleva anche l'istruzione di destinazione e la si tiene pronta.
  • Anticipare la decisione: calcolare condizione e indirizzo già in ID (un sommatore e un comparatore in più): il costo scende a 1 ciclo.
  • Loop buffer (o buffer circolare): una piccola memoria velocissima (es. 256 byte) con le ultime istruzioni prelevate, indirizzata dai bit bassi dell'indirizzo (8 bit per 256 byte) e con i bit alti come etichetta, come una cache. Un ciclo breve che salta all'indietro trova le istruzioni già nel buffer.
  • Salto ritardato (delayed branch, MIPS): l'istruzione subito dopo il salto (delay slot) viene sempre eseguita. Il compilatore ci mette un'istruzione utile che va eseguita comunque (presa da prima del salto), oppure una nop.

Esempio. Anticipando condizione e indirizzo in ID, un salto preso costa 11 ciclo invece di 22.

Definizione (predizione statica)

  • sempre non preso: si continua a prelevare in sequenza; se il salto è preso si buttano le istruzioni prelevate;
  • sempre preso;
  • in base al codice operativo o alla direzione: i salti all'indietro (chiusura dei cicli) presi, quelli in avanti non presi. Il compilatore può anche indicare la previsione con un bit nell'istruzione.

Esempio. Il salto che chiude un ciclo (all'indietro) si prevede preso, un salto in avanti non preso.

Definizione (predittori dinamici a 1 e 2 bit). 1 bit: si prevede ciò che il salto ha fatto l'ultima volta. In un ciclo che si ripete sbaglia due volte per ogni esecuzione completa del ciclo: all'uscita (previsto preso, invece non preso) e al primo giro successivo (previsto non preso, invece preso).

2 bit: quattro stati, due "prevedi preso" e due "prevedi non preso"; per cambiare previsione servono due errori consecutivi.

Stato Previsione Se preso Se non preso
11 forte preso 11 10
10 debole preso 11 00
01 debole non preso 11 00
00 forte non preso 01 00

Esempio. In un ciclo da 1010 iterazioni (salto preso 99 volte e non preso 11) il predittore a 11 bit sbaglia 22 volte ogni 1010 (80% corrette), quello a 22 bit 11 volta (90%).

Processori superscalari e multicore

Definizione (processore superscalare). Un processore superscalare preleva, decodifica ed esegue più istruzioni per ciclo (2–8), con più unità funzionali (più ALU, unità load/store, unità in virgola mobile). Il limite teorico è un CPI di 1/n1/n con nn istruzioni lanciate per ciclo.

Esempio. Con n=2n=2 istruzioni per ciclo il CPI minimo è 1/21/2; a 22 GHz si arriva fino a 4⋅1094\cdot10^9 istruzioni al secondo.

Definizione (ridenominazione dei registri). Fuori ordine le dipendenze WAR e WAW (vedi Hazard nella pipelineHazard strutturali, sui dati e sul controllo; dipendenze RAW, WAR e WAW; stalli e bolle con diagrammi; data forwarding (bypass) e caso load-use; riordino delle istruzioni da parte del compilatore e dell'hardware; costo dei salti.Hazard nella pipeline →) diventano un problema. Sono dipendenze "di nome" (riuso dello stesso registro), non di dato: si eliminano con la ridenominazione dei registri, che assegna a ogni nuovo valore un registro fisico diverso (i registri fisici sono molti più di quelli dell'ISA).

1: add r1, r2, r3
2: sub r4, r1, r5      ; RAW su r1: dipendenza vera
3: mul r1, r6, r7      ; WAW con 1, WAR con 2: dipendenze di nome

Esempio. Ridenominando r1 dell'istruzione 3 in p9, la mul non confligge più con add e sub e può partire prima della 2.

X. Valutazione delle prestazioni

Prestazioni di un calcolatore

Definizione (prestazioni e confronto)

  • Prestazioni = 1 / tempo di esecuzione. "A è nn volte più veloce di B" significa TB/TA=nT_B / T_A = n.

Esempio. Se TB=6T_B=6 s e TA=4T_A=4 s, A è 6/4=1,56/4=1{,}5 volte più veloce di B.

Formula (tempo di CPU)

TCPU=Nistr⋅CPI⋅Tclock=Nistr⋅CPIfT_{CPU} = N_{istr} \cdot CPI \cdot T_{clock} = \frac{N_{istr} \cdot CPI}{f}

Esempio. 10910^9 istruzioni con CPI 1,51{,}5 a 22 GHz: T=109⋅1,5/(2⋅109)=0,75T=10^9\cdot1{,}5/(2\cdot10^9)=0{,}75 s.

Formula (CPI medio). Se le istruzioni sono divise in classi con frequenza FiF_i e CPIiCPI_i:

CPI=∑iFi⋅CPIiCPI = \sum_i F_i \cdot CPI_i

Esempio. Con classi al 50%50\% (CPI 11), 20%20\% (CPI 55), 10%10\% (CPI 33) e 20%20\% (CPI 22): CPI=0,5+1+0,3+0,4=2,2CPI=0{,}5+1+0{,}3+0{,}4=2{,}2.

Formula (MIPS)

MIPS=NistrT⋅106=fCPI⋅106\text{MIPS} = \frac{N_{istr}}{T \cdot 10^6} = \frac{f}{CPI \cdot 10^6}

Esempio. A 22 GHz con CPI=2,2CPI=2{,}2: MIPS=2⋅109/(2,2⋅106)≈909\text{MIPS}=2\cdot10^9/(2{,}2\cdot10^6)\approx909.

Legge (di Amdahl). Se un miglioramento accelera di un fattore ss solo una frazione FF del tempo di esecuzione:

S=1(1−F)+F/sS = \frac{1}{(1 - F) + F/s}

Esempio. Con F=0,4F=0{,}4 e s=10s=10: S=1/(0,6+0,04)=1,56S=1/(0{,}6+0{,}04)=1{,}56.