Otevřené RISCové architektury OpenRISC a RISC-V

29. 10. 2015
Doba čtení: 21 minut

Sdílet

 Autor: Derrick Coetzee, podle licence: Public Domain CC0
Ve světě open-source hardware (OSH) se již poměrně dlouho rozvíjí dva velmi zajímavé projekty. Jedná se o otevřené RISCové architektury nazvané OpenRISC a RISC-V. Dnes se seznámíme jak s prvním zmíněným projektem používajícím licence GPL a LGPL, tak i s projektem RISC-V, který je mnohem promyšlenější.

Obsah

1. Otevřené RISCové architektury OpenRISC a RISC-V

2. Instrukční sada: základ specifikace mikroprocesorů

3. Společný ideový předek projektů OpenRISC i RISC-V: architektura MIPS

4. Programátorský model a instrukční sada mikroprocesorů s architekturou MIPS I

5. Projekt OpenRISC

6. Programátorský model OpenRISC

7. Instrukční sady použité v projektu OpenRISC

8. ORBIS32: OpenRISC Basic Instruction Set

9. Projekt RISC-V: budoucnost čistě RISCových čipů?

10. Instrukční sady použité v projektu RISC-V

11. Nejdůležitější rozdíly RISC-V oproti architektuře MIPS a OpenRISC

12. Odkazy na Internetu

1. Otevřené RISCové architektury OpenRISC a RISC-V

„It's called hardware because it's hard.“

Myšlenky open source a s ním souvisejících licencí pravděpodobně není nutné čtenářům serveru Root.cz podrobněji představovat a vysvětlovat. Zajímavé ovšem je, že tyto myšlenky postupně pronikají i do dalších oblastí, například i do světa hardware, kde se stále častěji mluví o open-source hardware, neboli zkráceně o OSH. Ostatně právě otevřený hardware je jedním z posledních dílů ve „skládačce“ open source technologií, protože k dispozici jsou jak propracované a úspěšné open source operační systémy a vývojářské nástroje, tak i aplikace pro servery, kanceláře i domácnosti (opět pravděpodobně není nutné zabíhat do podrobností). V rámci open-source hardware vzniklo již poměrně velké množství designů různých čipů. Například se jedná o grafické akcelerátory, reimplementace některých populárních typů mikroprocesorů apod. Designem je zde skutečně myšlen zdrojový kód, protože návrhy čipů se provádí většinou v nějakém HDL, například v jazycích VHDL, Verilogu či Chiselu.

Zdrojový kód popisující zapojení jednotlivých modulů čipu (typicky na vyšší úrovni, než jsou jednotlivá hradla či dokonce tranzistory) je pak možné použít při jeho implementaci v FPGA či při návrhu masky skutečného zákaznického integrovaného obvodu. Velmi zajímavou oblastí OSH je návrh mikroprocesorů (popř. jejich instrukčních sad), protože z open-source hardware mohou v této oblasti profitovat prakticky všechny zúčastněné strany: uživatelé (ti mohou či budou moci použít otevřenou platformu bez různých zadních vrátek), pracovníci ve výzkumu překladačů či instrukčních sad a v neposlední řadě taktéž výrobci čipů, protože licence některých open-source hardware mikroprocesorů umožňují jejich použití v komerčních integrovaných obvodech (zatímco za použití mikroprocesorových jader MIPS či ARM se musí platit, což evidentně nepředstavuje problém pro větší společnosti typu nVidie, Samsungu, Qualcommu, Texas Instruments apod., ovšem například pro startupy se může jednat o nepřekonatelný problém, dtto pro školy – zde bude problém spíše morální).

2. Instrukční sada: základ specifikace mikroprocesorů

V dnešním článku si ve stručnosti popíšeme dva projekty spadající právě do oblasti open-source hardware. Tyto projekty byly vybrány především z toho důvodu, že mají – samozřejmě podle názoru autora :-) – poměrně velkou naději na úspěch a současně jsou tyto technologie vzájemně dobře porovnatelné. Jedná se o projekt nazvaný jednoduše a výstižně OpenRISC a taktéž o projekt s názvem RISC-V. Při popisu projektů OpenRISCRISC-V je zapotřebí zdůraznit, že se tyto projekty vždy skládají z několika částí. Základem je specifikace instrukční sady (ISA – Instruction Set Architecture), protože právě instrukční sada určuje vlastnosti čipů a do značné míry může ovlivnit i způsob jejich designu (například počet řezů pipeline, existenci branch delay slotů, nutnosti použít víceportové paměti pro implementaci matice registrů atd.). Dále se pak jedná o konkrétní designy mikroprocesorových jader; příkladem může být projekt OpenRISC 1200 či o návrh jádra RISC-V Rocket.

Dnes se budeme zabývat především vlastnostmi instrukčních sad specifikovaných v rámci projektů OpenRISC a RISC-V. Jak si řekneme v navazujících kapitolách, má minimálně jedna z těchto dvou architektur poměrně dobrou šanci na to, aby se stala základem pro RISCové mikroprocesory nové generace, protože návrh její instrukční sady je postaven na současných požadavcích a možnostech (důraz na čipy s mnoha jednoduchými jádry). Co je možná ještě důležitější – tento návrh není zatížen žádnou snahou o dosažení zpětné kompatibility s původními – dnes již vlastně několik desítek let starými – instrukčními sadami. Evidentní je to zejména při porovnání návrhu instrukční sady procesorů RISC-V s instrukční sadou x86, ale paradoxně i s RISCových instrukčními sadami mikroprocesorových architektur PowerPC, SPARC, MIPS či dokonce architektury ARM. Navíc je každé rozhodnutí o struktuře instrukcí velmi detailně popsáno společně se zmínkou o alternativním (tj. horším :-) řešení, což je pravděpodobně světový unikát.

3. Společný ideový předek projektů OpenRISC i RISC-V: architektura MIPS

Vzhledem k tomu, že open-source hardware by měl být v ideálním případě co nejjednodušší (aby šel syntetizovat i na levnějších FPGA atd.) a současně i dostatečně výkonný, nebude pravděpodobně žádným překvapením, že se při návrhu OHS procesorů jejich tvůrci uchýlili k implementaci základních myšlenek architektury RISC neboli Reduced Instruction Set Code (v některých případech se tato zkratka taktéž používala ve významu Reduced Instruction Set Computer). Nutno podotknout, že význam této zkratky je mnohdy chápán mylně: ve skutečnosti mají některé RISCové procesory více instrukcí, než „konkurenční“ procesory CISCové, ovšem RISCové instrukce jsou obecně implementačně mnohem jednodušší a nevyžadují použití mikroprogramového řadiče (kromě několika výjimek, to se však netýká dnes popisovaných projektů). Zajímavé je, že jak v případě projektu OpenRISC, tak i u projektu RISC-V můžeme najít jejich společného ideového předka, kterým je architektura MIPS (Microprocessor without Interlocked Pipeline Stages).

Práce na návrhu architektury MIPS začala již v roce 1981, kdy John L. Hennessy z univerzity ve Stanfordu spolu se svým týmem navrhl koncept procesoru, v němž by se sice využívala pipeline s poměrně velkým množstvím řezů (typicky pěti), ovšem zpracování části instrukce v každém řezu by trvalo konstantní dobu, ideálně jeden hodinový takt. To mj. znamenalo, že takový procesor nemohl obsahovat instrukce s dlouhotrvajícími operacemi, například násobením a dělením. Tyto operace by totiž zcela jistě trvaly déle než jeden hodinový takt, což by znamenalo nutnost mít v procesoru rozvedeny signály pro pozastavení provádění dalších instrukcí (interlock). Hennessy si uvědomil, že tyto signály rozváděné po celém procesoru limitují maximální hodinovou frekvenci a proto jím navržený procesor neobsahoval žádné dlouhotrvající instrukce, pouze jednoduché součty, rozdíly a bitové operace. Navíc tento procesor – na rozdíl od mnoha dalších procesorů s architekturou RISC – neobsahoval registrová okna, protože Hennesy správně odhadl, že je výhodnější neomezovat počet současně použitelných pracovních registrů, protože jejich efektivní alokaci pro předávání parametrů lze ponechat na překladači.

Mikroprocesory patřící do této rodiny byly v minulosti použity jak u výkonných grafických stanic firmy SGI i v některých superpočítačích, tak i na zcela opačném segmentu trhu: v embedded aplikacích, přehrávačích DVD, herních konzolích Nintendo 64, Sony PlayStation, PlayStation 2 atd. Čínští výrobci elektronických zařízení mají svoji verzi MIPS označovanou jako Godson popř. v anglicky mluvících zemích Dragon. Důvod velké oblíbenosti mikroprocesorů postavených na jádru MIPS spočívá především v možnosti propojení jádra mikroprocesoru s dalšími obvody na jednom čipu, což je velmi často využíváno zejména v embedded aplikacích. V praxi to znamená možnost mít celé zařízení (například dekodér videa či router) umístěné na jednom jediném čipu a programovat přitom na známé, výkonné a mnoha lety praxe odladěné architektuře. Navíc je možné použít některé „nadstavbové“ instrukční sady, například v oblasti DSP, zpracování videa apod.

4. Programátorský model a instrukční sada mikroprocesorů s architekturou MIPS I

Poznámka: tato kapitola je zde uvedena kvůli kontextu, lze ji samozřejmě bez problémů přeskočit.

Programátorský model 32bitových procesorů s architekturou MIPS je ve skutečnosti velmi jednoduchý. Programátoři mají k dispozici 32 pracovních registrů, z nichž každý má šířku 32 bitů. Navíc se při načítání instrukcí z operační paměti používá čítač instrukcí (PC – Program Counter), jehož obsah však není programátorům přímo přístupný; mění se nepřímo operacemi skoku a volání subrutiny. První z pracovních registrů, který je označovaný jménem r0 nebo též přezdívkou (aliasem) $zero, má speciální význam, protože obsahuje vždy nulovou hodnotu, nezávisle na tom, jaká hodnota je do registru zapisována (zápis však nebyl zakázán). Existence registru obsahujícího nulovou konstantu umožnila zmenšit počet instrukcí v instrukční sadě. Dalším 31 pracovním registrům sice nebyla při konstrukci mikroprocesoru přiřazena žádná určitá funkce, ale vývojáři operačních systémů i překladačů vyšších programovacích jazyků začali některým registrům přiřazovat zvláštní význam.

Pracovní registry s indexy 2 a 3 se používaly pro předání návratových hodnot programovému kódu, který volal subrutinu. Aliasy těchto registrů byly $v0 a $v1 (v – value). Pracovní registry s indexy 4 až 7 se používaly pro předání prvních čtyř argumentů volaným funkcím; z tohoto důvodu byla pro jejich aliasy zvolena jména $a0$a3 (a – argument). Pokud se do volané funkce předávalo větší množství parametrů, mohly se použít i další pracovní registry, nebo taktéž programově vytvořený zásobníkový rámec (stack frame), k jehož adresaci se používaly pracovní registry číslo 29 (alias $sp – stack pointer) a 30 (alias $fp – frame pointer). Dalších osm pracovních registrů s aliasy $s0$s7 (s – saved) bylo vyhrazeno pro hodnoty, jejichž hodnota by při návratu z volané subrutiny neměla být změněna. V subrutině se tyto registry samozřejmě mohly používat, ovšem jejich původní hodnoty se většinou v tomto případě ukládaly do aktivačního záznamu subrutiny.

Deset pracovních registrů s aliasy $t0$t9 mohla volaná subrutina využívat pro své vlastní účely, typicky pro provádění aritmetických a logických operací. Hodnoty těchto registrů tedy nemusely být zachovány při návratu ze subrutiny (t – temporary). Zbylých šest pracovních registrů mělo následující význam: $zero – nulová konstanta v registru s indexem 0, registr $at používal assembler při provádění pseudoinstrukcí (assembler temporary), $k0 a $k1 jsou registry používané při volání funkcí jádra (kernel), popř. při zpracování přerušení, v registru s aliasem $gp byl uložen ukazatel na globální data (global pointer) a konečně v registru $ra byla uložena adresa zajišťující návrat ze subrutiny (return address), protože mikroprocesory MIPS neobsahovaly klasický zásobník s návratovými adresami.

Všechny instrukce mikroprocesorů R2000 měly konstantní šířku 32bitů, což mj. taktéž znamenalo, že instrukce byly v operační paměti vždy zarovnány na násobek čtyř bajtů, takže každá instrukce byla načtena v jediném strojovém taktu. Podle způsobu rozdělení bitových polí v 32bitovém slovu se instrukce dělily pouze do třech kategorií – I-type (Immediate), J-type (Jump) a R-Type (register).

U prvního typu instrukcí (I-type) je přímo v instrukčním slovu uložena šestnáctibitová konstanta chápaná podle konkrétní instrukce buď jako šestnáctibitové slovo bez znaménka (0..65535) či šestnáctibitové slovo se znaménkem (-32768..32767). Ve zbývajících šestnácti bitech byl uložen šestibitový operační kód, pětibitový index zdrojového registru a taktéž pětibitový index registru cílového:

  I-Type (immediate)
  ------------------------------------------------------------
  | 31  26     | 25  21 | 20  16 | 15                      0 |
  ------------------------------------------------------------
  | opcode (6) | rs (5) | rt (5) | offset/konstanta (16)     |
  ------------------------------------------------------------

Formát instrukcí typu J (Jump) je ještě jednodušší než formát předchozí, protože za šestibitovým operačním kódem následuje pouze 26 bitů tvořících adresu skoku (skutečná adresa se získá vynásobením konstanty čtyřmi, resp. bitovým posuvem o dva bity doleva):

  J-Type (jump)
  ------------------------------------------------------------
  | 31  26     | 25                                        0 |
  ------------------------------------------------------------
  | opcode (6) | adresa (26)                                 |
  ------------------------------------------------------------

Poslední instrukční formát je využíván u aritmetických a logických instrukcí, které používají takzvaný tříadresový kód, tj. instrukce je provedena se dvěma operandy (zdrojovými registry) a do třetího registru je uložen výsledek operace. Kromě operačního kódu jsou v instrukčním slovu uloženy pětibitové indexy obou zdrojových registrů (rs, rt) i registru cílového (rd), šestibitový kód operace a taktéž pětibitová hodnota posunu (shift) použitá u bitových posunů a rotací:

  R-Type (register)
  ------------------------------------------------------------
  | 31  26     | 25  21 | 20  16 | 15  11 | 10  6 | 5      0 |
  ------------------------------------------------------------
  | opcode (6) | rs (5) | rt (5) | rd (5) | shift | operace  |
  ------------------------------------------------------------

Vlastní instrukční sada mikroprocesorů R2000 se vyznačuje dvěma zvláštnostmi. První z nich je absence registru příznaků (flags), protože konstruktéři tohoto mikroprocesoru (zcela správně :-)) usoudili, že by používání příznaků typu zero, carry, overflow atd. mohlo vést ke vzniku konfliktů, kdy by na výsledek jedné instrukce čekala instrukce další. Kvůli absenci příznaků jsou v instrukční sadě pouze dva podmíněné skoky beq (branch on equal) a bne (branch on not equal), při nichž se skok provede/neprovede na základě porovnání obsahu dvou pracovních registrů, jejichž indexy jsou přímo součástí instrukčního slova – jedná se tedy o instrukce I-type. Povšimněte si, že díky existenci registru $zero se vlastně zadarmo instrukční sada rozšiřuje o pseudoinstrukce bz (branch on zero) a bnz (branch on non zero). Dále se použití příznaků nahradilo logickými instrukcemi slt (set on less than) a slti (set on less than immediate). To již není tak skvělá myšlenka a v projektu RISC-V byla zavržena :-)

5. Projekt OpenRISC

Konečně se dostáváme k prvnímu projektu open-source hardware mikroprocesoru, konkrétně k projektu s názvem OpenRISC. V rámci tohoto projektu je zveřejněn design procesoru pod licencí LGPL, případný firmware pak pod licencí GPL (což je docela dobrý kompromis mezi zajištěním otevřenosti celé platformy a současně to umožňuje komerční využití, i když ne v takové míře, jako u RISC-V). Projekt počítá jak s možností implementace „pouhých“ 32bitových čipů, tak i čipů s 64bitovými sběrnicemi a aritmeticko-logickou jednotkou. Navíc je možné si při implementaci zvolit, zda bude mikroprocesor obsahovat i matematický koprocesor (pro hodnoty s plovoucí řádovou čárkou typu float/single, double či obojí) popř. je možné na čip s mikroprocesorem přidat i koprocesor určený pro zpracování hodnot uložených v krátkých vektorech.

V návrhu se počítá se čtyřřezovou pipeline („klasické RISCové“ fáze IF, ID, EX, WB), kde se jednotlivé fáze různých instrukcí samozřejmě mohou překrývat. Zajímavé je, že se počítá s existencí branch delay slotu (provedení instrukce za skokem), což je další rozdíl v porovnání s architekturou RISC-V. Celkový návrh OpenRISCu působí dojmem, že na prvním místě byla snaha o navržení open-source hardware za každou cenu, zatímco hlubší analýza některých technických detailů se neprováděla (což ostatně zmiňuje i zakladatel projektu LowRisc Alex Bradbury). Výsledek sice vůbec není špatný, ale v porovnání s RISC-V je odlišný přístup k řešení celé problematiky jasně patrný.

6. Programátorský model OpenRISC

Popišme si nyní programátorský model mikroprocesorů OpenRISC. Podobně, jako tomu bylo u výše zmíněné architektury MIPS, i zde mají programátoři k dispozici 16 či (častěji) 32 pracovních registrů o šířce 32 bitů popř. 64 bitů. Registry jsou pojmenované r0r15. V následující tabulce jsou vypsány funkce jednotlivých registrů, ovšem s tou poznámkou, že tyto funkce jsou založeny pouze na konvenci (kromě prvního registru, který je konstantně nulový, opět viz popis architektury MIPS):

Registr(y) Význam
r0 tento registr obsahuje konstantně nulu, díky němu lze zjednodušit instrukční sadu
r1 používá se jako ukazatel na vrchol zásobníku
r9 link registr, používá se pro uchování návratové adresy volající subrutiny
r11 return registr, používá se pro předání návratové hodnoty do volající subrutiny
r12 return registr, používá se pro předání návratové hodnoty do volající subrutiny

Kromě těchto obecných registrů je ve specifikaci popsáno i několik registrů se speciálními funkcemi (například registr s hodnotou časovače). V kontextu programátorského modelu je z těchto registrů důležitý především stavový registr obsahující mimo jiné i tyto tři jednobitové příznaky:

Příznak Význam
carry příznak přenosu při aritmetických operacích
overflow příznak přetečení při aritmetických operacích (typ signed)
branch příznak použitý pro implementaci podmíněných skoků

Zajímavé je, že pro podmíněné skoky lze přímo využít jen příznak branch (označovaný i jako F). Ten je nastavován některou instrukcí pro porovnání dvou registrů, takže podmíněný skok je v praxi implementován vždy dvěma instrukcemi.

7. Instrukční sady použité v projektu OpenRISC

Vzhledem k tomu, že se předpokládá použití mikroprocesorových jader s architekturou OpenRISC v různých zařízeních, od jednodušších řídicích systémů přes zpracování signálů až například po servery, je instrukční sada navržena modulárně. V současnosti existuje pět základních „sad“ instrukcí s předpokladem, že další sady bude možné navrhnout a implementovat v budoucnosti. Jediné, s čím se v architektuře OpenRISC přímo nepočítá, je podpora instrukcí proměnné délky, tj. obdoby sad Thumb známých z konkurenční architektury ARM. V následující tabulce je vypsáno všech pět prozatím oficiálně popsaných sad instrukcí architektury OpenRISC:

# Zkratka Celé jméno Stručný popis
1 ORBIS32 OpenRISC Basic Instruction Set zpracování 32bitových operandů, skoky, podmínky, bitové operace
2 ORBIS64 OpenRISC Basic Instruction Set rozšíření na 64bitové operandy
3 ORFPX32 OpenRISC Floating Point eXtension operace s numerickými hodnotami typu float/single (jednoduchá přesnost)
4 ORFPX64 OpenRISC Floating Point eXtension operace s numerickými hodnotami typu double (dvojitá přesnost)
5 ORVDX64 OpenRISC Vector/DSP eXtension zpracování hodnot uložených v 64bitových vektorech

Pro vytvoření reálně pracujícího mikroprocesoru postačuje implementovat pouze první sadu, tj. ORBIS32, samozřejmě s tím omezením, že zpracování 64bitových celých čísel či reálných čísel typu single a double bude prováděno softwarově (za pomoci subrutin). Vlastnostmi této instrukční sady se budeme zabývat v navazující kapitole.

8. ORBIS32: OpenRISC Basic Instruction Set

Základní instrukční sada ORBIS32 se v několika ohledech podobá instrukční sadě mikroprocesorů MIPS. I zde totiž najdeme instrukce s konstantní šířkou 32bitů, které jsou v paměti vždy zarovnány na adresu dělitelnou čtyřmi. Díky tomu se u skoků nemusí specifikovat nejnižší dva bity adresy či offsetu, neboť tyto bity jsou vždy nulové. Tak, jako je tomu u MIPS, i zde mají instrukce tři formáty. První formát se označuje písmenem R a používá se pro většinu aritmetických, logických a porovnávacích operací prováděných se dvěma zdrojovými registry a jedním registrem cílovým. Další formát se jmenuje I a používá se pro instrukce, v nichž se pracuje se dvěma registry (zdrojový+cílový) a šestnáctibitovou konstantou. Třetí formát se jmenuje J a používá se u skoků, neboť součástí instrukčního slova je 26bitová konstanta. Pokud vám názvy R, I a J připadají povědomé, je to díky tomu, že jsme se o nich zmiňovali ve čtvrté kapitole v souvislosti s architekturou MIPS.

Vzhledem k tomu, že všechny aritmetické a logické operace pracují s hodnotami uloženými v registrech, je množina instrukcí pro přesuny dat do a z paměti poměrně malá. OpenRISC podporuje instrukce typu load a store, které mohou zpracovávat bajty, 16bitová slova či 32bitová slova. Při načítání bajtů a 16bitových slov se provádí rozšíření na plných 32 bitů se znaménkem (doplnění podle nejvyššího bitu načítané hodnoty) či bez znaménka (doplnění nul). To je v mnoha ohledech praktické, neboť i ty nejmodernější 64bitové mikroprocesory mnohdy tráví většinu času zpracováním řetězců.

Mezi aritmetickými instrukcemi najdeme například sčítání s carry či bez carry, násobení a dělení (se znaménkem či bez znaménka), operace typu „multiply and accumulate“ a „multiply and subtract“ a dokonce instrukce ff1 (find first 1) a fl1 (find last 1). Už na tomto krátkém výčtu je patrné, že instrukční sada je poměrně rozsáhlá a implementace „na křemíku“ patřičně komplikovaná (měřeno plochou čipu).

Za zmínku stojí taktéž instrukce začínající prefixem sf. Tyto instrukce nastavují příznakový bit branch/F na základě výsledku porovnání dvou registrů či porovnání registru s šestnáctibitovou konstantou. Hodnota příznakového bitu je následně využita v podmíněném skoku. Příkladem může být instrukce sfeq nastavující F←1 jen tehdy, pokud mají oba registry shodnou hodnotu. Nezapomeňme navíc na registr r0 s „trvalou nulou“, díky jehož existenci automaticky získáváme instrukce sfzero. Alternativou k sfeq je instrukce sfeqi pro porovnání registru s konstantou. Existují i další alternativy, kde se namísto „eq“ používá „gt“ (větší než), „ge“ (větší nebo rovno) atd.

Za zmínku stojí taktéž skoky:

Instrukce Význam
j skok na adresu PC+konstanta
jal skok na adresu PC+konstanta, návratová adresa se uloží do registru r9
jr skok na adresu uloženou ve specifikovaném registru
jalr kombinace jal+jr (skok na adresu v registru, návratová adresa → r9)
bf skok na PC+konstanta pokud je F nastaven
bnf skok na PC+konstanta pokud je F vynulován

Poslední instrukcí, o níž se zmíníme, je instrukce cmov používající taktéž tříadresový kód (indexy tří registrů). Tato instrukce může v některých případech nahradit podmíněné skoky:

  1. Pokud je F==1, proveď mov D,A
  2. Pokud je F==0, proveď mov D,B

9. Projekt RISC-V: budoucnost čistě RISCových čipů?

Druhým projektem, o němž se dnes alespoň stručně zmíníme, je projekt nazvaný RISC-V. Cílem tohoto projektu bylo navrhnout zcela novou instrukční sadu použitelnou ve všech typech aplikací, tj. jak v open-source hardware projektech, tak i v komerčních čipech. Z tohoto důvodu byla zvolena BSD Licence a nikoli dvojice GPL+LGPL tak, jako tomu je u projektu OpenRISC. V rámci RISC-V se počítá s 32bitovými, 64bitovými a v budoucnu dokonce se 128bitovými čipy, přičemž specifikace je psána takovým způsobem, že předpokládá všechny možnosti. Návrh RISC-V je velmi čistý a jednoduchý. To se týká jak formátu instrukcí (indexy registrů jsou vždy na stejném místě, což zjednodušuje dekodér), tak i samotné instrukční sady (čistý RISC v původním významu). Čistota návrhu se týká i různých maličkostí; například způsobu uložení konstant v instrukčním slovu, způsobu řešení dělení nulou u instrukcí typu div a rem, absence příznakových bitů apod.

Programátorský model procesorů RISC-V se v mnoha ohledech podobá modelu procesorů MIPSOpenRISC. I zde je k dispozici 32 registrů x0x31 o šířce 32, 64 či alternativně 128 bitů, přičemž registr s indexem 0 (x0) obsahuje konstantní nulu a registr x1 se používá pro uložení návratové adresy (link registr). Kromě toho je k dispozici i registr PC. V případě implementace matematického koprocesoru se sada registrů rozrůstá o registry f0f31 doplněné o stavový registr fsr. Specifikace taktéž uvádí několik speciálních registrů používaných ve funkci čítačů. Podrobnosti o této problematice si řekneme příště.

10. Instrukční sady použité v projektu RISC-V

Podobně, jako je tomu u výše popsaného projektu OpenRISC, i v čipech založených na architektuře RISC-V je možné použít několik instrukčních sad. Díky návrhu kódování instrukcí není nutné provádět přepínání mezi jednotlivými sadami způsobem, jaký znají například programátoři mikroprocesorů s architekturou ARM (přepínání A32→Thumb→A32 atd.). To, že je možné zcela libovolně mixovat instrukce z různých sad, je velmi zajímavé a rozšiřitelné řešení. V následující tabulce jsou zmíněna jména základních (oficiálních) instrukčních sad i dalších rozšíření, ovšem s tím doplněním, že v tabulce operačních kódů zbývá místo i na další – oficiální či privátní – instrukce (což je jen dobře, že tvůrci „nezaplácali“ všechny operační kódy):

Označení Význam
  Oficiální sady instrukcí
I aritmetické instrukce (32/64 bit), load/store, skoky
M rozšíření o instrukce pro násobení a dělení
A atomické operace typu read-modify-write (pro multicore)
F operace s hodnotami typu float/single (jednoduchá přesnost)
D operace s hodnotami typu double (dvojitá přesnost)
  Další rozšíření
Q operace s hodnotami typu quad (čtyřnásobná přesnost)
L decimální aritmetika
C komprimované instrukce (viz poznámka pod tabulkou)
B bitové operace
T podpora pro transakční paměť
P SIMD operace

Poznámka: operační kódy instrukcí jsou konstruovány takovým způsobem, aby bylo v budoucnu možné používat i instrukce proměnné délky, tj. jak instrukce kratší než 32 bitů (obdoba Thumb), tak i například nějakou variantu VLIW.

Poznámka2: prvních pět sad IMAFD se označuje symbolem G znamenající univerzální mikroprocesor.

11. Nejdůležitější rozdíly RISC-V oproti architektuře MIPS a OpenRISC

Architektura RISC-V se v několika ohledech odlišuje jak od architektury MIPS, tak i od OpenRISC. Asi nejvíce je to patrné u podpory podmíněných skoků. Zatímco u MIPS existovaly jen dvě instrukce pro podmíněné skoky (beq, bne) doplněné o instrukce slt a slti), spoléhají se čipy OpenRISC na porovnávací operace nastavující příznak F. Naproti tomu se u architektury RISC-V příznaky nepoužívají vůbec a sada podmíněných skoků byla doplněna na beq, bne, blt a bge, přičemž další kombinace (bgt apod.) vzniknou jednoduše prohozením obsahu prvního a druhého registru. Opět nesmíme zapomenout na registr x0 s konstantní nulou, který umožňuje realizovat skoky typu bz a bnz.

ict ve školství 24

Liší se vlastní implementace skoků na čipu, protože RISC-V neobsahuje branch delay slot a navíc se u skoků předpokládá, že na čipu bude implementován statický a dynamický prediktor skoků. Statický prediktor bude u prozatím neznámé skokové instrukce předpokládat, že skok směrem dozadu se provede a skok dopředu nikoli, dynamický prediktor pak může vést přesnější statistiku.

Vzhledem k rozsáhlosti tohoto tématu se dalšími vlastnostmi architektury RISC-V budeme zabývat příště.

12. Odkazy na Internetu

  1. Comparing four 32-bit soft processor cores
    http://www.eetimes.com/au­thor.asp?section_id=14&doc_id=1286116
  2. RISC-V Instruction Set
    http://riscv.org/download­.html#spec_compressed_isa
  3. RISC-V Spike (ISA Simulator)
    http://riscv.org/download.html#isa-sim
  4. RISC-V (Wikipedia)
    https://en.wikipedia.org/wiki/RISC-V
  5. David Patterson (Wikipedia)
    https://en.wikipedia.org/wi­ki/David_Patterson_(compu­ter_scientist)
  6. OpenRISC (oficiální stránky)
    http://openrisc.io/
  7. OpenRISC architecture
    http://openrisc.io/architecture.html
  8. Emulátor OpenRISC CPU v JavaScriptu
    http://s-macke.github.io/jor1k/demos/main.html
  9. OpenRISC (Wikipedia)
    https://en.wikipedia.org/wi­ki/OpenRISC
  10. OpenRISC – instrukce
    http://sourceware.org/cgen/gen-doc/openrisc-insn.html
  11. OpenRISC – slajdy z přednášky
    https://iis.ee.ethz.ch/~gmichi/a­socd/lecturenotes/Lecture6­.pdf
  12. Maska mikroprocesoru RISC 1
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC1.jpg
  13. Maska mikroprocesoru RISC 2
    http://www.cs.berkeley.edu/~pat­trsn/Arch/RISC2.jpg
  14. C.E. Sequin and D.A.Patterson: Design and Implementation of RISC I
    http://www.eecs.berkeley.e­du/Pubs/TechRpts/1982/CSD-82–106.pdf
  15. Berkeley RISC
    http://en.wikipedia.org/wi­ki/Berkeley_RISC
  16. Great moments in microprocessor history
    http://www.ibm.com/develo­perworks/library/pa-microhist.html
  17. Microprogram-Based Processors
    http://research.microsoft.com/en-us/um/people/gbell/Computer_Struc­tures_Principles_and_Exam­ples/csp0167.htm
  18. Great Microprocessors of the Past and Present
    http://www.cpushack.com/CPU/cpu1.html
  19. A Brief History of Microprogramming
    http://www.cs.clemson.edu/~mar­k/uprog.html
  20. What is RISC?
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/whatis/
  21. RISC vs. CISC
    http://www-cs-faculty.stanford.edu/~ero­berts/courses/soco/projec­ts/2000–01/risc/risccisc/
  22. RISC and CISC definitions:
    http://www.cpushack.com/CPU/cpu­AppendA.html
  23. FPGA
    https://cs.wikipedia.org/wi­ki/Programovateln%C3%A9_hra­dlov%C3%A9_pole
  24. The Evolution of RISC
    http://www.ibm.com/develo­perworks/library/pa-microhist.html#sidebar1
  25. SPARC Processor Family Photo
    http://thenetworkisthecom­puter.com/site/?p=243
  26. SPARC: Decades of Continuous Technical Innovation
    http://blogs.oracle.com/on­therecord/entry/sparc_deca­des_of_continuous_technical
  27. The SPARC processors
    http://www.top500.org/2007_o­verview_recent_supercompu­ters/sparc_processors
  28. Reduced instruction set computing (Wikipedia)
    http://en.wikipedia.org/wi­ki/Reduced_instruction_set_com­puter
  29. MIPS architecture (Wikipedia)
    http://en.wikipedia.org/wi­ki/MIPS_architecture
  30. Very long instruction word (Wikipedia)
    http://en.wikipedia.org/wi­ki/Very_long_instruction_word
  31. Classic RISC pipeline (Wikipedia)
    http://en.wikipedia.org/wi­ki/Classic_RISC_pipeline
  32. R2000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wi­ki/R2000_(microprocessor)
  33. R3000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R3000
  34. R4400 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R4400
  35. R8000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R8000
  36. R10000 Microprocessor (Wikipedia)
    http://en.wikipedia.org/wiki/R10000
  37. SPARC (Wikipedia)
    http://en.wikipedia.org/wiki/Sparc
  38. CPU design (Wikipedia)
    http://en.wikipedia.org/wi­ki/CPU_design
  39. Control unit (Wikipedia)
    http://en.wikipedia.org/wi­ki/Control_unit

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.