Datapad en pipelining van een processor

Bekijk hoe een processor instructies uitvoert. Bouw een RISC-V-datapad dat elke instructie in één klokcyclus uitvoert uit registers, een ALU, geheugens en multiplexers, ontwerp de besturingssignalen die het aansturen en volg echte instructies met concrete waarden door het datapad. Verdeel het daarna in vijf pipelinestappen, bereken de versnellingsfactor en leer hoe rechtstreeks doorsturen, wachtcycli, instructieplanning en sprongvoorspelling de pipeline aan het werk houden ondanks data- en besturingsconflicten.

GemiddeldLes 4 van 6 in Cursus Computerarchitectuur: processors, geheugen en prestaties

Wat je leert

  1. Herken de hardware-eenheden die een RISC-V-processor nodig heeft, verbind ze zodat rekenkundige instructies, geheugeninstructies en voorwaardelijke sprongen elk in één klokcyclus worden voltooid en volg echte instructies door het resultaat.
    • Benoem de bouwstenen van een datapad en beschrijf hoe ze door de klok worden aangestuurd
      Onderscheid combinatorische elementen van toestandselementen en beschrijf wat de programmateller, geheugens, registerbank, ALU, generator voor onmiddellijke operanden, optellers en multiplexers elk doen.
    • Verbind de onderdelen van het datapad voor rekenkundige instructies, geheugeninstructies en voorwaardelijke sprongen
      Bepaal welke eenheden en verbindingen elke instructieklasse gebruikt en voeg de afzonderlijke routes samen tot één datapad met multiplexers waar ze samenkomen.
    • Volg instructies door het datapad dat elke instructie in één klokcyclus uitvoert
      Volg concrete instructies met echte register- en geheugenwaarden door elke eenheid, geef de waarden op de belangrijkste draden en vermeld wat op de klokflank verandert.
  2. Leid de besturingssignalen af waarmee het datapad elke instructie uitvoert. Gebruik een hoofdbesturingseenheid die wordt aangestuurd door de opcode en een kleine ALU-besturingseenheid die wordt aangestuurd door de functievelden.
    • Stel de hoofdbesturingssignalen voor elke instructie in
      Leg uit wat elk hoofdbesturingssignaal doet, stel de besturingstabel op voor R-type-instructies, laad- en opslaginstructies en voorwaardelijke sprongen, en gebruik onverschillige waarden correct.
    • Genereer de ALU-besturingscode uit ALUOp en de functievelden
      Gebruik decodering op twee niveaus om de 2-bits-ALUOp en de funct7- en funct3-velden van de instructie om te zetten in de 4-bitscode die de ALU-bewerking selecteert.
  3. Leg uit hoe overlappende instructies de doorvoer verhogen, beschrijf het datapad met vijf pipelinestappen en de bijbehorende pipelineregisters en besturing, en volg instructies met pipelinediagrammen.
    • Leg uit waarom pipelining een processor versnelt
      Bepaal de klokperiode van een ontwerp dat elke instructie in één klokcyclus uitvoert op basis van het kritieke pad en bereken daarna de doorvoer, latentie en versnellingsfactor van een versie met een pipeline.
    • Beschrijf het datapad met vijf pipelinestappen en de bijbehorende pipelineregisters
      Leg uit wat de pipelineregisters bevatten, hoe besturingssignalen met elke instructie meegaan en waarom elke instructie alle vijf stappen doorloopt.
    • Volg instructies met pipelinediagrammen
      Teken en lees pipelinediagrammen over meerdere klokcycli, bepaal welke instructie in een bepaalde cyclus in elke stap zit en tel het totale aantal cycli met en zonder wachtcycli.
  4. Herken wanneer instructies in de pipeline met elkaar conflicteren en los dataconflicten op met rechtstreeks doorsturen, wachtcycli en instructieplanning.
    • Herken conflicten en de gegevensafhankelijkheden die ze veroorzaken
      Deel conflicten in als structuur-, data- of besturingsconflicten, bepaal de afhankelijkheden tussen instructies en ga na welke daarvan wachtcycli veroorzaken in een pipeline zonder rechtstreeks doorsturen.
    • Stuur resultaten rechtstreeks door om wachtcycli te voorkomen
      Leg de routes voor rechtstreeks doorsturen en de voorwaarden van de doorstuureenheid uit en bepaal waar elke ALU-operand in een gegeven instructiereeks vandaan komt.
    • Voeg wachtcycli in bij laad-gebruikconflicten en plan instructies om die conflicten te voorkomen
      Detecteer laad-gebruikconflicten, leg uit hoe de pipeline een lege plaats invoegt en herschik instructies om wachtcycli te verwijderen zonder het resultaat van het programma te veranderen.
  5. Verminder de extra cycli door sprongen door eerder te bepalen of een sprong wordt genomen, pipeline-instructies ongeldig te maken en statische of dynamische sprongvoorspelling te gebruiken. Schat ook hoe alle conflicten samen de pipelineprestaties beïnvloeden.
    • Verminder de extra cycli door sprongen in de pipeline
      Leg uit waarom sprongen besturingsconflicten veroorzaken, vergelijk wachten, voorspellen dat een sprong niet wordt genomen en eerder bepalen of een sprong wordt genomen, en behandel uitzonderingen als een verwante verandering in het programmaverloop.
    • Voorspel sprongen dynamisch op basis van de spronggeschiedenis
      Volg 1-bits- en 2-bits-sprongvoorspellers, leg de spronggeschiedenistabel en de sprongdoelbuffer uit en herken waar eenvoudige voorspellers tekortschieten.
    • Schat de pipelineprestaties met inachtneming van conflicten
      Combineer wachtcycli door laad-gebruikconflicten en extra cycli door sprongen tot een effectieve CPI, bereken uitvoeringstijden en vergelijk strategieën voor de afhandeling van sprongen en processorontwerpen.

Datapad en pipelining: uitleg

5 hoofdstukken

1

Bouw een datapad dat elke instructie in één klokcyclus uitvoert

Een processor zet instructiebits om in veranderingen in registers, geheugen en het adres van de volgende instructie. Volg de onderdelen die dit werk uitvoeren en verbind ze daarna tot routes voor rekenkundige instructies, laad- en opslaginstructies en voorwaardelijke sprongen. Concrete voorbeelden laten de waarden op de draden zien en de veranderingen die op elke klokflank worden opgeslagen. Het ontwerp gebruikt RV64-registers en een kleine verzameling RISC-V-instructies van 4 bytes, zodat elke verbinding een duidelijk doel heeft.

1.1 Herken de hardware en de klokgrens

Een datapad bewaart en bewerkt de waarden die een instructie nodig heeft. De besturingseenheid stuurt die waarden en geeft toestemming om te schrijven. Samen voeren ze instructies uit zoals add, sub, and, or, ld, sd en beq.

Volg waarden tussen klokflanken

Een toestandselement onthoudt een waarde: de programmateller, de registerbank en het datageheugen zijn voorbeelden. Een combinatorisch element produceert uitvoer uit zijn huidige invoer. Optellers, multiplexers, de ALU en de generator voor onmiddellijke operanden doen dit werk zonder het resultaat van een instructie tussen cycli op te slaan.

Op de actieve klokflank leggen toestandselementen hun volgende waarden vast. Tussen klokflanken voeden hun uitgangen de combinatorische logica. De PC kan daardoor gedurende een cyclus het huidige adres leveren en aan het einde ervan het volgende adres vastleggen. Het lezen van een toestandselement overschrijft de opgeslagen waarde niet.

Ophalen en toegang tot registers

De programmateller (PC) bevat het instructieadres. Het instructiegeheugen levert de 32-bitsinstructie op dat adres. In dit model wordt het alleen gelezen terwijl het programma draait en zoekt het de instructie bij een adres op. Een afzonderlijke opteller vormt PC + 4 omdat de instructies in deze deelverzameling 4 bytes innemen.

De registerbank bevat x0–x31. Twee leespoorten ontvangen de bronnummers rs1 en rs2 en leveren hun waarden. Eén schrijfpoort ontvangt doelregister rd, te schrijven gegevens en RegWrite. Leesbewerkingen zijn combinatorisch; een vrijgegeven schrijfbewerking wordt op de klokflank opgeslagen. Register x0 levert bij lezen altijd nul op en negeert schrijfbewerkingen. RV64-registers bevatten 64 bits. Een RV32-versie gebruikt 32-bitsregisters en lw/sw, met dezelfde basisverbindingen.

Berekenen, selecteren en het geheugen benaderen

De rekenkundig-logische eenheid (ALU) telt op, trekt af of voert een bitsgewijze bewerking uit. Een 4-bitsbesturingscode selecteert de bewerking. De Zero-uitgang is 1 als het resultaat nul is; aftrekken kan daarom testen of twee waarden gelijk zijn.

De generator voor onmiddellijke operanden, ImmGen, reconstrueert de onmiddellijke operand van een instructie en past tekenuitbreiding toe tot 64 bits. Door de tekenbit te kopiëren blijft een negatieve waarde behouden. Het 12-bitspatroon 1111 1111 1000 stelt −8 voor; nuluitbreiding zou er 4088 van maken en een geheugenbewerking naar het verkeerde adres sturen.

Een multiplexer, of mux, selecteert één invoer. Multiplexers kiezen de tweede ALU-operand, de te schrijven registergegevens en de volgende PC. Een multiplexer verandert de route; een schrijfvrijgavesignaal bepaalt of een opgeslagen waarde verandert.

Het datageheugen heeft ingangen voor adres en te schrijven gegevens, een uitgang voor gelezen gegevens en de besturingssignalen MemRead en MemWrite. Een laadinstructie moet tijdens dezelfde enkele cyclus een instructie ophalen en gegevens benaderen. Afzonderlijke instructie- en datageheugens maken beide toegangen mogelijk. Afzonderlijke optellers laten ook toe dat PC + 4 en het sprongdoeladres worden berekend terwijl de ALU ander werk doet.

Ongebruikte uitgangen kunnen tijdens een cyclus nog steeds veranderen. Correcte besturing houdt in dat alleen de geselecteerde uitgangen terechtkomen bij vrijgegeven schrijfbewerkingen naar toestandselementen. Een berekende waarde op een niet-geselecteerde draad heeft geen effect op het programma.

Belangrijkste punten

  • Het datapad verwerkt waarden; besturingssignalen selecteren routes en geven toestemming om te schrijven.
  • Toestandselementen bewaren waarden over klokflanken heen; combinatorische elementen bewerken hun huidige invoer.
  • De registerbank heeft twee leespoorten en één schrijfpoort en x0 levert bij lezen altijd nul op.
  • Tekenuitbreiding behoudt de waarde met teken van een onmiddellijke operand.
  • Afzonderlijke geheugens en optellers ondersteunen werk dat in één cyclus gelijktijdig nodig is.

1.2 Verbind de routes voor elke instructieklasse

Begin met wat elke instructie moet lezen en wat ze moet veranderen. Het gedeelde datapad combineert deze routes, met een multiplexer overal waar alternatieve waarden bij één ingang samenkomen.

Haal de instructie op en decodeer de velden

Bij het ophalen wordt de PC gebruikt om het instructiegeheugen te lezen en wordt parallel PC + 4 berekend. De opcode staat in bits 6–0. Waar aanwezig staat rd in bits 11–7, funct3 in 14–12, rs1 in 19–15 en rs2 in 24–20; funct7 van het R-type staat in bits 31–25. Door de vaste posities van de bronvelden kan het lezen van registers beginnen terwijl de besturing van de instructie wordt gedecodeerd. Een opslaginstructie of voorwaardelijke sprong heeft geen rd-veld: bits 11–7 dragen bij aan de onmiddellijke operand.

Vergelijk de uitvoeringsroutes
InstructieALU-invoer en bewerkingDatageheugenOpgeslagen resultaat
add x5, x6, x7x6 + x7Geen toegangSom naar x5
ld x5, 16(x6)x6 + 16Lezen op effectief adresGeheugengegevens naar x5
sd x5, 24(x6)x6 + 24x5 schrijven op effectief adresGeheugen verandert
beq x8, x9, offsetx8 − x9Geen toegangVolgende PC selecteren

Bij een laadinstructie is het ALU-resultaat een effectief adres, het adres van de te lezen gegevens. De geheugenuitvoer gaat vervolgens terug naar de registerbank. Een opslaginstructie vormt ook een adres met de ALU, maar haar tweede bronwaarde gaat afzonderlijk naar de ingang voor te schrijven gegevens van het geheugen. Als de onmiddellijke operand als ALU-operand wordt geselecteerd, mag die op te slaan waarde niet verloren gaan. ImmGen reconstrueert de offset van het S-formaat uit de twee groepen bits.

Een voorwaardelijke sprong voert twee bewerkingen parallel uit. De ALU trekt de vergeleken registerwaarden van elkaar af; Zero geeft aan of ze gelijk zijn. De sprongopteller telt de byteoffset met teken op bij de eigen PC van de spronginstructie. De codering van het B-formaat laat de lage bit weg die altijd nul is. ImmGen kan de volledige byteoffset reconstrueren, inclusief die nul; een tekening die in plaats daarvan de offset in eenheden van halve woorden genereert, vereist een verschuiving van één bit naar links. De verschuiving hoort precies één keer in de route thuis.

Voeg de routes samen met multiplexers

ALUSrc selecteert de waarde van rs2 of de onmiddellijke operand voor de tweede ALU-ingang. MemtoReg selecteert het ALU-resultaat of de uitvoer van het datageheugen om naar een register terug te schrijven. PCSrc selecteert PC + 4 of het sprongdoeladres. Twee concurrerende resultaten hebben een selector nodig, geen draad die hun uitgangen rechtstreeks verbindt.

Deze routes verklaren waarom de laadinstructie de langste keten heeft: ophalen, register lezen, adres berekenen, geheugen lezen en register schrijven dragen allemaal bij. Rekenkundige instructies gaan buiten het datageheugen om; een opslaginstructie gaat buiten het terugschrijven naar een register om.

Breid de bestaande routes uit

addi x5, x6, 3 hergebruikt de ALU-route met een onmiddellijke operand als invoer en de route voor het terugschrijven van het ALU-resultaat. De instructie heeft passende besturing nodig, maar geen nieuwe eenheid in het datapad. jal heeft een aanvullende eis: de instructie schrijft PC + 4 naar rd en leidt tegelijk de PC om zonder op gelijkheid te testen. De selector voor het terugschrijven heeft daarom een ingang voor PC + 4 nodig en de logica voor de volgende PC moet een onvoorwaardelijke sprong ondersteunen.

Belangrijkste punten

  • Een laadinstructie schrijft geheugengegevens naar rd; haar ALU-uitvoer is het adres.
  • Een opslaginstructie stuurt rs2 naar het geheugen terwijl de ALU basis en offset optelt.
  • Een voorwaardelijke sprong vergelijkt registerwaarden en berekent parallel PC + offset.
  • ALUSrc, MemtoReg en PCSrc selecteren gedeelde routes.
  • Bij de reconstructie van de byteoffset van het B-formaat wordt de impliciete nulbit precies één keer meegenomen.
  • Optellen met een onmiddellijke operand hergebruikt bestaande hardware; een sprong met opslag van het terugkeeradres heeft ook een route nodig om PC + 4 terug te schrijven.

1.3 Volg de waarden en de toestandsveranderingen

Als je een instructie volgt, verbind je de assembleerbewerking met werkelijke waarden op de draden. Onderscheid waarden die tijdens de cyclus worden berekend van waarden die op de afsluitende klokflank worden opgeslagen.

Gebruik een vaste volgorde
  1. Haal op vanaf de huidige PC en herken de instructievelden.
  2. Lees bronregisters en vorm de onmiddellijke operand met teken.
  3. Selecteer de ALU-operanden en bereken het resultaat.
  4. Voer de gevraagde toegang tot het datageheugen uit.
  5. Selecteer de te schrijven registergegevens en de volgende PC.
  6. Vermeld de schrijfbewerkingen naar toestandselementen op de klokflank.
Tel twee registerwaarden op

Op PC 400 heeft add x5, x6, x7 de codering 0x007302B3. De velden zijn opcode 0110011, rd 5, funct3 000, rs1 6, rs2 7 en funct7 0000000. Met x6 = 25 en x7 = −9 leveren de leespoorten 25 en −9. ALUSrc selecteert de tweede registerwaarde en de ALU produceert 16. MemtoReg selecteert 16 om terug te schrijven. Op de klokflank wordt x5 gelijk aan 16 en de PC gelijk aan 404. MemRead en MemWrite zijn beide nul.

Laad een dubbelwoord en sla er daarna een op

Bekijk op PC 404 de instructie ld x5, 16(x6) met x6 = 1000 en het geheugen op 1016 dat 42 bevat. ImmGen levert 16. De ALU berekent het adres 1016 en het datageheugen levert 42. MemtoReg selecteert die geheugenwaarde, zodat x5 op de klokflank gelijk wordt aan 42 en de PC gelijk aan 408. Als je 1016 naar x5 zou schrijven, zou je het adres verwarren met de waarde die daar is opgeslagen.

Op PC 408 leest sd x5, 24(x6) de waarden x5 = 42 en x6 = 1000. De ALU berekent 1024 terwijl de rs2-route 42 aan het geheugen levert. MemWrite geeft toestemming voor de opslag; RegWrite is nul. Op de klokflank wordt het dubbelwoord op 1024 gelijk aan 42 en de PC gelijk aan 412. Het geheugenadres en de op te slaan waarde gaan over verschillende draden.

De offsets worden gemeten in bytes. Aangrenzende RV64-dubbelwoorden beginnen 8 bytes uit elkaar: na het dubbelwoord op 1016 begint het volgende op 1024. Als je één byte opschuift, bereik je het volgende dubbelwoord niet.

Beslis over een sprong

Op PC 412 vergelijkt beq x8, x9, 12 x8 = 7 met x9 = 7. De ALU trekt af en krijgt nul. Branch is 1, dus Branch AND Zero is 1 en PCSrc selecteert het sprongdoeladres. De sprongopteller produceert 424 door 12 bij 412 op te tellen. Alleen de PC verandert.

Als x9 in plaats daarvan 8 is, levert de aftrekking −1 op en is Zero 0. De volgende PC is dan 416. De gecodeerde offset is uitgedrukt in eenheden van 2 bytes, dus de opgeslagen waarde met teken voor deze verplaatsing van 12 bytes is 6; de volledige verplaatsing die de opteller gebruikt, blijft 12.

Lees de toestand voor de volgende instructie

Elke instructie die in één klokcyclus wordt uitgevoerd, voltooit haar werk tussen opeenvolgende klokflanken. De volgende instructie leest de toestand die op de vorige klokflank is opgeslagen. Zo kan de opslaginstructie de nieuwe x5-waarde van de laadinstructie in de volgende cyclus lezen zonder rechtstreekse doorsturing in een pipeline. Elke instructie duurt één klokcyclus, wat een CPI van 1 oplevert voor uitvoering in één cyclus, ongeacht hoeveel hardware-eenheden de route gebruikt.

Belangrijkste punten

  • Een instructie volgen levert numerieke waarden op de draden op en geeft afzonderlijk de toestandsveranderingen op de klokflank aan.
  • Een rekenkundige instructie schrijft een ALU-resultaat; een laadinstructie schrijft de geheugenuitvoer.
  • Een opslaginstructie verandert het geheugen en de PC, zonder naar de registerbank te schrijven.
  • Bij beq selecteert gelijkheid het doeladres, gemeten vanaf de PC van de spronginstructie.
2

Ontwerp de besturingseenheid voor de processor die elke instructie in één klokcyclus uitvoert

Dezelfde hardware kan twee registers optellen, een geheugenadres berekenen of waarden vergelijken voor een sprong. Besturingssignalen bepalen welke handeling in elke cyclus van belang is. Leid die signalen af uit het werk dat een instructie moet doen, inclusief de schrijfvrijgavesignalen die de opgeslagen toestand beschermen. Volg daarna de twee decoderingsniveaus die een opcode en functiebits omzetten in een specifieke ALU-bewerking en breid het ontwerp uit met optellen met een onmiddellijke operand.

2.1 Leid de hoofdbesturingstabel af

De hoofdbesturingseenheid vertaalt een opcode naar stuursignalen en schrijftoestemmingen. Het is een combinatorische waarheidstabel die met logische poorten is geïmplementeerd: hardbedrade besturing.

Geef elk signaal een taak

RegWrite geeft toestemming om naar rd te schrijven. ALUSrc selecteert de tweede ALU-invoer: 0 voor rs2, 1 voor een onmiddellijke operand. MemRead en MemWrite vragen de bijbehorende toegang tot het datageheugen aan. MemtoReg selecteert de te schrijven registergegevens: 0 voor het ALU-resultaat, 1 voor geheugengegevens. Branch duidt een voorwaardelijke sprong op basis van gelijkheid aan. De 2-bits-ALUOp geeft de afzonderlijke ALU-besturingseenheid aan welke bewerkingsklasse nodig is.

PCSrc is anders: het hangt af van de instructie en de vergeleken waarden. De hoofdbesturing activeert Branch en de ALU levert Zero. Hun AND vormt PCSrc, zodat een gewoon rekenkundig resultaat van nul op zichzelf geen sprong kan veroorzaken.

Stel de tabel op vanuit de vereiste handelingen
KlasseALUSrcMemtoRegRegWriteMemReadMemWriteBranchALUOp
R-type00100010
ld11110000
sd1X001000
beq0X000101

Voor ld heeft de ALU een onmiddellijke offset nodig, dus ALUSrc is 1. De geladen gegevens gaan naar rd, waardoor MemtoReg en RegWrite beide 1 zijn. Het geheugen wordt gelezen, niet beschreven, wat MemRead = 1 en MemWrite = 0 geeft. Branch is 0 en ALUOp = 00 vraagt om optelling voor het adres.

Voor sd telt de ALU ook een offset op, maar het doel is het geheugen. Stel MemWrite = 1 en RegWrite = 0 in. MemRead blijft nul: het geheugen gebruiken betekent niet dat je het leest. Voor beq gebruikt de ALU beide registerwaarden en trekt die van elkaar af, terwijl de enige mogelijke wijziging van de architecturale toestand die van de PC is.

Gebruik onverschillige waarden alleen waar resultaten worden genegeerd

X is een onverschillige waarde: beide selectiewaarden geven hetzelfde gedrag. MemtoReg mag X zijn voor een opslaginstructie of voorwaardelijke sprong omdat RegWrite nul is. De ingang voor te schrijven gegevens van de registerbank wordt genegeerd, zodat de ontwerper de selectiewaarde mag kiezen die de schakeling vereenvoudigt.

Een vrijgavesignaal voor het schrijven van toestand mag niet zo worden behandeld als schrijven verboden is. Een onbedoelde MemWrite tijdens een rekenkundige instructie kan het geheugen beschadigen, ook al heeft de instructie de uitvoer van dat geheugen verder niet nodig. RegWrite en MemWrite moeten daarom expliciet nul zijn voor instructies die deze schrijfbewerkingen niet uitvoeren.

Voeg een rij toe voor rekenen met een onmiddellijke operand

addi x5, x6, 3 haalt de tweede operand uit ImmGen en schrijft de ALU-som. De rij is ALUSrc 1, MemtoReg 0, RegWrite 1, MemRead 0, MemWrite 0, Branch 0, ALUOp 00. De opcode 0010011 verschilt van de R-type-opcode 0110011, dus de hoofdbesturing heeft deze extra rij nodig. Om andi en ori te ondersteunen, moeten ook hun funct3-waarden worden gedecodeerd om de bewerking te selecteren.

Signaalnamen hangen af van het ontwerp. RegWEn, BSel en WBSel in diagrammen van andere cursussen beschrijven verwante taken voor schrijfvrijgave en invoerselectie. Volg de definitie van een signaal en de multiplexeringangen ervan wanneer je een nieuw diagram leest.

Belangrijkste punten

  • De hoofdbesturing leidt routeselecties en schrijfvrijgavesignalen af uit de opcode.
  • PCSrc combineert Branch met de Zero-vlag van de ALU.
  • Een opslaginstructie activeert MemWrite en schakelt RegWrite en MemRead uit.
  • Een selector heeft alleen een onverschillige waarde als de geselecteerde waarde het gedrag niet kan beïnvloeden.
  • addi heeft een nieuwe opcoderij nodig, maar hergebruikt het bestaande datapad voor optellen met een onmiddellijke operand.

2.2 Decodeer de ALU-bewerking op twee niveaus

De opcode alleen kan add niet van sub onderscheiden: beide behoren tot de R-type-klasse. Besturing op twee niveaus herkent eerst de klasse en gebruikt daarna de functiebits waar die van belang zijn.

Van ALUOp naar bewerking

De hoofdbesturing levert naast haar andere uitvoer een 2-bits-ALUOp. De ALU-besturing combineert die met funct3 en instructiebit 30, onderdeel van funct7, om vier besturingsbits voor de bewerking te produceren.

ALUOpAanvullende informatieALU-besturingBewerking
00Functiebits genegeerd0010Optellen
01Functiebits genegeerd0110Aftrekken
10funct3 000, bit 30 = 00010Optellen
10funct3 000, bit 30 = 10110Aftrekken
10funct3 1110000AND
10funct3 1100001OR

Deze codes beschrijven deze ALU-implementatie, geen RISC-V-instructiecoderingen. Laad- en opslaginstructies gebruiken ALUOp 00 omdat ze een basis en een offset optellen. Voorwaardelijke sprongen op basis van gelijkheid gebruiken ALUOp 01 omdat aftrekken Zero oplevert wanneer de operanden gelijk zijn. R-type-instructies gebruiken ALUOp 10 en vereisen verdere decodering.

Volg een gecodeerde aftrekking

sub x5, x6, x7 heeft de codering 0x407302B3. De opcode 0110011 duidt het R-type aan en selecteert ALUOp 10. De funct3 is 000, zodat optellen en aftrekken de mogelijkheden zijn. Bit 30 is 1, afkomstig uit funct7 0100000, dus de ALU-besturing levert 0110 voor aftrekken.

Als je die functiebit in nul verandert, krijg je de bijbehorende add-codering 0x007302B3, met funct7 0000000 en ALU-besturing 0010. De rij van de hoofdbesturing blijft hetzelfde omdat beide instructies twee registeringangen gebruiken, een ALU-resultaat schrijven en het datageheugen niet benaderen.

Hergebruik de opteller voor aftrekken

In de klassieke ALU stellen de besturingslijnen Ainvert, Bnegate en een 2-bitsselector voor de bewerking voor. Aftrekken gebruikt de opteller nadat de tweede operand is geïnverteerd en een inkomende overdracht van 1 is toegevoegd:

a−b=a+b‾+1

Door deze tweecomplementidentiteit kunnen optellen en aftrekken hardware delen. Het verschil in Bnegate verklaart de codes 0010 en 0110; er is geen afzonderlijke rekenkundige route voor elke instructie nodig.

Decodeer bits alleen in het juiste formaat

Bij ALUOp 00 of 01 selecteren de posities van de functievelden de ALU-bewerking niet. De funct3 011 van een laadinstructie beschrijft een toegang tot een dubbelwoord. De hoge bits van opslaginstructies en voorwaardelijke sprongen bevatten bits van een onmiddellijke operand. Als je die posities als R-type-functievelden zou behandelen, zou je adresvorming verwarren met rekenkundige decodering.

Voor een snelle R-type-controle selecteert ALUOp 10 met funct3 110 de code 0001, de OR-bewerking. Om een andere bewerking onder dezelfde opcode toe te voegen, hoeft mogelijk alleen de ALU-besturing te worden aangepast als de ALU die bewerking al ondersteunt. Een nieuwe instructieklasse kan ook wijzigingen in de hoofdbesturing vereisen, zoals bij rekenen met een onmiddellijke operand.

Belangrijkste punten

  • ALUOp selecteert een bewerkingsklasse; functiebits van het R-type ronden de decodering af.
  • ALUOp 00 vraagt om optellen en 01 om aftrekken zonder functiedecodering.
  • In dit ontwerp selecteert 0010 optellen en 0110 aftrekken.
  • Bit 30 onderscheidt add van sub als funct3 000 is.
  • De betekenis van functievelden hangt af van het instructieformaat.
  • Aftrekken met tweecomplement hergebruikt optellen met een geïnverteerde tweede operand en inkomende overdracht 1.
3

Pas pipelining toe op het datapad

Een lange klokperiode voor uitvoering in één cyclus moet lang genoeg zijn voor een laadinstructie, ook als de huidige instructie minder werk vereist. Pipelining verdeelt dat werk in stappen en laat instructies overlappen. Vergelijk de resulterende klokperiode, doorvoer en latentie en volg daarna de gegevens en besturing die tussen de stappen worden opgeslagen. Pipelinediagrammen maken de overlap zichtbaar en bieden een directe manier om het vullen, de stabiele werking en de voltooiing van een korte instructiereeks te tellen.

3.1 Bereken klokperiode, latentie en doorvoer

Een processor die elke instructie in één klokcyclus uitvoert, moet zijn langzaamste instructie vóór de volgende klokflank voltooien. Snellere instructies wachten nog steeds op dezelfde vaste klokperiode. Pipelining verandert hoeveel werk elke klokperiode moet bevatten.

Bepaal de grens bij uitvoering in één cyclus

Gebruik deze onderdeelvertragingen, zonder multiplexers en kleine optellers mee te rekenen: ophalen 250 ps, register lezen 150 ps, ALU 200 ps, datageheugen 250 ps en register schrijven 150 ps.

InstructiePadvertraging
R-type250 + 150 + 200 + 150 = 750 ps
ld250 + 150 + 200 + 250 + 150 = 1000 ps
sd250 + 150 + 200 + 250 = 850 ps
beq250 + 150 + 200 = 600 ps

De laadinstructie vormt het kritieke pad en bepaalt de periode op 1000 ps, ofwel 1 ns. Dat is een klokfrequentie van 1 GHz. Een mix van 25% laadinstructies, 10% opslaginstructies, 50% R-type-instructies en 15% voorwaardelijke sprongen heeft een gewogen padvertraging van 800 ps. Toch krijgt elke instructie 1000 ps, wat 1,25 keer dat gemiddelde is. Een gemiddelde vertraging kan geen klokperiode bepalen die ook lang genoeg moet zijn voor de langste instructie.

Laat vijf stappen overlappen

De pipeline verdeelt de uitvoering in IF (ophalen), ID (decoderen en register lezen), EX (uitvoeren of een adres berekenen), MEM (datageheugen benaderen) en WB (een register schrijven). Verschillende instructies bevinden zich gelijktijdig in verschillende stappen.

Doorvoer telt het aantal voltooide instructies per tijdseenheid. Latentie meet de tijd die één instructie vanaf binnenkomst tot voltooiing doorbrengt. Een lopende band kan per interval één product voltooien, ook als elk product meerdere intervallen nodig heeft om erdoorheen te gaan. Hetzelfde onderscheid geldt hier.

De langzaamste stap duurt 250 ps. Met 20 ps tijdsoverhead van het pipelineregister is de klokperiode 270 ps, ongeveer 3,70 GHz. Eén instructie doorloopt vijf perioden en duurt 1350 ps. Dat is langer dan haar latentie bij uitvoering in één cyclus, maar een volle pipeline kan elke 270 ps een instructie voltooien.

Neem de vul- en voltooiingstijd mee

Zonder wachtcycli voert een pipeline met k stappen n instructies uit in k + n − 1 cycli. Voor vijf stappen is dit n + 4. Vier instructies hebben acht cycli nodig en duren 2160 ps, tegenover 4000 ps in de processor die elke instructie in één klokcyclus uitvoert. De versnellingsfactor is ongeveer 1,85.

Voor 1.000.000 instructies heeft de pipeline 1.000.004 cycli nodig, ongeveer 270,0 μs. Het ontwerp dat elke instructie in één klokcyclus uitvoert, heeft 1000 μs nodig. De versnellingsfactor benadert de verhouding 1000/270, ongeveer 3,70, naarmate de vaste kosten van het vullen en leeglopen klein worden.

Een perfecte vijfvoudige versnelling zou vijf even langzame stappen van 200 ps vereisen zonder registeroverhead of vertragingen door conflicten. Bij ongelijke stappen wachten snellere stappen op de langzaamste. Meer stappen voegen ook overhead toe en kunnen de kosten van conflicten verhogen.

Vaste 32-bitsinstructies in deze deelverzameling vereenvoudigen het ophalen. Vaste registervelden helpen ID en de beperking van toegang tot het datageheugen tot laad- en opslaginstructies past bij adresberekening in EX gevolgd door MEM. Deze eigenschappen van de instructiesetarchitectuur maken de stapgrenzen praktisch.

Belangrijkste punten

  • De langzaamste volledige instructie bepaalt de klokperiode bij uitvoering in één cyclus.
  • De langzaamste stap plus registeroverhead bepaalt de klokperiode van de pipeline.
  • Pipelining verhoogt de doorvoer; de latentie van één instructie kan toenemen.
  • Een conflictvrije reeks van n instructies in een pipeline met vijf stappen duurt n + 4 cycli.
  • Ongelijke stappen, registeroverhead, korte reeksen en conflicten verminderen de versnellingsfactor.

3.2 Voer elke instructie mee door pipelineregisters

Meerdere instructies delen het datapad tegelijk, dus elke stap heeft de waarden van zijn eigen instructie nodig. Pipelineregisters bewaren die waarden en hun besturingssignalen op elke klokflank.

Stem de inhoud af op later werk
RegisterDoorgegeven informatie
IF/IDInstructie en bijbehorende PC
ID/EXBronwaarden, onmiddellijke operand, PC, rs1, rs2, rd, functiebits, besturingssignalen voor EX/MEM/WB
EX/MEMALU-resultaat, Zero, sprongdoeladres, op te slaan waarde, rd, besturingssignalen voor MEM/WB
MEM/WBGeheugengegevens, ALU-resultaat, rd, besturingssignalen voor WB

Elk register is genoemd naar de aangrenzende stappen. Het legt de uitvoer van de eerste stap vast voor gebruik in de tweede. Na WB is er geen extra pipelineregister; WB schrijft de architecturale toestand. De PC levert de toestand aan het begin van het ophalen.

De bovenstaande inhoud van EX/MEM ondersteunt een ontwerp dat de spronginformatie in MEM gebruikt. Een ontwerp dat in EX bepaalt of de sprong wordt genomen, stuurt die informatie eerder terug naar het ophalen. De stap waarin de sprong wordt afgehandeld, bepaalt het aantal extra cycli door het besturingsconflict.

Houd doelregister en gegevens bij elkaar

Een laadinstructie wordt in ID gedecodeerd maar schrijft rd drie cycli later in WB. Op dat moment bevat IF/ID een latere instructie. Als de schrijfpoort rd van die latere instructie zou gebruiken, zou de geladen waarde naar het verkeerde register gaan. Het nummer van het doelregister van de laadinstructie moet daarom naast het resultaat door ID/EX, EX/MEM en MEM/WB worden meegevoerd.

Een opslaginstructie voert op dezelfde manier haar rs2-waarde mee door ID/EX en EX/MEM. Het adres en de gegevens moeten bij dezelfde opslaginstructie horen wanneer ze het datageheugen bereiken. Pipelineregisters bewaren via deze gekoppelde waarden de identiteit van een instructie, ook al zijn er tegelijk meerdere andere instructies actief.

Laat de besturing met de instructie meegaan

De besturing wordt in ID gegenereerd. EX gebruikt ALUSrc en ALUOp; MEM gebruikt Branch, MemRead en MemWrite; WB gebruikt MemtoReg en RegWrite. Elke stap geeft de besturingssignalen die later nodig zijn samen met de gegevens door.

Als de ALU-besturing in EX wordt gedecodeerd, moet ID/EX zowel bit 30 en funct3 als ALUOp meevoeren. R-type-bewerkingen delen ALUOp 10, dus die waarde alleen kan add, sub, AND en OR niet onderscheiden. Een ander geldig ontwerp decodeert de volledige 4-bitsbewerking in ID en voert in plaats daarvan die code mee.

Houd het stappenschema regelmatig

Een R-type-instructie doorloopt MEM zonder het datageheugen te gebruiken. Een opslaginstructie doorloopt WB zonder een register te schrijven. Doordat alle instructies hetzelfde schema met vijf stappen volgen, blijft de volgorde van registerschrijfbewerkingen behouden. Als een R-type-instructie MEM zou overslaan, zou die in dezelfde cyclus als de laadinstructie direct ervoor de enkele schrijfpoort van de registerbank kunnen bereiken.

De registerbank bedient WB en ID in één cyclus door in de eerste helft te schrijven en in de tweede helft te lezen. ID kan dan een waarde zien die een eerdere instructie in die cyclus heeft geschreven. Afzonderlijke instructie- en datageheugens laten IF en MEM gelijktijdig werken.

De meeste informatie gaat vooruit door de pipeline. Bij terugschrijven gaat een resultaat terug naar de registerbank en de sprongbesturing stuurt een beslissing over de volgende PC terug naar het ophalen. Deze lange terugwaartse routes verklaren waarom latere instructies mogelijk hulp nodig hebben voordat een eerdere instructie klaar is.

Belangrijkste punten

  • Pipelineregisters bewaren de gegevens en nog benodigde besturingssignalen van elke instructie.
  • rd gaat naar WB samen met het resultaat dat erin thuishoort.
  • EX heeft de functiebits of een al gedecodeerde ALU-besturingscode nodig.
  • Alle instructies behouden het schema met vijf stappen, ook als een stap geen werk doet.
  • Schrijven in de eerste helft en lezen in de tweede helft laten WB in dezelfde cyclus een waarde aan ID leveren.
  • Afzonderlijke geheugens maken gelijktijdig instructies ophalen en gegevens benaderen mogelijk.

3.3 Lees pipelinediagrammen en tel cycli

Een pipelinediagram maakt overlap zichtbaar. Rijen tonen instructies in programmavolgorde en kolommen tonen klokcycli. Elke cel noemt de stap waarin de instructie zich tijdens die cyclus bevindt.

Bouw een trap

Vul voor vijf onafhankelijke instructies IF in voor I1 in cyclus 1, gevolgd door ID, EX, MEM en WB in cycli 2–5. Start I2 één cyclus later en herhaal dit. De namen van de stappen vormen een diagonale trap.

Instructie123456789
I1IFIDEXMEMWB
I2IFIDEXMEMWB
I3IFIDEXMEMWB
I4IFIDEXMEMWB
I5IFIDEXMEMWB

In cyclus 5 zit I1 in WB, I2 in MEM, I3 in EX, I4 in ID en I5 in IF. Als je een kolom van boven naar beneden leest, krijg je een momentopname van één cyclus. Een rij volgen geeft de geschiedenis van één instructie.

Nummer de stappen van IF = 1 tot en met WB = 5. Zonder wachtcycli bereikt instructie i stap s in cyclus i + s − 1. I3 bereikt MEM dus in cyclus 6. De laatste WB-cel geeft de voltooiingscyclus: vijf instructies zijn klaar in cyclus 9.

Vul een momentopname met waarden

Neem I1 als ld x5, 16(x6), met x6 = 1000 en het geheugen op 1016 dat 42 bevat. Neem I2 als een onafhankelijke optelinstructie, I3 als een onafhankelijke aftrekinstructie en I4 als een onafhankelijke OR-instructie. In cyclus 4 leest de laadinstructie het geheugen op 1016, gebruikt I2 de ALU, leest I3 registers en wordt I4 opgehaald. In cyclus 5 schrijft de laadinstructie 42 naar x5. Een kolom bevat werk van meerdere instructies, niet meerdere stappen van de laadinstructie.

Toon een wachtcyclus zonder eerder werk te stoppen

Gebruik nu ld x10, 0(x20) gevolgd door add x11, x10, x12, en daarna een onafhankelijke instructie. Met rechtstreeks doorsturen heeft de direct volgende verbruikende instructie nog steeds één wachtcyclus nodig:

  • De laadinstructie zit in IF 1, ID 2, EX 3, MEM 4, WB 5.
  • De optelinstructie zit in IF 2, ID 3, opnieuw ID 4, EX 5, MEM 6, WB 7.
  • De derde instructie zit in IF 3, opnieuw IF 4, ID 5, EX 6, MEM 7, WB 8.

De optelinstructie wacht in ID terwijl een lege pipelineplaats door EX gaat. De laadinstructie gaat normaal verder; als je die zou stilzetten, zou de waarde die de optelinstructie nodig heeft juist later beschikbaar komen. Elke latere instructie wordt samen met de optelinstructie vertraagd.

Tel de reeks één keer

Een pipeline met vijf stappen heeft zonder wachtcycli n + 4 cycli nodig. Elke ingevoegde wachtcyclus voegt één cyclus toe, wat n + 4 + wachtcycli geeft als er geen andere verliezen zijn. Het voorbeeld met drie instructies eindigt in cyclus 8: drie instructies, vier extra stapintervallen en één wachtcyclus.

De eerste vier cycli vullen de pipeline en de laatste vier laten die leeglopen. Dit zijn twee manieren om naar hetzelfde schema van n + 4 te kijken, geen twee afzonderlijke toeslagen van vier cycli. Bij een lange reeks is hun vaste bijdrage klein; bij een korte reeks kan die de versnellingsfactor overheersen.

Belangrijkste punten

  • Rijen volgen één instructie; kolommen tonen gelijktijdig werk.
  • Zonder wachtcycli bevindt instructie i zich in stap s tijdens cyclus i + s − 1.
  • Een wachtcyclus herhaalt ID en houdt het ophalen van latere instructies tegen terwijl eerdere instructies verdergaan.
  • Het totale aantal cycli is n + 4 + wachtcycli voor het schema met vijf stappen zonder andere verliezen.
4

Detecteer dataconflicten en los ze op

Door overlappende instructies kan een waarde nodig zijn voordat de producerende instructie die naar de registerbank heeft geschreven. Bepaal voor elke bronoperand de werkelijke producerende instructie en volg daarna de doorstuurroutes die nieuwe resultaten aan latere instructies leveren. Laadinstructies laten de tijdslimiet van rechtstreeks doorsturen zien: hun gegevens komen te laat voor een direct volgende verbruikende instructie. Volg de benodigde wachtcyclus en bekijk hoe het verplaatsen van onafhankelijk werk de vertraging kan wegnemen met behoud van het programmaresultaat.

4.1 Zoek de afhankelijkheden die de uitvoering kunnen vertragen

Een conflict verhindert dat de volgende instructie in de geplande cyclus wordt uitgevoerd. Om een conflict te analyseren, bepaal je welke voorziening of waarde nodig is, in welke cyclus die nodig is en in welke cyclus die beschikbaar komt.

Onderscheid drie soorten conflicten
SoortConflictVoorbeeld
StructuurGelijktijdige vraag naar één voorzieningIF en MEM hebben één geheugen met één poort nodig
DataEen benodigde waarde is niet klaarEen aftrekinstructie heeft het resultaat van de voorgaande optelinstructie nodig
BesturingHet juiste volgende adres is nog niet bepaaldHet ophalen gaat door voordat de sprong is beslist

Afzonderlijke instructie- en datageheugens nemen het structuurconflict tussen IF en MEM weg. Door de registerbank in de eerste helft van een cyclus te schrijven en in de tweede helft te lezen, kunnen ook WB en ID die delen. Met deze inrichting blijft er in dit model met vijf stappen geen structuurconflict over.

Bepaal de werkelijke producerende instructie

Een lees-na-schrijfafhankelijkheid (RAW) bestaat wanneer een latere instructie een waarde leest die door een eerdere instructie is geschreven. In add x1, x2, x3 gevolgd door sub x4, x1, x5 produceert de optelinstructie x1 en gebruikt de aftrekinstructie die waarde. Zonder hulp leest de aftrekinstructie x1 in ID tijdens cyclus 3, voordat de optelinstructie die in WB tijdens cyclus 5 schrijft.

Een schrijf-na-leesafhankelijkheid (WAR) gebruikt een register opnieuw nadat een eerdere instructie het heeft gelezen. Een schrijf-na-schrijfafhankelijkheid (WAW) geeft twee instructies hetzelfde doelregister. Deze naamafhankelijkheden veroorzaken geen conflicten in het ontwerp met vijf stappen dat instructies in volgorde uitvoert: leesbewerkingen gebeuren in ID en schrijfbewerkingen in WB, in programmavolgorde. Ze zijn wel van belang bij de beslissing of software instructies mag herschikken.

Volg een reeks met herhaalde doelregisters

Bekijk:

ld  x5, 0(x10)
add x6, x5, x7
sub x5, x8, x9
or  x9, x6, x5

De RAW-verbanden zijn laden → optellen via x5, optellen → OR via x6 en aftrekken → OR via x5. De OR-instructie heeft de nieuwe x5 van de aftrekinstructie nodig, niet de oudere geladen waarde. Als je alleen naar gelijke registernamen kijkt, kun je deze verandering van producerende instructie missen.

De aftrekinstructie schrijft x5 nadat de optelinstructie x5 leest: een WAR-afhankelijkheid. De laad- en aftrekinstructie hebben ook een WAW-afhankelijkheid op x5. De OR-instructie schrijft x9 nadat de aftrekinstructie die leest: nog een WAR-afhankelijkheid. Geen van deze afhankelijkheden veroorzaakt een WAR- of WAW-hardwareconflict in deze pipeline die instructies in volgorde uitvoert.

Tel wachtcycli zonder rechtstreeks doorsturen

Met alleen de registerbank waarin eerst wordt geschreven en daarna gelezen, heeft een direct volgende verbruikende instructie twee wachtcycli nodig. Die moet haar leesbewerking in ID uitstellen van cyclus 3 naar cyclus 5. Eén onafhankelijke instructie tussen de producerende en verbruikende instructie vermindert dit tot één wachtcyclus. Door twee onafhankelijke instructies bereikt de verbruikende instructie ID in de WB-cyclus van de producerende instructie en is er geen wachtcyclus nodig.

Een afhankelijkheid is een eigenschap van het programma; of die een wachtcyclus veroorzaakt, hangt af van de timing en de beschikbare routes. Een RAW-afhankelijkheid over grotere afstand vereist mogelijk geen actie. Register x0 levert nooit een nog te schrijven resultaat, omdat het bij lezen altijd nul oplevert en schrijfbewerkingen negeert.

Software kan nop-instructies invoegen of onafhankelijk werk naar wachtintervallen verplaatsen. Hardware kan resultaten rechtstreeks doorsturen of automatisch wachtcycli invoegen. Beide aanpakken moeten ervoor zorgen dat elke verbruikende instructie de waarde krijgt die haar producerende instructie in programmavolgorde schrijft.

Belangrijkste punten

  • Structuur-, data- en besturingsconflicten betreffen verschillende soorten conflicten.
  • RAW duidt een producerende instructie aan waarvan een latere instructie de waarde leest.
  • Alleen RAW-afhankelijkheden veroorzaken dataconflicten in dit ontwerp met vijf stappen dat instructies in volgorde uitvoert.
  • De meest recente eerdere schrijvende instructie voor een bronregister levert de benodigde waarde.
  • Zonder rechtstreeks doorsturen wacht een direct volgende verbruikende instructie twee cycli; één tussenliggende instructie vermindert de wachttijd tot één cyclus.
  • WAR en WAW beperken nog steeds welke herschikkingen door software geldig zijn.

4.2 Selecteer de nieuwste beschikbare waarde met rechtstreeks doorsturen

Een ALU-resultaat bestaat voordat het wordt teruggeschreven naar een register. Rechtstreeks doorsturen leidt dat resultaat direct naar de ingang van een latere instructie, zodat niet op de registerbank hoeft te worden gewacht.

Selecteer de bron voor elke operand

Twee multiplexers voeden de uitvoeringsroutes. ForwardA bedient rs1 en ForwardB bedient rs2. Elke operand wordt afzonderlijk gecontroleerd.

SelectiecodeBron van de waarde
00Registerwaarde meegevoerd in ID/EX
10ALU-resultaat meegevoerd in EX/MEM
01Terug te schrijven waarde meegevoerd in MEM/WB

De EX/MEM-route bereikt de direct volgende instructie. De MEM/WB-route bereikt een instructie twee plaatsen verder en kan een ALU-resultaat of geladen gegevens doorgeven. ForwardB voedt ook de route voor op te slaan gegevens voordat ALUSrc tussen die waarde en een onmiddellijke operand kiest.

Controleer toestemming, doelregister en overeenkomst

Voor ForwardA = 10 moet de instructie in EX/MEM RegWrite = 1 hebben, een rd ongelijk aan nul en een rd die gelijk is aan ID/EX.rs1. Vervang rs1 door rs2 voor de ForwardB-controle. Een opslaginstructie of voorwaardelijke sprong mag niet als producerende instructie worden behandeld alleen omdat haar instructiebits toevallig op een doelregisternummer lijken. Schrijfbewerkingen naar x0 mogen ook geen doorgestuurde waarden worden.

Controleer voor ForwardA = 01 op dezelfde manier RegWrite, rd ongelijk aan nul en de overeenkomst van registernummers voor MEM/WB. Gebruik dit oudere resultaat alleen wanneer EX/MEM de vereiste operand nog niet levert. ForwardB volgt onafhankelijk dezelfde voorrangsregel.

Volg één resultaat naar latere verbruikende instructies

Begin met add x1, x2, x3, waarbij x2 = 10 en x3 = 5. De instructie produceert 15 aan het einde van EX in cyclus 3.

  • De volgende instructie, sub x4, x1, x5, bereikt EX in cyclus 4. Met x5 = 3 levert ForwardA = 10 de waarde 15 en geeft de aftrekking 12.
  • and x6, x7, x1 bereikt EX in cyclus 5. ForwardB = 01 haalt x1 uit MEM/WB.
  • or x8, x1, x9 leest registers in ID tijdens cyclus 5, na de schrijfbewerking van de add-instructie in de eerste helft. Er is geen rechtstreekse doorsturing in EX nodig.

Voor deze afhankelijkheden van ALU-resultaten is geen wachtcyclus nodig. De verbruikende instructie ontvangt de waarde wanneer ze de ALU gebruikt, ook als haar eerdere leesbewerking in ID een verouderde waarde opleverde.

Los twee overeenkomende schrijvende instructies op

In drie opeenvolgende instructies add x1, x1, x2, add x1, x1, x3 en add x1, x1, x4 komen zowel EX/MEM als MEM/WB overeen met rs1 van de derde instructie. EX/MEM bevat het resultaat van de tweede add-instructie, de nieuwste x1. MEM/WB bevat het resultaat van de eerste add-instructie en krijgt geen voorrang.

Via dezelfde routes kan add x5, x6, x7 de instructie sd x5, 0(x8) zonder wachtcyclus van gegevens voorzien. De doorgestuurde x5 bereikt de route voor te schrijven geheugengegevens terwijl de ALU van de opslaginstructie de onmiddellijke offset gebruikt.

Rechtstreeks doorsturen kan geen gegevens leveren voordat ze bestaan. EX/MEM bevat bij een laadinstructie haar adres, niet de geladen waarde. De direct volgende verbruikende instructie moet wachten totdat de laadinstructie MEM heeft voltooid; als je het adres zou doorsturen, zou de instructie ongemerkt met de verkeerde grootheid rekenen.

Belangrijkste punten

  • Rechtstreeks doorsturen levert een resultaat direct aan een latere instructie voordat het naar een register wordt teruggeschreven.
  • 00 selecteert ID/EX, 10 selecteert EX/MEM en 01 selecteert MEM/WB.
  • Elke overeenkomst voor doorsturen vereist RegWrite, een rd ongelijk aan nul en een overeenkomend bronnummer.
  • EX/MEM heeft voorrang op MEM/WB voor dezelfde operand.
  • ForwardB kan zowel op te slaan gegevens als een ALU-registeroperand leveren.
  • Een instructie die direct de geladen waarde gebruikt, heeft nog steeds een wachtcyclus nodig omdat de gegevens nog niet klaar zijn.

4.3 Voeg één lege pipelineplaats in of vul de tussenruimte met nuttig werk

Een laadinstructie produceert gegevens aan het einde van MEM. De direct volgende instructie zou die gegevens aan het begin van EX in dezelfde cyclus nodig hebben. Eén wachtcyclus verplaatst de EX-stap van de verbruikende instructie naar de volgende cyclus, wanneer MEM/WB de waarde kan leveren.

Detecteer de ontbrekende waarde in ID

De conflictdetectie-eenheid onderzoekt de instructie in EX en de instructie die wordt gedecodeerd. De basiscontrole is ID/EX.MemRead = 1 en een overeenkomst tussen ID/EX.rd en een van beide bronnummer­velden in IF/ID. Een verfijnde controle sluit rd = x0 uit en controleert welke bronvelden de gedecodeerde instructie werkelijk leest.

Deze laatste controle voorkomt een onnodige wachtcyclus bij een I-type-instructie waarvan de bits van de onmiddellijke operand op de gebruikelijke rs2-positie staan. Ruwe veldposities vergelijken is veilig, maar kan een instructie vertragen die het register niet werkelijk leest.

Houd later werk tegen en laat de laadinstructie doorgaan

De wachtcyclus voert drie samenhangende handelingen uit:

  1. Zet de besturingssignalen die ID/EX ingaan op nul en voeg zo een lege pipelineplaats in.
  2. Stel PCWrite = 0 in om het ophaaladres ongewijzigd te houden.
  3. Stel IF/IDWrite = 0 in om de instructie te behouden die in ID wacht.

De laadinstructie en eerdere instructies gaan verder. De lege pipelineplaats gaat door latere stappen zonder registers of geheugen te schrijven. Als je ID/EX zou stilzetten terwijl de laadinstructie er nog in zit, zou die worden herhaald in plaats van een lege bewerking in te voegen.

Bij ld x10, 0(x20) gevolgd door add x11, x10, x12 zit de laadinstructie in EX en de optelinstructie in ID tijdens cyclus 3. In cyclus 4 zit de laadinstructie in MEM, de lege pipelineplaats in EX en de optelinstructie nog steeds in ID. In cyclus 5 zit de laadinstructie in WB en bereikt de optelinstructie EX met ForwardA = 01.

Plan onafhankelijke instructies

Bekijk:

ld  x10, 0(x20)
ld  x11, 8(x20)
add x12, x10, x11
sd  x12, 24(x20)
ld  x13, 16(x20)
add x14, x10, x13
sd  x14, 32(x20)

Het gebruik van x11 en x13 volgt direct op de bijbehorende laadinstructies. Met rechtstreeks doorsturen veroorzaakt dit twee wachtcycli, wat 7 + 4 + 2 = 13 cycli oplevert. Verplaats ld x13, 16(x20) naar de derde plaats, vóór de eerste optelinstructie. Daarmee komt er ruimte tussen de laadinstructie voor x11 en de verbruikende instructie en staat x13 ver genoeg vóór de verbruikende instructie. De reeks duurt nu 7 + 4 = 11 cycli.

De verplaatsing is geldig omdat de laadinstructie x20 leest en de instructies waarover ze wordt verplaatst dat register niet veranderen. Het doelregister x13 beïnvloedt die instructies niet. Het adres x20 + 16 verschilt van x20 + 24 van de opslaginstructie waarover ze wordt verplaatst. Een laadinstructie mag niet over een opslaginstructie worden verplaatst die mogelijk de bytes schrijft die zij leest. Herschikking moet RAW-, WAR-, WAW- en geheugenafhankelijkheden behouden.

Combineer wachtcycli en rechtstreeks doorsturen

Bij ld x5, 0(x10), add x6, x5, x7, sub x5, x8, x9 en or x9, x6, x5 veroorzaakt alleen het direct opeenvolgende laad-gebruikpaar een wachtcyclus. Wanneer OR EX bereikt, levert ForwardA = 01 de x6 van de optelinstructie en ForwardB = 10 de x5 van de aftrekinstructie. Het totaal is 4 + 4 + 1 = 9 cycli.

Belangrijkste punten

  • Een laad-gebruikpaar heeft met rechtstreeks doorsturen één wachtcyclus nodig.
  • Een wachtcyclus zet de inkomende besturingssignalen van ID/EX op nul en houdt PC en IF/ID vast.
  • De laadinstructie gaat door MEM terwijl de verbruikende instructie in ID wacht.
  • Door onafhankelijk werk te plannen kun je ruimte maken tussen laadinstructies en instructies die hun resultaat gebruiken.
  • Een geldige herschikking behoudt register- en geheugenafhankelijkheden.
  • Selecteer na een wachtcyclus elke doorgestuurde operand uit de bijbehorende werkelijke producerende instructie.
  • Het aantal cycli is gelijk aan het aantal instructies + 4 + wachtcycli voor deze reeksen met vijf stappen.
5

Handel besturingsconflicten af en voorspel sprongen

Door een sprong hangt het adres van de volgende instructie af van werk dat nog in de pipeline zit. Volg wat er gebeurt wanneer het ophalen wacht, het volgende adres voorspelt of herstelt van een verkeerde voorspelling. Volg voorspellers op basis van geschiedenis en onderscheid hun richtingsvoorspellingen van opgeslagen sprongdoeladressen. Combineer tot slot vertragingen door laad-gebruikconflicten en extra cycli door sprongen met de klokperiode om uitvoeringstijden te vergelijken, inclusief de afwegingen bij diepere pipelines.

5.1 Herstel na sprongen en uitzonderingen

Het ophalen heeft elke cyclus een nieuw adres nodig. Een voorwaardelijke sprong levert de juiste keuze pas na de vergelijking en de berekening van het doeladres. Dit tijdsverschil veroorzaakt een besturingsconflict.

Koppel de beslissingsstap aan de vertraging

In een pipeline met vijf stappen waarin na de beslissingsstap wordt omgeleid, gaat bij een verkeerde voorspelling één ophaalplaats verloren als de uitkomst aan het einde van ID bekend is. Een beslissing aan het einde van EX kost er twee; aan het einde van MEM drie. Tijdens die plaatsen zijn al latere instructies binnengekomen.

Eén strategie laat het ophalen wachten totdat over elke sprong is beslist. Dat is eenvoudig, maar zowel genomen als niet-genomen sprongen kosten de volledige wachttijd. Bij voorspellen dat de sprong niet wordt genomen gaat het ophalen daarentegen verder vanaf PC + 4. Een juiste voorspelling vereist geen herstel. Een genomen sprong leidt het ophalen om en gooit de latere instructies op de opeenvolgende route weg.

Volg een genomen sprong

Haal beq x1, x2, 16 op adres 100 op in cyclus 1 en beslis aan het einde van EX in cyclus 3 of de sprong wordt genomen. De voorspelling dat de sprong niet wordt genomen, haalt de adressen 104 en 108 op in cycli 2 en 3. Als de sprong wordt genomen, zijn beide instructies van de verkeerde route. Het ophalen begint in cyclus 4 op 116, na een vertraging van twee cycli.

Door pipeline-instructies ongeldig te maken kunnen die latere instructies de architecturale toestand niet veranderen of uitzonderingen veroorzaken. De implementatie kan pipelineplaatsen ongeldig maken of hun besturingssignalen en gevolgen van uitzonderingen onderdrukken. Een opslaginstructie op de verkeerde route mag nooit daadwerkelijk naar het geheugen schrijven.

Een lege pipelineplaats is niet hetzelfde als een RISC-V-instructie met alleen nullen. De codering met alleen nullen is ongeldig. Als een echte instructiecodering wordt ingevoegd, is de standaard-nop gelijk aan addi x0, x0, 0, gecodeerd als 0x00000013. Een ongeldig gemaakte pipelineplaats stelt daarentegen geen uitgevoerde instructie voor.

Beslis eerder, maar zorg eerder voor operanden

Door de vergelijker en de opteller voor het sprongdoeladres naar ID te verplaatsen, daalt de vertraging door omleiding tot één cyclus. De vergelijking heeft nu bronwaarden in ID nodig, dus alleen de gebruikelijke rechtstreekse doorsturing naar EX is onvoldoende. Met geschikte rechtstreekse doorsturing naar ID wacht een sprong direct na de producerende ALU-instructie één cyclus. Direct na een producerende laadinstructie wacht die twee cycli. Eerder beslissen ruilt minder verloren ophaalplaatsen in voor hogere eisen aan de levering van operanden.

Statische sprongvoorspelling legt vooraf een regel vast. Gebruikelijke regels zijn altijd niet genomen, altijd genomen en achterwaarts genomen/voorwaarts niet genomen. Een achterwaartse sprong onderaan een lus herhaalt de lus vaak, waardoor die richting een nuttige aanwijzing is.

RISC-V heeft geen vertragingsplaats na een sprong. Als een sprong wordt genomen, wordt de opeenvolgende instructie erna niet uitgevoerd alleen omdat die is opgehaald. Sommige oudere MIPS-ontwerpen lieten die volgende instructie uitvoeren als een gedefinieerde instructie op een vertragingsplaats; dat is een andere regel van de instructiesetarchitectuur.

Behoud een precieze uitzonderingsgrens

Een ongeldige instructie of ecall draagt de besturing over aan een afhandelingsroutine. Eerdere instructies worden voltooid; de instructie die de uitzondering veroorzaakt en latere instructies leggen hun normale effecten niet vast. De processor registreert de PC van de betreffende instructie en de oorzaak, met registers zoals sepc/scause in supervisorstand of mepc/mcause in machinestand, en haalt daarna instructies op vanaf de afhandelingsroutine. Deze precieze uitzondering toont de toestand als een grens tussen voltooid eerder werk en niet-voltooid later werk.

Belangrijkste punten

  • Als later wordt bepaald of een sprong wordt genomen, moeten meer latere instructies worden weggegooid.
  • Voorspellen dat een sprong niet wordt genomen, kost alleen extra herstelcycli als de voorspelling verkeerd is.
  • Het ongeldig maken van pipeline-instructies onderdrukt toestandsveranderingen en uitzonderingen op de verkeerde route.
  • Instructiebits die allemaal nul zijn, vormen een ongeldige instructie; de standaard-nop is 0x00000013.
  • Een vroege beslissing in ID vereist ook eerdere operanden en geschikte rechtstreekse doorsturing.
  • RISC-V heeft geen architecturale vertragingsplaats na een sprong.
  • Precieze uitzonderingen behouden voltooid eerder werk en verwerpen de effecten van de veroorzakende en latere instructies.

5.2 Volg sprongvoorspellingen op basis van geschiedenis

Dynamische sprongvoorspelling leert van uitkomsten die worden waargenomen terwijl een programma draait. Een spronggeschiedenistabel bewaart kleine toestandsitems die worden geselecteerd met bits uit een sprongadres. Voorspel eerst, vergelijk later met de werkelijke uitkomst en werk daarna het item bij.

Bekijk waarom één bit tweemaal mist bij een lus

Een 1-bitsvoorspeller bewaart de vorige uitkomst. Als de laatste sprong werd genomen, voorspelt de voorspeller dat die de volgende keer wordt genomen; anders voorspelt die dat de sprong niet wordt genomen. Bij een herhaaldelijk uitgevoerde lus waarvan de sprong negen keer wordt genomen en daarna één keer niet, blijft de bit na het verlaten van de lus op niet genomen staan.

Bij de volgende uitvoering wordt de eerste genomen sprong verkeerd voorspeld. De tussenliggende genomen sprongen trainen de bit op genomen, zodat ook het uiteindelijke verlaten van de lus met een niet-genomen sprong verkeerd wordt voorspeld. In de stabiele toestand zijn dat twee fouten in tien uitkomsten, ofwel 80% nauwkeurigheid.

Voeg een tweede bit toe voor meer bestendigheid

Een 2-bits-verzadigende teller heeft toestanden 0 tot en met 3. Toestanden 0 en 1 voorspellen niet genomen; 2 en 3 voorspellen genomen. Een genomen uitkomst verhoogt de teller en een niet-genomen uitkomst verlaagt die. De waarden stoppen bij 0 en 3.

ToestandNaamVoorspelling
0Sterk niet genomenNiet genomen
1Zwak niet genomenNiet genomen
2Zwak genomenGenomen
3Sterk genomenGenomen

Vanuit toestand 3 brengt één niet-genomen sprong bij het verlaten van de lus de toestand naar 2, die nog steeds genomen voorspelt. De eerste sprong bij de volgende uitvoering van de lus wordt daarom correct voorspeld. Dezelfde lus met tien uitkomsten heeft in de stabiele toestand één fout per uitvoering, ofwel 90% nauwkeurigheid. Vanuit een sterke toestand zijn twee opeenvolgende tegengestelde uitkomsten nodig om een voorspelling om te keren.

Volg eerst de voorspelling en werk daarna bij

Begin in toestand 1 en observeer genomen, genomen, niet genomen, genomen:

  1. Toestand 1 voorspelt niet genomen: fout. Verhoog naar 2.
  2. Toestand 2 voorspelt genomen: goed. Verhoog naar 3.
  3. Toestand 3 voorspelt genomen: fout. Verlaag naar 2.
  4. Toestand 2 voorspelt genomen: goed. Verhoog naar 3.

Er zijn twee fouten en de eindtoestand is 3. Als je vóór het voorspellen zou bijwerken, zou de voorspeller ten onrechte toegang krijgen tot de uitkomst die hij moet voorspellen.

Onderscheid richting, doeladres en verstoring

Twee sprongadressen kunnen hetzelfde item in de spronggeschiedenistabel indexeren. Door deze aliasing kunnen hun uitkomsten elkaar verstoren. Een verkeerde voorspelling kost cycli, maar bij het herstel wordt de werkelijke uitkomst gecontroleerd en blijft de correctheid behouden.

Een sprongdoelbuffer levert een adres, niet alleen een richtingsbit. De buffer wordt tijdens IF met de PC geraadpleegd en kan vóór de decodering het voorspelde doeladres van een genomen sprong leveren voor de volgende ophaalcyclus. De richtingsvoorspelling bepaalt of dat doeladres wordt gebruikt.

Eenvoudige geschiedenis heeft grenzen. Bij een strikt afwisselend patroon van genomen/niet genomen blijft een 1-bitsvoorspeller verkeerd voorspellen zodra die het patroon volgt. Een 2-bitsteller heeft het hoogstens de helft van de keren goed; als die vóór een genomen uitkomst in toestand 1 begint, zit die er elke keer naast. Correlerende sprongvoorspellers voegen recente spronggeschiedenis toe, toernooivoorspellers kiezen tussen voorspellers en een terugkeeradresstack voorspelt doeladressen van terugkerende procedures. Diepere pipelines maken herstel duurder omdat zich vóór de beslissing meer later werk ophoopt.

Belangrijkste punten

  • Een 1-bitsvoorspeller herhaalt de laatste uitkomst.
  • Een 2-bitsteller voorspelt genomen in toestanden 2 en 3 en verzadigt bij 0 en 3.
  • De voorspelling gebruikt de oude toestand; bijwerken volgt op de werkelijke uitkomst.
  • Twee bits voorkomen de fout bij het opnieuw ingaan van de lus die door één keer verlaten ontstaat.
  • Door aliasing in de spronggeschiedenistabel kunnen verschillende sprongen hetzelfde geschiedenisitem verstoren.
  • Een sprongdoelbuffer levert een voorspeld doeladres; de richtingsvoorspelling kiest of dat wordt gebruikt.

5.3 Reken conflictfrequenties om naar uitvoeringstijd

De snelheid van een pipeline hangt af van zowel de klokperiode als de cycli die aan wachten of herstel worden besteed. Effectieve CPI meet die extra cycli gemiddeld over de instructiestroom.

Weeg elke kostenpost naar de getroffen instructies

Begin voor een lange reeks waarbij maximaal één instructie per cyclus wordt uitgegeven met de ideale CPI 1. Tel elke afzonderlijke, niet-overlappende oorzaak van verloren cycli erbij op als fractie getroffen instructies maal verloren cycli per gebeurtenis. Een voorwaardelijke fractie heeft ook de bovenliggende fractie nodig.

Stel dat 25% van de instructies laadinstructies zijn en 40% van die laadinstructies een direct volgende verbruikende instructie heeft. Elk zo'n paar veroorzaakt één wachtcyclus, dus de bijdrage van laad-gebruikconflicten is 0,25 × 0,40 × 1 = 0,10 cycli per instructie. Stel dat 15% voorwaardelijke sprongen zijn, 10% daarvan verkeerd wordt voorspeld en herstel twee cycli kost. De bijdrage van sprongen is 0,15 × 0,10 × 2 = 0,03.

Als je de onafhankelijke kosten optelt, krijg je CPI = 1 + 0,10 + 0,03 = 1,13. Als je elke laadinstructie één wachtcyclus zou aanrekenen, zou dat 0,25 in plaats van 0,10 opleveren. Als je de 10% verkeerd voorspelde sprongen op elke instructie zou toepassen, zou je op dezelfde manier te veel tellen.

Neem klokperiode en aantal instructies mee

Uitvoeringstijd is gelijk aan aantal uitgevoerde instructies × CPI × klokperiode. Een klokfrequentie van 4 GHz heeft een periode van 0,25 ns. Voor 10⁹ instructies met CPI 1,13 duurt de uitvoering 10⁹ × 1,13 × 0,25 ns = 0,2825 s. De gemiddelde tijd per instructie is 0,2825 ns.

Tel voor een korte reeks de cycli voor vullen, leeglopen en conflicten expliciet. De ideale basis-CPI van 1 beschrijft de stabiele doorvoer; een pipeline met vijf stappen die maar enkele instructies uitvoert, heeft ook een bijdrage van vier cycli voor vullen en voltooien.

Vergelijk sprongstrategieën onder gelijke voorwaarden

Houd de kosten van laad-gebruikconflicten op 0,10, de sprongfractie op 0,15 en de vertraging op twee cycli:

SprongstrategieKosten van sprongenEffectieve CPI
Wachten bij elke sprong0,15 × 2 = 0,301,40
Niet genomen voorspellen, 60% genomen0,15 × 0,60 × 2 = 0,181,28
Dynamisch, 90% nauwkeurig0,15 × 0,10 × 2 = 0,031,13

Bij dezelfde klokperiode en hetzelfde aantal instructies is dynamische voorspelling ongeveer 1,24 keer zo snel als wachten, omdat 1,40/1,13 ≈ 1,24.

Vergelijk verschillende processors met CPI × periode. Een ontwerp dat elke instructie in één klokcyclus van 1000 ps uitvoert, kost 1000 ps per instructie. Een pipeline met 270 ps en CPI 1,13 kost 305,1 ps per instructie, een versnellingsfactor van ongeveer 3,28. Een vergelijking op basis van alleen CPI zou de CPI van 1 bij uitvoering in één cyclus bevoordelen en tot de verkeerde conclusie leiden.

Begrijp de volgende ontwerpafweging

Meer pipelinestappen kunnen het combinatorische werk per cyclus verkorten. Ze voegen ook registeroverhead toe en kunnen de extra cycli door laad-gebruikconflicten en verkeerde voorspellingen verhogen. De klokfrequentie alleen kan niet bepalen of het diepere ontwerp wint.

Meervoudige instructie-uitgifte start meerdere instructies per cyclus, waardoor een CPI onder 1 en meer dan 1 instructie per cyclus (IPC) mogelijk zijn. De compiler kiest groepen voor statische uitgifte; de hardware kiest bij dynamische uitgifte, of superscalaire uitvoering, en gebruikt daarbij vaak speculatie en uitvoering buiten programmavolgorde. Gegevensafhankelijkheden en sprongvoorspelling begrenzen nog steeds de bruikbare overlap.

Belangrijkste punten

  • Bereken de gemiddelde kosten van elk conflict over alle instructies en neem bij voorwaardelijke fracties ook de bovenliggende fractie mee.
  • Tel afzonderlijke bijdragen van verloren cycli op bij de ideale CPI 1 voor lange instructiestromen met maximaal één uitgifte per cyclus.
  • Uitvoeringstijd is aantal uitgevoerde instructies × CPI × klokperiode.
  • Vergelijk verschillende processors met CPI × periode, niet met alleen CPI.
  • Diepere pipelines ruilen kortere stappen in voor meer overhead en hogere kosten door conflicten.
  • Meervoudige instructie-uitgifte kan een IPC boven 1 en een CPI onder 1 bereiken.

Datapad en pipelining: voorbeelden

5 Walkthroughs

1

Volg een instructie van ophalen tot opgeslagen resultaat

14 stappen
Bouw de gedeelde routes voor uitvoering in één klokcyclus en volg een rekenkundige instructie, een laad- en opslaginstructie en een voorwaardelijke sprong met concrete waarden.
  1. 1
    IntroductieZet instructiebits om in opgeslagen waarden

    Een instructie geeft werk aan, zoals registerwaarden optellen of gegevens laden. De processor heeft hardware nodig die dat werk doet en besturingssignalen die de juiste routes selecteren.

    Volg het datapad dat elke instructie in één klokcyclus uitvoert van de opslagelementen tot de uitgangen. Volg daarna een korte reeks en bepaal precies wat op elke afsluitende klokflank verandert. Elke instructie in deze deelverzameling neemt 4 bytes in.

  2. 2
    UitlegBegin met het opgeslagen instructieadres

    De PC bevat het huidige instructieadres. Het instructiegeheugen levert de instructie op dat adres en een afzonderlijke opteller berekent tegelijk PC + 4.

    De PC is een toestandselement: die behoudt zijn waarde tijdens de cyclus. De opteller is combinatorisch: de uitvoer volgt de invoer. Op de afsluitende klokflank legt de PC het volgende adres vast dat de ingangsmultiplexer selecteert.

  3. 3
    UitlegLees de operanden en vorm de onmiddellijke operand

    De registerbank leest rs1 en rs2 via twee poorten. De schrijfpoort verandert rd alleen wanneer RegWrite toestemming geeft om op de klokflank te schrijven; x0 levert bij lezen altijd nul op.

    ImmGen reconstrueert een onmiddellijke operand en past tekenuitbreiding toe tot 64 bits. Door de tekenbit te kopiëren blijft een negatieve offset negatief. Voor de 12-bitswaarde 1111 1111 1000 is het resultaat −8, niet de met nuluitbreiding verkregen waarde 4088.

  4. 4
    KernpuntOnderscheid een berekend resultaat van een opgeslagen resultaat

    De ALU telt op, trekt af of voert AND of OR uit volgens haar besturingsingang. De Zero-vlag geeft aan of het resultaat nul is. Multiplexers selecteren uit mogelijke invoerwaarden en schrijfvrijgavesignalen bepalen welke geselecteerde waarden opgeslagen toestand worden.

    Een eenheid kan een ongebruikte uitvoer berekenen zonder het programma te veranderen. Een vrijgavesignaal voor schrijven naar het geheugen is anders: als je dat activeert, kan een waarde worden opgeslagen, ook als die schrijfbewerking nooit bedoeld was.

  5. 5
    UitdagingWelk onderdeel onthoudt de waarde?

    Een opteller voor het sprongdoeladres berekent 740 terwijl de PC nog 720 bevat. Welke eenheid bewaart vóór de actieve klokflank het huidige instructieadres en verandert het berekende doeladres zelf dat adres?

    ---reveal---

    De PC bewaart 720. De opteller berekent alleen een mogelijk doeladres. De PC verandert wanneer de geselecteerde volgende waarde op de klokflank wordt vastgelegd; een mogelijke waarde op een niet-geselecteerde ingang overschrijft die niet.

  6. 6
    UitlegLeid rekenkundige en geheugenbewerkingen door het datapad

    Een R-type-bewerking leest twee registerwaarden, stuurt ze door de ALU en geeft het resultaat terug aan rd. Een laadinstructie heeft daarentegen een adres op basis van basis plus offset nodig en vervolgens de geheugenwaarde op dat adres.

    Een opslaginstructie berekent op dezelfde manier een adres, maar rs2 levert de te schrijven gegevens. De gegevensroute naar het geheugen moet beschikbaar blijven terwijl ALUSrc een onmiddellijke operand selecteert voor de tweede ALU-ingang.

  7. 7
    UitlegKies de gedeelde verbindingen

    Drie selectors voegen de routes samen:

    • ALUSrc kiest rs2 of de onmiddellijke operand voor de ALU.
    • MemtoReg kiest het ALU-resultaat of geheugengegevens voor rd.
    • PCSrc kiest PC + 4 of het sprongdoeladres.

    Een laadinstructie stelt ALUSrc in op 1 en MemtoReg op 1. Een opslaginstructie gebruikt ook de adresroute met een onmiddellijke operand, maar schakelt het terugschrijven naar een register uit en geeft toestemming om naar het geheugen te schrijven.

  8. 8
    TipBereken een sprongdoeladres één keer

    Bij beq test een aftrekking de gelijkheid terwijl een afzonderlijke opteller de PC van de spronginstructie + byteoffset met teken vormt. Deze berekeningen kunnen parallel verlopen.

    De codering van het B-formaat laat de lage nulbit van de offset weg. ImmGen kan de volledige byteoffset reconstrueren, of een externe verschuiving kan die bit leveren. Als de volledige byteoffset eenmaal bestaat, zou opnieuw verschuiven de verplaatsing verdubbelen.

  9. 9
    UitdagingOnderscheid het opslagadres van de op te slaan gegevens

    Bij sd x11, 32(x18) bevat x18 de waarde 2400 en x11 de waarde 55. Wat zijn het ALU-resultaat en de naar het geheugen te schrijven gegevens?

    ---reveal---

    De ALU berekent het adres 2432 uit 2400 + 32. De naar het geheugen te schrijven gegevens zijn 55, geleverd door x11. Als je 55 in plaats van de offset naar de ALU zou sturen, zou die een ongerelateerd adres berekenen; selectie van de onmiddellijke operand moet de route voor op te slaan gegevens intact laten.

  10. 10
    VoorbeeldVolg een optelinstructie tot de klokflank

    Op PC 400 leest add x5, x6, x7 de waarden x6 = 25 en x7 = −9. ALUSrc selecteert de tweede registerwaarde, de ALU telt op en MemtoReg selecteert de resulterende 16.

    Op de klokflank slaat RegWrite 16 op in x5 en wordt de PC gelijk aan 404. Het datageheugen wordt niet gelezen en niet beschreven.

  11. 11
    VoorbeeldVolg een laad- en daarna een opslaginstructie

    Op PC 404 gebruikt ld x5, 16(x6) de waarde x6 = 1000 en leest adres 1016, waarvan het dubbelwoord 42 bevat. De ALU levert 1016; het geheugen levert 42, dat MemtoReg selecteert voor x5. De PC gaat naar 408.

    De volgende instructie sd x5, 24(x6) berekent adres 1024 en schrijft de bijgewerkte x5-waarde, 42. De instructie laat de PC naar 412 gaan zonder een register te schrijven.

  12. 12
    VoorbeeldBepaal het volgende instructieadres

    Op PC 412 leest beq x8, x9, 12 twee waarden van 7. Aftrekken geeft nul en de doeladresopteller geeft 424. Branch AND Zero selecteert 424 als volgende PC.

    Als x9 gelijk was aan 8, zou aftrekken −1 geven en zou de PC naar 416 gaan. In geen van beide gevallen wordt een algemeen register of het datageheugen beschreven. De vergelijking bepaalt welk mogelijk adres wordt opgeslagen.

  13. 13
    UitdagingOnderzoek de verkeerde waarde in het doelregister

    Een correcte ld x10, 8(x20) met x20 = 3200 leest het dubbelwoord 91 op 3208. Een defecte multiplexer voor terugschrijven zorgt er daarentegen voor dat x10 = 3208 wordt. Wat heeft de multiplexer geselecteerd en wat moet die selecteren?

    ---reveal---

    De multiplexer selecteerde het ALU-resultaat, het adres 3208. Die moet de uitvoer van het datageheugen selecteren, 91. De adresberekening kan correct zijn terwijl de uiteindelijke toestand verkeerd is omdat het terugschrijven de verkeerde bron koos.

  14. 14
    SamenvattingKoppel elke schrijfbewerking naar een toestandselement aan de route

    Onderscheid voor een volledig verloop in één cyclus het rekenkundige resultaat, het effectieve adres, de geheugengegevens en de volgende PC. Laad- en rekenkundige instructies schrijven rd via verschillende multiplexeringangen; opslaginstructies gebruiken een afzonderlijke gegevensroute; voorwaardelijke sprongen selecteren alleen het volgende instructieadres.

    Ze gebruiken allemaal dezelfde klokgrens: combinatorisch werk produceert mogelijke waarden tijdens de cyclus en vrijgegeven schrijfbewerkingen naar toestandselementen leggen de geselecteerde waarden aan het einde ervan vast.

2

Leid de besturing af uit het werk dat een instructie vereist

11 stappen
Stel een besturingsrij voor een laadinstructie op, onderbouw onverschillige waarden en decodeer rekenkundige R-type-instructies met ALUOp en functiebits.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieLaat het gedeelde datapad de instructie uitvoeren
  2. 2
    VoorbeeldLeid een rij voor een laadinstructie af uit de gegevensroute
  3. 3
    UitlegBescherm de toestand met vastgelegde schrijfvrijgavesignalen
  4. 4
    KernpuntLaat gegevens de sprongbeslissing voltooien
  5. 5
    UitdagingKies de onschuldige niet-vastgelegde instelling
  6. 6
    UitlegGebruik ALUOp om een bewerkingsklasse te selecteren
  7. 7
    VoorbeeldVolg de functiebits voor aftrekken
  8. 8
    VerbandHergebruik de opteller voor aftrekken
  9. 9
    UitdagingGeef de bits van een laadinstructie hun juiste rol
  10. 10
    UitdagingBreid de besturing uit zonder een adresroute toe te voegen
  11. 11
    SamenvattingVerbind toestemmingen met decodering
3

Bekijk hoe onafhankelijke instructies overlappen

15 stappen
Bereken een klokperiode voor de pipeline, volg waarden door stapregisters en lees voltooiingstijden af uit het schema met vijf stappen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieOnderscheid één instructie van de instructiestroom
  2. 2
    VoorbeeldZoek de langzaamste volledige instructie
  3. 3
    VoorbeeldBepaal de klokperiode van de pipeline met de langzaamste stap
  4. 4
    AnalogieVergelijk doorvoer en latentie
  5. 5
    UitdagingBereken een korte reeks
  6. 6
    UitlegVoer de instructie mee, niet alleen het resultaat
  7. 7
    VoorbeeldHoud het doelregister bij een laadinstructie
  8. 8
    UitlegVoer de besturingssignalen mee totdat hun stap ze gebruikt
  9. 9
    UitdagingWaarom de ongebruikte MEM-plaats behouden?
  10. 10
    VoorbeeldBouw een trap van stappen
  11. 11
    TipBepaal een stap zonder elke cel te tekenen
  12. 12
    VoorbeeldVoeg een wachtcyclus in zonder eerder werk te herhalen
  13. 13
    UitdagingLees de vertraagde voltooiing af
  14. 14
    UitdagingCombineer opslag met een momentopname van een cyclus
  15. 15
    SamenvattingLees prestaties af uit het schema
4

Volg de nieuwste waarde door een wachtende pipeline

17 stappen
Herken producerende instructies, selecteer bronnen voor rechtstreeks doorsturen, voeg een lege pipelineplaats in bij een laad-gebruikconflict en controleer een verplaatsing in de instructieplanning.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieZoek waar de benodigde waarde bestaat
  2. 2
    UitlegOnderscheid conflicten naar hun oorzaak
  3. 3
    VoorbeeldBepaal de producerende instructie voor elke leesbewerking
  4. 4
    UitdagingVeroorzaakt hergebruik van een register een hardwareconflict?
  5. 5
    UitlegLever een ALU-resultaat vóór het terugschrijven
  6. 6
    TipControleer elke overeenkomst voor doorsturen
  7. 7
    VoorbeeldLos twee overeenkomende schrijvende instructies op
  8. 8
    UitdagingStuur twee operanden onafhankelijk rechtstreeks door
  9. 9
    VerbandBehoud de afzonderlijke route voor op te slaan gegevens
  10. 10
    UitlegBekijk de tijdslimiet van rechtstreeks doorsturen
  11. 11
    UitlegHoud de verbruikende instructie vast en voeg een lege pipelineplaats in
  12. 12
    VoorbeeldVolg het wachten over drie cycli
  13. 13
    TipLaat de detector werkelijke bronnen lezen
  14. 14
    VoorbeeldVerplaats nuttig werk naar de tussenruimte
  15. 15
    UitdagingControleer de verplaatsing voordat je de winst telt
  16. 16
    UitdagingCombineer de lege pipelineplaats met later rechtstreeks doorsturen
  17. 17
    SamenvattingKies hulp op basis van het moment waarop de waarde ontstaat
5

Herstel de instructiestroom en meet de kosten

19 stappen
Volg een genomen sprong, vergelijk voorspellingstoestanden en combineer conflictfrequenties met de klokperiode om de uitvoeringstijd te schatten.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieHoud nuttig werk op de juiste route
  2. 2
    UitlegTel de ophaalplaatsen van latere instructies
  3. 3
    VoorbeeldVolg een genomen sprong bij voorspelling dat die niet wordt genomen
  4. 4
    TipGooi werk weg zonder een ongeldige instructie uit te voeren
  5. 5
    UitlegWeeg een eerdere beslissing af tegen eerder benodigde operanden
  6. 6
    UitdagingBescherm de toestand na een verkeerde voorspelling
  7. 7
    VerbandBehoud de uitzonderingsgrens
  8. 8
    UitlegGebruik geschiedenis om de richting te voorspellen
  9. 9
    UitlegLaat twee bits de zekerheid behouden
  10. 10
    VoorbeeldVolg de voorspelling vóór het bijwerken
  11. 11
    UitdagingTest twee tegengestelde uitkomsten
  12. 12
    UitlegOnderscheid richting en doeladres
  13. 13
    KernpuntHerken verstoring en beperkingen bij patronen
  14. 14
    VoorbeeldReken voorwaardelijke fracties om naar kosten per instructie
  15. 15
    VoorbeeldNeem de duur van een cyclus mee
  16. 16
    VoorbeeldVergelijk voorspellingsstrategieën
  17. 17
    UitdagingVind de ontbrekende sprongfractie
  18. 18
    UitdagingBeoordeel een diepere pipeline
  19. 19
    SamenvattingMeet nuttige overlap na herstelkosten

Datapad en pipelining: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Volg waarden en besturingssignalen10 Oefenvragen

Vraag 1 van 10

Welke schakeling bewaart het instructieadres tussen klokcycli?
  1. De generator voor onmiddellijke operanden
  2. De opteller voor het sprongdoeladres
  3. De programmateller
  4. De ALU-multiplexer
Toon antwoordVerberg antwoord
Antwoord: C
De programmateller is een toestandselement en bewaart het instructieadres dus over cycli heen. Een opteller voor het sprongdoeladres kan een mogelijk volgend adres berekenen, maar slaat dat adres niet op. De PC legt de geselecteerde volgende waarde vast op de actieve klokflank.

Vraag 2 van 10

Waar komt bij sd x14, 40(x9) de waarde vandaan die naar het geheugen wordt geschreven?
  1. De waarde in x14
  2. De waarde in x9
  3. De onmiddellijke operand 40
  4. De adresuitvoer van de ALU
Toon antwoordVerberg antwoord
Antwoord: A
De opslaginstructie schrijft de waarde die uit rs2 wordt gelezen, dus uit x14. Register x9 levert de basis voor de adresberekening en 40 is de byteoffset. De ALU telt basis en offset op om het doeladres te bepalen; dat adres staat los van de waarde die naar het geheugen wordt gestuurd.

Vraag 3 van 10

Op PC 640 wordt ld x12, -16(x8) uitgevoerd met x8 = 2080 en een dubbelwoordwaarde van −6 op adres 2064. Wat zijn x12 en de PC na voltooiing?
  1. x12 = 2064; PC = 644
  2. x12 = −6; PC = 624
  3. x12 = 2080; PC = 644
  4. x12 = −6; PC = 644
Toon antwoordVerberg antwoord
Antwoord: D
De ALU vormt adres 2064 door −16 bij 2080 op te tellen. De laadinstructie schrijft de geheugenwaarde, −6, naar x12 en verhoogt de PC van de instructie met 4 naar 644. Als je 2064 naar x12 schrijft, verwar je het berekende adres met de gegevens die vanaf dat adres worden teruggegeven.

Vraag 4 van 10

Een beq x16, x17, -24 op adres 880 vergelijkt twee registers die beide 11 bevatten. Welk adres wordt hierna opgehaald?
  1. 860
  2. 856
  3. 884
  4. 904
Toon antwoordVerberg antwoord
Antwoord: B
De registerwaarden zijn gelijk, dus de sprong wordt genomen. Tel de byteverplaatsing met teken op bij de PC van de spronginstructie: 880 − 24 geeft 856. Vanaf PC + 4 beginnen zou 860 geven, maar de sprongverplaatsing wordt gemeten vanaf de spronginstructie zelf.

Vraag 5 van 10

Waarom kan MemtoReg voor beq een onverschillige waarde zijn?
  1. MemRead is 0, dus elke besturingswaarde wordt genegeerd.
  2. RegWrite is 0, dus de geselecteerde waarde wordt genegeerd.
  3. Branch is 1, dus de registerbank wordt overschreven.
  4. Zero is 1, dus beide ingangen voor terugschrijven zijn gelijk.
Toon antwoordVerberg antwoord
Antwoord: B
MemtoReg selecteert alleen te schrijven registergegevens en RegWrite = 0 verhindert dat een voorwaardelijke sprong een register schrijft. De selectie heeft dus geen effect. MemRead = 0 maakt niet alle besturingssignalen irrelevant: een onjuist schrijfvrijgavesignaal kan de opgeslagen toestand nog steeds veranderen.

Vraag 6 van 10

Een instructie heeft de R-type-opcode, funct3 000 en bit 30 = 1. Welke ALUOp en ALU-besturingscode produceert dit ontwerp?
  1. ALUOp 01; ALU-besturingscode 0110
  2. ALUOp 10; ALU-besturingscode 0010
  3. ALUOp 00; ALU-besturingscode 0010
  4. ALUOp 10; ALU-besturingscode 0110
Toon antwoordVerberg antwoord
Antwoord: D
De R-type-opcode geeft eerst ALUOp 10. De functiedecodering gebruikt daarna funct3 000 en bit 30 = 1 om aftrekken te selecteren, code 0110. ALUOp 01 vraagt ook om aftrekken, maar is de instelling voor de sprongklasse en wordt niet door deze R-type-opcode gegenereerd.

Vraag 7 van 10

Een 12-bits onmiddellijke operand bevat 1111 1111 0000. Welke waarde met teken moet ImmGen aan het 64-bitsdatapad leveren?
  1. −16
  2. 4080
  3. −15
  4. 240
Toon antwoordVerberg antwoord
Antwoord: A
De voorste tekenbit is 1, dus dit is een negatieve onmiddellijke operand in tweecomplement. De 12-bitswaarde zonder teken is 4080; als je 4096 aftrekt, krijg je −16, wat door tekenuitbreiding behouden blijft. Nuluitbreiding zou ten onrechte de waarde zonder teken 4080 behouden.

Vraag 8 van 10

Een ld x15, 32(x18) die in één klokcyclus wordt uitgevoerd, heeft x18 = 3000 en het geheugen op 3032 bevat 77. Een besturingsfout verandert alleen MemtoReg van 1 naar 0. De volgende instructie is sd x15, 48(x18). Welke waarde schrijft die opslaginstructie en waar?
  1. 77 op adres 3048
  2. 3032 op adres 3032
  3. 3032 op adres 3048
  4. 77 op adres 3080
Toon antwoordVerberg antwoord
Antwoord: C
De defecte laadinstructie selecteert haar ALU-adres, 3032, als terug te schrijven gegevens, zodat x15 gelijk wordt aan 3032. De volgende opslaginstructie berekent haar eigen adres als 3000 + 48 = 3048 en schrijft daar die x15-waarde. Om 77 op te slaan had de laadinstructie de geheugengegevens correct moeten selecteren.

Vraag 9 van 10

Een voorwaardelijke sprong op PC 1200 vergelijkt gelijke registers. De gereconstrueerde byteoffset met teken is −32, maar een defecte sprongroute verschuift die volledige offset vóór het optellen nog eenmaal naar links. Welke volgende PC ontstaat en wat had die moeten zijn?
  1. 1168 in plaats van 1136
  2. 1136 in plaats van 1168
  3. 1140 in plaats van 1172
  4. 1264 in plaats van 1232
Toon antwoordVerberg antwoord
Antwoord: B
De gereconstrueerde offset bevat de impliciete lage nulbit al. De extra verschuiving verdubbelt −32 ten onrechte tot −64, wat 1136 oplevert; het juiste doeladres is 1200 − 32 = 1168. Optellen vanaf PC + 4 zou een andere fout opleveren die deze vraag niet beschrijft.

Vraag 10 van 10

Een ontwerper voegt onder de bestaande R-type-opcode een ondersteunde bitsgewijze R-type-bewerking toe. De gegevensroutes en schrijfbewerkingen naar toestandselementen komen overeen met die van andere R-type-bewerkingen en de ALU implementeert de bewerking al. Welke wijziging in de decodering is nodig?
  1. Breid de ALU-functiedecodering uit.
  2. Voeg een nieuwe opcodebesturingsrij toe.
  3. Hergebruik de besturingsrij voor laden.
  4. Stel MemtoReg in op selectie van geheugen.
Toon antwoordVerberg antwoord
Antwoord: A
De nieuwe bewerking deelt de bestaande R-type-rij van de hoofdbesturing, omdat ze nog steeds registers leest en een ALU-resultaat schrijft. Haar functiebits hebben een decoderingsitem nodig dat de bestaande ALU-bewerking selecteert. Voor een nieuwe instructieklasse zou een nieuwe opcoderij nodig zijn, maar deze uitbreiding introduceert die niet.
Set 2: Lees het schema met vijf stappen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke prestatiegrootheid telt het aantal voltooide instructies per tijdseenheid?
  1. Instructielatentie
  2. Doorvoer
  3. Klokcycluslatentie
  4. Pipelinediepte
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Waarom moet het rd-veld van een laadinstructie naar MEM/WB worden meegevoerd?
  1. WB moet de onmiddellijke operand van de volgende sprong decoderen.
  2. MEM moet het basisregister van die laadinstructie opnieuw lezen.
  3. IF moet de bronoperand van die laadinstructie selecteren.
  4. WB moet het doelregister van die laadinstructie bepalen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

In een conflictvrije pipeline met vijf stappen begint instructie I6 in cyclus 6 aan IF. In welke cyclus bereikt ze MEM?
  1. 9
  2. 8
  3. 10
  4. 11
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

De logische vertragingen van de stappen zijn 180, 120, 210, 160 en 130 ps. De tijdsoverhead van het pipelineregister is 15 ps. Welke klokperiode is vereist?
  1. 800 ps
  2. 210 ps
  3. 225 ps
  4. 175 ps
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

De instructie in EX is een R-type-bewerking met ALUOp 10. ID/EX voert noch haar functiebits noch een vooraf gedecodeerde bewerkingscode mee. Welke informatie ontbreekt?
  1. Welke specifieke R-type-ALU-bewerking nodig is.
  2. Dat de instructieklasse het R-type is.
  3. Hoeveel pipelinestappen het ontwerp heeft.
  4. Wat het adres van de volgende opeenvolgende instructie is.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een pipeline met vijf stappen voert acht instructies uit met drie ingevoegde wachtcycli en zonder verliezen door sprongen. Aan het einde van welke cyclus voltooit de laatste instructie WB?
  1. 11
  2. 15
  3. 12
  4. 19
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een pipeline met vijf stappen heeft geen rechtstreeks doorsturen en schrijft de registerbank elke cyclus voordat die wordt gelezen. Voer add x13, x2, x3; or x20, x4, x5; sub x14, x13, x6 uit. De middelste instructie is onafhankelijk. Hoeveel wachtcycli en hoeveel cycli in totaal zijn nodig?
  1. 2 wachtcycli; 9 cycli
  2. 0 wachtcycli; 7 cycli
  3. 1 wachtcyclus; 9 cycli
  4. 1 wachtcyclus; 8 cycli
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een processor die elke instructie in één klokcyclus uitvoert, kost 900 ps per instructie. Een versie met vijf stappen heeft logische vertragingen van 180, 120, 210, 160 en 130 ps en 15 ps registeroverhead. Beide voeren zes onafhankelijke instructies uit. Wat is de versnellingsfactor van de pipeline?
  1. 4,00 keer
  2. 2,57 keer
  3. 2,40 keer
  4. 5,00 keer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een laadinstructie gaat één cyclus vóór een R-type-instructie IF in. Welk conflict zou ontstaan als alleen de R-type-instructie MEM overslaat en rechtstreeks vanuit EX WB ingaat?
  1. Beide hebben in dezelfde cyclus het datageheugen nodig.
  2. De laadinstructie bereikt EX na de R-type-instructie.
  3. De R-type-instructie leest registers vóór het decoderen.
  4. Beide instructies gebruiken WB in dezelfde cyclus.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Voer met volledige rechtstreekse doorsturing naar EX ld x21, 0(x25); add x22, x21, x3; or x24, x6, x7; sub x23, x22, x4 uit. De OR-instructie is onafhankelijk en sprong- en structuurconflicten ontbreken. In welke cyclus gaat de laatste aftrekinstructie EX in?
  1. 6
  2. 7
  3. 8
  4. 9
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Kies operanden en plan rond laadinstructies10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke afhankelijkheid verbindt sub x11, x2, x3 met de latere instructie and x12, x11, x4?
  1. WAR via x11
  2. WAW via x11
  3. RAW via x12
  4. RAW via x11
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Zowel EX/MEM als MEM/WB bevat gereedstaande resultaten voor schrijfbewerkingen naar hetzelfde bronregister ongelijk aan nul. Welk resultaat moet de doorstuureenheid selecteren?
  1. MEM/WB
  2. EX/MEM
  3. De oude ID/EX-waarde
  4. De waarde van de generator voor onmiddellijke operanden
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een laadinstructie in EX produceert x19 en de instructie in ID leest x19. Welke handelingen voeren de benodigde wachtcyclus voor het laad-gebruikconflict uit?
  1. Houd PC en IF/ID vast; zet inkomende ID/EX-besturing op nul.
  2. Houd ID/EX en EX/MEM vast; laat PC en IF/ID doorgaan.
  3. Maak IF/ID leeg en houd elk eerder pipelineregister vast.
  4. Laat PC doorgaan; kopieer de laadbesturing naar ID/EX.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een instructie zou x0 schrijven en wordt direct gevolgd door add x18, x0, x7. Het eerdere ALU-resultaat is ongelijk aan nul. Welke waarde moet de optelinstructie voor haar eerste operand gebruiken?
  1. Het ALU-resultaat
  2. Het getal 18
  3. Nul uit x0
  4. De oude x18-gegevens
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Voer met volledige rechtstreekse doorsturing add x9, x1, x2; add x9, x9, x3; sub x11, x9, x4 uit met x1 = 6, x2 = 7, x3 = 9 en x4 = 5. Welke waarde produceert de aftrekinstructie en welk pipelineregister levert haar x9?
  1. 8; x9 uit MEM/WB
  2. 17; x9 uit MEM/WB
  3. 17; x9 uit EX/MEM
  4. 26; x9 uit EX/MEM
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een add x16, x5, x6 wordt direct gevolgd door sd x16, 56(x20). De pipeline stuurt op te slaan gegevens rechtstreeks door vóór de selectie door ALUSrc. Hoe krijgt de opslaginstructie haar gegevens?
  1. ForwardB levert het optelresultaat; ALUSrc selecteert nog steeds 56.
  2. ALUSrc moet x16 selecteren, zodat het adres de offset mist.
  3. De opslaginstructie moet wachten totdat x16 is teruggeschreven.
  4. ForwardA levert x16 als adresbasis in plaats van x20.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Bekijk ld x6, 0(x20); add x7, x6, x8; ld x9, 16(x20); sub x10, x9, x11. Geen andere instructie verandert x20, x8 of x11 en beide leesbewerkingen zijn geldig. Welke volgorde verwijdert beide wachtcycli door laad-gebruikconflicten met behoud van de resultaten?
  1. add x7; ld x6; ld x9; sub x10
  2. ld x6; ld x9; add x7; sub x10
  3. ld x6; add x7; sub x10; ld x9
  4. ld x9; sub x10; ld x6; add x7
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

De reeks is ld x5, 0(x20); add x6, x5, x7; sd x6, 8(x20); ld x8, 8(x20). Waarom is het ongeldig om de laatste laadinstructie naar de tweede plaats te verplaatsen, ook als die daarmee de tussenruimte bij het laad-gebruikconflict vult?
  1. Ze zou een WAR-hardwareconflict op x8 veroorzaken.
  2. Ze zou beide laadinstructies hetzelfde register laten schrijven.
  3. Ze zou de byteoffset van de eerste laadinstructie veranderen.
  4. Ze zou het geheugen lezen voordat de opslaginstructie het bijwerkt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Welke registerafhankelijkheid beperkt het omwisselen van de instructies in add x5, x6, x7; sub x6, x8, x9?
  1. WAR via x6
  2. RAW via x6
  3. WAW via x5
  4. RAW via x8
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Voer met volledige rechtstreekse doorsturing ld x12, 0(x26); add x13, x12, x2; ld x14, 8(x26); sub x15, x14, x13; sd x15, 24(x26) uit. Op te slaan gegevens worden vóór ALUSrc rechtstreeks doorgestuurd en er zijn geen andere conflicten. Hoeveel cycli zijn nodig tot en met de laatste WB-plaats?
  1. 9
  2. 10
  3. 11
  4. 12
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Herstel het ophalen en volg de spronggeschiedenis10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Waarom werkt een RISC-V-instructie met alleen nullen niet als vervangende nop?
  1. Het is een ongeldige instructiecodering.
  2. Het is de codering van een genomen sprong.
  3. Het is de codering van een opslag naar adres nul.
  4. Het is een geldige instructie die x0 ongelijk aan nul maakt.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een 2-bits-verzadigende sprongteller staat in toestand 0. Welke toestand volgt na nog een uitkomst niet genomen?
  1. 1
  2. 2
  3. 0
  4. 3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een genomen sprong op PC 960 heeft byteoffset −40. De sprong wordt in cyclus 1 opgehaald en aan het einde van EX wordt beslist of die wordt genomen, met voorspelling niet genomen. Welke adressen worden weggegooid voordat het doel wordt opgehaald?
  1. 920 en 924
  2. 964 en 968
  3. 960 en 964
  4. 968 en 972
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een 2-bits-verzadigende teller begint in toestand 2 en ziet de uitkomsten niet genomen, niet genomen, genomen, genomen, niet genomen. Hoeveel voorspellingen zijn verkeerd en wat is de eindtoestand?
  1. 3 fout; eindtoestand 1
  2. 4 fout; eindtoestand 2
  3. 2 fout; eindtoestand 0
  4. 4 fout; eindtoestand 1
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Bij het ophalen wordt voorspeld dat een sprong wordt genomen, maar er is tot de decodering geen doeladres beschikbaar. Welke aanvullende structuur kan tijdens IF een eerder gezien doeladres leveren?
  1. Een richtingsgeschiedenisbit
  2. Een conflictdetectie-eenheid
  3. Een sprongdoelbuffer
  4. Een multiplexer voor terugschrijven
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Met geschikte rechtstreekse doorsturing naar ID wordt ld x18, 0(x22) direct gevolgd door een voorwaardelijke sprong die x18 vergelijkt. In ID wordt beslist of de sprong wordt genomen. Hoeveel cycli moet de vergelijking extra wachten ten opzichte van geen wachten op operanden, en waarom?
  1. 1 cyclus; gewone doorsturing naar EX bereikt de vergelijking op tijd.
  2. 2 cycli; geladen gegevens moeten de eerdere vergelijking in ID bereiken.
  3. 0 cycli; registers lezen in ID gaat buiten de geheugentoegang om.
  4. 3 cycli; een laadinstructie moet na WB een aparte cyclus voltooien.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een herhaaldelijk uitgevoerde lussprong heeft per uitvoering vijf genomen uitkomsten gevolgd door één niet-genomen sprong om de lus te verlaten. Hoe verhouden de nauwkeurigheden van de 1-bits- en 2-bitsvoorspeller zich zonder aliasing en na training tot de stabiele toestand?
  1. 1 bit: 4/6; 2 bits: 5/6
  2. 1 bit: 5/6; 2 bits: 5/6
  3. 1 bit: 4/6; 2 bits: 4/6
  4. 1 bit: 5/6; 2 bits: 6/6
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een ongeldige instructie wordt gevolgd door een latere opslaginstructie terwijl twee eerdere rekenkundige instructies nog worden voltooid. Welke toestand moet een precieze uitzondering aan de afhandelingsroutine tonen?
  1. Geen van beide eerdere resultaten aanwezig; latere opslag afwezig.
  2. Beide eerdere resultaten aanwezig; latere opslag aanwezig.
  3. Alleen de latere opslag aanwezig; eerdere resultaten afwezig.
  4. Beide eerdere resultaten aanwezig; latere opslag afwezig.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een 2-bitsteller begint in toestand 1 vóór een strikt afwisselend patroon van genomen en niet genomen. Welke voorspellingsnauwkeurigheid bereikt de teller over de eerste zes uitkomsten?
  1. 50%
  2. 0%
  3. 67%
  4. 100%
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Twee sprongen delen een 2-bitsteller die begint in toestand 3. Sprong A wordt genomen, B niet, A wel en B niet. Hoeveel verkeerde voorspellingen ontstaan en welke sprong veroorzaakt die?
  1. 2 fouten, beide bij B
  2. 1 fout, alleen bij B
  3. 2 fouten, één bij elk
  4. 3 fouten, twee bij B
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Combineer pipelinetiming en kosten van conflicten10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Welke grootheid vergelijkt bij hetzelfde aantal instructies de uitvoeringstijd per instructie tussen processors met verschillende klokfrequenties?
  1. CPI ÷ klokperiode
  2. CPI × klokperiode
  3. Klokfrequentie × CPI
  4. Aantal uitgevoerde instructies ÷ CPI
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

In een lange instructiestroom is 30% een laadinstructie en heeft 20% van die laadinstructies een direct volgende verbruikende instructie die één wachtcyclus nodig heeft. Wat is de bijdrage van laad-gebruikconflicten aan de CPI?
  1. 0,06
  2. 0,20
  3. 0,30
  4. 0,50
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een lange instructiestroom heeft 30% laadinstructies, waarvan 20% direct wordt gevolgd door een verbruikende instructie, en 20% voorwaardelijke sprongen, waarvan 15% verkeerd wordt voorspeld. Elk laad-gebruikconflict kost één cyclus en elke verkeerde voorspelling drie. De kosten overlappen niet. Hoelang duren 400 miljoen instructies bij 2 GHz?
  1. 0,212 s
  2. 0,290 s
  3. 0,460 s
  4. 0,230 s
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Twee processors voeren hetzelfde lange programma uit. A heeft een periode van 300 ps, kosten van 0,08 cycli/instructie door laad-gebruikconflicten, een sprongfractie van 0,20, 10% sprongfouten en herstel van twee cycli. B heeft een periode van 240 ps, dezelfde kosten door laad-gebruikconflicten en dezelfde sprongfractie, 20% sprongfouten en herstel van vier cycli. De kosten overlappen niet. Welke is sneller en ongeveer hoeveel?
  1. A, ongeveer 1,13 keer
  2. B, ongeveer 1,25 keer
  3. B, ongeveer 1,13 keer
  4. A, ongeveer 1,11 keer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een ontwerp dat elke instructie in één klokcyclus uitvoert, gebruikt 800 ps per instructie. Een versie met vijf stappen gebruikt 200 ps per cyclus en voert een korte reeks uit met twee wachtcycli en zonder verliezen door sprongen. Wat is het kleinste positieve aantal instructies waarvoor de pipeline strikt sneller is?
  1. 3 instructies
  2. 2 instructies
  3. 4 instructies
  4. 6 instructies
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een lange instructiestroom heeft 25% voorwaardelijke sprongen en niet-gerelateerde wachtkosten van 0,05 cycli/instructie. Een nieuwe voorspeller verhoogt de sprongnauwkeurigheid van 80% naar 92%, met hetzelfde herstel van drie cycli en dezelfde klokperiode. Wat is de versnellingsfactor van de uitvoering?
  1. 1,120 keer
  2. 1,136 keer
  3. 1,081 keer
  4. 1,250 keer
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een geldige wijziging in de instructieplanning verwijdert twee wachtcycli door laad-gebruikconflicten uit een reeks van zes instructies in een pipeline met vijf stappen, zonder andere verliezen. Hoe verandert de totale tijd bij een periode van 250 ps?
  1. 2000 ps wordt 1500 ps
  2. 2500 ps wordt 2000 ps
  3. 3500 ps wordt 3000 ps
  4. 3000 ps wordt 2500 ps
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Twee ontwerpen voeren een lange instructiestroom uit met veel sprongen: 30% voorwaardelijke sprongen en geen andere conflicten. Voorspellen dat de sprong niet wordt genomen is 60% nauwkeurig. X beslist aan het einde van EX met een periode van 200 ps; Y beslist aan het einde van ID met een periode van 220 ps en zonder wachtcycli voor operanden. Welke heeft de laagste tijd per instructie?
  1. X met 248 ps
  2. Y met 246,4 ps
  3. X met 224 ps
  4. Y met 272,8 ps
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een processor met meervoudige instructie-uitgifte houdt IPC 2 aan. Welke gemiddelde CPI hoort bij die snelheid?
  1. 1
  2. 2
  3. 0,5
  4. 4
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een processor met vijf stappen heeft basiskosten van 0,09 cycli/instructie door laad-gebruikconflicten en 18% voorwaardelijke sprongen. De gemeten CPI op lange termijn is 1,18. Alle resterende verloren cycli komen door verkeerde sprongvoorspellingen met herstel van drie cycli. Welke nauwkeurigheid van sprongvoorspelling volgt hieruit?
  1. Ongeveer 95,0%
  2. Ongeveer 66,7%
  3. Ongeveer 50,0%
  4. Ongeveer 83,3%
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

72 Kernbegrippen, elk met een definitie

A

Aliasing
Aliasing ontstaat wanneer verschillende sprongadressen hetzelfde item in de voorspellingstabel selecteren en hun bijwerkingen elkaar verstoren.
Een meestal genomen sprong kan het gedeelde item verstoren dat door een meestal niet-genomen sprong wordt gebruikt.
ALU-besturingscode
De ALU-besturingscode is de 4-bitscode die de specifieke rekenkundige of bitsgewijze bewerking selecteert die de ALU in deze implementatie uitvoert.
De code 0110 selecteert aftrekken, terwijl de verwante code 0010 optellen selecteert.
ALUOp
ALUOp is een 2-bits-instructieklassesignaal dat de ALU-besturing aangeeft of die moet optellen, aftrekken of de R-type-functievelden moet decoderen.
ALUOp 00 selecteert optellen voor het adres, ook al beschrijft funct3 van een laadinstructie de grootte van haar geheugentoegang.
ALUSrc
ALUSrc is het besturingssignaal dat de tweede ALU-operand selecteert: in dit ontwerp een registerwaarde bij 0 of een onmiddellijke operand bij 1.
Een opslaginstructie stelt ALUSrc in op 1 terwijl haar rs2-waarde afzonderlijk naar het geheugen gaat.

B

Besturingsconflict
Een besturingsconflict ontstaat wanneer het ophalen het volgende instructieadres nodig heeft voordat een sprong of andere besturingsoverdracht dat heeft bepaald.
Bij voorspellen dat de sprong niet wordt genomen, gaat het opeenvolgende ophalen door terwijl een sprongvergelijking nog in een latere stap zit.

C

Combinatorisch element
Een combinatorisch element is een schakeling waarvan de uitvoer afhangt van de huidige invoer, zonder tussen klokcycli een waarde te bewaren.
Een opteller berekent zijn uitvoer opnieuw wanneer een invoer verandert, voordat een register de som vastlegt.
Conflictdetectie-eenheid
Een conflictdetectie-eenheid herkent gevallen die een wachtcyclus vereisen, waaronder een laadinstructie in EX waarvan het doelregister wordt gelezen door de instructie in ID.
Een nauwkeurige controle van gebruikte bronnen voorkomt dat bits van een I-type-onmiddellijke operand als tweede bronregister worden behandeld.
Correlerende sprongvoorspeller
Een correlerende sprongvoorspeller gebruikt recente spronguitkomsten naast de lokale geschiedenis van één sprong om een richting te voorspellen.
Een beslissing kan eenvoudiger te voorspellen worden wanneer de uitkomst van een eerdere sprong laat zien welke route is genomen.

D

Dataconflict
Een dataconflict ontstaat wanneer een instructie een punt bereikt waar een waarde nodig is voordat een eerdere instructie die beschikbaar heeft gemaakt.
Zonder rechtstreeks doorsturen kan een verbruikende instructie in ID een verouderde waarde lezen voordat de producerende instructie WB bereikt.
Datapad
Een datapad is de hardware die waarden bewaart en bewerkt tijdens het ophalen van instructies, registertoegang, berekeningen en geheugentoegang.
Een rekenkundige instructie stuurt twee registerwaarden door het datapad en geeft een ALU-resultaat terug.
Decodering op twee niveaus
Decodering op twee niveaus scheidt de hoofdbesturing voor de instructieklasse van de kleinere decoder die de specifieke ALU-bewerking selecteert.
De hoofdbesturing geeft add en sub ALUOp 10; decodering van functiebits onderscheidt ze daarna.
Doorstuureenheid
Een doorstuureenheid vergelijkt bron- en doelregisternummers en controleert schrijftoestemming om de juiste beschikbare operandbron te selecteren.
De eenheid sluit rd = x0 uit omdat een berekend resultaat de nulwaarde van dat register niet kan veranderen.
Doorvoer
Doorvoer is het aantal instructies dat per tijdseenheid wordt voltooid en neemt toe wanneer nuttig instructiewerk overlapt.
Een volle conflictvrije pipeline kan na het aanvankelijke vullen elke cyclus een instructie voltooien.
Dubbelwoord
Een dubbelwoord is een gegevensgrootheid van 64 bits die 8 bytes inneemt en door de RV64-instructies ld en sd wordt overgedragen.
Dubbelwoorden op opeenvolgende uitgelijnde adressen kunnen beginnen op 2048, 2056 en 2064.
Dynamische sprongvoorspelling
Dynamische sprongvoorspelling gebruikt tijdens de uitvoering waargenomen spronguitkomsten om de toestand voor toekomstige richtingsvoorspellingen bij te werken.
Herhaalde genomen uitkomsten van een lus trainen de voorspeller vóór de ongebruikelijke niet-genomen sprong waarmee de lus wordt verlaten.

E

Effectief adres
Een effectief adres is het geheugenadres dat voor een laad- of opslaginstructie wordt berekend door de basisregisterwaarde en de byteoffset met teken op te tellen.
Voor ld x4, 24(x8) met x8 = 2000 is het effectieve adres 2024.
Effectieve CPI
De effectieve CPI is het gemiddelde aantal cycli per instructie, inclusief de extra cycli die verloren gaan door conflicten en herstel na sprongen.
Een lange instructiestroom met enkelvoudige uitgifte en 0,12 verloren cycli per instructie heeft een effectieve CPI van 1,12.
EX/MEM
EX/MEM is het pipelineregister dat het uitvoeringsresultaat, op te slaan gegevens, het doelregisternummer en de nog benodigde besturingssignalen voor geheugen en terugschrijven meevoert.
Een rekenkundig resultaat in EX/MEM kan rechtstreeks worden doorgestuurd naar de EX-ingangen van de volgende instructie.
Extra cycli door een sprong
Extra cycli door een sprong zijn de verloren cycli door wachten op of herstellen van een sprong, bepaald door het moment waarop het juiste ophalen kan worden hervat.
In een pipeline met vijf stappen gaan bij een beslissing aan het einde van EX twee ophaalplaatsen verloren na een verkeerde voorspelling.

F

ForwardA
ForwardA bestuurt de doorstuurmultiplexer voor rs1: in dit ontwerp kiest 00 ID/EX, 10 EX/MEM en 01 MEM/WB.
Een recent bijgewerkte waarde van het basisregister van een laadinstructie kan rechtstreeks naar de adresberekening worden doorgestuurd.
ForwardB
ForwardB bestuurt de doorstuurmultiplexer voor rs2 en levert vóór de ALUSrc-selectie een registeroperand en de waarde voor de route met op te slaan gegevens.
Een opslaginstructie kan haar gegevens rechtstreeks doorgestuurd krijgen terwijl ALUSrc een onmiddellijke operand selecteert voor de adresberekening.
Functieveld
Een functieveld levert instructiebits die bewerkingen met dezelfde opcode onderscheiden, zoals funct3 en funct7 bij R-type-instructies.
Voor add en sub met funct3 000 selecteert instructiebit 30 welke rekenkundige bewerking wordt uitgevoerd.

G

Geheugenafhankelijkheid
Een geheugenafhankelijkheid verbindt geheugentoegangen waarvan de volgorde van belang is omdat ze overlappende bytes kunnen benaderen en minstens één toegang die bytes schrijft.
Een laadinstructie mag niet vóór een opslaginstructie worden geplaatst die mogelijk de bytes levert die de laadinstructie moet lezen.
Generator voor onmiddellijke operanden
Een generator voor onmiddellijke operanden reconstrueert de bits van de onmiddellijke operand voor een instructieformaat en breidt de waarde met teken uit tot de registerbreedte.
Bij een opslaginstructie combineert ImmGen bits uit twee delen van de instructie om de offset te reconstrueren.

H

Hardbedrade besturing
Hardbedrade besturing is een implementatie met combinatorische logica die instructiebits vertaalt naar selecties in het datapad en schrijfvrijgavesignalen.
De opcode van een laadinstructie produceert een besturingsrij die een onmiddellijke operand selecteert en toestemming geeft voor geheugen lezen en register schrijven.

I

ID/EX
ID/EX is het register dat gedecodeerde operanden, registernummers, de onmiddellijke operand, functie-informatie en besturingssignalen naar de uitvoeringsstap voert.
EX combineert de meegevoerde ALUOp met de meegevoerde functiebits om een R-type-bewerking te selecteren.
IF/ID
IF/ID is het pipelineregister tussen instructies ophalen en decoderen, dat de opgehaalde instructie en de bijbehorende PC bewaart.
Tijdens een wachtcyclus door een laad-gebruikconflict kan de wachtende verbruikende instructie opnieuw worden gedecodeerd doordat IF/ID wordt vastgehouden.
Instructieplanning
Instructieplanning herschikt instructies met behoud van programmaresultaten en plaatst onafhankelijk werk in intervallen die anders wachtcycli zouden opleveren.
Door een onafhankelijke laadinstructie tussen een andere laadinstructie en de bijbehorende verbruikende instructie te plaatsen, kan een vertraging door een laad-gebruikconflict verdwijnen.
IPC
IPC, of instructies per cyclus, meet het gemiddelde aantal voltooide instructies per klokcyclus en is het omgekeerde van de gemiddelde CPI.
Meervoudige instructie-uitgifte kan genoeg onafhankelijk werk voltooien om een IPC groter dan één te bereiken.

K

Klokflank
Een klokflank is de actieve klokovergang waarop een op een flank gestuurd toestandselement een vrijgegeven volgende waarde vastlegt.
Op de laatste klokflank van een optelinstructie ontvangt rd de som en de PC het volgende adres.
Kritiek pad
Een kritiek pad is het langste vereiste combinatorische pad tussen toestandsgrenzen en begrenst hoe kort de klokperiode kan zijn.
In een ontwerp dat elke instructie in één klokcyclus uitvoert, bepaalt de route van een laadinstructie de klokperiode, ook wanneer een kortere optelinstructie wordt uitgevoerd.

L

Laad-gebruikconflict
Een laad-gebruikconflict ontstaat wanneer een instructie direct na een laadinstructie het resultaat nodig heeft voordat de laadinstructie het lezen van het datageheugen heeft voltooid.
De verbruikende instructie wacht met rechtstreeks doorsturen naar EX één cyclus en haalt daarna de gegevens uit MEM/WB.
Latentie
Latentie is de verstreken tijd waarin één instructie van binnenkomst tot voltooiing gaat, inclusief alle stappen die ze doorloopt.
Vijf stapintervallen van 270 ps geven één instructie een pipelinelatentie van 1350 ps.
Leeglopen van de pipeline
Het leeglopen van de pipeline is het laatste interval waarin eerder opgehaalde instructies worden voltooid nadat de laatste instructie van de reeks is binnengekomen.
De laatste instructie heeft na haar ophaalcyclus nog ID, EX, MEM en WB nodig.
Lees-na-schrijfafhankelijkheid
Een lees-na-schrijfafhankelijkheid verbindt een latere leesbewerking van een register met een eerdere schrijfbewerking die de voor die leesbewerking vereiste waarde produceert.
Bij een optelinstructie gevolgd door een aftrekinstructie die haar resultaat leest, hangt de aftrekinstructie af van de optelinstructie.
Lege pipelineplaats
Een lege pipelineplaats is een inactieve plaats in de pipeline die verdergaat zonder het werk van een instructie uit te voeren dat de toestand verandert.
Een wachtcyclus door een laad-gebruikconflict plaatst een lege pipelineplaats in EX terwijl de laadinstructie door MEM gaat.

M

Meervoudige instructie-uitgifte
Meervoudige instructie-uitgifte start meer dan één instructie in een klokcyclus en gebruikt keuzes van de compiler of hardware om werk te vinden dat kan overlappen.
Statische meervoudige instructie-uitgifte vertrouwt op groepen van de compiler; bij dynamische uitgifte selecteert de hardware instructies.
MEM/WB
MEM/WB is het pipelineregister dat geheugengegevens, het ALU-resultaat, het doelregisternummer en de besturingssignalen voor terugschrijven naar een register bevat.
Een wachtende instructie die een laadresultaat gebruikt, kan haar operand halen uit de geladen waarde in MEM/WB.
MemRead
MemRead is het besturingssignaal dat leestoegang tot het datageheugen aanvraagt, zodat een laadinstructie gegevens van haar effectieve adres kan ophalen.
Het ophalen uit het instructiegeheugen staat los van de door MemRead bestuurde toegang tot het datageheugen.
MemtoReg
MemtoReg selecteert de waarde die wordt teruggeschreven naar een register: in dit ontwerp het ALU-resultaat bij 0 of de uitvoer van het datageheugen bij 1.
Een laadinstructie waarvan MemtoReg ten onrechte op 0 staat, zou haar adres schrijven in plaats van de geladen gegevens.
MemWrite
MemWrite is het besturingssignaal dat een schrijfbewerking naar het datageheugen vrijgeeft, zodat de op te slaan waarde op de klokflank op het effectieve adres wordt opgeslagen.
Een rekenkundige instructie moet MemWrite op 0 houden om onbedoelde veranderingen in het geheugen te voorkomen.
Multiplexer
Een multiplexer is een schakeling die afhankelijk van een selectiesignaal één van meerdere gegevensingangen doorgeeft aan één uitgang.
De multiplexer voor terugschrijven selecteert geheugengegevens voor een laadinstructie en het ALU-resultaat voor een rekenkundige instructie.

N

Nulvlag
De nulvlag is een ALU-uitgang die gelijk is aan 1 wanneer het berekende resultaat nul is, zodat aftrekken kan testen of registers gelijk zijn.
Gelijke operanden zorgen ervoor dat een aftrekking voor een sprong Zero = 1 oplevert, zodat Branch het doeladres kan selecteren.

O

Ongeldig maken van pipeline-instructies
Het ongeldig maken van pipeline-instructies maakt werk in de pipeline ongeldig, zodat instructies op de verkeerde route of andere weggegooide instructies de architecturale toestand niet kunnen veranderen of uitzonderingen kunnen veroorzaken.
Een ongeldig gemaakte opslaginstructie kan niet naar het geheugen schrijven nadat een genomen sprong het ophalen heeft omgeleid.
Onverschillige waarde
Een onverschillige waarde is een waarde in een besturingstabel die 0 of 1 mag zijn omdat de gekozen instelling het gedrag van de instructie niet kan beïnvloeden.
MemtoReg kan voor beq een onverschillige waarde zijn omdat er geen register wordt geschreven.

P

PCSrc
PCSrc selecteert de volgende PC; in het ontwerp dat een sprong op basis van gelijkheid in één klokcyclus uitvoert, is het de logische AND van Branch en de ALU-nulvlag.
Een optelinstructie die nul produceert, volgt nog steeds de opeenvolgende route omdat haar Branch-signaal 0 is.
Pipelinediagram over meerdere klokcycli
Een pipelinediagram over meerdere klokcycli toont instructies als rijen en cycli als kolommen en geeft aan in welke stap elke instructie zich in de loop van de tijd bevindt.
Als je cyclus 5 van boven naar beneden leest, kun je in elk van de vijf pipelinestappen één instructie zien.
Pipelineregister
Een pipelineregister legt de gegevens en besturingssignalen vast die een instructie na een stap nodig heeft en houdt die tijdens de volgende cyclus beschikbaar.
ID/EX bewaart de operanden van een gedecodeerde instructie terwijl IF/ID een latere instructie ontvangt.
Pipelining
Pipelining laat instructies overlappen door hun uitvoering in stappen te verdelen, zodat verschillende instructies tegelijk verschillende stappen kunnen bezetten.
Terwijl één instructie het datageheugen benadert, kan een latere instructie in de ALU rekenen.
Precieze uitzondering
Bij een precieze uitzondering zijn alle eerdere instructies voltooid en zijn de normale effecten van de veroorzakende instructie en alle effecten van latere instructies uitgesloten.
De afhandelingsroutine ontvangt de opgeslagen PC van de veroorzakende instructie en de oorzaak, samen met de toestandsgrens in programmavolgorde.
Programmateller
De programmateller is een toestandsregister dat het adres bevat waarmee de huidige instructie uit het instructiegeheugen wordt opgehaald.
Na een gewone instructie van 4 bytes op adres 720 gaat de programmateller naar 724.

R

Rechtstreeks doorsturen
Rechtstreeks doorsturen leidt een geproduceerde waarde vanuit een pipelineregister direct naar de ingang van een latere instructie vóór het architecturale terugschrijven.
Een direct volgende aftrekinstructie kan het nieuwe resultaat van een optelinstructie uit EX/MEM ontvangen zonder te wachten.
Registerbank
Een registerbank is de verzameling architecturale registers, met lees- en schrijfpoorten die registers via hun nummers benaderen.
De twee leespoorten kunnen de waarden van x6 en x7 aan één rekenkundige instructie leveren.
RegWrite
RegWrite is het vrijgavesignaal dat toestaat dat het geselecteerde resultaat van een instructie op de klokflank in de registerbank wordt opgeslagen.
Een opslaginstructie houdt RegWrite op 0, ook al leest ze registerwaarden voor haar adres en gegevens.

S

Schrijf-na-leesafhankelijkheid
Een schrijf-na-leesafhankelijkheid ontstaat wanneer een latere instructie een register schrijft dat een eerdere instructie eerst moet lezen.
Als je de latere schrijvende instructie vóór die lezer plaatst, kan het programma veranderen, ook al voert de pipeline instructies in volgorde uit.
Schrijf-na-schrijfafhankelijkheid
Een schrijf-na-schrijfafhankelijkheid ontstaat wanneer twee instructies hetzelfde register schrijven, waardoor de volgorde van hun schrijfbewerkingen volgens de programmavolgorde van belang is.
Als je twee schrijfbewerkingen naar x12 omwisselt, kan de waarde veranderen die volgende instructies zien.
Sprongdoeladres
Een sprongdoeladres is het instructieadres dat wordt bereikt wanneer een sprong wordt genomen, berekend uit de PC van de spronginstructie en de byteoffset met teken.
Een genomen sprong op adres 600 met offset −20 leidt het ophalen van instructies om naar adres 580.
Sprongdoelbuffer
Een sprongdoelbuffer bewaart doeladressen en levert tijdens het ophalen een voorspeld doeladres voordat de sprong wordt gedecodeerd.
Een voorspelling dat de sprong wordt genomen, kan een treffer in de sprongdoelbuffer gebruiken om in de volgende cyclus vanaf het voorspelde doel op te halen.
Spronggeschiedenistabel
Een spronggeschiedenistabel bewaart kleine items met voorspellingstoestand die met bits van sprongadressen worden geselecteerd, zodat recent gedrag het ophalen kan sturen.
Twee sprongadressen kunnen één item selecteren, zodat de opgeslagen toestand niet uitsluitend bij één sprong hoeft te horen.
Statische sprongvoorspelling
Statische sprongvoorspelling voorspelt de sprongrichting met een vaste regel die niet leert van uitkomsten tijdens de uitvoering van het programma.
Achterwaarts genomen, voorwaarts niet genomen gebruikt de richting van de sprongverplaatsing als aanwijzing.
Structuurconflict
Een structuurconflict ontstaat wanneer instructies in dezelfde klokcyclus dezelfde beperkte hardwarevoorziening nodig hebben.
Een geheugen met één poort kan de MEM-toegang van een laadinstructie en het ophalen van een andere instructie niet tegelijk bedienen.
Superscalaire processor
Een superscalaire processor gebruikt hardware om meerdere instructies in een cyclus te selecteren en uit te geven, binnen de grenzen van beschikbare voorzieningen en afhankelijkheden.
Verkeerde sprongvoorspellingen en ketens van afhankelijke waarden beperken hoeveel parallel instructiewerk nuttig blijft.

T

Tekenuitbreiding
Tekenuitbreiding maakt een binaire waarde met teken breder door de tekenbit naar de toegevoegde hoge posities te kopiëren, met behoud van de waarde.
Een negatieve 12-bitslaadoffset blijft negatief nadat ImmGen die tot de RV64-registerbreedte heeft uitgebreid.
Terugkeeradresstack
Een terugkeeradresstack houdt terugkeeradressen van procedures bij, zodat het ophalen het doel van een terugkeer kan voorspellen voordat de normale uitvoering dat bepaalt.
Bij geneste aanroepen horen de terugkeeradressen vanzelf bij de omgekeerde volgorde van de aanroepen.
Terugschrijven
Terugschrijven is het overbrengen van het geselecteerde resultaat van een instructie naar haar doelregister wanneer de schrijfbewerking naar het register is vrijgegeven.
Een laadinstructie schrijft de geheugenwaarde terug, terwijl een optelinstructie haar ALU-resultaat terugschrijft.
Tijdsoverhead van pipelineregisters
De tijdsoverhead van pipelineregisters is de tijd die het opslaan en leveren van stapwaarden kost en die bij de logische vertraging van de langzaamste stap wordt opgeteld.
Een bepalende stap van 250 ps met 20 ps registeroverhead vereist een periode van 270 ps.
Toernooivoorspeller
Een toernooivoorspeller kiest tussen voorspellingsmechanismen en gebruikt hun waargenomen succes om te bepalen welk mechanisme voor een sprong wordt vertrouwd.
De ene voorspeller kan bij het ene sprongpatroon passen, terwijl een andere bij een ander patroon beter presteert.
Toestandselement
Een toestandselement is een hardwarecomponent die een waarde over cycli heen bewaart en die via een bestuurde schrijfbewerking bijwerkt.
De PC bewaart het huidige instructieadres terwijl het volgende adres wordt berekend.

U

Uitvoeringstijd
De uitvoeringstijd is de verstreken programmatijd, berekend uit het aantal uitgevoerde instructies, de gemiddelde CPI en de klokperiode van de processor.
Hetzelfde aantal instructies kan bij een hogere CPI sneller worden voltooid als de klokperiode voldoende korter is.

V

Verzadigende teller
Een verzadigende teller verandert naar zijn boven- of ondergrens zonder naar het andere uiteinde terug te springen en geeft zo blijvende zekerheid aan een voorspelling.
Een genomen uitkomst laat een 2-bitsteller op 3 staan wanneer de teller al sterk genomen voorspelt.
Vullen van de pipeline
Het vullen van de pipeline is het begininterval waarin opeenvolgende instructies binnenkomen en nog niet alle stappen nuttig werk bevatten.
De eerste instructie bereikt WB in cyclus 5, nadat de eerste stappen zijn gevuld.

W

Wachtcyclus
Een wachtcyclus vertraagt geselecteerd werk in de pipeline één cyclus, zodat een instructie op een operand of een andere vereiste voorwaarde kan wachten.
Tijdens een wachtcyclus door een laad-gebruikconflict wacht later werk terwijl de laadinstructie verdergaat om de waarde te produceren.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag