---
# System prepended metadata

title: SYK 5

---

# SYK 5

## Zad 1
![](https://i.imgur.com/XxuRpKh.png)




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
![](https://i.imgur.com/jdXpuwG.png)
![](https://i.imgur.com/L1iIRYR.png)

## Zad 3
x = y binop z
![](https://i.imgur.com/QPOpBec.png)
![](https://i.imgur.com/uAHMeiv.png)

## Zad 4
$if\ x\ relop\ y\ goto\ L$
![](https://i.imgur.com/56vl47Y.png)



![](https://i.imgur.com/f4OQ5Wj.png)

## Zad 4
![](https://i.imgur.com/tSOFUxN.png)

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.
![](https://i.imgur.com/Wn9MTjw.png)

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

![](https://i.imgur.com/UUso3LZ.png)

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
![](https://i.imgur.com/gNYfX9v.png)

![](https://i.imgur.com/331sua7.png)

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
![](https://i.imgur.com/0AfqiQl.png)
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
![](https://i.imgur.com/GGXfSKC.png)
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
![](https://i.imgur.com/nD2Kqcs.png)
Opóźnienie: **750ps**
### e
![](https://i.imgur.com/aWgRTIU.png)
Opóźnienie: **825ps**
### f
![](https://i.imgur.com/XM5mecR.png)
Opóźnienie: **375ps**

Najmniejszy f? 375?

# Zad 7
![](https://i.imgur.com/0ZQIsrt.png)

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)
![](https://i.imgur.com/bAoSkSE.png)

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.