Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Istruzioni
Si scriva solo negli spazi previsti nel testo della prova e non si separino i fogli.
Per la minuta si utilizzino le pagine bianche inserite in fondo al fascicolo distribuito con il testo della prova. I
fogli di minuta, se staccati, vanno consegnati intestandoli con nome e cognome.
È vietato portare con sé libri, eserciziari e appunti, nonché cellulari e altri dispositivi mobili di calcolo o
comunicazione. Chiunque fosse trovato in possesso di documentazione relativa al corso – anche se non
strettamente attinente alle domande proposte – vedrà annullata la propria prova.
Tempo a disposizione 2 h : 00 m
spiazzamento
negativo ?
spiazzamento
positivo o
contenuto
rispetto a
simbolico
gp 0x 1000 8000
indirizzi
alti
FUNCT [...]
indirizzi
FUNCT [0] 0x 8000 neg
bassi
Per definizione l’elemento intero (una parola da 32 bit ossia da 4 byte) FUNCT [0] della variabile
globale vettore FUNCT ha spiazzamento 215 0x 8000 rispetto al registro puntatore globale
$gp. Inoltre si ha che 8192 213 e 8192 4 215. Pertanto l’elemento intero FUNCT [8192] del
vettore ha spiazzamento 0 rispetto a $gp. Ora, si ha che 8199 8192 7 e 7 4 28, pertanto
l’elemento intero FUNCT [8199] del vettore ha spiazzamento 28 0x 001C rispetto a $gp. Per
finire, la variabile globale intera INF ha spiazzamento 28 4 32 0x 0020 e la variabile globale
intera NUM ha spiazzamento 32 4 36 0x 0024, rispetto a $gp.
punto 1 – codice MIPS della sezione dichiarativa globale (numero di righe non significativo)
spiazz. rispetto
contenuto simbolico
a stack pointer
indirizzi alti
ra (salvato da CONST) 12
s0 (salvato da CONST) 8
s1 (salvato da CONST) 4
PREV (varloc allocata in pila) 0 sp (fine area)
indirizzi bassi
La varloc PREV è riferita per indirizzo, dunque va allocata in pila (non in un registro). La funzione const non
è foglia, dunque deve salvare il registro ra. La funzione print usa il registro a0, ma dopo il rientro di print la
funzione const non lo usa più, pertanto non occorre che const lo salvi in pila. La funzione print è foglia e non
usa il registro a1, pertanto non occorre che const lo salvi in pila sebbene lo usi dopo il rientro di print.
punto 3 – codice MIPS degli statement riquadrati di MAIN – (numero di righe non significativo)
// num = 8200
li $t0, 8200 // carica costante 8200
sw $t0, NUM // aggiorna varglob NUM
DO: // idx--
subi $a1, $a1, 1 // aggiorna param IDX
// while (idx != 0)
bne $a1, $zero, DO // se idx != 0 vai a DO
.data .data
MIN .word 32 FILL: .space 8
VECT .space 40 ELEM .word 80
MAX .space 4 .text
.text .globl FUNCTION
.globl MAIN FUNCTION: lw $t1, ELEM
MAIN: addi $t0, $zero, 28 beq $t1, $zero, FUNCTEND
sw $t0, MIN lw $t1, MIN
la $a0, VECT beq $t1, $zero, MAIN
jal FUNCTION FUNCTEND: jr $ra
MAINEND: sw $v0, MAX
dimensione testo: 18 hex (24 dec) dimensione testo: 14 hex (20 dec)
dimensione dati: 30 hex (48 dec) dimensione dati: 0C hex (12 dec)
testo testo
dati dati
base del testo: 0040 0000 base del testo: 0040 0018
base dei dati: 1000 0000 base dei dati: 1000 0030
1 1 1 1 1 1 1 1
I 0 0 0 0 0 0 0 0
D1
Q1 0
D2
Q2 0
U
CLK
1 1 1 1 1 1 1 1
I 0 1 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
D1 0 0 0 0 0 0 0 0
1 1
Q1 0 0
1 1
D2 0
1
Q2 0 0
1
U 0 0
CLK
Si noti che se vale U = 1, la porta XOR si comporta da negatore dell’altro segnale, dunque annulla l’effetto
del negatore di I. Ne risulta che si ha D1 = I; invece, se vale U = 0, la porta XOR riproduce sulla sua uscita
l’altro segnale, dunque si ha D1 = !I.
Il secondo bistabile master-slave riceve sull’ingresso D2 il valore Q1 e nell’intervallo successivo mostra tale
valore su Q2.
Sono dati il seguente frammento di codice macchina MIPS (simbolico), che inizia l’esecuzione all’indirizzo
indicato, e i valori iniziali per alcuni registri e parole di memoria.
2) Dato il valore su 16 bit espresso in esadecimale 0x AAAF lo si interpreti come uno spiazzamento di
parola. A partire da questo, si determini su 32 bit con estensione di segno il valore corrispondente
allo spiazzamento di byte. Si esprima tale valore in esadecimale.
La pipeline NON è ottimizzata per la gestione dei conflitti di controllo. Si consideri il ciclo di clock 4 in cui
l’esecuzione delle istruzioni nei vari stadi è la seguente:
ciclo di clock
1 2 3 4 5 6 7 8 9 10
segnali all’ingresso dei registri di interstadio (subito prima del fronte di SALITA del clock – ciclo 4)
IF (beq) ID (beq-stallo) EX (lw) MEM (add)
registro IF/ID registro ID/EX registro EX/MEM registro MEM/WB
.WB.MemtoReg .WB.MemtoReg .WB.MemtoReg
0 1 0
.WB.RegWrite .WB.RegWrite .WB.RegWrite
0 1 1
.M.MemWrite .M.MemWrite
0 0
.M.MemRead .M.MemRead
0 1
.M.Branch .M.Branch
0 0
.PC .PC .PC valore numerico
0FFF 0010 0FFF 0010 0FFF 000C + FFFE AABC =
0FFD AAC8
.istruzione .(Rs) (t1) iniziale
beq 1001 0000
.(Rt) (t3) iniziale .(Rt) t2 iniziale
1000 FFF5 0001 0115
.Rt .R .R
t3 t2 t1
.Rd
****************
.imm/offset esteso .ALU_out ind. mem dati .ALU_out
FFFF FFFE 1000 AAA4 (t2) + (t3) 1002 010A
.EX.ALUSrc .Zero .DatoLetto
0 0 ****************
.EX.RegDest
0
segnali di altre unità funzionali (subito prima del fronte di SALITA del clock – CICLO 4)
Mem.indirizzo RegWrite
1002 010A add n.d. istruzione precedente alla add non specif.
MemWrite RegDest
0 add 0 lw
MemRead MemtoReg
0 add n.d. istruzione precedente alla add non specif.
segnali relativi al RF (subito prima del fronte di DISCESA interno al ciclo di clock – CICLO 5)
RF.RegLettura1 RF.DatoLetto1 RF.RegScrittura
t1 beq 1001 0000 (t1) iniz t1 add
RF.RegLettura2 RF.DatoLetto2 RF.DatoScritto
t3 beq 1000 FFF5 (t3) iniz 1002 010A (t1) finale
ciclo di clock
NOTA BENE: per percorsi attivi nello stesso ciclo di clock e riferiti alla stessa istruzione, utilizzare
una sola colonna per rappresentarli.
Tabella 3
istruzione che ne
usufruisce
2 (add)
tipo(i) di
MEM-EX (rs)
propagazione
ID / EX.Rs $3
segnali di ingresso all’unità di propagazione
ID / EX.Rt $2
EX / MEM.R v.s.
EX / MEM.RegWrite 0 (stallo)
MEM / WB.R $3
MEM / WB.RegWrite 1
MUX di propagazione
interessato
PA
ingresso di selezione
segnali di uscita
di propagazione
MUX PA
01
dell’unità
ingresso di selezione
MUX PB
00
Si vuole progettare la rete combinatoria che realizza una versione semplificata dell’unità di controllo
del processore pipeline MIPS.
L’unità di controllo in oggetto riceve in ingresso un “CODICE ISTRUZIONE” di 3 bit e genera 7 uscite da 1
bit ciascuna, le quali rappresentano una parte dei segnali di controllo della pipeline.
Nella tabella ingressi-uscite predisposta, a ogni configurazione di CODICE ISTRUZIONE (C2, C1, C0) è
associato il simbolico dell’istruzione stessa.
Si definisca la tabella ingressi-uscite del circuito, tenendo conto della seguente ulteriore specifica:
se per una certa istruzione e per un certo segnale di controllo risulta indifferente generare il valore 0
oppure il valore 1, si scelga sempre di sintetizzare il segnale con uno 0
ADD 0 0 0 1 0 0 0 0 1 0
SUB 0 0 1 1 0 0 0 0 1 0
AND 0 1 0 1 0 0 0 0 1 0
OR 0 1 1 1 0 0 0 0 1 0
SLT 1 0 0 1 0 0 0 0 1 0
LW 1 0 1 0 1 0 1 0 1 1
SW 1 1 0 0 1 0 0 1 0 0
BEQ 1 1 1 0 0 1 0 0 0 0
RegWrite = !C2 !C1 !C0 + !C2 !C1 C0 + !C2 C1 !C0 + !C2 C1 C0 + C2 !C1 !C0 + C2 !C1 C0 ____
Si consideri poi l’espressione ottenuta al punto precedente per il segnale RegWrite e la si semplifichi
usando le regole dell’algebra fino a ottenere un’espressione costituita dalla somma di due soli termini:
RegWrite = !C2 !C1 !C0 + !C2 !C1 C0 + !C2 C1 !C0 + !C2 C1 C0 + C2 !C1 !C0 + C2 !C1 C0 ____
= !C2 !C1 (!C0 + C0) + !C2 C1 (!C0 + C0) + C2 !C1 (!C0 + C0) (raccoglimento) _____
2. Calcolare il tempo necessario per caricare un blocco dalla memoria centrale in caso di fallimento
(miss), in numero di cicli di clock.
3. Va in esecuzione un nuovo programma che accede, caricandolo in memoria cache, a un array di interi di
dimensione pari a 1032 byte. Calcolare il numero di fallimenti (miss) per la cache dati e mostrare
nella tabella i blocchi dell’array presenti in cache dati al termine del caricamento, numerandoli a
partire da 0 (numero di righe non significativo).
# fallimenti caricamento = 5 miss (1032 byte corrispondono a 5 blocchi, dunque ci sono 5 miss)
0 0, 4
1 1
2 2
3 3
4. Calcolare il tempo totale di accesso alla memoria dati per questo programma, considerando che il
programma, dopo l’accesso di cui alla domanda precedente, accede sequenzialmente ai primi 100
elementi dell’array e agli ultimi 8 elementi dell’array in un ciclo ripetuto 10 volte.
Tempo totale di accesso alla memoria dati = T accesso domanda 3 + T accesso domanda 4
L’array è composto da 1032 byte / 4 byte per elemento = 258 elementi. Ogni blocco contiene 64 elementi.
Pertanto, dei 100 + 8 = 108 elementi acceduti, i primi 100 si trovano nel blocco 0 (64 elementi) e nel blocco
1 (36 elementi), mentre gli ultimi 8 si trovano nel blocco 3 (6 elementi) e nel blocco 4 (ultimi 2 elementi).
Per calcolare il tempo di accesso alla cache dati, è necessario calcolare il numero totale di miss, oltre ai 5
miss per il primo caricamento dell’array che porta ad avere in cache i blocchi 4, 1, 2 e 3 (cfr. domanda 3).
Per ciascuna delle 10 ripetizioni della sequenza di accesso all’array (cfr. domanda 4), ci sono sempre due
miss, per il blocco 0 e per il blocco 4, i quali blocchi finiscono nella stessa posizione (blocco) di cache.
Totale numero di accessi alla cache dati = 258 elementi + 10 ripetizioni 108 elementi = 1338 accessi
Tempo di accesso alla cache dati = 1338 cicli clock + (5 + 10 2) miss 335 cicli clock = 9713 cicli clock