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 co-
municazione. Chiunque fosse trovato in possesso di documentazione relativa al corso – anche se non stret-
tamente attinente alle domande proposte – vedrà annullata la propria prova.
Tempo a disposizione 2 h : 00 m
Si deve tradurre in linguaggio macchina simbolico (assemblatore) MIPS il frammento di programma C ripor-
tato sotto. Il modello di memoria è quello standard MIPS e le variabili intere sono da 32 bit. Non si tenti
di accorpare od ottimizzare insieme istruzioni C indipendenti. Si facciano le ipotesi seguenti:
il registro “frame pointer” fp non è in uso
le variabili locali sono allocate nei registri, se possibile
vanno salvati (a cura del chiamante o del chiamato, secondo il caso) solo i registri necessari
Si chiede di svolgere i quattro punti seguenti (usando le varie tabelle predisposte nel seguito):
1. Si descriva il segmento dei dati statici dando gli spiazzamenti delle variabili globali rispetto al registro
global pointer gp, e si traducano in linguaggio macchina le dichiarazioni delle variabili globali.
2. Si descrivano l’area di attivazione della funzione const e l’allocazione delle variabili locali e dei parame-
tri di const nei registri.
3. Si traduca in linguaggio macchina il codice dello statement riquadrato nel prog. principale main.
4. Si traduca in linguaggio macchina il codice dell’intera funzione const (vedi tab. 4 strutturata).
spiazzamento
negativo ?
spiazzamento
positivo o
contenuto
rispetto a
simbolico
gp 0x 1000 8000
indirizzi
alti
NUM
INF
FUNCT [8199]
FUNCT [...]
indirizzi
FUNCT [0]
bassi
punto 1 – codice MIPS della sezione dichiarativa globale (numero di righe non significativo)
spiazz. rispetto
contenuto simbolico
a stack pointer
indirizzi alti
indirizzi bassi
punto 3 – codice MIPS degli statement riquadrati di MAIN – (numero di righe non significativo)
// num = 8200
DO: // idx--
// while (idx != 0)
.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
testo testo
dati dati
MAINEND FUNCTEND
MIN FILL
VECT ELEM
MAX
0040 0004 sw
0040 0014 sw
0040 0018 lw
0040 0020 lw
0040 0028 jr
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
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.
000000 100000
6 bit 5 bit 5 bit 5 bit 5 bit 6 bit
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 ID EX MEM
registro IF/ID registro ID/EX registro EX/MEM registro MEM/WB
.WB.MemtoReg .WB.MemtoReg .WB.MemtoReg
.M.MemWrite .M.MemWrite
.M.MemRead .M.MemRead
.M.Branch .M.Branch
.istruzione .(Rs)
.(Rt) .(Rt)
.Rt .R .R
.Rd
****************
.imm/offset esteso .ALU_out .ALU_out
segnali di altre unità funzionali (subito prima del fronte di SALITA del clock – CICLO 4)
Mem.indirizzo RegWrite
MemWrite RegDest
MemRead MemtoReg
segnali relativi al RF (subito prima del fronte di DISCESA interno al ciclo di clock – CICLO 5)
RF.RegLettura1 RF.DatoLetto1 RF.RegScrittura
ciclo di clock
1
2
3
4
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
tipo(i) di propagazio-
ne
ID / EX.Rs
segnali di ingresso all’unità di propagazione
ID / EX.Rt
EX / MEM.R
EX / MEM.RegWrite
MEM / WB.R
MEM / WB.RegWrite
MUX di propagazione
interessato
ingresso di selezione
segnali di uscita
di propagazione
MUX PA
dell’unità
ingresso di selezione
MUX PB
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) è asso-
ciato 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
SUB 0 0 1
AND 0 1 0
OR 0 1 1
SLT 1 0 0
LW 1 0 1
SW 1 1 0
BEQ 1 1 1
ALUSrc = _________________________________________________________________________
RegWrite = _________________________________________________________________________
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 = _________________________________________________________________________
= _________________________________________________________________________
= _________________________________________________________________________
= _________________________________________________________________________
= _________________________________________________________________________
= _________________________________________________________________________
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 =
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 ele-
menti dell’array e agli ultimi 8 elementi dell’array in un ciclo ripetuto 10 volte.