Ladda ner presentationen
Presentation laddar. Vänta.
Publicerades avUlla-Britt Emilia Jonasson
1
1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios
2
2 Innehåll ● Repetition av pipelining ● Load/Store ● Hopp ● Villkorliga hoppinstruktioner ● Metodanrop ● Stack ● Registerfönster
3
3 Programexekvering i två steg (decode) EXECUTE FETCH (update PC) R
4
4 Hårdvara i processorn Execute Fetch Operand Write Back Fetch Instruction Register File 32 x 32 Program Memory n x 16 ALU IR Register File 32 x 32 PC R
5
5 PIPE - LINE införs nu Flera Instruktions-Register IR ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 NYTT R
6
6 Pipelining ger problem vid Data Dependencies ● Programexempel 44:ADD R4 <- R5 + R6 46:ADD R1 <- R2 + R3 48:ADD R7 <- R1 + R4 ● ”nya” R1 och R4 finns inte i REG-FILE R
7
7 Data Dependencies – inför nya data-vägar Execute Fetch Operand Write Back Fetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 48: R7 <- R1+R4 50 +2 46: R1 <- R2+R3 44: R4 <- R5+R6 R
8
8 ADD R dst, data n ADD Hur många bitar behövs ? Hur stor blir varje instruktion ? INSTRUKTIONSFORMAT Nios INSTRUKTIONSFORMAT med immediate data R
9
9 Immediate data inför ny dataväg ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 +2 R
10
10 Immediate data är bara 5 bitar ● En PreFiX-instruktion PFX införs ● PFX modifierar efterföljande instruktion och ger den ett längre immediate-värde ● PFX använder ett specialregister K ● Principen med prefixinstruktioner finns även i Pentium-serien R
11
11 Inför ny hårdvara K - register ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC IR0 IR1 IR2 +2 R
12
12 Hur används register K ? ● PreFiX-instruktionen PFX Imm 11 skriver ett 11 bitars värde till register K ● Instruktionen direkt efter PFX Imm 11 använder innehåll i K – sedan nollställs register K ● Imm 5 ökar till (Imm 11 cat Imm 5 ) R
13
13 PFX Imm 11 FIPFX - - PFX IMM 11 MOVI R dst, Imm 5 FIFOEXEWB R
14
14 Mall för makro – en syntetisk instruktion.macroCLR reg MOVI\reg, 0x0.endm Effekt: man kan använda en ny instruktion clr %ri för att nollställa register %ri R
15
15 ADD Rdest, regA, regB Skriv makro för add-instruktion med 3 register.macroADD reg1, reg2, reg3 MOV\reg1, \reg2 ADD\reg1, \reg3.endm R
16
16 Makrot MOVIA reg, Addr ;Ladda ett 32 bitars värde till ett register ;Värdet kan vara negativt.macroMOVIA reg, Addr PFX%hi(\Addr) MOVI\reg, %lo(\Addr) PFX%xhi(\Addr) MOVHI\reg, %xlo(\Addr).endm R
17
17 JUMP (R addr ) inför ny dataväg Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC IR0 IR1 IR2 +2 Register File 32 x 32 Register File 32 x 32 R
18
18 BRA Imm inför adder och datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC ADD IR0 IR1 IR2 +2 Register File 32 x 32 Register File 32 x 32 R
19
19 Pipelining ger möjlighet till Branch Delay Slot Instruktionen i minnespositionen närmast efter en hoppinstruktion hämtas och körs medan hoppet verkställs Programexempel 18: BRA 74 20: ADD … 22: … … 94: SUB... R
20
20 Slut på repetitionen ● Load/Store ● Nios ● Hoppinstruktioner ● Villkorliga hopp ● Metodanrop ● Stack ● Registerfönster R
21
21 LOAD och STORE ● Vi vill kunna utföra instruktionerna LOADR dst, [ R addr ] STORE [ R addr ], R src
22
22 ExecuteFetch OperandWrite BackFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC ADD IR0 IR1 IR2 RWM +2 LOAD och STORE med 4 stegs PIPE-LINE
23
23 LOAD och STORE med 4 stegs PIPE-LINE LOAD to Rd USE Rd FIFO MEM WBFIFOEXEWB Data från MEM finns tillgängligt Data från MEM finns tillgängligt för FO tack vare Data Forward
24
24 Behov av indexerad adress ● Programvariabler ligger samlade ● Ett register pekar ut variabelarean ● Varje LOAD/STORE behöver först en adressberäkning med ADD ● Indexerad adress LOAD R2 ← 8(R28); R2 ← hm(r28 + 8) ● Sparar en klockcykel vid varje LOAD
25
25 Programvariabler samlade i minnet ● Variabler – int i; – int j; – int k; ● läggs efter varann i minnet av kompilatorn minne i j k
26
26 Ett register pekar ut variabelarean ● Vid programstart tilldelas registret adressen till variabelarean i minnet minne i j k register r28
27
27 Varje LOAD/STORE behöver adressberäkning med ADD ● k ska hämtas till R2 ● R17 är ledigt ● ADDI R17 <- R28 + 8 ● LOAD R2 <- (R17) ● En extra instruktion ● En extra klockcykel ● Extra krångel i programkoden minne i j k register r28
28
28 Indexerad adress ● Addition i LOAD- instruktionen ● LOAD R2 ← 8(R28) ● innebär R2 ← hm(r28+8) ● Innehåll i R28, plus talet 8, blir minnesadress minne i j k register r28
29
29 Sparar en klockcykel vid varje LOAD ● add följt av load byts mot ● load med "inbyggd" addition addi r17←r28+8 load r2←(r17) FIFO EXE WB FIFO MEM WB load r2←8(r17) FIFOALUWB MEM
30
30 LOAD och STORE Vi vill alltså kunna utföra instruktionerna LOADR dst, Offset[ R addr ] STOREOffset[ R addr ], R src
31
31 LOAD Rdst <- Offset[Raddr] Vi kan utföra instruktionen/operationen LOADR dst, Offset[ R addr ] med koden (tar 2 klockcykler eller hur) ADDIR adr, Offset LOADR dst, [ R addr ]
32
32 STORE Offset[Raddr] <- Rsrc Vi kan utföra instruktionen/operationen STOREOffset[ R addr ], R src med koden (tar 2 klockcykler eller hur) ADDIR adr, Offset ST[ R addr ], R src
33
33 5 stegs PIPE-LINE ALUFetch OperandMEMFetch Instruction Register File 32 x 32 Program Memory n x 16 ALU Register File 32 x 32 PC ADD IR0 IR1 IR2 RWM IR3 Write Back +2
34
34 Programexekvering i fem steg ● FI- Fetch Instruction ● FO - Fetch Operand ● ALU - Calculation ● MEM - Memory Reference ● WB - Write Back
35
35 5 stegs PIPE-LINE LOAD FIFOALUWB MEM FIFOALUWB MEM ADD Hur lång tid tar varje instruktion ? Antal cykler per instruktion, CPI ? Antal instruktioner per cykel ?
36
36 Pipelining – problem med Data Dependency vid Load LOAD to Rd FIFOALUWB MEM FIFOALUWB MEM Rd tillgängligt från minne Rd önskas till ALU-reg men finns inte tillgängligt USE Rd
37
37 Data Dependency vid Load – Load Delay Slot LOAD to Rd FIFOALUWB MEM FIFO stall Rd tillgängligt från minne Rd levereras till ALU-reg en klockcykel senare USE Rd WB MEM ALU Rd önskas till ALU-reg men finns inte tillgängligt
38
38 Load DELAY även vid Data Forward LOAD FIFOALUWB MEM ADD Tillgängligt från minne FIFOALUWB MEM Skriv till ALU-reg Data Forward fungerar FIFOALUWB MEM NOP?
39
39 Programmering med hopp ● Hopp = ett värde skrivs till PC ● Effektivadress skrivs till PC ● Olika adresseringsmetoder finns ● JUMP Label brukar använda absolut adress ● BRA Label brukar använda PC-relativ adress
40
40 Ovillkorligt hopp Villkorligt hopp ● Ovillkorligt hopp utförs alltid Exempel: JMP och BRA ● Villkorligt hopp utförs endast om ett angivet villkor är sant Exempel Bcc där cc är villkoret ● Exempel på villkor EQZ = EQual to Zero NEZ = Not Equal to Zero
41
41 JUMP och BRA JUMP brukar ha direkt adress BRA brukar ha PC-relativ adress JMP 18 ;PC := 18”hopp till 18”. BRA 18 ;PC := pc + 18”hopp till 66” 08: 18: 46: 66:
42
42 Typisk hopp-instruktion JUMP Label Absolut adressering Läget Label motsvarar en binär adress Kopiera Label till PC Om PC har 32 bitar bör Label vara 32 bitar Adressen Label lagras i instruktionen
43
43 Typisk hopp-instruktion BRA Label PC-relativ adressering Läget Label motsvarar en binär adress Före körning beräknar assemblern hur långt från instruktionen Label finns Avståndet lagras i instruktionen som displacement eller offset Vid körning adderas offset till PC offset kan vara positivt eller negativt
44
44 Typisk hopp-instruktion JUMP (R addr ) Kopiera registerinnehåll till PC Register med 32 bitar betyder att 32-bits adress kan användas Hur får man in 32-bits adress i registret? MOVIA R addr, Imm 32 eller motsvarande
45
45 Nios hopp-instruktion JMP %rA Skifta innehåll i register %rA ett steg åt vänster och kopiera till PC
46
46 Nios JMP %rA inför nya datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC IR0 IR1 IR2 +2
47
47 Nios hårdvara för JMP %rA 32 bitar från ”A-busen” Program Counter 0 ignoreras
48
48 Typisk hopp-instruktion BR Imm n PC sätts till PC + Imm n Hur stor är Imm n ? Hur stor vill vi att Imm n ska vara helst ?
49
49 Nios hopp-instruktion BR IMM11 Skifta IMM11 ett steg vänster gör Sign Extension addera till aktuellt värde i PC PC <- PC + 2 + ( sext( IMM11 ) << 1 )
50
50 BRA Imm n inför ADDitionsenhet och datavägar Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC ADD IR0 IR1 IR2 +2 Register File 32 x 32 Register File 32 x 32
51
51 Nios hårdvara för BR IMM11 0 31... 11... 2 1 0... IR0 PC ADD IMM11: 11 bitar från IR0 Sign Extension
52
52 Typisk instruktion SUBR dst, R srcA, R srcB Subtrahera innehåll i R srcA från R srcB och skriv till R dst Förutom resultatet / skillnaden så lagras ytterligare information i STATUS-flaggor
53
53 Typisk instruktion CMPR srcA, R srcB Jämför innehåll i R srcA och R srcB genom att Subtrahera innehåll i R srcA från R srcB Men skriv ej resultat till något register Information om resultatet / skillnaden lagras som information i STATUS-flaggor
54
54 Vanliga STATUS-flaggor ● Z = Zero; ”utfall lika med noll” ● N = Negativ; ”utfall med negativt tecken” ● V = oVerflow; ”utfall med overflow” – summan av två positiva tal har blivit negativ ● C = Carry-ut från ALU ● Påverkas av ADD, SUB, CMP...
55
55 STATUS -flaggor Execute Fetch Operand Write Back Fetch Instruction Program Memory n x 16 ALU PC ADD IR0 IR1 IR2 +2 NVZC Register File 32 x 32 Register File 32 x 32
56
56 Gäller detta för Nios-Processorn ? R0 R31 R1 PC Minne Generella registerProgramräknare NZVC
57
57 Villkorlig hopp-instruktion Bcond Imm n PC sätts till PC + Imm n om cond är sant PC sätts till PC + n om cond är falskt (n är antal bytes per instruktion) Nios har ingen instruktion Bcond Imm Det måste finnas minst en villkorlig instruktion för att klara en IF-sats
58
58 Nios har villkorlig instruktion IFS cc_IMM4 if-skip IFS Conditionally execute next instruction Om villkoret är sant utförs nästa instr. Om villkoret är falskt skippas nästa instruktion Om nästa är en PFX så skippas 2 instr.
59
59 Nios har villkorlig instruktion SKPS cc_IMM4 SKPS Skip On Condition Code Om villkoret är sant skippas nästa instr. Om villkoret är falskt utförs nästa instruktion Om nästa är en PFX så skippas 2 instr.
60
60 IFS cc_IMM4 SKPS cc_IMM4 Cc_IMM4 kan väljas bland 14 olika cc_eq, cc_ne, cc_lt osv. enligt tabell Program-exempel: if (reg1==0) goto Label CMPIreg1, 0;jämför reg1 med noll IFScc_eq;om Z=1 BRLabel;hoppa till Label
61
61 14 olika villkor finns i Nios ● cc_ncC = 0 ● cc_cC = 1 ● cc_nzZ = 0 ● cc_zZ = 1 ● cc_plN = 0 ● cc_miN = 1 ● cc_ltN xor V ● cc_genot(N xor V) ● cc_gt not(Zor(NxorV)) ● cc_le Zor(NxorV) ● cc_nvV = 0 ● cc_vV = 1 ● cc_hinot (C or Z) ● cc-laC or Z
62
62 Alias för villkor i Nios ● cc_cs = cc_cCarry Set = Carry ● cc_n = cc_miNegative = MInus ● cc_cc = cc_ncCarry Clear = No Carry ● cc_vc = cc_nvoVerflow Clear = No oVe... ● cc_eq = cc_zEqual = Zero ● cc_ne = cc_nzNot Equal = Not Zero ● cc_vs = cc_voVerflow Set = oVerflow ● cc_p = cc_plPlus = PLus
63
63 Nios instruktion IFRZ reg ● Execute next instruction if register is Zero ● Exempel: if (reg1==0) goto Label IFRZreg1;om reg1 = 0 BRLabel;hoppa till Label ● SKPRNZ är ekvivalent med IFRZ ● Om nästa är en PFX så görs två nästa
64
64 Nios instruktion IFRNZ reg ● Execute next instruction if register is Not Zero ● Exempel: if (reg1 != 0) goto Label IFRNZreg1;om reg1 ej är 0 BRLabel;hoppa till Label ● SKPRZ är ekvivalent med IFRNZ ● Om nästa är en PFX så görs två nästa
65
65 funktioner, subrutiner, metoder ● Hur sker anrop ? ● Med hoppinstruktion ! ● Hur sker återhopp ? ● Med hoppinstruktion ! ● Returadress måste lagras !
66
66 Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … RETURN
67
67 Subrutinanrop CALL RUT RET1:ADD … CALL RUT RET2:SUB... RUT:ADD … CALL FKN RETURN FKN: MUL … CALL NEW RETURN
68
68 funktioner, subrutiner, metoder Hur sker parameteröverföring Var lagras parametrar ● från anropare till rutinen, inparametrar ● från rutinen till anroparen, returvärden Olika typ av parameter ● värde ● pekare)
69
69 Nios hopp-instruktion BSR IMM11 Liknar BR IMM11 med tilläggg att Returadress sparas i register %R15=%o7 Returadressen är adressen till instruktionen närmast efter hoppluckan dvs adress till BSR ökat med 4 Returadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15
70
70 Nios hopp-instruktion CALL %rA Liknar JMP %rA med tillägg att Returadress sparas i register %R15=%o7 Returadressen är adressen till instruktionen närmast efter hoppluckan dvs adress till CALL ökat med 4 Returadressen sparas skiftad ett steg höger för att passa ihop med JMP %R15
71
71 Nios hårdvara för BSR och CALL alt. 2 0 PC A-bus till ALU-A register 32 bitar från PC ignoreras... A-bus till ALU-A register
72
72 Stackhantering ● Stack är speciell reserverad plats i minnet ● Stack Pekare pekar på plats i stacken ● PUSH-operation, lägg på stack ● POP-operation, hämta från stack
73
73 STACK operationer PUSH och POP Stack Pointer SP PUSH op: SP <- sp - n mem(sp) <- op POPdst: dst <- mem(sp) SP <- sp + n n = antal bytes + -
74
74 STACK PUSH och POP operationer ● PUSHR src SUBI%sp, 4 ST[%sp], R src ● POPR dst LDR src, [%sp] ADDI%sp, 4
75
75 PUSH reg ;Pusha ett register på stacken.macroPUSH reg SUBI%sp, 4;%sp = %o6 ST[%sp], \reg.endm ;PUSH %o6 är inte bra
76
76 POP reg ;Poppa ett register från stacken.macroPOP reg LD \reg, [%sp] ADDI%sp, 4;%sp = %o6.endm ;POP %o6 är förödande
77
77 Nios stöd för stack ● Stack Pointer = %r14 = %sp (alias %o6) ● Finns det Stack-operationer ? ● LDS är LOAD R dst <- [%sp, IMM8] ● STS är STORE [%sp,IMM8] <- R src med flera variationer ● Ingen PUSH- eller POP-instruktion ● Ingen JSR/RTS med returadress på stack
78
78 Nios stöd för subrutiner Anrop med CALL reg, returadress i register %r15 = %o7 innehållet i reg multipliceras med 2 innan det skrivs till PC, jämför med JMP reg Anrop med BSR Label Retur med RET (JMP %r31 alias %i7) Retur med LRET (JMP %r15 alias %o7)
79
79 Returadress vid subrutinanrop ● I ett speciellt register (fördel/nackdel) ● I valfritt register (fördel/nackdel) ● I minnet på speciell plats (fördel/nackdel) ● I minnet på valfri plats (fördel/nackdel) ● I minnet på en stack med PUSH (fördel/nackdel) ● I första ordet i subrutinen (fördel/nackdel)
80
80 Register Window Vad? Hur? Varför?
81
81 Register Window ● 5-bits registernummer = 32 register ● %g0-%g7 = %r0 -%r7globala ● %o0-%o7 = %r8 -%r15ut-register ● %L0-%L7 = %r16-%r23lokala register ● %i0-%i7 = %r24-%r31in-register
82
82 Registerfönster 32 register är direkt tillgängliga 128 eller 256 eller 512 register totalt CWP - Current Window Pointer anger vilka register som just nu är direkt åtkomliga CWP finns i statusregister %ctl0 !
83
83 Register Window ● CWP = Current Window Pointer ● SAVE ”öppna nytt fönster” minska CWP med 1 ● RESTORE ”byt till gammalt fönster” öka CWP med 1
84
84 Exempel: tre fönster Ins Locals Outs Ins Locals Outs Ins Locals Outs Globals
85
85 Exempel: tre fönster Ins Locals Outs Ins Locals Outs Ins Locals Outs Globals t I huvudprogram CALL RUT I rutinen RUT SAVE %sp,0 Nytt register- fönster för RUT I rutinen RUT CALL FKN I rutinen FKN SAVE %sp,0 Nytt register- fönster för FKN
86
86 Tre fönster ● Metodanrop CALL RUT ● I metoden RUT – SAVE %sp,0 minskar CWP med 1 – Metodanrop CALL FKN – I metoden FKN ● SAVE %sp,0 minskar CWP med 1
87
87 Table 20. Smallest Nios Register File Reg[.. Reg[24..31] Reg[16..23] Reg[8..15] Reg[104..111] Reg[112..119] Reg[120..127] Reg[0..7] %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7 %o0..%o7 %L0..%L7 %i0..%i7%g0..%g7 %o0..%o7 %L0..%L7 %i0..%i7%g0..%g7 SAVE RESTORE CWP = 0 CWP = 1 CWP = 5 CWP = 6 CWP = 4 CWP = 2
88
88 Register- fönster- cirkeln ● Exempel – 8 fönster ● Fönster 7 används bara av handler för window overflow
89
89 Exempel på subrutinkod utan SAVE och RESTORE nästlat subrutinanrop går ej RUT:kod kod ;;;BSR RUT2;subrutinanrop nix! … LRET;JMP %07
90
90 RUT:SAVE %sp,0;ändra inte %sp kod BSR RUT2;fungerar … RET;JMP %i7 RESTORE;i hopplucka Exempel på subrutinkod med SAVE och RESTORE nästlat subrutinanrop går bra
91
91 Parameterplats till och från subrutin I register (fördel/nackdel) I minnet på fast adress (fördel/nackdel) I minnet på en stack (fördel/nackdel)
92
92 Exempel på parameteröverföring med SAVE och RESTORE Anroparen lagrar parametrar i %o-register (utom %o7) Anroparen gör BSR eller CALL varvid returadress sparas i %o7 Subrutinen gör SAVE varvid alla %o-reg hamnar på platser %ireg Returadress finns nu i %i7 Parametrar finns nu i %i-register Det finns 16 ”nya” register, 8 st %Local och 8 st %Out Subrutinen arbetar Subrutinen gör RESTORE Returadress finns nu i %o7 varvid retur ska göras med JMP %o7 (samma som LRET)
93
93 Exempel på parameteröverföring med PUSH och POP Anroparen lagrar parametrar på stacken med PUSH Anroparen gör BSR eller CALL varvid returadress sparas i %o7 Parametrar finns nu i på stacken Det finns inga ”nya” register (kan fixas med SAVE/RESTORE) Subrutinen arbetar och Lägger eventuella returparametrar i register eller på stack Returadress finns nu i %o7 varvid retur ska göras med JMP %o7 (samma som LRET) Anroparen ska städa på stacken (med POP eller ADD till %sp)
94
94 Föreläsning 3 Sammanfattning ● MACRO är praktiskt att använda ● HOPP finns av olika slag ● Subrutiner kan anropas ● Parametrar kan överföras ● Stack med PUSH och POP är bra att ha ● Register Window
Liknande presentationer
© 2024 SlidePlayer.se Inc.
All rights reserved.