Presentation laddar. Vänta.

Presentation laddar. Vänta.

1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios.

Liknande presentationer


En presentation över ämnet: "1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios."— Presentationens avskrift:

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


Ladda ner ppt "1 2G1502 Datorteknik allmän kurs Föreläsning 3 Programmering med hopp Programmering av Nios."

Liknande presentationer


Google-annonser