Foto: Rona Proudfoot (some rights reserved) Vi skall nu kolla närmare på hur det går till när en instruktion utförs. Fetch = + Digitalteknik och Datorarkitektur hp path & Control maj 2 karl.marklund@it.uu.se Execute Decode Vi börjar med Fetch. Fetch = + Execute Decode MEMORY ress Content xffffffff xfffffffe xfffffffd xfffffffc... x x2 x x Kan inneålla både data och instruktioner (stored program concept). I detta fall har jag valt bitars adress adresserbara minnes-celler...... som innehåller bitar vardera. Vi har tidigare sett hur vi kan konstruera minnes-celler och större minnen med hjälp av grundläggande grindar. Det finns färdiga RAM-moduler i Logisim Anger adress 2 Raising Edge Triggad...... och nu skrivs data till minnet.... Dvs för att skriva data måste klockan gå från låg till hög. x97 x97 Klockan == Låg () För att skriva data måste out sättas till. Ändrar Klockan till hög ()...
Prövar med både output (read) och input (write) data. Läser data från adress och får output x9 Värdet på klockan spelar ingen roll vid läsning. För att läsa data måste out sättas till. Ändrar till adress... och nu blir går det galet! Försöker läsa från minnet och write data input samtidigt!!! Dvs, blir en blandning av Ändrar till (read)... 2 (x7) och 2 (x9) Three State Buffer Three State Buffer: släpper bara igenom D vid out = (read) A B E A (low ) E (low) B High Z When not Enabled (E = ) the three state buffer acts lika a huge resistance, kind of cutting of the wire. (high) (low) High Z (low) (high) (high) (high) (low) (high) When Enabled (E = ) the three state buffer lets the input signal A through. Output B can be in three states, (low), (high) and high resistance (Z). Three State Buffer: släpper bara igenom vid out = (write) 2
A RAM with bit address and 2 bit data cells. Kan beskriva inehållet i minnet i en vanlig textfil. Anger innehållet på varje adress som ett hexadecimalt tal. En rad för varje adress. v2. raw 2 2 En adress Ett ord Kan enkelt kolla om en address inte anger ett alignat ord. 2 bitars byte-adress. Men i MIPS är varje adress på 2 bitar......och varje address anger en byte. Konverterar till bitars ord-adress. Ett ord börjar alltid på en adress som är jämnt delbar med fyra. Nästa instruktion ligger byte l ngre fram. Byte adress konverterat till ord-adress. Maskininstruktion: x2 Vi börjar bygga en datapath. A datapath is a collection of functional units, such as s or multipliers, that perform data processing operations. 2 bitars byte-adress. ress 2 bit instruction Most processors consist of a datapath and a unit, with a large part of the unit dedicated to regulating the interaction between the datapath and memory. Fetch = + För att hämta en instruktion från minnet läser vi helt enkelt på den plats som anger. Execute Decode För att hämta nästa instruktion flyttar vi fram 2 bitar, dvs fyra bytes.
Nästa instruktion ligger byte l ngre fram. Byte adress konverterat till ordadress. Maskininstruktion: x2 Fetch = + Vi har kollat på Fetch och det är nu dags att studera avkodningsfasen (decode) 2 bitars byte-adress. Execute Decode Op Code == R-Format op rs rt rd 9 shamt funct 2 Maskininstruktion: x2 Maskininstruktion: x2 add $t, $t, $t Op Code == R-Format Func == 2 add Op Code == R-format Func == 2 add op rs rt rd 9 shamt funct 2 op rs rt rd 9 shamt funct 2 6 bits Write result bits to this register bits for add, bitssub, and, bitslt, etc 6 bits op rs rt rd shamt funct Operand-2 register allways here for add, sub, and slt, etc but also for sw (value to store) 6 bits bits bits 6 bits op rs rt address/constant Operand- register always here even for lw/sw (base register) 6 bits op 26 bits Target address Write result to this register for lw and addi I-type J-type Avkodning av instruktion Op Code = I-format $ $to 7 2 bits addi $t, $, 7 OP always here
Slutligen skall vi i detalj se hur det går till när en instruktion utörs (execute). Fetch = + We have already seen how we can build a complete register file. Execute Decode register a bit bit register b bit s bit OP Kant-triggad D-Latch. register c bit bit Sätter ihop fetch... Med (add, sub, and, or, slt...) och med I-type lw/sw Sätter ihop fetch... Med (add, sub, and, or, slt...) och med I-type lw/sw ress r r 2 Write r ress ress r r 2 Write r ress Mem 6 2 Mem Skall resultatet tolkas som en address (lw/sw) eller som ett resultatet av till exempel en addition? Vid lw och sw har vi 6 bitars konstant (offset) som måste bli til 2 bitar. Sätter ihop fetch... Med (add, sub, and, or, slt...) A simple datapath och med I-type lw/sw ress r r 2 Write r 6 2 Src ress Mem Control lines Function AND OR add sub slt NOR bit 2 bit Vilken input påverkar kontrollenheten?? This is a sub set of all the possible four bit bit patterns
Op code LW SW equal Alu Op op Load Word Store Word equal Subtract AND OR Set less than Sannings-tabell Funct field xxxxxx xxxxxx xxxxxx Karnough-diagram action Subtract Subtract And Or Set on less than input ress Single Cycle path with Control Multiplexer Instr[-] Op Instr[-26] Instr[2-2] Instr[2-6] Instr[ -] Instr[-] Control Src r r 2 Write r 6 2 Instr[-] Src Mem ress Hårdvara Hur ser det ut för en instruktion av R-typ? R type Op Instr[-26] Control Src Src Mem Op Instr[-26] Control Src Src Mem Instr[2-2] r Instr[2-6] r 2 Instr[-] ress Write r Instr[ -] ress Instr[2-2]` r Instr[2-6] r 2 Instr[-] ress Write r Instr[ -] ress Instr[-] 6 2 Instr[-] 6 2 Instr[-] Instr[-] Hur ser det ut för Load Word (I-typ)? Load Word Op Instr[-26] Control Src Src Mem Op Instr[-26] Control Src Src Mem Instr[2-2] r Instr[2-6] r 2 Instr[-] ress Write r Instr[ -] ress Instr[2-2]` r Instr[2-6] r 2 Instr[-] ress Write r Instr[ -] ress Instr[-] 6 2 Instr[-] Instr[-] 6 2 Instr[-] 6
beq Kodas som 6 bitars jump offset för att ange hur många instruktioner vi skall hoppa (framåt eller bakåt) $t, $t2 my_label on Equal (beq) Op Instr[-26] Control Src Src Mem Hur funkar branchinstruktioner... Instr[-] ress Instr[2-2]` Instr[2-6] Instr[ -] Instr[-] r r 2 Write r 6 2 ress Instr[-] Vi tar en närmare titt på hur n skulle kunna se ut. 2 bit Control lines Function AND OR add sub slt NOR bit Vi nöjer oss med en som klarar dessa 6 operationer. NOT B = - (two s complement) ( (NOT B) + ) + A = A - B - = 2 + = Get sign negative Op Code ADD The third bit from the left in the OP code selects B inverse and also function as carry in. 7
A B A OR B A AND B!A!B NOT (A OR B)!A AND!B AND = Op Code of all es A B A OR B A AND B!A!B NOT (A OR B)!A AND!B NOT (A AND B)!A OR!B A NOR B De Morgan's laws not (A and B) = (not A) or (not B) (NOT ) AND (NOT ) = NOT (A OR B) not (A or B) = (not A) and (not B) Augustus De Morgan (6-7) Two most significant bits select!a and!b Two least significant bits selects the the upper most input to the result MUX. Nu tar vi och bygger en datapath som endast klarar av add instruktionen, ett första försök med en instruktion av R-typ. För add behöver vi kunna läsa operander från register och skriva resultatet tillbaka till något register. Vi vill kunna skriva program som detta. add $t2, $t, $t add $t, $t2, $t2
Och registren Här hittar vi register, dvs $t - $t. Men hur för vi in data I registren om vi inte har addi? För att vi skall kunna testa vår datapath fuskar vi lite add $t2, $t, $t add $t, $t2, $t2 Vi kan använda spim för att få fram maskinkoden för vårt program. Sätter $t konstant till v2. raw 92 2 Sätter $t konstant till Nu kan vi spara maskinkoden i en vanlig textfil i det format som RAM-modulen kan använda. Innehållet I $t Lägger till fler prober så att det blir lättare att följa vad som händer. Här avkodas instruktionen. rs = ($t) Innehållet I $t rt = 9 ($t) rd = ($t2) rs OP Code för add add $t2, $t, $t add $t, $t2, $t2 Resultatet skrivs tillbaka till $t2 Varför är klocksignalen till registerfilen inverterad? 9
rs Nu lägger vi till stöd för addi addi $t, $, 27 add $t2, $t, $t add $t, $t2, $t2 6 bits bits bits 6 bits op rs rt address/constant Resultat till detta register add $t2, $t, $t add $t, $t2, $t2 Op Code 2 = s andra input kan nu komma från ett register eller från immediate-fältet. Men vi kan inte addera ett 2 bitars tal med ett 6 bitars tal (two s complement). Extension I detta fall skall resultatet skrivas till rt och inte som tidigare till rd. 6 bit Immediate Vi kan automatiser styrsignalerna till MUXarna genom att titta på bit tre från vänster I OP-koden. Resultatet skrivs till rt ($t) l samma som för add addi $t, $, 27 add $t2, $t, $t add $t, $t2, $t2 addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2
addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2 addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2 Nu lägger vi till stöd för sub addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2 sub $t, $t, $t addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2 sub $t, $t, $t addi add sub OP Code Funct xxx xxx Control För vår enkla MIPS med endast add, addi och sub kan vi enkelt härleda Control från en bit ur OP-koden och en bit ur funct-fältet.. Hur kan vi beräkna den näst mest signifikanta biten i Control? I vår förenklade variant av MIPS är alla bitar utom en konstant. addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2 sub $t, $t, $t addi $t, $, 27 addi $t, $, add $t2, $t, $t add $t, $t2, $t2 sub $t, $t, $t Samma som för addi Nu ändras Control från till.