RISC-V

Logo
Prototyp eines RISC-V Mikroprozessors aus dem Jahr 2013

RISC-V, offizielle Aussprache in Englisch: „risc-five[1] [rɪsk faɪv], ist eine Befehlssatzarchitektur (engl. instruction set architecture, ISA), die sich auf das Designprinzip des Reduced Instruction Set Computers (RISC) stützt. Es ist ein offener Standard, welcher der freien BSD-Lizenz unterliegt. Das bedeutet, dass RISC-V nicht patentiert ist und frei verwendet werden darf. Somit ist es jedem erlaubt, RISC-V Mikroprozessoren zu entwerfen, herzustellen, weiterzuentwickeln und zu verkaufen (Open-Source-Hardware).[2] Zahlreiche Unternehmen bieten RISC-V-Hardware an oder haben diese angekündigt.

Der RISC-V Befehlssatz wurde für eine Vielzahl von Anwendungsfällen entworfen. Er hat eine variable Datenwortbreite und ist erweiterbar, so dass mehr Kodierungsbits jederzeit hinzugefügt werden können. Er unterstützt drei Datenwortbreiten: 32, 64 und 128 Bit und eine Auswahl an Unterbefehlssätzen. Die Definitionen jedes Unterbefehlssatzes variieren geringfügig zwischen den drei Wortbreiten. Die Unterbefehlssätze unterstützen kompakte eingebettete Systeme, persönliche Rechner, Hochleistungsrechner mit Vektorprozessoren und Parallelrechner.

Der Befehlssatzraum für den auf 128 Bit gedehnten Befehlssatz wurde reserviert, weil 60 Jahre Industrieerfahrung gezeigt haben, dass die meisten nicht wieder gut zu machenden Fehler in der Gestaltung von Befehlssätzen durch fehlenden Speicheradressraum verursacht wurden. Noch im Jahr 2016 blieb der 128-Bit-Teil des Befehlssatzes absichtlich undefiniert, da bisher wenig Erfahrung mit solch großen Speichersystemen besteht. Es gibt Vorschläge, Instruktionen mit einer variablen Breite bis zu 864 Bit zu implementieren.[3]

Das Projekt begann 2010 an der University of California, Berkeley unter der Leitung von Krste Asanovic und David A. Patterson und wird bereits von Hard- und Softwareentwicklern weltweit mitentwickelt und gefördert.[4] Anders als andere akademische Entwürfe, die üblicherweise auf einfache Erläuterung optimiert sind, wurde der RISC-V-Befehlssatz für die praktische Anwendung in Rechnern entworfen. Er besitzt Eigenschaften, die die Rechnergeschwindigkeit erhöhen, aber trotzdem die Kosten und den Energieverbrauch senken. Dies schließt eine Load/Store-Architektur ein, sowie Bit-Muster, um die Multiplexer in einer CPU zu vereinfachen, vereinfachte Standard-basierte Gleitkommazahlen, einen architekturneutralen Entwurf und das Setzen des höchstwertigen Bits an eine festgelegte Position, um die Vorzeichenerweiterung zu beschleunigen. Vorzeichenerweiterung wird häufig als kritisch eingestuft. Im Jahre 2019 wurde die Version 2.2 des Userspace-ISA[5] und im Jahre 2021 die Version 1.12 des privilegierten ISA[6] festgelegt und ermöglichen es Software- und Hardwareherstellern, diesen zu nutzen oder zu implementieren. Eine Fehlersuch-Spezifikation ist in der Spezifikation der privilegierten ISA enthalten.

Architektur

Der RISC-V-Befehlssatz steht in der Tradition der RISC-Prozessoren, die sich auf möglichst wenige, einfach zu dekodierende Maschinenbefehle konzentrieren. Dementsprechend hat der einfachste RISC-V-Befehlssatz (RV32I) nur 40 Befehle.

RISC-V hat in allen Varianten eine Wortgröße von 32 bit. Demnach sind alle regulären standardisierten Befehle 32 bit groß, und die kleinstmögliche Registergröße ist 32 bit. Für einige Befehle gibt es in der C-Erweiterung (siehe unten) alternative Kodierungen, die nur 16 bit (Halbwort) groß sind, allerdings dasselbe Verhalten aufweisen wie der entsprechende 32-bit-Befehl. Die Größe eines Maschinenbefehls kann an den untersten Bit des Befehls abgelesen werden, und Maschinenbefehle mit 64 und 128 bit Größe sind hier bereits vorgesehen. Ist die C-Erweiterung nicht implementiert, müssen Befehle an 4-Byte-Grenzen ausgerichtet sein, andernfalls können es auch 2-Byte-Grenzen sein (selbst für 32-bit-Befehle).

RISC-V ist eine Little-Endian-Architektur. Befehle werden immer in Little-Endian-Reihenfolge gelesen; daher auch die Kodierung der Befehlsgröße in den untersten Befehlsbits, die sich immer im ersten gelesenen Byte befinden. Falls die Implementierung dies unterstützt, kann nur für Datenzugriffe im Hauptspeicher auf Big-Endian umgeschaltet werden.

Architekturen und Erweiterungen

RISC-V ist nicht eine einzige Architektur, sondern eine ganze Familie an Architekturen, die modular aufeinander aufbauen. So gibt es die drei Grundarchitekturen namens RV32I, RV64I und RV128I, die entsprechend der Zahl im Namen eine Register- und Speicherbreite von 32, 64 bzw. 128 bit besitzen. Auch wenn streng genommen RV64I keine einfache Erweiterung von RV32I ist, werden alle existierenden Befehle mit neuer Bedeutung übernommen; der ADD-Befehl addiert beispielsweise nun statt zweier 32-bit Zahlen zwei 64-bit Zahlen. Die Grundarchitekturen enthalten entsprechend des „I“ im Namen nur Integer-Befehle, d. h. Befehle, die mit Ganzzahlen rechnen. Dazu kommen andere, fast immer benötigte Befehle wie bedingte und unbedingte Sprungbefehle, Speicherzugriffsbefehle und Software-Interrupt-Befehle. Alle weiteren Funktionalitäten sind in standardisierte Befehlssatzerweiterungen zusammengefasst, die jeweils eine 32-bit, 64-bit und 128-bit-Version besitzen. Wichtige Erweiterungen und ihre Namen sind:

  • M für Ganzzahl-Multiplikation und -Division
  • A für atomare Speicheroperationen in Multiprozessorsystemen
  • F, D und Q für Gleitkommaoperationen nach IEEE 754: binary32, binary64 bzw. binary128
  • Zicsr für Control and Status Registers (CSRs) (siehe unten)
  • C für komprimierte Befehle, das sind 16-bit-Kodierungen häufig verwendeter Befehle, die somit den Speicherverbrauch reduzieren.

Es ist explizit vorgesehen, dass proprietäre bzw. Drittanbieter-Erweiterungen für RISC-V verfasst werden, die einen mit X beginnenden Namen führen. Beispiele dafür sind XTheadBb, XTheadSync oder XVentanaCondOps.[7]

Verfügt eine RISC-V-Implementierung nun über eine bestimmte Sammlung an Erweiterungen, so kann diese entsprechend der Kurznamen kompakt bezeichnet werden, beispielsweise RV64IMCZicsr für einen Prozessor, der über die 64-bit-Basisarchitektur mit Ganzzahlmultiplikationen, komprimierten Befehlen und CSR-Unterstützung verfügt. Manche Erweiterungen hängen wiederum von anderen ab; so ist die Unterstützung von 64-bit-Gleitkommazahlen (D) nur gleichzeitig mit CSRs (Zicsr) und 32-bit-Gleitkommazahlen (F) möglich. Für eine CPU, die ein Endbenutzer-Betriebssystem ausführen kann, werden eine ganze Reihe an Erweiterungen benötigt, die unter der Pseudo-Erweiterung G (general purpose) zusammengefasst werden. RV64G bedeutet demnach eigentlich RV64IMAFDZicsr_Zifencei, also die Basisarchitektur inklusive sieben Erweiterungen.

Basisarchitektur

RISC-V besitzt 32 Register, die ganze Zahlen enthalten. Die Basisarchitektur bestimmt deren Größe; so hat RV32 eben 32-bit-Register und RV64 64-bit-Register. Die Register werden mit den Architekturnamen x0 bis x31 bezeichnet. Dabei ist x0 ein besonderes Register, da es beim Lesen immer 0 enthält und alle Schreibvorgänge auf x0 ignoriert werden. Dies wird genutzt, um verschiedene Funktionen ohne zusätzliche Befehle möglich zu machen:

# Subtrahiert x6 von x0, d.h. negiert x6
sub x5, x0, x6
# Prüft, ob x0 kleiner als x13 ist, d.h. ob x13 größer als 0 ist
slt x2, x0, x13
# Speichert die Addition von 0 und x0 in x0; kanonisches NOP
addi x0, x0, 0

Viele dieser Funktionen sind in diversen Assembler-Pseudobefehlen verfügbar; für die drei Befehle oben wären es neg, sgtz bzw. nop. Rechenbefehle verfügen immer über drei Operanden: zwei Quellregister rs1 und rs2 und ein Zielregister rd. Anders als bei anderen Architekturen ist das erste Quellregister nicht automatisch auch das Zielregister, wobei es natürlich möglich ist, dasselbe Register für Quelle und Ziel anzugeben. Befehle mit konstanten Operanden, sogenannte Immediate-Befehle, ersetzen rs2 durch eine Konstante, die im Befehl selbst enthalten ist. Einige Beispiele für Rechenbefehle:

# Addiert x0 (0) und 42 und speichert das Ergebnis in x7
# d.h. lädt die Konstante 42 in x7
addi x7, x0, 42
# Konstante 10 wird in x6 gespeichert
addi x6, x0, 10
# Subtrahiert x7 von x6 und speichert das Ergebnis in x5
sub x5, x6, x7
# Exklusives Oder mit Immediate
xori x4, x5, 0x1111
# Arithmetische Bitverschiebung nach rechts
sra x8, x4, x5
# Multipliziert x5 mit x4 und speichert das Ergebnis in x10
mul x10, x5, x4

Konstanten, LUI und AUIPC

Gewöhnliche Immediate-Befehle können aufgrund der Befehlskodierung ausschließlich 12-bit-Konstanten enthalten. Je nachdem, ob die Konstante vorzeichenlos oder vorzeichenbehaftet ist, bedeutet dies einen Wertebereich von 0 bis 4096 bzw. −2048 bis 2047. Um auch größere Konstanten kodieren zu können, gibt es den Befehl Load Upper Immediate (lui). lui lädt eine 32-bit-Konstante, deren obere 20 bit dem Immediate entstammen und deren untere 12 bit auf 0 gesetzt werden. Mittels einer darauffolgenden Addition kann so in zwei Befehlen jede 32-Bit-Zahl geladen werden:

# Die Zahl 987654321 (0x3ADE6'8B1) soll in Register x20 geladen werden.

# Lade in x20 die Konstante 0x3ADE6'000,
# Das 20-bit-Immediate-Argument wird in Bit 31...12 geschrieben, Bit 11...0 werden genullt
lui x20, 0x3ADE6

# Setzen der unteren 12 bit
addi x20, x20, 0x8B1         # oder ori x20, x20, 0x8B1

# Mit einem Makro-Assembler würde man einen Makrobefehl li definieren,
# den man so verwenden kann und der je nach Konstante 1 oder 2 Instructions erzeugt:
li x20, 0x3ADE68B1

Makro-Assembler sind seit den späten 1950er Jahren verfügbar.[8]

Der Befehl Add Upper Immediate to Program Counter (auipc) addiert einen solchen 20-Bit-Immediate stattdessen zum aktuellen Programmzähler (Program Counter), womit effizient Speicheradressen in der Nähe des Programmcodes abgerufen werden können und der Code positionsunabhängig wird.

Speicherzugriffe

RISC-V hat als Load/Store-Architektur keine Befehle, die direkt auf Daten im Speicher Rechenoperationen durchführen können. Eine Ausnahme hiervon bilden die atomaren Befehle aus der A-Erweiterung, die solche Funktionalität zur Prozessorsynchronisierung benötigen (amoadd, amoor, amoswap etc.). Für reguläre Speicherzugriffe ist nur ein einfaches Laden oder Speichern vom/zum Hauptspeicher möglich, und der Addressierungsmodus ist immer Register+Konstante. Beispielsweise kann das Register die Startadresse einer Struktur enthalten und die Konstante den Offset eines Felds in der Struktur.

# Lade Byte von Adresse 0x40
lb x11, 0x40(x0)
# Lade erstes Wort auf dem Stack (x2 ist der Stack Pointer)
lw x12, 4(x2)
# Lade Halbwort (16 bit) ohne Vorzeichenerweiterung
lhu x13, 2(x2)

# Speichere Doppelwort (nur RV64 und RV128)
sd x13, 8(x2)
# Speichere Wort ohne Vorzeichenerweiterung (nur RV64 und RV128)
swu x12, 0(x2)

Speicherzugriffe müssen ausgerichtet sein, z. B. Wortzugriffe auf Vielfache von 4 Byte und Doppelwortzugriffe auf 8 Byte. Eine Implementierung kann auch unausgerichtete Speicherzugriffe unterstützen, dies ist jedoch in der Regel nicht der Fall und wird eventuell in der Firmware emuliert (fast trap and emulate).

Kontrollfluss

RISC-V besitzt anders als die meisten heutzutage verbreiteten Architekturen kein Statusregister und keine Flags. Kontrollflussentscheidungen werden immer auf der Basis eines konkreten Vergleichs durchgeführt, zum Beispiel:

# Springe falls x4 < x5 (ganze Zahlen)
blt x4, x5, label1
# Springe falls x7 >= x9 (natürliche Zahlen)
bgeu x7, x9, label2
# Springe falls x1 = 0 (Pseudobefehl beqz)
beq x1, x0, label3

Das Sprungziel wird im Maschinenbefehl als Offset vom aktuellen Befehl angegeben und kann bis zu ±4KiB betragen. Für bedingungslose Sprünge, Prozeduraufruf und Rückkehr aus einer Prozedur dienen Jump And Link (jal) und Jump And Link Register (jalr). jal verwendet ein Offset wie die bedingten Branch-Befehle, wobei dank 20-bit-Offset jetzt Sprünge ±1MiB möglich sind. jalr benutzt ein kleineres Offset addiert zu einem Register und kann somit auf den gesamten Speicherbereich springen. Beide Befehle speichern die Adresse des folgenden Befehls im Zielregister, was später einen Rücksprung ermöglicht.

# Sprung ohne Speichern der Rücksprungadresse (Pseudobefehl j)
jal x0, label1
# Rücksprungadresse wird im Return-Address-Register x1 gespeichert (Pseudobefehl call)
jal x1, my_procedure
# Sprung zur Return-Adresse aus x1 (Pseudobefehl ret)
jalr x0, x1, 0

Gleitkommazahlen

RISC-V unterstützt mit den F-, D-, und Q-Erweiterungen Gleitkommazahlen nach dem IEEE 754-2008-Standard. 32 separate Register für Gleitkommazahlen sind verfügbar, f0-f31 genannt, wobei das Register f0 keine Sonderstellung wie x0 einnimmt. Je nach konkreter Erweiterung haben die Register eine Größe von 32, 64 oder 128 bit, und Gleitkommazahlen kleinerer Größe (bspw. 32-bit-Gleitkommazahlen auf einer Implementierung mit D-Unterstützung) werden mittels NaN-Packing „eingebettet“.

Gleitkommaoperationen haben analog zu den Ganzzahloperationen drei Operanden (zwei Quellregister und ein Zielregister). Ein Quadratwurzelbefehl existiert (fsqrt), aber beispielsweise kein Sinus oder Kosinus. Es existieren direkte Speicherzugriffsbefehle, die Gleitkommaregister laden und speichern können. Es können sowohl Ganzzahlen in Gleitkommazahlen umgewandelt werden und zurück (fcvt), als auch die IEEE-754-Darstellung einer Kommazahl direkt aus einem Ganzzahlregister geladen oder in ein solches gespeichert werden (fmv). Mittels der Sign-Injection-Befehle (fsgnj, fsgnjx, fsgnjn), die den Betrag des ersten Quellregisters und das Vorzeichen des zweiten Quellregisters kombinieren, können zusätzlich die Operationen Negation, Betrag und Register-Transfer (fmv) implementiert werden.

In den Basiserweiterungen F, D, und Q sind Fused-Multiply-Add-Befehle enthalten (fmadd, fmsub, fnmadd, fnmsub), die als einzige Standardbefehle überhaupt vier Operanden (drei Quellregister) enthalten. Diese benötigen einen wesentlichen Anteil des 32-bit-Befehlsraums, sorgen aber in mathematischen Operationen und Multimediaanwendungen für einen deutlichen Geschwindigkeitsgewinn[9].

# Ausschnitt aus einer asinh-Implementierung
# Programmkonstante laden
auipc   x12,0xfffbf
fld     f11,-1154(x12)
# Diese Befehle nutzen alle dynamische Rundung
fmadd.d f5,f4,f5,f6
fmadd.d f5,f4,f5,f7
fmadd.d f5,f4,f5,f10
fmadd.d f5,f4,f5,f11
fld     f6,-426(x10)
fmul.d  f4,f4,f5
fmul.d  f4,f3,f4
fmadd.d f2,f3,f2,f4
fmul.d  f2,f2,f6
Bit Mne-
monic
Bedeutung
4 NV Invalid Operation
3 DZ Divide by Zero
2 OF Overflow
1 UF Underflow
0 NX Inexact

IEEE-754-Exceptions lösen keine Interrupts aus (was vom Standard auch erlaubt ist). Stattdessen dient das Gleitkomma-Steuer-und-Status-Register Bit 4 bis 0: fflags-Feld zur Auflistung aller aufgetretenen Gleitkomma-Fehler.

Der Rundungsmodus kann in den meisten Befehlen fest angegeben werden (hart kodiert im Befehl) oder aber auch aus dem Gleitkomma-Steuer-und-Status-Register Bit 7 bis 5: frm-Feld entnommen werden.

Rundungs-
Modus-
Nummer
Mne-
monic
Bedeutung
000 RNE Runde zur nächstgelegenen Zahl, bevorzuge gerade Zahlen
001 RTZ Runde in Richtung ±0
010 RDN Runde ab in Richtung −
011 RUP Runde auf in Richtung +
100 RMM Runde zur nächstgelegenen Zahl, bevorzuge größere Amplitude
101 res.
110 res.
111 DYN nutze Gleitkomma-Steuer-und-Status-Register Bit 7:5
für Rundungsmodus (hat 000...100 zu sein)

Control and Status Registers (Zicsr)

Um das Verhalten des Prozessors und verschiedener Befehle zu steuern, verfügt ein RISC-V-Prozessor mit der Zicsr-Erweiterung über bis zu 4096 sogenannter Control and Status Register, d. h. Kontroll- und Statusregister, abgekürzt CSRs. Die CSRs werden mit eigenen Befehlen wie csrrw und csrrci modifiziert, die in der Regel gleichzeitig ein CSR lesen und schreiben, außer es wird x0 als Operand genutzt. Abhängig vom Prozessormodus und der Implementierung sind manche CSRs nur lesbar, oder Schreibzugriffe werden ignoriert. Wichtige CSRs sind beispielsweise:

  • IEEE 754 Exceptions (fflags) und Rundungsmodi (frm)
  • Performance-Counter: Verstrichene Taktzyklen (cycle), Monotoner Zeitzähler beliebiger Auflösung (time), abgearbeitete Befehle (instret) und 29 weitere Zähler mit unspezifizierter Funktion

Der Großteil der CSRs wird für Systemfunktionalitäten benötigt und ist daher in üblichen Benutzeranwendungen nicht verfügbar. Dazu gehören beispielsweise:

  • Interruptsteuerung für S-, H- oder M-Mode (sstatus, sie, stvec, ...)
  • Informationen für den Interrupthandler (sepc/mepc, scause/mcause, stval/mtval, ...)
  • Konfiguration der Physical Memory Protection (PMP) (pmpcfg0-pmpcfg15, pmpaddr0-pmpaddr63)
  • Verfügbare RISC-V-Erweiterungen (misa)

ABI

Die ABI für RISC-V wird, anders als bei vielen Architekturen, gemeinsam mit der ISA spezifiziert und standardisiert.[10] Je nach Basisarchitektur und genauer Prozeduraufrufkonvention, besonders zur Behandlung von Gleitkommaparametern, gibt es verschiedene inkompatible ABIs, die wie die Architekturen mit Kürzeln wie LP64D, ILP32 oder ILP32E bezeichnet werden. Teil der standardisierten ABI ist auch die Spezifikation zur Verwendung des ELF-Binärformats für RISC-V.

Die ABI weist einigen Registern besondere Bedeutungen zu und teilt die übrigen Register in die Kategorien Saved, Argument und Temporary ein. Jedes Register, ob Ganzzahl- oder Gleitkommaregister, erhält entsprechend einen ABI-Namen, der die Assemblerprogrammierung vereinfacht.

Register ABI-
Name(n)
Bezeichnung Erklärung
x0 zero Zero Konstantes Nullregister (Lesen: Wert 0, Schreiben: kein Effekt)
x1 ra Return address Rücksprungadresse; wird in Pseudobefehlen wie ret und call implizit genutzt.
x2 sp Stack pointer Stapelzeiger. Einige Erweiterungen wie C besitzen spezialisierte Befehle hierfür.
x3 gp Global pointer Zeiger auf die Liste globaler Programmsymbole.
x4 tp Thread pointer Zeiger auf den TLB des aktuellen Programmthreads, siehe Thread-local storage.
x8 fp Frame pointer Framezeiger, zeigt auf die Startadresse des aktuellen Stackframes. Optional; entspricht auch s0.
x5…7, x28…31 t0…6 Temporary registers Register für temporäre Daten, die beim Prozeduraufruf nicht erhalten bleiben müssen.
x8…9, x18…27 s0…11 Callee-saved registers Register, die von aufgerufenen Prozeduren gesichert werden, falls sie diese benötigen.
x10…17 a0…7 Argument registers Register für die ersten 8 Prozedurargumente und Rückgabewerte.
f0…7, f28…31 ft0…11 Floating-point Temporary registers Temporäre Register für Gleitkommazahlen.
f8…9, f18…27 fs0…11 Floating-point Callee-saved registers Gesicherte Register für Gleitkommazahlen.
f10…17 fa0…7 Floating-point Argument registers Register für die ersten 8 Gleitkomma-Argumente und -Rückgabewerte von Prozeduren.

Prozeduraufruf (Calling Convention)

Bei einem Prozeduraufruf werden nur die gesicherten bzw. unveränderlichen Register wie s0-s11 oder gp erhalten. So viele Argumente wie möglich werden in den Argumentregistern übergeben, weitere Argumente kommen auf den Stack. Rückgabewerte werden genauso wie Argumente übergeben.

Prozeduraufrufe (mit Pseudobefehlen ret und call) interagieren nicht ohne weiteres mit dem Stack, was die manuelle Sicherung der Rücksprungadresse spätestens direkt vor einem weiteren Prozeduraufruf erfordert. In der Praxis werden Register nach aufsteigender Nummer auf dem Stack gesichert, sodass die Rücksprungadresse auf dem Stack ganz unten liegt. Führt eine Prozedur allerdings keinen weiteren Prozeduraufruf auf, so erübrigt sich auch die Sicherung der Rücksprungadresse.

Ein RISC-V-Stack wächst „nach unten“ (Richtung absteigender Adressen) und der Stapelzeiger zeigt immer auf den obersten in Verwendung befindlichen Speicher.

# Beginn der asinh-Prozedur von oben
# Stack um zwei Doppelworte vergrößern...
addi x2, x2, -16
# ... damit zwei Register gesichert werden können.
sd   x1, 8(x2) # Rücksprungadresse (diese Prozedur ruft noch andere Prozeduren auf)
sd   x8, 0(x2) # Frame Pointer des Aufrufers
# Neuen Frame Pointer einrichten (entsprechend der Stackadresse beim Prozedureintritt)
addi x8, x2, 16

# ...

# Ende von asinh
# f10 (=fa0) enthält den Rückgabewert
fdiv.d f10, f0, f1
# Rücksprungadresse und Frame Pointer wiederherstellen
ld     x1, 8(x2)
ld     x8, 0(x2)
# Stack verkleinern und damit wiederherstellen
addi   x2, x2, 16
# Rücksprung (ret)
jalr   x0, x1, 0

System

Aspekte von RISC-V, die ein laufendes System und seine Verwaltung betreffen, werden in der privilegierten Spezifikation (genannt Band II) behandelt.[6] Wie der Name „privilegiert“ besagt, ist diese besonders für Entwickler privilegierter Anwendungen (z. B. Betriebssysteme) oder Implementierer relevant, da Benutzeranwendungen selten mit diesen Aspekten interagieren.

Privilegienstufen

RISC-V besitzt hauptsächlich drei Privilegienstufen, meist einfach Modes genannt. Nur M-Mode muss in jedem System vorhanden sein; andere Modi sind normale Architekturerweiterungen, die beispielsweise über misa erkannt werden können.

Name
(Erweiterung)
Bezeichnung Vorgesehen für…
U User/Application Benutzeranwendungen oder Software in sicheren Embedded-Systemen
S Supervisor Betriebssysteme
M Machine Firmware oder Embedded-Software

Der Debug-Modus einer debugbaren Implementierung ist streng genommen ein eigener Privilegienmodus, der Zugriff auf weitere CSRs und Speicherbereiche hat, die aus dem M-Mode nicht benutzt werden können. Außerdem wird unter der Hypervisor-Erweiterung (siehe unten) der S-Mode in mehrere Untermodi unterteilt.

Jeder Modus kontrolliert, auf welche Systemfunktionalitäten ein darüberliegender Modus Zugriff hat. M-Mode ist für die Firmware einer Implementierung gedacht, die nicht vom Betriebssystem geändert werden kann (vergleiche BIOS). M-Mode hat Zugriff auf alle Speicherbereiche, CSRs und Hardwarefunktionalitäten, auch solche, die eigentlich für höhere Modi gedacht sind. S-Mode wird von Betriebssystemen genutzt und hat Zugriff auf einen Großteil der Systemfunktionalitäten, wie die Konfiguration von virtuellem Speicher und Speicherschutzfunktionen. M-Mode kann zudem weitere Aufgaben, wie die Behandlung von Traps, an den S-Mode delegieren. Benutzerprogramme im U-Mode können per Design keinen Zugriff auf solche Funktionen haben.

Virtueller Speicher und Speicherschutz

RISC-V unterstützt mehrere Arten des virtuellen Speichers, die je nach Implementierung konstant oder umschaltbar sind. Ungeachtet des virtuellen Speichermodus sind Speicherseiten 4KiB groß und die unteren 12 bit einer Adresse beschreiben den Seitenoffset.

Für RV32 gibt es nur Sv32, welches eine zweistufige Seitentabelle mit je 10 Bit pro Tabellennummer verwendet. Dabei kann bereits ein Level-1-PTE ein Blatteintrag ohne untergeordnete Seitentabelle sein; in diesem Fall beschreibt der Eintrag eine 4-MiB-Megapage.

Für RV64 gibt es Sv39, Sv48 und Sv57, die entsprechend der Zahl im Namen eine bestimmte virtuelle Addressgröße haben. Bereits 39 bit (512 GiB) sind für viele heutige Anwendungen ausreichend. Alle drei virtuelle Speichermodi benutzen 9 bit pro Tabellennummer und haben 3-, 4- bzw. 5-stufige Tabellen. Die PTEs unterscheiden sich nur in Details, und auch hier gibt es die Möglichkeit, durch Blatteinträge in höherstufigen Seitentabellen Megapages (2 MiB), Gigapages (1 GiB), Terapages (512 GiB) und Petapages (256 TiB) zu erzeugen.

Speicherschutz kann auf zwei Arten erreicht werden. Zum einen mittels der 64 physischen Speicherattribute (Physical Memory Attributes, PMP), die in den pmp-CSRs festgelegt sind und eventuell nicht veränderbar sind (z. B. Nur-Lese-Attribut für ROM-Regionen). Zum anderen verfügt jede virtuelle Speicherregion über (im S-Mode) konfigurierbaren Speicherschutz, der während der Adressübersetzung geprüft wird. RISC-V definiert die Zugriffsarten Lesen, Schreiben und Ausführen, wobei das Ausführen eines Speicherworts nicht als Lesezugriff gilt. Code kann also als nicht lesbar konfiguriert werden, was einen Zugriff mit Speicherzugriffsbefehlen verhindert. Außerdem kann eine Speicherregion als vom U-Mode nicht zugreifbar definiert werden.

Umgebungsaufrufe und SBI

Um Funktionalität des umgebenden Systems abrufen zu können, besitzt RISC-V ein verallgemeinertes Systemaufruf-Verfahren, das Environment Calls, d. h. Umgebungsaufrufe, genannt wird. Der dafür zuständige Befehl ecall (Teil der I-Basisarchitektur) kann in jedem Privilegienmodus genutzt werden, um ein Trap (d. h. Softwareinterrupt) in den nächsthöheren Modus auszulösen. Dieser kann die Anfrage dann behandeln und mittels mret oder sret die Kontrolle an den anfragenden Modus zurückgeben. Welche Funktionen verfügbar sind und wie Argumente übergeben werden, definiert die ABI (für U-Mode nach S-Mode, d. h. Systemaufruf) oder SBI (Supervisor Binary Interface für S-Mode nach M-Mode, d. h. Firmwareinterface). Üblicherweise ähnelt die Aufrufkonvention der normalen Prozeduraufrufkonvention, z. B. werden Argumente in den Argumentregistern a0-a7 übergeben.

Die SBI ist standardisiert[11] und definiert eine Reihe an Funktionen und Erweiterungen, deren Vorhandensein von S-Mode-Software abgefragt werden und dann verwendet werden kann. Dabei werden Register a7 für die ID der Erweiterung und Register a6 für die Funktion innerhalb der Erweiterung genutzt. Beispielsweise kann mit Erweiterung 16 (verpflichtende Basiserweiterung) und Funktion 0 die implementierte SBI-Spezifikationsnummer abgerufen werden, oder mit Erweiterung 4442434E16 und Funktion 2 ein Textzeichen auf der Debugging-Konsole ausgegeben werden.[12]

Virtualisierung

Zur Unterstützung der Virtualisierung bietet RISC-V die Hypervisor-Erweiterung, die S-Mode in einen HS-Mode (hypervisor extended supervisor) und VS-Mode (virtual supervisor) aufteilt. HS-Mode erhält Zugriff auf eine Reihe an speziellen CSRs und kann zudem die Supervisor-CSRs des VS-Mode separat konfigurieren. Ein Umgebungsaufruf aus dem VS-Mode wird nun vom HS-Mode (statt M-Mode) behandelt, sodass der Hypervisor z. B. eine völlig andere Firmware und virtuelle Geräte emulieren kann, als eigentlich hardwareseitig vorhanden ist. Auch können Traps an den VS-Mode delegiert werden, beispielsweise um direkten Zugriff auf physische Hardware zu erlauben. VS-Mode besitzt seinen eigenen virtuellen Speicher, der in zwei Stufen übersetzt wird: zunächst von virtuellen Gastadressen in physische Gastadressen (entsprechend normalen virtuellen Adressen), und dann von physischen Gastadressen in physische Adressen. Mittels spezieller Hypervisor-Befehle (hlv, hlvx etc.) kann der Hypervisor (oder ein Benutzerprogramm im HU-Mode) wie VS-Mode mit virtuellen Gastadressen Speicherzugriffe ausführen.

Auszeichnungen

  • 2017: The Linley Group's Analyst's Choice Award for Best Technology (für den Befehlssatz)[13]

Implementierungen

RISC-V ist ein offener Standard, welcher eine Befehlssatzarchitektur spezifiziert, aber weder eine Mikroarchitektur noch ein Lizenzmodell vorgibt. Aus diesem Grund wurden sowohl RISC-V Kerne mit kommerzieller Lizenz als auch mit Open-Source-Lizenz entwickelt. Die RISC-V-Stiftung pflegt eine Liste aller RISC-V-CPU- und -SoC-Implementierungen.[14]

Proprietäre RISC-V-Kerne

VisionFive 2-Einplatinencomputer von StarFive mit vier U74-Kernen von SiFive
  • Das Fraunhofer IPMS war die erste Organisation, die einen RISC-V Kern entwickelt hat, der den Anforderungen nach funktionaler Sicherheit gerecht wird. Der IP Core EMSA5 ist ein 32-Bit-Prozessor mit fünfstufiger Pipeline und ist als General Purpose Variante (EMSA5-GP) und als Safety Variante (EMSA5-FS) mit einer ASIL-D ready Zertifizierung nach der ISO 26262:2018 für funktionale Sicherheit erhältlich.[15]
  • Andes Technology Corporation bietet mehrere Familien von RISC-V-Kernen an, mit unterschiedlichen optionalen Erweiterungen, darunter einige mit Multiprozessorfähigkeiten:[16]
    • Die “N(X)”-Familie besteht sowohl aus 32-bit (N) als auch 64-bit (NX) Kernen. Deren Pipeline-Länge variiert dabei von zwei Stufen im N22 bis zu acht Stufen im N45. Der NX27V unterstützt die RISC-V “V”-Erweiterung.[17]
    • Die “D(X)”-Familie besteht aus Kernen mit “P”-Erweiterung für SIMD-Instruktionen und verfügt sowohl über 32-bit (D) als auch 64-bit (DX) Kerne.
    • Die “A(X)”-Familie besteht aus Linux-fähigen Prozessorkernen mit Pipelines von fünf bis acht Stufen. Die Kerne integrieren Gleitkommaeinheiten und MMUs.
  • Codasip war das erste Unternehmen, welches einen RISC-V-konformen, kommerziellen Prozessorkern im Januar 2016 auf den Markt brachte (Codix)[18] und bietet seitdem eine Reihe von Prozessorkernen für eingebettete Systeme sowie betriebssystembasierte Anwendungen an. Codasips Prozessorkerne sind mittels der Entwicklungsumgebung “Codasip Studio” in CodAL[19] entwickelt, einer Architektur-Beschreibungssprache (Architecture Description Language):
    • Die “L”-Familie besteht aus energiesparenden 32-bit-Kernen für eingebettete Systeme mit optionaler Gleitkommaeinheit und entweder drei- oder fünfstufiger Pipeline.
    • Die “H”-Familie besteht aus leistungsfähigen 64-bit-Kernen für eingebettete Systeme mit optionaler Gleitkommaeinheit, ebenfalls mit drei- oder fünfstufiger Pipeline.
    • Die “A”-Familie besteht aus Linux-fähigen 64-bit-Kernen mit optionaler “P”-Erweiterung. Die Prozessorkerne haben eine siebenstufige Pipeline, eine Gleitkommaeinheit und eine MMU. Zusätzlich unterstützen die “MP”-Versionen mit L1- und L2-Caches bis zu vier Kerne pro Cluster.[20]
    • Die “uRISC-V”-Kerne sind einfache Kerne, verfügbar als Teil von Codasip Studio und gedacht für Lehr- und Selbstlernzwecke.[21]
  • HiFive1-Mikrocontroller von SiFive (links), Arduino Uno (rechts, blau)
    SiFive war das erste Unternehmen, welches mit dem FE310 einen RISC-V basierten-SoC auf den Markt brachte.[22] Aktuell bietet SiFive drei Produktfamilien an:
    • Die “E”-Kerne sind 32-bit-Kerne für eingebettete Systeme mit zwei- bis achtstufiger Pipeline. Das fortschrittlichste Produkt dieser Familie ist der vierkernige E76-MC.
    • Die “S”-Kerne sind 64-bit-Kerne für eingebettete Systeme mit zwei- bis achtstufiger Pipeline. Das fortschrittlichste Produkt aus dieser Familie ist der vierkernige S76-MC.
    • Die “U”-Kerne sind Linux-fähige 64-bit-Kerne mit fünf bis zwölf Pipelinestufen. Der U54 und der U74 sind auch in multiprozessorfähigen Versionen verfügbar. Der performanteste Kern dieser Familie ist der dreifach superskalare U84.[23]
    • Der “Intelligence X280” ist ein von der “U”-Familie abgeleiteter, ebenfalls Linux-fähiger Prozessorkern, welcher zusätzlich die “V”-Erweiterung für Vektorberechnungen unterstützt.[24]

Quelloffene RISC-V-Kerne

  • Die University of California, Berkeley hat eine Reihe RISC-V-Kerne unter Verwendung von Chisel, einer Hardware-Beschreibungssprache, entwickelt. Dies sind unter anderem:
    • Der 64-bit-Kern “Rocket”,[25] geeignet für kompakte und energiesparende Anwendungen mit mittleren Performanzanforderungen, z. B. elektronischen Kleingeräten für den persönlichen Bedarf.
    • Der 64-bit-Kern “Berkeley Out of Order Machine” oder “BOOM”, ein synthetisier- und parametrisierbarer, quelloffener RV64GC-RISC-V-Kern, welcher für Anwendungen im Bereich Personal Computing, aber auch für Rechenzentren und Serverfarmen geeignet ist.
    • Fünf 32-bit “Sodor” CPU-Designs[26] wurden für Bildungszwecke entworfen.
  • PULPino (“Riscy” und “Zero-Riscy”) der ETH Zürich / Universität Bologna.[27] Die Prozessorkerne des PULPino-Projekts implementieren einen simplen “RV32IMC”-RISC-V-Befehlssatz für Mikrocontroller (“Zero-Riscy”) oder einen leistungsfähigeren “RV32IMFC”-RISC-V-Befehlssatz mit individuellen DSP-Erweiterungen für eingebettete Signalverarbeitung.
  • CVA6 der OpenHWGroup.[28] Die Prozessorkerne der CVA6-Familie sind quelloffene, in SystemVerilog geschriebene sogenannte Application-Class-Prozessoren. Dies bedeutet, dass sie einen Großteil der privilegierten Spezifikation implementieren und in der Lage sind, übliche Embedded-Betriebssysteme wie Embedded Linux oder FreeRTOS auszuführen. Sie besitzen eine sechsstufige In-Order-Pipeline und unterstützen je nach Konfiguration RV32GC bzw. RV64GC und diverse andere Erweiterungen. Das CVA6-Projekt entstammt dem ARIANE-Prozessor der ETH Zürich / Universität Bologna, die nach den einfacheren PULPino-Prozessoren einen praktisch einsetzbaren Prozessor entwickeln wollten.[29]
  • Western Digital hat seine “SweRV” genannten RISC-V-Kerne durch die “CHIPS Alliance” als quelloffen verfügbar gemacht. Des Weiteren kündigte Western Digital eine Kooperation mit Codasip an, um den kommerziellen Support der Prozessoren zu ermöglichen.[30] Diese Kerne sind für anspruchsvolle eingebettete Anwendungen konzipiert und unterstützen den “RV32IMC”-RISC-V-Befehlssatz. Im Detail sind es:
    • Der “SweRV Core EH1”, welcher zweifach superskalar ist und eine neunstufige Pipeline hat.
    • Der “SweRV Core EH2”,[31] welcher ebenfalls zweifach superskalar ist und eine neunstufige Pipeline hat, aber auch Hardwareunterstützung für zwei parallele Threads bietet.
    • Der “SweRV Core EL2”, als einfach skalarer Kern mit vierstufiger Pipeline.

Software

Folgende Betriebssysteme wurden, unter anderem, auf die RISC-V Prozessorarchitektur portiert:

Außerdem können Programme mithilfe von verschiedenen Kompilern wie z. B. der GNU Compiler Collection und LLVM zu RISC-V-Maschinencode kompiliert werden.

RISC-V in nationalen- und supranationalen Förderbestrebungen

RISC-V ist als variable Befehlssatzarchitektur interessant für nationale- sowie supranationale Förderung als Reaktion auf die Chipkrise, beispielsweise um effizientere Mikroprozessoren zu entwickeln. Im Europäischen Chip-Gesetz wird RISC-V als eine vielversprechende Architektur angesehen, um Prozessoren mit niedrigem Stromverbrauch zu entwickeln und den Versorgungsengpässen bei Halbleitern entgegenzuwirken, indem die Produktion in Europa gesteigert wird.[32][33]

In den USA gibt es ebenfalls Bestrebungen, die Entwicklung energieeffizienter Prozessoren mit Hilfe des CHIPS and Science Act zu forcieren.[34]

Hersteller entsprechender Chips

Siehe auch

Weblinks

Commons: RISC-V – Sammlung von Bildern, Videos und Audiodateien

Einzelnachweise

  1. RISC-V ISA - RISC-V Foundation. In: RISC-V Foundation. (amerikanisches Englisch, riscv.org [abgerufen am 3. Februar 2018]).
  2. FAQ - RISC-V Foundation. In: RISC-V Foundation. (amerikanisches Englisch, riscv.org [abgerufen am 22. Dezember 2023]).
  3. Wolf, Clifford: Alternative proposal for instruction length encoding. Archiviert vom Original am 20. Oktober 2019; abgerufen am 20. Oktober 2019.
  4. Contributors - RISC-V Foundation. In: RISC-V Foundation. (riscv.org [abgerufen am 3. Februar 2018]).
  5. Andrew Waterman, Krste Asanović, RISC-V Foundation: The RISC-V Instruction Set Manual, Volume I: User-Level ISA, Document Version 20191213. (pdf) 13. Dezember 2019, abgerufen am 18. Juli 2023 (englisch).
  6. a b Andrew Waterman, Krste Asanović, John Hauser, RISC-V International: The RISC-V Instruction Set Manual, Volume II: Privileged Architecture, Document Version 20211203. (pdf) 4. Dezember 2021, abgerufen am 18. Juli 2023 (englisch).
  7. RISC-V-CustomExts (Using as). Abgerufen am 12. Dezember 2023.
  8. Alternativ kann sich auch ein normaler Assembler um solche Kodierungsdetails kümmern. Passiert auch beim normalen 8086-Assembler, je nach Offset werden unterschiedliche Opcodes verwendet.
    0:  8b 18               mov    ebx, dword [eax+  0]  ; 2 Byte
    2:  8b 58 01            mov    ebx, dword [eax+  1]  ; 3 Byte
    5:  8b 98 0000080       mov    ebx, dword [eax+128]  ; 6 Byte
    
  9. R. K. Montoye, E. Hokenek, S. L. Runyon: Design of the IBM RISC System/6000 floating-point execution unit. In: IBM Journal of Research and Development. Band 34, Nr. 1, Januar 1990, ISSN 0018-8646, S. 59–70, doi:10.1147/rd.341.0059 (ieee.org [abgerufen am 12. Dezember 2023]).
  10. Alex Bradbury, Andrew Burgess, Chih-Mao Chen, Zakk Chen, Kito Cheng, Nelson Chu, Michael Clark, Jessica Clarke, Palmer Dabbelt, Sam Elliott, Gonzalo Brito Gadeschi, Sebastian Huber, Roger Ferrer Ibanez, Quey-Liang Kao, Nick Knight, Luís Marques, Evandro Menezes, Max Nordlund, Stefan O’Rear, Konrad Schwarz, Fangrui Song, Hsiangkai Wang, Andrew Waterman, Jim Wilson: RISC-V ABIs Specification Version 1.0: Ratified. (PDF; 268 KB) November 2022, abgerufen am 12. Dezember 2023 (englisch).
  11. Palmer Dabbelt, Atish Patra: RISC-V Supervisor Binary Interface Specification. (PDF; 323 KB) RISC-V Platform Specification Task Group, 5. Dezember 2023, abgerufen am 13. Dezember 2023 (englisch).
  12. Debug Console Extension. 13. Dezember 2023, abgerufen am 13. Dezember 2023 (englisch).
  13. The Linley Group Announces Winners of Annual Analysts' Choice Awards. 12. Januar 2017 (linleygroup.com [abgerufen am 21. Januar 2018]).
  14. riscv/riscv-cores-list. RISC-V, 16. Mai 2021, abgerufen am 17. Mai 2021.
  15. Michael Eckstein: Bis ASIL-D: Erster nach ISO 26262 zertifizierbarer RISC-V-Core. Abgerufen am 13. April 2022.
  16. Andes Technology Corporation: Andes Announces New RISC-V Processors: Superscalar 45-Series with Multi-core Support and 27-Series with Level-2 Cache Controller. 30. November 2020, abgerufen am 17. Mai 2021 (englisch).
  17. Nitin Dahad: Andes’ Core has RISC-V Vector Instruction Extension. In: EE Times. 12. September 2019, abgerufen am 17. Mai 2021 (englisch).
  18. Codasip Joins RISC-V Foundation and Announces Availability of RISC-V Compliant Codix Processor IP. Abgerufen am 17. Mai 2021 (englisch).
  19. What is CodAL? 26. Februar 2021, abgerufen am 21. Mai 2021 (amerikanisches Englisch).
  20. Codasip announces RISC-V processor cores providing multi-core and SIMD capabilities. Archiviert vom Original (nicht mehr online verfügbar) am 23. Dezember 2020; abgerufen am 17. Mai 2021.  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.newelectronics.co.uk
  21. Codasip Releases a Major Upgrade of Its Studio Processor Design Toolset with a Tutorial RISC-V core. Abgerufen am 17. Mai 2021 (englisch).
  22. RISC-V Available in Silicon. Abgerufen am 17. Mai 2021 (englisch).
  23. SiFive Announces U8-Series 2.6GHz High-Performance Out-of-Order RISC-V Core IP. Abgerufen am 17. Mai 2021 (englisch).
  24. Andreas Schilling: Neuer Intelligence X280 von SiFive verbindet RISC-V mit Vektorbeschleunigung. Abgerufen am 17. Mai 2021.
  25. chipsalliance/rocket-chip. CHIPS Alliance, 15. Mai 2021, abgerufen am 17. Mai 2021.
  26. ucb-bar/riscv-sodor. UC Berkeley Architecture Research, 9. Mai 2021, abgerufen am 17. Mai 2021.
  27. PULP platform. Abgerufen am 17. Mai 2021.
  28. CVA6: An application class RISC-V CPU core — CVA6 documentation. Abgerufen am 12. Dezember 2023.
  29. Luca Benini: Ariane: An open-source 64-bit RISC-V Application-Class Processor and latest Improvements. 9. Mai 2018 (riscv.org [PDF; 2,6 MB]).
  30. Codasip partners with Western Digital on open‑source processors. 10. Dezember 2019, abgerufen am 17. Mai 2021 (englisch).
  31. Anton Shilov: Western Digital Rolls-Out Two New SweRV RISC-V Cores For Microcontrollers. Abgerufen am 17. Mai 2021.
  32. Verordnung (EU) 2023/1781 des Europäischen Parlaments und des Rates vom 13. September 2023 zur Schaffung eines Rahmens für Maßnahmen zur Stärkung des europäischen Halbleiter-Ökosystems und zur Änderung der Verordnung (EU) 2021/694 (Chip-Gesetz) (Text von Bedeutung für den EWR). In: EUR-Lex. 13. September 2023, abgerufen am 9. Januar 2024.
  33. RISC-V: Potenziale eines offenen Standards für Chipentwicklung. In: acatech IMPULS. 8. November 2023, abgerufen am 9. Januar 2024.
  34. CHIPS Act of 2022. In: PUBLIC LAW 117–167. 9. August 2022, abgerufen am 9. Januar 2024.
  35. Espressif kündigt Wi-Fi-6- und Bluetooth-5-SoC mit RISC-V-Kern an. In: all-electronics.de. 23. April 2021, abgerufen am 18. November 2021.
  36. Sebastian Grüner: Googles Security-Chip nutzt RISC-V. In: golem.de. 28. Oktober 2021, abgerufen am 9. November 2021.
  37. Christof Windeck: Deutsches Projekt entwickelt quelloffenen Sicherheits-Chip in zwei Jahren. In: heise online. 20. Oktober 2023, abgerufen am 22. Oktober 2023.
  38. VisionFive 2 - open source quad-core RISC-V dev board. In: Kickstarter. 23. Mai 2023, abgerufen am 25. Dezember 2023 (englisch).