Sie sind auf Seite 1von 28

Lehrstuhl für Rechnerarchitektur & Parallele Systeme, Lehrstuhl für Design Automation

TUM School of Computation, Information and Technology


Technische Universität München

Hinweise zur Personalisierung:


• Ihre Prüfung wird bei der Anwesenheitskontrolle durch Aufkleben eines Codes persona-
Esolution lisiert.
• Dieser enthält lediglich eine fortlaufende Nummer, welche auch auf der Anwesenheits-
Sticker mit SRID hier einkleben
liste neben dem Unterschriftenfeld vermerkt ist.
• Diese wird als Pseudonym verwendet, um eine eindeutige Zuordnung Ihrer Prüfung zu
ermöglichen.

ag
Einführung in die Rechnerarchitektur
Klausur: IN0004 / Endterm Datum: Montag, 13. Februar 2023
Prüfer: Prof. Dr. Martin Schulz, Prof. Dr. Robert Wille Uhrzeit: 08:00 – 10:00

hl
sc
A1 A2 A3 A4 A5 A6 A7 A8 A9 A 10 A 11

I
or
II
sv

Bearbeitungshinweise
• Diese Klausur umfasst 28 Seiten mit insgesamt 11 Aufgaben.
Bitte kontrollieren Sie jetzt, dass Sie eine vollständige Angabe erhalten haben.
ng

• Die Gesamtpunktzahl in dieser Klausur beträgt 120 Punkte.


• Das Heraustrennen von Seiten aus der Prüfung ist untersagt.

• Als Hilfsmittel sind zugelassen:


su

– ein analoges Wörterbuch Deutsch ¡ Muttersprache ohne Anmerkungen


• Es werden nur solche Ergebnisse gewertet, bei denen der Lösungsweg erkennbar ist. Auch Text-
aufgaben sind grundsätzlich zu begründen, sofern es in der jeweiligen Teilaufgabe nicht ausdrücklich
anders vermerkt ist.

• Schreiben Sie weder mit roter / grüner Farbe noch mit Bleistift. Es darf kein Tipp-Ex benutzt werden!
Eingaben mit Bleistift werden nicht bewertet!
• Schalten Sie alle mitgeführten elektronischen Geräte vollständig aus, verstauen Sie diese in Ihrer
Tasche und verschließen Sie diese.

• Es ist kein Taschenrechner erlaubt.


• Es sind keine Merkblätter/Cheatsheets/selbstgebrachte Schmierpapiere erlaubt.

Hörsaal verlassen von bis / Vorzeitige Abgabe um

– Seite 1 / 28 –
1 Teil 1: Allgemeine Fragen
Aufgabe 1 Datenstrukturen (2 Punkte)

0 a) Auf welche für die Rechnerarchitektur zentrale Datenstruktur wird nach dem LIFO Prinzip zugegriffen?
1

Keller, Stack, Stapel

ag
0 b) Nennen Sie die zwei Operationen, mit denen üblicherweise auf einen LIFO Speicher zugegriffen werden
1 kann um Daten zu lesen & zu schreiben.

Push / Pop

hl
Aufgabe 2 Adressformen (4 Punkte)

sc
0 a) Wo liegen bei einer Maschine mit Nulladressform die Operanden?
1

Auf dem Stack


or
0 b) Nennen Sie ein Beispiel einer Machine mit Nulladressform:
sv

JAVA VM, IA-32 FP


ng

0 c) Erläutern Sie einen Vorteil einer Machine mit Dreiaddressform mit Speicher/Speicher-Modell:
1

Volle Flexibilität für ProgrammiererIn


su

0 d) Erläutern Sie einen Nachteil einer Machine mit Dreiaddressform mit Speicher/Speicher-Modell:
1

Komplexe ISA und/oder Implementierung, lange Befehle, lange Dekodierzeiten, viele Speicherzugriffe,

langsam

– Seite 2 / 28 –
2 Teil 2: x86 Architektur und Assembler
Aufgabe 3 Hangman (26 Punkte)
In dieser Aufgabe sollen die Bestandteile des Spiels „Hangman” entwickelt werden, bei dem Wörter erraten
werden müssen. Das Program nutzt Funktionen, die unabhängig voneinander entwickelt werden sollen. Das
Spiel wird nur mit den 26 Kleinbuchstaben des englischen Alphabets gespielt [a-z].
• find_char - um den Index des ersten Erscheinens eines Chars im String zu finden
– Eingabe 1: Char (in AL)
– Eingabe 2: nullterminierter String (in EDX)

ag
– Ausgabe: Index des ersten Erscheinens dieses Zeichens in dem String; sonst -1
• append_char - hängt den eingegebenen Charakter an das Ende des Strings
– Eingabe 1: Char (in AL)
– Eingabe 2: nullterminierter String (in EDX)

hl
• copy_letter_in - sucht mithilfe von find_char alle Indizes, an denen der Char im String vorkommt.
Setzt den Buchstaben an diesen Indizes im String auf das Zeichen.
– Eingabe 1: Char (in AL)

sc
– Eingabe 2: nullterminierter Quellstring (in ESI)
– Eingabe 2: nullterminierter Zielstring (in EDI)

a) Im ersten Teilproblem soll eine Funktion namens find_char entwickelt werden. Ihre Eingaben sind ein 0
or
Zeichen und ein null-terminierter String. Die Funktion gibt den Index des ersten Vorkommens dieses Zeichens 1
im String zurück oder -1, wenn das Zeichen nicht vorhanden ist. Verwenden Sie die vorgegebenen Labels: 2
3
• ENDLOOP_FAIL, wenn das Zeichen nicht gefunden wird, 4
5
sv

• ENDLOOP_FOUND, wenn das Zeichen gefunden wird. 6


7
Information zur Aufrufkonvention: Alle Register (exkl. Ausgaberegister) sollen nach dem Beenden der Routine 8
unverändert sein. Für die Ein- und Ausgabeparameter der Funktionen müssen die in den Kommentaren des 9
Codes angegebenen Register verwendet werden. 10
ng

; AUFGABE TEIL 1 ---------------------------------------------------------------


;find_char
; input: Char und nullterminierter String
; returns: Index des ersten Erscheinens dieses Zeichens in dem String; sonst -1
su

FIND_CHAR:
; AL: Buchstabe Eingabe
; EDX: String Pointer Eingabe
; ECX: Counter
; EAX: Ausgabe

push ECX
mov ECX, 0

LOOPHEAD_SEARCH:
;die Schleife für die Suche des Chars muss hier darunter sein

– Seite 3 / 28 –
cmp byte [EDX+ECX], 0
je ENDLOOP_FAIL
cmp byte [EDX+ECX], AL
je ENDLOOP_FOUND
inc ECX
jmp LOOPHEAD_SEARCH

ENDLOOP_FAIL:

ag
mov EAX, -1
pop ECX
ret

hl
ENDLOOP_FOUND:

mov EAX, ECX

sc
pop ECX
ret or
sv
ng
su

– Seite 4 / 28 –
b) Wir wollen die geratenen Buchstaben im Auge behalten. Zu diesem Zweck implementieren wir eine 0
Funktion namens append_char, die jedes Mal aufgerufen wird, wenn ein neuer Buchstabe getippt wird. Diese 1
Funktion nimmt das Zeichen und den null-terminierten String guessed als Eingabe und fügt den geratenen 2
Buchstaben an das Ende des Strings guessed an. String guessed muss nach dem Hinzufügen des Zeichens 3
4
wieder ein nullterminierter String sein. 5
Das eigentliche Anhängen des Buchstabens an den String muss nach dem Sprung auf ENDLOOP_APPEND 6
realisiert werden. Der Sprung sollte erfolgen, wenn der richtige Ort gefunden wird. 7

Information zur Aufrufkonvention: Alle Register sollen nach Beenden der Routine unverändert sein. Für die
Ein- und Ausgabeparameter der Funktionen müssen die in den Kommentaren des Codes angegebenen
Register verwendet werden.
Der Einfachheit halber gehen wir davon aus, dass genügend Speicherplatz vorhanden ist um beliebig viele

ag
Chars an das Ende des Strings hinzufügen zu können. Das heißt es muss kein Speicher neu alloziert
werden.

; AUFGABE TEIL 2 ---------------------------------------------------------------

hl
;append_char
; input: Char und nullterminierter String
; action: hängt den Charakter an das Ende des Strings an

sc
APPEND_CHAR:
; AL: Buchstabe Eingabe
; EDX: String Pointer Eingabe
or
push EDX
sv

LOOPHEAD_PLACING:
;die Schleife für das Finden der Stelle zum Hinzufügen des Chars muss hier sein.

cmp byte [EDX], 0


je ENDLOOP
ng

inc EDX
jmp LOOPHEAD_PLACING
su

– Seite 5 / 28 –
ENDLOOP_APPEND:

mov byte [EDX], AL


mov byte [EDX+1], 0
pop EDX
ret

ag
hl
sc
or
sv
ng
su

– Seite 6 / 28 –
c) Nachdem Buchstaben richtig erraten werden, wollen wir diese schön darstellen können und zwar in der 0
richtigen Position im String. Dazu nehmen wir einen String display, der genau so groß wie der Quellstring 1
ist, jedoch mit “_” Charaktern gefüllt. Nach jedem erfolgreichen Erraten wird der Charakter an allen entspre- 2
chenden Stellen, an denen es im Quellstring vorkommt, durch den richtigen Charakter ersetzt. 3
4
Zu diesem Zweck implementieren wir eine Funktion namens copy_letter_in, die jedes Mal aufgerufen wird, 5
wenn ein neuer Buchstabe richtig erraten wird. Diese Funktion nimmt den Charakter, den null-terminierten 6
String display und den Quellstring als Eingaben und ersetzt das “_” durch diesen Charakter an den 7
entsprechenden Stellen. 8
9

• Nach dem Einsetzen an allen Stellen sollte auf FINISHED gesprungen werden, wo gesicherte Werte
freigegeben werden sollen und das Fuktionsende implementiert werden soll.

ag
Information zur Aufrufkonvention: Alle Register sollen nach Beenden der Routine unverändert sein. Für die
Ein- und Ausgabeparameter der Funktionen müssen die in den Kommentaren des Codes angegebenen
Register verwendet werden.

hl
; AUFGABE TEIL 3 ---------------------------------------------------------------
;copy_letter_in

sc
; input: Char und null-terminierte Quell- und Zielstrings
; action: sucht alle Indizes, an denen das Zeichen in dem Quellstring vorkommt,
setzt den Buchstaben an diesen Indizes in dem Zielstring auf das Zeichen.

COPY_LETTER_IN:
; AL: Letter Eingabe
or
; ESI: String Pointer Eingabe Quellstring
; EDI: String Pointer Eingabe display

push EAX
sv

push EBX
push ECX
push EDX
mov BL, AL
mov ECX, 0
ng

LOOPHEAD:
;Hinweis: find_char muss benutzt werden
;Hinweis: achten Sie darauf, in welchen Registern die Eingangsargumente
; der find_char Funktion abgelegt werden
su

LEA EDX, [ESI+ECX]


MOV AL, BL
CALL FIND_CHAR

CMP EAX, -1
JE FINISHED
LEA EDX, [ECX + EAX]
MOV [EDI + EDX], BL
LEA ECX, [ECX + EAX + 1]
JMP LOOPHEAD

– Seite 7 / 28 –
FINISHED:

FINISHED:
pop EDX
pop ECX
pop EBX
pop EAX
ret

ag
hl
sc
or
sv
ng
su

– Seite 8 / 28 –
3 Teil 3: Caches und Parallelisierung
Aufgabe 4 Caching (23 Punkte)

a) Welche beiden Speicherzugriffsmuster helfen beim Caching von Daten? Beschreiben Sie diese knapp. 0
1
2
Räumliche Lokalität: Zugriff auf ein Datum erhöht Wahrscheinlichkeit auf Zugriff nahegelegener Daten.
Zeitliche Lokalität: Zugriff auf ein Datum erhöht Wahrscheinlichkeit auf Zugriff desselben Datums in
der Zukunft.

ag
hl
b) Was ist eine Miss-Penalty in Bezug auf Caching? 0
1

sc
Die zusätzlich von der Speicherhierarchie benötigte Antwortzeit, wenn ein Cache-Miss auftritt.
or
c) Wie ist die Hit-Rate definiert und welchen Wertebereich hat sie? 0
1
2
sv

Anzahl an Cache-Hits
Anzahl Speicherzugriffen

œ [0, 1]
ng

d) Was sagt die durchschnittliche Speicherzugriffszeit (Average Memory Access Time) aus? 0
Definieren sie die Speicherzugriffszeit zusätzlich Anhand von Hit/Miss-Raten und Latenzen. 1
2
su

Durchschnittlich benötigte Zeit, um auf Speicher zuzugreifen, pro Instruktion.

Average Memory Access Time = Hit-Rate ◊ Hit-Latency + Miss-Rate ◊ Miss-Latency


– Seite 9 / 28 –
Sie haben ein Programm mit 109 Instruktionen, dass auf einem 16-bit in-order Prozessor “MUC1” mit
einer Frequenz von 3 GHz läuft. Der Prozessor braucht durchschnittlich 3 Zyklen pro Instruktion (exklusive
Speicherzugriff) und pro Instruktion fallen durchschnittlich 1.5 Speicherzugriffe an. Es gibt einen 16B Cache
mit einer Latenz von 10 ns und Cachezeilenlänge 2 Byte. Der Arbeitsspeicher ist 2 GB groß und hat eine
Miss-Latenz von 50 ns. Messungen ergeben, dass der Cache beim Ausführen des Programms 3 ◊ 108 Hits
erzeugt.

0 e) Wie viel Zeitersparnis bringt die Verwendung des Caches?


1
2
3 ◊ 108 Hits, 50 ns ≠ 10 ns = 40 ns Ersparnis / Zugriff
3 ◊ 108 ú 40 ns = 12 s

ag
hl
sc
0 f) Berechnen Sie die durchschnittliche Speicherzugriffszeit (Average Memory Access Time).
1
2
3◊108 Hits
Speicherzugriffe = 20% Hit-Rate
1.5 Instruktion ◊109 Instruktionen
ns ns ns
20% ◊ 10 Zugriff + 80% ◊ 50 Zugriff = 42 Zugriff
or
sv

Folgende Formel lässt sich zur Berechnung der Ausführungszeit verwenden:


3 4
ng

CPI
CPU Time = IC ◊ + Memory Access Rate ◊ Average Memory Access Time
f

0 g) Wie ist die Gesamtausführungszeit des Programms?


1
2
su

1 2
= 109 ◊ 3◊3109 + 1.5 ◊ 42 ns
= 1 + 1.5 ◊ 42 = 64 s

– Seite 10 / 28 –
Den “MUC1” Prozessor gibt es jeweils in einer Ausführung mit Direct-Mapped Cache, einem 4-fach Assozia-
tivem Cache und einem Voll-Assoziativen Cache.

h) An wie vielen Stellen im jeweiligen Cache kann die Addresse 0x08 auftauchen? 0
1
2

Direct Mapped 4-fach Assoziativ Voll-Assoziativ

1 4 8

für Direct Mapped und Voll-Assoziativ richtig, für 4-fach assoziativ.

ag
i) Wie viele Bits werden jeweils für Tag, Index und Offset Benötigt? 0
1
2
3
Direct Mapped 4-fach Assoziativ Voll-Assoziativ

hl
Tag 12 14 15

sc
Index 3 1 0

Offset 1 1 1
or
Je für Direct Mapped, 4-fach Assoziativ und Voll-Assoziativ richtig.
Nennen Sie jeweils einen Vorteil und einen Nachteil für jede Bauart.
sv

j) Direct Mapped: 0
1

Einfache Suche/Billig aber Unflexibel


ng

k) n-Fach Assoziativ: 0
1
su

Kompromiss Flexibilität/Kosten aber Indexberechnung notwendig


l) Vollassoziativ: 0
1

Sehr flexibel aber suche langsam/teuer

– Seite 11 / 28 –
0 m) Nennen sie 2 Cacheersetzungsstrategien und beschreiben sie jeweils einen Nachteil.
1
2
Je für Nennung, für Nachteil
Random: Keine Berücksichtigung von Lokalität
FIFO: Keine Berücksichtung von Nutzungsfrequenz
LFU: Neue Blöcke werden bevorzugt eliminiert
...

ag
hl
sc
or
sv
ng
su

– Seite 12 / 28 –
Aufgabe 5 Amdahl’s Gesetz (5 Punkte)
Gehen Sie in der folgenden Aufgabe von idealer Parallelisierung aus (keine Overheads).
Sie haben ein Programm, dass auf dem 2-core Supercomputer MUC2Duo 6 Sekunden Ausführungszeit hat.
Sie lassen dasselbe Programm auf dem neueren 4-core iMUC laufen und messen eine Ausführungszeit von
5 Sekunden.

a) Welcher Prozentsatz des Programms ist parallelisiert? 0


1
2
tp 3
6 = ts +
2
tp

ag
5 = ts +
4
tp
1=
4
4 = tp

hl
4
6 = ts +
2
ts = 4

sc
or p = 0.5

b) Wie schnell würde dieses Problem auf dem 1-core SteinzeitMUC laufen? 0
1

tp 4
sv

t = ts + =4+
1 1

t =8
ng
su

c) Wie schnell würde dieses Problem auf dem Œ-core HyperMUC laufen? 0
1

4
4+ = 4s = t
Œ

– Seite 13 / 28 –
4 Teil 4: Schaltungsentwurf und RISC-V Architektur
Aufgabe 6 Wahrheitstabelle (7 Punkte)

0 Prüfen oder widerlegen Sie die folgende Aussage mittels einer Wahrheitstabelle.
1
2 (a+c )·b =(b +c )+a
3
4
5
6
7
a b c a+c (a+c ) (a + c) · b b +c (b +c )+a (b + c) + a

ag
0 0 0 1 0 0 1 1 0
0 0 1 1 0 0 1 1 0
0 1 0 1 0 0 0 1 0
0 1 1 1 0 0 1 1 0
1 0 0 0 1 0 1 1 0

hl
1 0 1 1 0 0 1 1 0
1 1 0 0 1 1 0 0 1
1 1 1 1 0 0 1 1 0

sc
or
sv
ng
su

– Seite 14 / 28 –
Aufgabe 7 Wellenformen (5 Punkte)

Die folgende Wellenform zeigt die beiden Eingänge (D und Clk ) eines negativ flankengesteuerten D-Flipflops. 0
Vervollständigen Sie die folgende Wellenform. 1
Es sind zwei Kopien der selben Wellenform angegeben falls Sie einen Fehler ausbessern wollen. Geben Sie 2
daher explizit an welche Wellenform korrigiert werden soll. 3
4
5

ag
hl
sc
or
sv
ng
su

Lösung:

– Seite 15 / 28 –
Aufgabe 8 Single-Cycle RISC-V Prozessor (15 Punkte)
Betrachten Sie das Schaltbild des single-cycle RISC-V Prozessors in Abbildung 8.1.

0 a) Vervollständigen Sie die Belegung der Kontrollsignale des Steuerwerks für die angegebenen Befehle in
1 der untenstehenden Tabelle. Geben Sie don’t cares explizit mit X an. Es ist ausreichend bei ALUControl die
2 Funktion (ADD, SUB, ...) anzugeben. Nehmen Sie weiterhin an, dass das Extend-Bauteil wie folgt gesteuert
3 wird:
4
5 Befehlstyp ImmSrc
I 00
S 01
B 10

ag
J 11
Eine Befehlsreferenz für RISC-V Befehle finden Sie in Abbildung 8.4 auf Seite 19.

Befehl Branch Jump ResultSrc MemWrite ALUControl ALUSrc ImmSrc RegWrite

hl
ORI

BEQ

sc
SUB

LW
or
JAL

Lösung:
sv

Befehl Branch Jump ResultSrc MemWrite ALUControl ALUSrc ImmSrc RegWrite

ORI 0 0 00 0 OR 1 00 1

BEQ 1 0 XX 0 SUB 0 10 0
ng

SUB 0 0 00 0 SUB 0 XX 1

LW 0 0 01 0 ADD 1 00 1

JAL X 1 10 0 XXX X 11 1
su

0 b) Der Instruktionssatz des Prozessor soll um den Befehl blt (branch if less than) erweitert werden. Der Befehl
1 blt rs1, rs2, imm vergleicht zwei Register rs1, rs2 und führt einen Sprung aus falls rs1 < rs2. Die Sprung-
2 adresse berechnet sich aus dem Vorzeichenerweiterten Immediate und dem PC als PC + signext(imm).
3 Erweitern Sie den Datenpfad des Prozessors mit möglichst wenig Logik, sodass der Befehl blt unterstützt

4
5
wird. Tragen Sie auch die Werte aller Kontrollsignale des Steuerwerks an die entsprechenden Signale im
6 Schaltbild ein. Geben Sie don’t cares explizit mit X an.
7 Nehmen Sie an, dass die ALU die folgenden Befehle unterstützt:
8
9
ALUControl Instruction
10
000 (Add) ALUResult = SrcA + SrcB
001 (Sub) ALUResult = SrcA - SrcB
101 (Set Less Than) ALUResult = 1 if SrcA < SrcB else ALUResult = 0
011 (Or) ALUResult = SrcA ‚ SrcB (Bitweises Oder)
010 (And) ALUResult = SrcA · SrcB (Bitweises Und)
Es sind zwei Kopien des Prozessors beigelegt, falls Sie einen Fehler ausbessern wollen. Geben Sie daher
explizit an welches Schaltbild korrigiert werden soll.

– Seite 16 / 28 –

s
un
gs
– Seite 17 / 28 –

vo
rs
ch
la
g
Abbildung 8.1: Schaltbild des Single-Cycle RISC-V Prozessors

s
un
gs
– Seite 18 / 28 –

vo
rs
ch
la
Abbildung 8.2: Kopie des Schaltbilds des Single-Cycle RISC-V Prozessors

g

s
un
gs
– Seite 19 / 28 –

vo
rs
ch
la
g
Abbildung 8.3: Single-Cycle RISC-V Prozessor erweitert um BLT
RISC-V Instruction Set Summary
31:25 24:20 19:15 14:12 11:7 6:0 • imm: signed immediate in imm11:0
funct7 rs2 rs1 funct3 rd op R-Type • uimm: 5-bit unsigned immediate in imm4:0
imm11:0 rs1 funct3 rd op • upimm: 20 upper bits of a 32-bit immediate, in imm31:12
I-Type
• Address: memory address: rs1 + SignExt(imm11:0)
imm11:5 rs2 rs1 funct3 imm4:0 op S-Type
• [Address]: data at memory location Address

ag
imm12,10:5 rs2 rs1 funct3 imm4:1,11 op B-Type • BTA: branch target address: PC + SignExt({imm12:1, 1'b0})
imm31:12 rd op U-Type • JTA: jump target address: PC + SignExt({imm20:1, 1'b0})
imm20,10:1,11,19:12 rd op J-Type • label: text indicating instruction address
fs3 funct2 fs2 fs1 funct3 fd op R4-Type • SignExt: value sign-extended to 32 bits
5 bits 2 bits 5 bits 5 bits 3 bits 5 bits 7 bits • ZeroExt: value zero-extended to 32 bits
• csr: control and status register
Figure B.1 RISC-V 32-bit instruction formats

hl
Table B.1 RV32I: RISC-V integer instructions
op funct3 funct7 Type Instruction Description Operation
0000011 (3) 000 – I lb rd, imm(rs1) load byte rd = SignExt([Address]7:0)
0000011 (3) 001 – I lh rd, imm(rs1) load half rd = SignExt([Address]15:0)

sc
0000011 (3) 010 – I lw rd, imm(rs1) load word rd = [Address]31:0
0000011 (3) 100 – I lbu rd, imm(rs1) load byte unsigned rd = ZeroExt([Address]7:0)
0000011 (3) 101 – I lhu rd, imm(rs1) load half unsigned rd = ZeroExt([Address]15:0)
0010011 (19) 000 – I addi rd, rs1, imm add immediate rd = rs1 + SignExt(imm)
0010011 (19) 001 0000000* I slli rd, rs1, uimm shift left logical immediate rd = rs1 << uimm
0010011 (19) 010 – I slti rd, rs1, imm set less than immediate rd = (rs1 < SignExt(imm))
or
0010011 (19) 011 – I sltiu rd, rs1, imm set less than imm. unsigned rd = (rs1 < SignExt(imm))
0010011 (19) 100 – I xori rd, rs1, imm xor immediate rd = rs1 ^ SignExt(imm)
0010011 (19) 101 0000000* I srli rd, rs1, uimm shift right logical immediate rd = rs1 >> uimm
0010011 (19) 101 0100000* I srai rd, rs1, uimm shift right arithmetic imm. rd = rs1 >>> uimm
0010011 (19) 110 – I ori rd, rs1, imm or immediate rd = rs1 | SignExt(imm)
sv
0010011 (19) 111 – I andi rd, rs1, imm and immediate rd = rs1 & SignExt(imm)
0010111 (23) – – U auipc rd, upimm add upper immediate to PC rd = {upimm, 12'b0} + PC
0100011 (35) 000 – S sb rs2, imm(rs1) store byte [Address]7:0 = rs27:0
0100011 (35) 001 – S sh rs2, imm(rs1) store half [Address]15:0 = rs215:0
0100011 (35) 010 – S sw rs2, imm(rs1) store word [Address]31:0 = rs2
0110011 (51) 000 0000000 R add rd, rs1, rs2 add rd = rs1 + rs2
ng

0110011 (51) 000 0100000 R sub rd, rs1, rs2 sub rd = rs1 — rs2
0110011 (51) 001 0000000 R sll rd, rs1, rs2 shift left logical rd = rs1 << rs24:0
0110011 (51) 010 0000000 R slt rd, rs1, rs2 set less than rd = (rs1 < rs2)
0110011 (51) 011 0000000 R sltu rd, rs1, rs2 set less than unsigned rd = (rs1 < rs2)
0110011 (51) 100 0000000 R xor rd, rs1, rs2 xor rd = rs1 ^ rs2
0110011 (51) 101 0000000 R srl rd, rs1, rs2 shift right logical rd = rs1 >> rs24:0
0110011 (51) 101 0100000 R sra rd, rs1, rs2 shift right arithmetic rd = rs1 >>> rs24:0
su

0110011 (51) 110 0000000 R or rd, rs1, rs2 or rd = rs1 | rs2


0110011 (51) 111 0000000 R and rd, rs1, rs2 and rd = rs1 & rs2
0110111 (55) – – U lui rd, upimm load upper immediate rd = {upimm, 12’b0}
1100011 (99) 000 – B beq rs1, rs2, label branch if = if (rs1 == rs2) PC = BTA
1100011 (99) 001 – B bne rs1, rs2, label branch if ≠ if (rs1 ≠ rs2) PC = BTA
1100011 (99) 100 – B blt rs1, rs2, label branch if < if (rs1 < rs2) PC = BTA

1100011 (99) 101 – B bge rs1, rs2, label branch if ≥ if (rs1 ≥ rs2) PC = BTA
1100011 (99) 110 – B bltu rs1, rs2, label branch if < unsigned if (rs1 < rs2) PC = BTA
1100011 (99) 111 – B bgeu rs1, rs2, label branch if ≥ unsigned if (rs1 ≥ rs2) PC = BTA
1100111 (103) 000 – I jalr rd, rs1, imm jump and link register PC = rs1 + SignExt(imm), rd = PC + 4
1101111 (111) – – J jal rd, label jump and link PC = JTA, rd = PC + 4
*
Encoded in instr31:25, the upper seven bits of the immediate field

Abbildung 8.4: RISC-V Befehlsreferenz

– Seite 20 / 28 –
Aufgabe 9 Pipelinekonflikte (15 Punkte)
Gegeben ist der RISC-V Prozessor mit fünfstufiger Pipeline (fetch, decode, execute, memory, writeback ) aus
Abbildung 9.1. Wird ein Register von einem Befehl geschrieben, so ist der geschriebene Wert erst nach der
writeback Stufe verfügbar. Sprünge werden in der execute Stufe getätigt.
Auf dem Prozessor wird folgendes Programmfragment ausgeführt:
s1: add t4, t2, t1
s2: andi t3, t2, 4
s3: sub t4, t1, t5
s4: addi t1, t3, 15
s5: xor t2, t4, t3
s6: sw t1, 5(t3)

ag
s7: lw t2, 0(t1)

a) Geben Sie alle Datenabhängigkeiten im Programm an, die den Befehl s5 betreffen und klassifizieren Sie 0
diese entsprechend. Nutzen Sie dafür die folgende Tabelle. 1
2

hl
Art der Abhängigkeit Betroffene Befehle Betroffenes Register 3
4
5

sc
or
• WAR s5, s1 (Register t2)
• WAR s5, s2 (Register t2)
sv

• RAW s5, s3 (Register t4)


• RAW s5, s1 (Register t4)
• RAW s5, s2 (Register t3)
ng

• WAW s7, s5 (Register t2)

b) Finden und erläutern Sie alle Pipeline-Konflikte des Programms. 0


Geben Sie auftretende Konflikte nach folgendem Schema an: „Data Hazard in Zeitschritt ___ zwischen ___ 1
und ___. ___ wird in ___ gelesen, aber ___ wurde von ___ noch nicht geschrieben.“ 2
su

Hinweis: Um Ihnen Zeit zu ersparen, ist die Satzvorlage hier ein paar mal abgedruckt. Die Anzahl der 3
4
abgedruckten Vorlagen hat keinen Zusammenhang mit der Anzahl der Konflikte. 5
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___ 6
noch nicht geschrieben. 7
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___ 8

noch nicht geschrieben. 9


10
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.

– Seite 21 / 28 –
Data Hazard in Zeitschritt ___ zwischen ___ und ___. ___ wird in ___ gelesen, aber ___ wurde von ___
noch nicht geschrieben.
Hinweis: Die untenstehende Tabelle kann bei der Bearbeitung der Aufgabe zu Hilfe gezogen werden (sie
fließt nicht in die Benotung mit ein).

Zeitschritt F D E M W

1 s1

ag
4

hl
6

sc
8

10
or
11

12
sv

13

14

15
ng

16

• Data Hazard in Zeitschritt 5 zwischen s2 und s4. t3 wird in s4 gelesen, aber t3 wurde von s2 noch
nicht geschrieben.
su

• Data Hazard in Zeitschritt 6 zwischen s2 und s5. t3 wird in s5 gelesen, aber t3 wurde von s2 noch
nicht geschrieben.
• Data Hazard in Zeitschritt 6 zwischen s3 und s5. t4 wird in s5 gelesen, aber t4 wurde von s3 noch
nicht geschrieben.

• Data Hazard in Zeitschritt 7 zwischen s4 und s6. t1 wird in s6 gelesen, aber t1 wurde von s4 noch
nicht geschrieben.
• Data Hazard in Zeitschritt 8 zwischen s4 und s7. t1 wird in s7 gelesen, aber t1 wurde von s4 noch
nicht geschrieben.

– Seite 22 / 28 –

s
un
gs
– Seite 23 / 28 –

vo
rs
ch
Abbildung 9.1: Schaltbild des pipelined RISC-V Prozessors

la
g
Aufgabe 10 Logikminimierung (10 Punkte)

Betrachten Sie die folgende Boolsche Funktion:

f (a, b, c, d) = ā b̄ c̄ d̄ + ā b̄cd + ā b̄c d̄ + ābcd + ab c̄d + abcd + abc d̄ + a b̄ c̄ d̄ + a b̄cd + a b̄c d̄

0 a) Bestimmen Sie alle Primimplikanten von f mit einer der in der Vorlesung vorgestellten Methoden.
1
2 Lösung mit K-Maps:
3 a1 a0

ag
4 a3 a2
00 01 11 10
5
6 00 1 0 1 1
7
01 0 0 1 0

hl
11 0 1 1 1

10 1 0 1 1
Lösung mit Quine-McCluskey

sc
MT a b c d X MT a b c d X MT a b c d X
0 0 0 0 0 X 0, 2 0 0 - 0 X 0, 2, 8, 10 - 0 - 0
0, 8 - 0 0 0 X
2 0 0 1 0 X 2, 3, 10, 11 - 0 1 -
8 1 0 0 0 X 2, 3 0 0 1 - X 3, 7, 11, 15 - - 1 1
or
2, 10 - 0 1 0 X
3 0 0 1 1 X 10, 11, 14, 15 1 - 1 -
8, 10 1 0 - 0 X
10 1 0 1 0 X
3, 7 0 - 1 1 X
7 0 1 1 1 X
3, 11 - 0 1 1 X
sv

11 1 0 1 1 X
10, 11 1 0 1 - X
13 1 1 0 1 X
10, 14 1 - 1 0 X
14 1 1 1 0 X
7, 15 - 1 1 1 X
15 1 1 1 1 X
11, 15 1 - 1 1 X
13, 15 1 1 - 1
ng

14, 15 1 1 1 - X
su

– Seite 24 / 28 –
Primimplikantentafel:

Primimplikant a b c d 0 2 3 7 8 10 11 13 14 15 Essentiell?
0, 2, 8, 10 - 0 - 0 x x x x X
2, 3, 10, 11 - 0 1 - x x x x
3, 7, 11, 15 - - 1 1 x x x x X
10, 11, 14, 15 1 - 1 - x x x x X
13, 15 1 1 - 1 x x X
Primimplikanten: cd , ac , abd , b̄ d̄ , b̄c

ag
hl
sc
or
b) Geben Sie ein Minimalpolynom für f an. 0
1
sv

2
f (a, b, c, d) = cd + ac + abd + b̄ d̄ 3
ng
su

– Seite 25 / 28 –
Aufgabe 11 Binäre Entscheidungsdiagramme (8 Punkte)

0 Konstruieren Sie mit Hilfe der Shannon-Zerlegung zu der Funktion


1
2 f (x1 , x2 , x3 ) = (x1 · x2 + x̄1 · x̄2 ) · x3 + x̄1 · x3
3
4 das reduzierte, geordnete Entscheidungsdiagramm mit der Variablenordnung x2 < x1 < x3 . Geben Sie dabei
5 zu jedem Knoten die entsprechenden Kofaktoren an.
6
7
8
(x1 · x2 + x̄1 · x̄2 ) · x3 + x̄1 · x3

ag
x2

x̄1 x3

x1

x3

hl
x3

sc
0 1

Da der Fehler vermutlich des öfteren gemacht wird, hier die Musterlösung für den BDD mit Variablen-
ordnung x1 < x2 < x3 . Falls hier alles korrekt ist, werden trotzdem 6 Punkte vergeben.
or
(x1 · x2 + x̄1 · x̄2 ) · x3 + x̄1 · x3

x1
sv

x2 x3

x2

x3
ng

x3

0 1
su

– Seite 26 / 28 –
Zusätzlicher Platz für Lösungen. Markieren Sie deutlich die Zuordnung zur jeweiligen Teilaufgabe.
Vergessen Sie nicht, ungültige Lösungen zu streichen.

ag
hl
sc
or
sv
ng
su

– Seite 27 / 28 –
ag
hl
sc
or
sv
ng
su

– Seite 28 / 28 –

Das könnte Ihnen auch gefallen