# 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.