940 likes | 1.05k Vues
Föreläsning 3 Programmering med hopp Programmering av Nios. 2G1502 Datorteknik allmän kurs. Innehåll. Repetition av pipelining Load/Store Hopp Villkorliga hoppinstruktioner Metodanrop Stack Registerfönster. R. FETCH (update PC). (decode) EXECUTE. Programexekvering i två steg. R.
E N D
Föreläsning 3 Programmering med hopp Programmering av Nios 2G1502 Datorteknik allmän kurs
Innehåll • Repetition av pipelining • Load/Store • Hopp • Villkorliga hoppinstruktioner • Metodanrop • Stack • Registerfönster
R FETCH (update PC) (decode) EXECUTE Programexekveringi två steg
R Hårdvara i processorn Fetch Instruction Fetch Operand Execute Write Back Program Memory n x 16 Register File 32 x 32 IR PC ALU Register File 32 x 32
R Fetch Instruction Fetch Operand Execute Write Back PIPE - LINE införs nuFlera Instruktions-Register IR Program Memory n x 16 Register File 32 x 32 IR0 IR1 PC ALU IR2 NYTT Register File 32 x 32
R Pipelining ger problem vid Data Dependencies • Programexempel44: ADD R4 <- R5 + R6 46: ADD R1 <- R2 + R3 48: ADD R7 <- R1 + R4 • ”nya” R1 och R4 finns inte i REG-FILE
R Data Dependencies –inför nya data-vägar Program Memory n x 16 Fetch Instruction IR0 Fetch Operand IR1 Execute IR2 Write Back Register File 32 x 32 48: R7 <- R1+R4 PC 50 46: R1 <- R2+R3 +2 ALU 44: R4 <- R5+R6 Register File 32 x 32
R Nios INSTRUKTIONSFORMAT med immediate data ADD Rdst, datan ADD Hur många bitar behövs ? Hur stor blir varje instruktion ? INSTRUKTIONSFORMAT
R Fetch Instruction Fetch Operand Execute Write Back Immediate datainför ny dataväg Program Memory n x 16 Register File 32 x 32 IR0 IR1 PC +2 ALU IR2 Register File 32 x 32
R 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 Fetch Instruction Fetch Operand Execute Write Back Inför ny hårdvaraK - register Program Memory n x 16 Register File 32 x 32 IR0 IR1 PC +2 ALU IR2 Register File 32 x 32
R Hur används register K ? • PreFiX-instruktionen PFX Imm11skriver ett 11 bitars värde till register K • Instruktionen direkt efter PFX Imm11använder innehåll i K– sedan nollställs register K • Imm5 ökar till (Imm11 cat Imm5 )
R FI PFX - - FI FO EXE WB PFX Imm11 PFX IMM11 MOVI Rdst, Imm5
R Mall för makro– en syntetisk instruktion .macro CLR reg MOVI \reg, 0x0 .endm Effekt: man kan använda en ny instruktion clr %ri för att nollställa register %ri
R ADD Rdest, regA, regB Skriv makro för add-instruktion med 3 register .macro ADD reg1, reg2, reg3 MOV \reg1, \reg2ADD \reg1, \reg3 .endm
R MakrotMOVIA reg, Addr ; Ladda ett 32 bitars värde till ett register ; Värdet kan vara negativt .macro MOVIA reg, Addr PFX %hi(\Addr)MOVI \reg, %lo(\Addr)PFX %xhi(\Addr)MOVHI \reg, %xlo(\Addr) .endm
R JUMP (Raddr)inför ny dataväg Program Memory n x 16 Fetch Instruction IR0 Fetch Operand IR1 Execute IR2 Write Back Register File 32 x 32 PC +2 ALU Register File 32 x 32
BRA Imminför adder och datavägar R Program Memory n x 16 Fetch Instruction IR0 Fetch Operand IR1 Execute IR2 Write Back Register File 32 x 32 ADD PC +2 ALU Register File 32 x 32
R Pipelining ger möjlighet till Branch Delay Slot • Instruktionen i minnespositionennärmast efter en hoppinstruktionhämtas och körs medan hoppet verkställs Programexempel 18: BRA 74 20: ADD … 22: … … 94: SUB ...
R Slut på repetitionen • Load/Store • Nios • Hoppinstruktioner • Villkorliga hopp • Metodanrop • Stack • Registerfönster
LOAD och STORE • Vi vill kunna utföra instruktionerna LOAD Rdst, [ Raddr ] STORE [ Raddr ], Rsrc
Program Memory n x 16 Fetch Instruction IR0 Fetch Operand IR1 Execute IR2 Write Back LOAD och STOREmed 4 stegs PIPE-LINE Register File 32 x 32 ADD PC +2 RWM ALU Register File 32 x 32
FI FO WB MEM FI FO EXE WB LOAD och STOREmed 4 stegs PIPE-LINE Data från MEM finns tillgängligt LOAD to Rd USE Rd Data från MEM finns tillgängligt för FO tack vare Data Forward
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
Programvariabler samlade i minnet • Variabler • int i; • int j; • int k; • läggs efter varanni minnet av kompilatorn minne i j k
minne Ett register pekar ut variabelarean • Vid programstart tilldelas registret adressen till variabelarean i minnet i j register k r28
minne 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 i j register k r28
minne Indexerad adress • Addition i LOAD-instruktionen • LOAD R2←8(R28) • innebärR2←hm(r28+8) • Innehåll i R28, plus talet 8, blir minnesadress i j register k r28
FI FO WB addi r17←r28+8 EXE FI FO MEM WB load r2←(r17) FI FO ALU WB MEM Sparar en klockcykel vid varje LOAD • add följt av load byts mot • load med "inbyggd" addition load r2←8(r17)
LOAD och STORE • Vi vill alltså kunna utföra instruktionerna LOAD Rdst, Offset[ Raddr ] STORE Offset[ Raddr ], Rsrc
LOAD Rdst <- Offset[Raddr] • Vi kan utföra instruktionen/operationen LOAD Rdst, Offset[ Raddr ] • med koden (tar 2 klockcykler eller hur) ADDI Radr, Offset LOAD Rdst, [ Raddr ]
STORE Offset[Raddr] <- Rsrc • Vi kan utföra instruktionen/operationen STORE Offset[ Raddr ], Rsrc • med koden (tar 2 klockcykler eller hur) ADDI Radr, Offset ST [ Raddr ], Rsrc
5 stegs PIPE-LINE Program Memory n x 16 Fetch Instruction Fetch Operand ALU MEM Write Back Register File 32 x 32 IR0 ADD IR1 PC +2 ALU IR2 RWM IR3 Register File 32 x 32
Programexekveringi fem steg • FI - Fetch Instruction • FO - Fetch Operand • ALU - Calculation • MEM - Memory Reference • WB - Write Back
FI FO ALU WB MEM FI FO ALU WB MEM 5 stegs PIPE-LINE LOAD ADD Hur lång tid tar varje instruktion ? Antal cykler per instruktion, CPI ? Antal instruktioner per cykel ?
FI FO ALU WB MEM FI FO ALU WB MEM Pipelining – problem med Data Dependency vid Load Rd tillgängligt från minne LOAD to Rd USE Rd Rd önskas till ALU-reg men finns inte tillgängligt
FI FO ALU WB MEM FI FO stall ALU WB MEM Data Dependency vid Load – Load Delay Slot Rd tillgängligt från minne LOAD to Rd USE Rd Rd önskas till ALU-reg men finns inte tillgängligt Rd levereras till ALU-reg en klockcykel senare
Load DELAYäven vid Data Forward FI FO ALU WB MEM FI FO ALU WB MEM FI FO ALU WB MEM Tillgängligt från minne LOAD NOP? ADD Skriv till ALU-reg Data Forward fungerar
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
Ovillkorligt hoppVillkorligt hopp • Ovillkorligt hopp utförs alltidExempel: JMP och BRA • Villkorligt hopp utförs endast om ett angivet villkor är santExempel Bcc där cc är villkoret • Exempel på villkorEQZ = EQual to ZeroNEZ = Not Equal to Zero
JUMP och BRA • JUMP brukar ha direkt adress • BRA brukar ha PC-relativ adress 08: JMP 18 ;PC := 18 ”hopp till 18” . . 18: 46: BRA 18 ;PC := pc + 18 ”hopp till 66” 66:
Typisk hopp-instruktionJUMP 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
Typisk hopp-instruktionBRA 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
Typisk hopp-instruktionJUMP (Raddr) • Kopiera registerinnehåll till PC • Register med 32 bitar betyder att32-bits adress kan användas • Hur får man in 32-bits adress i registret? • MOVIA Raddr, Imm32 eller motsvarande
Nios hopp-instruktionJMP %rA • Skifta innehåll i register %rA ett steg åt vänster och kopiera till PC
Nios JMP %rAinför nya datavägar Program Memory n x 16 Fetch Instruction IR0 Fetch Operand IR1 Execute IR2 Write Back PC +2 ALU
Nios hårdvara förJMP %rA 32 bitar från ”A-busen” 0 ignoreras Program Counter
Typisk hopp-instruktionBR Immn • PC sätts till PC + Immn • Hur stor är Immn ? • Hur stor vill vi att Immn ska vara helst ?
Nios hopp-instruktionBR IMM11 • Skifta IMM11 ett steg vänster • gör Sign Extension • addera till aktuellt värde i PC • PC <- PC + 2 + ( sext( IMM11 ) << 1 )
BRA Immninför ADDitionsenhet och datavägar Program Memory n x 16 Fetch Instruction IR0 Fetch Operand IR1 Execute IR2 Write Back Register File 32 x 32 ADD PC +2 ALU Register File 32 x 32