RISC-V (uttalas "risk-five" på engelska) är en öppen processorarkitektur. Den finns huvudsakligen i två varianter: RV32 för 32 bitar och RV64 för 64 bitar. Det finns också en preliminär definition av en 128-bitarsvariant.[1]
Utvecklingen startade på University of California, Berkeley sommaren 2010. Namnet RISC-V kommer av att det är universitetets femte arkitektur av RISC-typ.[1] Nu drivs utvecklingen av RISC-V Foundation och dess medlemmar.[2]
Arkitekturen designades för att vara flexibel och enkel att utöka. Ett av de ursprungliga målen med utvecklingen av RISC-V var att underlätta forskning och utbildning kring processorarkitekturer.[1]
Den mest grundläggande formen av RISC-V (RV32I eller RV64I) har endast ett fåtal instruktioner som utför några vanliga heltalsoperationer och läser och skriver till minnet, med mera. Andra funktioner definieras i separata tillägg som är valfria att implementera.
För att underlätta utvecklingen av program till RISC-V har en delmängd av standardtilläggen utsetts till "general-purpose". Dessa tillägg är:
En processorkärna i RISC-V kan innehålla en eller flera hårdvarutrådar (engelska: hardware thread eller hart).
En hårdvarutråd har upp till tre olika lägen som den kan köras i: machine (M), supervisor (S) samt user (U). Det enda av dessa som måste stödas är machine-läget men för att kunna köra vanliga operativsystem (exempelvis Linux) behövs oftast alla tre.
När processorn startas börjar alla hårdvarutrådar att exekvera i machine-läget på en implementationsdefinierad minnesadress.
En instruktion har oftast storleken 32 bitar (både i RV32 och RV64), eller 16 bitar om komprimerade instruktioner används.
De flesta instruktioner kan inte läsa eller skriva till minnet, utan bara till register. För att läsa eller skriva till minnet används separata load- och store-instuktioner.
Det finns även ett antal pseudoinstruktioner definierade. Dessa instruktioner har inga egna kodningar, utan är endast alias för en eller flera andra instruktioner.
RISC-V definierar processorregister x0-31 för heltal, f0-31 för flyttal, pc (programräknare) samt ett antal kontroll- och statusregister. Storleken på heltalsregistren och programräknaren är 64 bitar i RV64 och 32 bitar i RV32. Storleken på flyttalsregistren är 64 bitar om D-tillägget används, annars 32 bitar om endast F-tillägget används.
Namn | ABI-namn | Beskrivning |
---|---|---|
32 Heltalsregister | ||
x0 | zero | Alltid 0 vid läsning. Inget händer vid skrivning. |
x1 | ra | Returadress |
x2 | sp | Stackpekare |
x3 | gp | Global pekare |
x4 | tp | Trådpekare |
x5 | t0 | Temporär / alt. länkregister |
x6-7 | t1-2 | Temporära |
x8 | s0/fp | Sparat register / rampekare |
x9 | s1 | Sparat register |
x10-11 | a0-1 | Funktionsargument / returvärden |
x12-17 | a2-7 | Funktionsargument |
x18-27 | s2-11 | Sparade register |
x28-31 | t3-6 | Temporära |
32 Flyttalsregister | ||
f0-7 | ft0-7 | Temporära |
f8-9 | fs0-1 | Sparade register |
f10-11 | fa0-1 | Funktionsargument / returvärden |
f12-17 | fa2-7 | Funktionsargument |
f18-27 | fs2-11 | Sparade register |
f28-31 | ft8-11 | Temporära |
Varje hårdvarutråd har en adressrymd tillgänglig. En adress kan antingen vara oanvändbar eller leda till antingen primärminne eller en annan enhet. Byteordningen som används i RISC-V är little-endian.
Det finns ingen garanti att minnesåtkomster som utförs av en hårdvarutråd kommer att ses i samma ordning av andra hårdvarutrådar eller andra enheter som kan komma åt minnet. För att garantera ordningen behöver en hårdvarutråd använda fence-instruktioner. En fence-instruktion kan göra så att en instruktion som utförs före fence och en instruktion som utförs efter inte kan se ut att ha utförts i motsatt ordning av andra hårdvarutrådar eller enheter.