# SYK 5
## Zad 1

1. Adres PC przechodzi do Instruction Memory. Odczytywana jest instrukcja o adresie PC z pamięci. Poniżej zostaje dodane 4 do PC (instrukcje zapisane są na 4 bajtach).
2. W Instruction Memory instrukcja zostaje odczytana - rejestry x, y trafiają do Register File, stała Imm do Sign Extend, a informacje o instrukcji do Control Unit.
3. W Register File wyciągnięta zostaje wartość z rejestru y i przekazana do ALU, wartość stałej Imm przez multiplekser również trafia do ALU.
4. Wyliczony adres w pamięci RAM oraz informacje z Control Unit trafiają do Data Memory, gdzie następuje odczyt wartości z pamięci RAM.
5. Odczytana wartość zostaje zapisana w rejestrze x.
## Zad 2
*(x +imm) = y


## Zad 3
x = y binop z


## Zad 4
$if\ x\ relop\ y\ goto\ L$


## Zad 4

Adres PC przechodzi do Instruction memory
Odczytywana jest instrukcja o adresie PC z pamięci
Poniżej zostaje dodane 4 do PC (instrukcje są zapisane na 4 bajtach)
Control unit dostaje relop'a, register file dostaje
adresy "x" oraz "y"
L zostaje przekazany do sign extend
Instrukcje są zapisane na 4 bajtach, więc L jest mnożone razy 4 (przesuwane o 2 bity w lewo)
L jest dodawane z PC, wynik dodawania przekazywany jest do multipleksera, który decyduje, czy wykonujemy skok, czy nie
Przekazane "x" i "y" są odczytywane z rejestru procesora w register file i dostajemy na wyjściu x, y
Za pomocą odczytanego przez control unit relop'a
Następnie w ALU wykonane zostaje x relop y
Wynik tego porównania jest łączony w bramce AND z informacją o tym, że jest to instrukcja skoku warunkowego i przekazywany to multipleksera, który decyduje o nowej wartości licznika rozkazów
## Zad 5
Zgodnie ze wskazówką w obu przykładach korzystam z procesora ze slajdu 27
### a) x = y binop imm, gdzie x i y są rejestrami a imm stałą
Widzimy analogię do zadania 3, nie będę więc omawiać pełnej ścieżki przepływu danych a jedynie różnicę w stosunku do zadania 3.

Zmiany zaczynają się przy destrukturyzacji instrukcji. Przekazujemy stałą `imm` do ***Sigm Extend***, która następnie trafia do multipleksera widocznego na schemacie po prawej strony od ***Register File***. Aby przekazana doń wartość (na "przewodzie" 1) została spropagowana dalej do bloczku ***ALU*** musimy zapewnić, że układ sterujący wskaże (za pomocą ALUSrc = 1) multiplekserowi, że tą właśnie wartość musi przekazać dalej. Dzieje się to również na etapie destrukturyzacji instrukcji (patrz - błękitna ścieżka po lewej strony układu sterującego).
W tym przykładzie nie musieliśmy jeszcze korzystać z rzadnych nowych ścieżek zaoferowanych przez rozszerzenie procesora. Przepływ danych poza fragmentem układu omówionym powyżej odbywa się analogicznie jak zostało zaprezentowane z zadaniu 3.
### b) goto L, gdzie L jest adresem w pamięci. Instrukcja wykona skok do adresu L

Rozpocznijmy analizę od czarnej strzałki o etykiecie "start". Następuje odczyt instrukcji z właściwej sekcji pamięci. Potem przekazujemy układowi sterującemu informację, aby "ustawił" zmienną start na wartość 1 (tj. żeby przekazał odpowiednią wartość do multipleksera położonego po lewej stronie schematu, jako drugi od granicy). Jednocześnie (niezależnie) kontynuujemy analizę dla dolnej części rysunku. Przekazujemy wartość etykiety L do bloczku `<<2` - pomnoży jej wartość przez 4, aby reprezentować jej adres (zgodnie z założeniami o 4-bitowości rozmiarów instrukcji naszego układu sterującego). Wartość etykiety następnie zostanie przekazana do opisywanego wyżej multipleksera, ten zaś (na bazie analizy górnej części schematu) - wiemy że spropaguje ją dalej. Tym samym w następnym cyklu procesora "znajdziemy" się w miejscu programu oznaczonym etykietą "L" - dokładnie tak jak byśmy oczekiwali.
## Zad 6
### a


Najdłuższa ścieżka:
PC + Instruction Memory + Register File + ALU + Data Memory + MUX + Register File =
50 + 250 + 150 + 200 + 250 + 25 + 150 = **1075 ps**
### b

Opóźnienie: **850ps**
Najdłuższa ścieżka
PC + Instruction Memory + Register File + ALU + DataMemory
50ps + 250ps + 150ps + 200 ps + 200 ps = **850ps**
!!!
Data Memory ma 250, będzie chyba [zmienić też w 7]
PC + Instruction Memory + Register File + ALU + DataMemory
50ps + 250ps + 150ps + 200 ps + 250 ps = **900ps**
### c

Najdłuższa ścieżka
PC + Instruction Memory + Register File + MUX + ALU + DataMemory + MUX
50ps + 250ps + 150ps + 25ps + 200 ps + 25ps + 200 ps = **950ps**
### d

Opóźnienie: **750ps**
### e

Opóźnienie: **825ps**
### f

Opóźnienie: **375ps**
Najmniejszy f? 375?
# Zad 7

Czas dla $[ x = *(y+ imm) ] = 1075ps$
Czas dla $[ *(x +imm) = y ] = 850ps$
Czas dla $[ if\ x\ relop\ y\ goto\ L ] = 750ps$
Czas dla $[ x = y\ binop\ z ] = 950ps$
Maksymalny czas -> 1075ps (taki musiałby być dla każdej operacji jeżeli musiałby być stały).
Jeśli jednak czas mógłby być zmienny - wystarczy obliczyć średnią ważoną (w zależności od użycia) aby poznać średni czas wykonania pojedynczej operacji.
25% * 1075 + 11% * 850 + 12% * 750 + 52% * 950 = 946.25ps = 88.02% * 1075ps
Osiągnęlibyśmy więc około 12% przyspieszenia.
# Zad 8
x = *(y + z)

Tekst taki jak w zadaniu 1. Jedyna różnica jest taka, że odczytujemy wartości dwóch rejestrów - y, z. Wynik zapisujemy do rejestru x.
1. Adres PC przechodzi do Instruction Memory. Odczytywana jest instrukcja o adresie PC z pamięci. Poniżej zostaje dodane 4 do PC (instrukcje zapisane są na 4 bajtach).
2. W Instruction Memory instrukcja zostaje odczytana - rejestry x, y trafiają do Register File, stała Imm do Sign Extend, a informacje o instrukcji do Control Unit.
3. W Register File wyciągnięta zostaje wartość z rejestru y i przekazana do ALU, wartość stałej Imm przez multiplekser również trafia do ALU.
4. Wyliczony adres w pamięci RAM oraz informacje z Control Unit trafiają do Data Memory, gdzie następuje odczyt wartości z pamięci RAM.
5. Odczytana wartość zostaje zapisana w rejestrze x.