Budeme pouzivat 3 formaty instrukcii
Zacneme datovou cestou pre Instruction Fetch. Instrukcie budeme tahat z cache. Potrebujeme PC, ktory bude menit svoju hodnotu podla Next Addr. Logic systemu po kazdom vykonani instrukcie a bude riadeny hodinami. Z pamate vypadne Instruction Word na datovu zbernicu. Tato cast bude spolocna pre vsetky instrukcie.
Next address logic moze len ikrementovat adresu ale aj reagovat na rozne skoky.
Next address logic moze len ikrementovat adresu ale aj reagovat na rozne skoky.
Ked uz vieme instrukcie nacitat, tak s nimi este musime vediet nieco spravit. Navrhneme teda datovu cast pre ALU. Bude sa tykat aritmetickych instrukcii. Registre, ktore vidime na obrazku su vlastne registre procesora. ALU vykonava aritmeticke operacie.
Operacia vyzaduje tri registre, napr. rd <- rs +/- rt a preto signaly pre kazdy z nich. RrgWr je riadiaci signal dekodovany z op a ALUctr je dekodovany z funct pola instrukcie.
Operacia vyzaduje tri registre, napr. rd <- rs +/- rt a preto signaly pre kazdy z nich. RrgWr je riadiaci signal dekodovany z op a ALUctr je dekodovany z funct pola instrukcie.
V sade mame este instrukciu s priamym operandom (immediate) a preto musime upravit nasu datovu cestu pre ALU. Immediate operand je zero extended v pripade potreby.
Toto je napriklad instrukcia ORI rt, rs, imm16, ktorej operacia je rt <- rs OR imm16. No, ale rs je 32b register a preto doplneny nulami a mechanizmus je pridany na data bus medzi registrom a ALU.
Okrem toho, tato operacia vyzaduje len dva registre a to rs a rt. rt je vlastne rd, ak porovname s predoslym navrhom. Preto ten multiplexor, ktory musi rozhodnut, ze co bude nasa final destination.
Toto je napriklad instrukcia ORI rt, rs, imm16, ktorej operacia je rt <- rs OR imm16. No, ale rs je 32b register a preto doplneny nulami a mechanizmus je pridany na data bus medzi registrom a ALU.
Okrem toho, tato operacia vyzaduje len dva registre a to rs a rt. rt je vlastne rd, ak porovname s predoslym navrhom. Preto ten multiplexor, ktory musi rozhodnut, ze co bude nasa final destination.
Teraz pridame cast pre operaciu Load. Prikladom instrukcie je LOAD rt, disp16(rs). Takze instrukcia pouziva bazove adresovanie. Rt ako destinacia mame zvladnute, disp16 je tentokrat sign extended a preto musime nahradit zero extender systemom, ktory bude bud robit zero extension alebo sign extension. Okrem toho, LOAD instrukcia cita data z pamate a preto musime pridat data memory, alebo data cache. MUX na konci datovej cesty je preto, ze tentokrat na zbernica vystavujeme data z 2 zdrojov.
Instrukcia Store ma rovanky format instrukcie ako Load, ale rozdiel je v tom, ze Store do pamate zapisuje. Nam stale chyba datova cesta z registrov do pamate.
Posledna chybajuca cesta je pre instrukciu skoku. Tu je format BEQZ rs, disp16 a teda PC <- PC + SX(disp16) + 4 a to len vtedy, ak je podmienka splnena. Inak, PC <- PC + 4 (uz navrhnute). Znamena to, ze z musime dostat aktualnu hodnotu a pripocitat k nej 32b hodnotu novej adresy (disp16 je sign extended). Do systemu Next Logic Address, ktory sme doteraz mali za black box pridame extender, tym padom mame 32b hodnotu pre pripocitanie. Este potrebujem pripocitat 4 + aktualna hodnota PC.
V ALU sa vyhodnoti podmienka a vysle sa signal rovnosti/nerovnosti (cond). Bus B je vzdy 0 a teda porovnanie je true, ak bus A je 0.
A teraz to dame dokopy a dostaneme jednoduchu datovu cast DLX. Samozrejme medzi Instruction Memory a jednotlivymi vstupmi do obvodu este zaradime radic, ktory bude tvoreny kombinacnou logikou (bude to dekoder) a du obvodu bude vysielat signaly a prijimat signaly z obvodu (napr. cond).
Pre takto navrhnuty procesor mame velmi velku Tclk. Tclk zalezi na najdlhsej ceste v kombinacnej logike, ktorou je instrukcia LOAD v nasom pripade. Najdlhsia z najdhsich ciest sa nazyva kriticka cesta. Tclk teda potrebujeme skratit a to spravime tak, ze medzi stupne kombinacnej logiky (zakladny cyklus) vlozime dodatocne registre (naznacene cervenou).
Este budeme musiet vymenit radic, ktory bol tvoreny kombinacnou logikou a vymenime ho za mikroprogramovany radic (konecny automat, sekvencny obvod). Tento radic je uz inteligentnejsi a tak mu mozme zverit zlozitejsie ulohy. Takyto mikrprogramovany radic nam umoznuje programovat zlozitejsie instrukcie. Priblizny postup automatu:
- Najprv nacita instrukciu a na adresove zbernice vystavi hodnoty rs a rt.
- Podla typu instrukcie sa rozhodne, co dalej
- ALU sa preda operand
- ulozi vysledok po vykonani ALU operacie
- vysledok po vykonani ALU sa ulozi na register alebo do pamate a zvysi sa PC
Zatial su vsetky varianty, ktore sme postavili plne sekvencne. Jedna instrukcia sa musi skoncit, aby dalsia instrukcia zacala. Takuto architekturu nazyvame konvencna architektura. Aby sme dosiahli lepsieho spracovania, tak pouzijeme pipelining. Znamena to, ze sa v kazdom takte pokusime pouzit datove casti, ktore sme teraz pouzivat nemohli a musieli sme cakat, kym spracovanie bude ukoncene. Ina moznost by bola optimalizacia zdielanim. Dosiahneme tak potencialneho zrychlenia tak velkeho ako je pocet stupnov pipeline.
Radic procesoru s pipeline je distribuovany medzi stupne pipeline. Instrukcia prechadza stupnami spracovania splocne so svojmi datami. Nejaky klasicky sekvencny radic je potreba pre konkretnu obsluhu vynimiek, hazardov a dalsich fcii.
Nacrtnuta pipeline je pomerne jednoducha 5 stupnova celociselna pipeline RISC procesoru, podporujuca len zarovnane data.