# Ćwiczenia 5, grupa śr. 10-12, 29 marca 2023
###### tags: `SYK23` `ćwiczenia` `pwit`
## Deklaracje
Gotowość rozwiązania zadania należy wyrazić poprzez postawienie X w odpowiedniej kolumnie! Jeśli pożądasz zreferować dane zadanie (co najwyżej jedno!) w trakcie dyskusji oznacz je znakiem ==X== na żółtym tle.
**UWAGA: Tabelkę wolno edytować tylko wtedy, gdy jest na zielonym tle!**
:::danger
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| ----------------------:| ----- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
Mateusz Biłyk | | | | | | | | | | | |
Mikołaj Dworszczak | | | | | | | | | | | |
Kacper Jóźwiak | X | X | X | X | X | | | X | | | |
Dominik Kiełbowicz | X | X | X | X | X | X | X | X | | | |
Michał Kolasa | | | | | | | | | | | |
Konrad Kowalczyk | X | X | X | X | X | | | X | | | |
Oskar Kropielnicki | X | X | X | X | X | X | X | X | | | |
Anna Krysta | X | X | X | X | X | X | X | X | X | X | X |
Jakub Krzyżowski | X | X | X | X | | | | | | | |
Oskar Kubkowski | ==X== | X | X | X | X | X | X | X | X | X | |
Patryk Maciąg | | | | | | | | | | | |
Mateusz Mazur | X | X | X | X | X | ==X== | X | X | X | X | X |
Barbara Moczulska | X | X | X | X | X | X | X | X | | | |
Kacper Sojda | X | X | ==X== | X | X | X | X | X | X | X | |
Marta Strzelec | X | ==X== | X | X |X | X | X | X | | X | |
Mikołaj Swoboda | X | X | X | X | X | | | X | | X | |
Filip Szczepański | X | X | X | X | X | X | | X | | X | |
Julian Włodarek | X | X | X | X | X | X | | X | | X | |
Beata Łakoma | x | x | x | x | x | x | x | x | | x | |
Michał Łukasik | X | X | X | X | X | X | X | X | X | X | X |
:::
:::info
**Uwaga:** Po rozwiązaniu zadania należy zmienić kolor nagłówka na zielony.
:::
## Zadanie 1
:::success
Autor: Oskar Kubkowski
:::


1. Z licznika rozkazów pobieramy numer aktualnego rozkazu, który chcemy wykonać
2. W Instruction Memory wyszukujemy instrukcję z pamięci i rozbieramy ją na części
3. Control Unit wybiera odpowiednią wartość dla ALUControl i RegWrite (wybiera dla wszystkich odpowiednie)
4. W Register File wyszukujemy wartość rejestru y, która dostaniemy na wyjściu w $RD1$
5. W Sign Extend rozsmarowujemy bit znaku stałej imm, tak żeby miała tyle samo bitów co wartość w rejestrze y
6. w ALU wykonujemy dodawanie wartości y i imm
7. W Data Memory pobieramy wartość zapisaną w rejestrze y+imm
8. W Register File zapisujemy wartość y+imm(WD3) do rejestru x(A3)
9. By przejść do następnej instrukcji zwiększamy licznik rozkazu o 4 (PCPlus4)
## Zadanie 2
:::success
Autor: Marta Strzelec
:::


Zmiana z poprzednim zadaniem:
WriteData, która odczytuje nam wartośc rejestru X.
MemWrite ustawione na 1,
1. Dostajemy numer instrukcji zapisany w liczniku rozkazów.
Następnie w Instruction Memory dostajemy odpowiednią instrukcję.
2. Do Register File wchodzi X na wejściu A1, Y na wejściu A2.
3. Rozszerzamy stałą imm, aby mogła zostać dodana do 32-bitowego rejestru
4. Jednostka arytmetyczno-logiczna wykonuje odpowiednią operację, która została przekazana przez linię sterującą (ALUControl). W tym przypadku jest to dodawanie. Otrzymaliśmy adres, który podajemy do Data Memory
5. Dostajemy odpowiedni sygnal z Control Unit (MemWrite ustawione na 1). W Data Memory zapisujemy pod adresem (x+imm) wartość Y.
6. Aby przejść do następnej instrukcji, zwiększamy licznik rozkazów.
## Zadanie 3
:::success
Autor: Kacper Sojda
:::


## Zadanie 4
:::success
Autor: Kacper Jóźwiak
:::

Po przetworzeniu wartości L, dodajemy ją do bieżącej wartości licznika
rozkazu PC, a wartości x, y dodajemy do przetworzenia przez ALU.
Następnie rozpatrujemy przypadki:
* relacja $x$ relop $y$ jest prawdą -> wysyłamy do MUX, znajdującego się przed zegarem,
sygnał, aby przejść do wskazanego adresu PC + L,
* jest fałszem -> używamy adresu PC + 4.
## Zadanie 5
:::success
Autor: Konrad Kowalczyk
:::

a) x = y binop imm
nie ma potrzeby rozszerzania procesora o nowe elementy, wystarczy jedynie odpowiednio dostosować ścieżkę

b) goto L
potrzebne będą dodatkowo:
- magistrala wykonująca przesunięcie bitowe o 2 miejsca (mnożąca przez 4)
- multiplekser do wyrzucania odpowiedniej wartości, jeśli nastąpił lub nie nastąpił skok bezwarunkowy
- dodatkowa linia z układu kontrolnego wysyłająca odpowiedni sygnał do wspomnianego multipleksera

## Zadanie 6
:::success
Autor: Dominik Kiełbowicz
:::
a) PC + MEM + REG + ALU + MEM + MUL + REG = 50 + 250 + 150 + 200 + 250 + 25 + 150 = 1075
b) PC + MEM + REG + ALU + MEM = 50 + 250 + 150 + 200 + 250 = 900
c) PC + MEM + REG + MUL + ALU + MUL + REG = 50 + 250 + 150 + 25 + 200 + 25 + 150 = 850
d) PC + MEM + REG + MUL + ALU + MUL = 50 + 250 + 150 + 25 + 200 + 25 = 700
e) PC + MEM + REG + ALU + MUL + REG = 50 + 250 + 150 + 200 + 25 + 150 = 825
f) PC + MEM + CTRL + MUL = 50 + 250 + 50 + 25 = 375
Cykl musi trwać co najmniej tyle ile najdłuższa ścieżka, a więc 1075ps.
## Zadanie 7
:::success
Autor: Oskar Kropielnicki
:::

$$(25\% \times t_{\text{x=*(y+imm)}} + 11\% \times t_{\text{*(x+imm)=y}} + 12\% \times t_{\text{if x relop goto L}} + 52\% \times t_{\text{x=y binop z}}) = \\
(25\% \times 1075 + 11\% \times 900 + 12\% \times 700 + 52\% \times 850) = \\
= 268.75 + 99 + 84 + 442 = 893.75 \text{ps}$$
$$1 - \frac{893.75\text{ps}}{1075\text{ps}} \approx 1 - 83.13\% = 16.87\%$$
## Zadanie 8
:::success
Autor: Barbara Moczulska
:::


Podobne do zadania 1.
- PC - adres -> pamięć instrukcji -> pobranie instrukcji
- przekazanie rejestru y do odczytu A1 w Register File
- przekazanie rejestru z do odczytu A2 w Register File
- W ALU wartości y i z są zsumowane
- wynik trafia do Data Memory jest w trybie odczytu z parametrem WE = 0 (MemWrite)
- dane z adresu A trafiają do Register File (WE3 = 1 = RegWrite) pod rejestr A3 czyli x gdzie zostanie zapisane
- obliczenie adresu następnej instrukcji czyli dodanie 4 bajtów
## Zadanie 9
:::success
Autor: Mateusz Mazur
:::

Możemy zapisać tylko 1 rejestr jednocześnie, a chcemy 2.
Zatem na wejściu musimy znać 2 adresy rejestrów x, y oraz ich wartości "x","y" do zamiany. Następnie korzystamy z 2 dodatkowych rejestrów x2, który na wejściu dostaje wartość zwracaną przez y, oraz y2 z wartością z x. Na koniec zwracamy wartości rejestrów x2 ("y") oraz y2 ("x").
## Zadanie 10
:::success
Autor: Filip Szczepański
:::


## Zadanie 11
:::success
Autor: Michał Łukasik
:::

Obliczmy czas:
x=\*y
50 + 250 + 150 + 250 + 25 + 150 = 875ps
PC + mem + reg + mem + mux + reg
\*x=y
50 + 250 + 150 + 250 = 700ps
PC + mem + reg + mem
wtedy długość cyklu to najdłuższa operacja - 875ps
ale x=\*(y+imm) oraz \*(x+imm)=y trwają 875ps + 875ps = 1750ps
tak jak w zadaniu 7, zakładając długość cyklu równą długości instrukcji, dla tego programu wystarczy obliczyć średnią
x=*(y+imm) => 850ps + 875ps = 1725ps
*(x+imm)=y => 850ps + 700ps = 1550ps
25% * 1725ps + 11% * 1550ps + 12% * 725ps + 52% * 850ps = 1130,75ps
wtedy można obliczyć spowolnienie
1130,75ps / 1075ps ≈ 105%
program spowolni o około 5%