Design-Praxis RISC-V

Von den Grundlagen bis zum Prototyp

10. März 2019, 19:51 Uhr | Dr. Constantin Tomaras, Ressortredakteur für Systemdesign, DESIGN&ELEKTRONIK

Fortsetzung des Artikels von Teil 6

III. SDK-Komponenten

Das SDK wird für arm- und RISC-Seite separat von open-isa.org heruntergeladen. Den Kern bildet ein für beide Seiten nahezu identisches Softwarepaket (Bild 4, oben) auf Ausführungs- und Anwendungsebene (middleware und demo_apps).

Anbieter zum Thema

zu Matchmaker+
Bild 4: (oben) Beispiel-Programme im ausgelieferten SDK auf arm- und RISC-Seite.  (unten) Eine aus dem selben c-Beispiel generierte Maschinenbefehlssequenz  für die arm- und RISC-Seite. Überraschenderweise fällt die Sequenz auf RISC-Seite 54 bytes lä
Bild 4: (oben) Beispiel-Programme im ausgelieferten SDK auf arm- und RISC-Seite. (unten) Eine aus dem selben c-Beispiel generierte Maschinenbefehlssequenz für die arm- und RISC-Seite. Überraschenderweise fällt die Sequenz auf RISC-Seite 54 bytes länger aus.
© DESIGN&ELEKTRONIK / (ct)

Im Wesentlichen unterscheidet sich die arm-Seite hier nur um ein weiteres
Beispiel für mbedtls. Die Middleware enthält u.a. Pakete für fat_fs, mbed_tls, Vielkernrechnung, sd_mmc, USB, WiFi mit BLE und Thread sowie wolfssl.

Die build-Umgebung fällt auf beiden Seiten erheblich proprietärer aus (Bild 5). Den kleinsten gemeinsamen Nenner für integer-Rechnung bildet GNU auf Terminalebene: für die RISC-Kerne kann der pulp-Compiler riscv32-unknown-elf [8], für die arm-Kerne arm-none-eabi [9,**], eine Quelle für gcc und gdb sein.
Dann ist cmake auf beiden Seiten das build-Tool der Wahl. Die Zielverbindung erfolgt auf RISC-Seite mit openocd, auf arm-Seite mit JLinkGDBServer (Bild 5). Eine openocd-Verbindung zur arm-Seite müsste im Einzelfall konfiguriert werden. Auch kommt eine vorkompilierte openocd-Version von open-isa.org zum Einsatz, da die kanonische 0.10.0 den RIC5Y-Kern nicht erkennt.

Bild 5: Der einheitliche Weg, vom Gastsystem mit Basis-SDK auf das jeweilige Ziel,  führt mit der GNU-Werkzeugkette über die J-Link-Sonde. Die arm-Seite kann der Anwender zusätzlich, mit allen verfügbaren Coresight-SWD-Werkzeugen für Cortex-M4 bearbe
Bild 5: Der einheitliche Weg, vom Gastsystem mit Basis-SDK auf das jeweilige Ziel, führt mit der GNU-Werkzeugkette über die J-Link-Sonde. Die arm-Seite kann der Anwender zusätzlich, mit allen verfügbaren Coresight-SWD-Werkzeugen für Cortex-M4 bearbeiten. Das SDK bietet dazu Middleware für IAR, KEIL und Segger.
© DESIGN&ELEKTRONIK / (ct)

Darüber hinaus gibt es third-party-Zugänge zur arm-Seite wie IAR, Keil und Segger, sowie Eclipse-Zugang zur RISC-Seite [7]. Den Eclipse-Zugang zur arm-Seite müsste ein Anwender noch selbst konfigurieren.

Die Struktur eines build-Verzeichnis' im SDK ist Standard: ein Verzeichnis mit Tool-Konfigurationen, sowie c-code und header für Hardware-Konfiguration, clock-Konfiguration und der auszuführenden Anwendung. Zwei Applikationsberichte in der Dokumentation begleiten bei der Inbetriebnahme einer Vielkern- oder Bluetooth-Anwendung.

Werkzeugkette und Code-Beispiel

Für die Inbetriebnahme des Vega-Boards muss zunächst in einer openocd-Verbindung der bootende Kern gesetzt werden, danach ist entweder die arm- oder die RISC-Seite über das jeweilige Hardwareinterface schreib-, ausführ- und analysierbar.

Bild 6: Zur Auswahl des Boot-Kerns wird der RESET-Button während der Terminaleingabe gehalten.
Bild 6: Zur Auswahl des Boot-Kerns wird der RESET-Button während der Terminaleingabe gehalten.
© DESIGN&ELEKTRONIK / (ct)

Für den schnellen proof-of-concept wird eines der Standardbeispiele (Bild 4, oben) mit dem vorliegenden cmake-Skript übersetzt und über das jeweilige gdb-Derivat auf den Chip geschrieben und getestet. Auf der arm-Seite muss im Auslieferzustand vor dem build-Skript allerdings noch einmal das clean-Skript ausgeführt werden.

Mangels RISC-V-trace ist zunächst kein Performanzvergleich in Zyklen oder absolutem Timing zwischen der RISC- und der arm-Seite möglich. Statische Codeanalyse für den jeweiligen Anwendungsfall, kann auch ohne die eigentliche Hardware (gdb $sim target) erfolgen.

Dazu wurde das hello_world um pseudo-zufällige Arithmetik erweitert: das Programm würfelt auf c-Ebene in jedem Schritt einen Elementarbefehl der I-Klasse aus (add, sub, mul, div, xor, or, and) und wendet ihn in Endlosschleife auf zufällige 32-Bit-Werte an. Die Code-Metrik in asm und Binärsequenz ist interessant: die RISC-Seite besitzt zwar 27 Zeilen weniger asm-Code (gdb $ disas) aber eine um 54 bytes längere Maschinenbefehlssequenz (Bild 4, unten; gdb $ gdumb /r) als die arm-Seite. 


  1. Von den Grundlagen bis zum Prototyp
  2. I. RISC-V Prinzipien nach ISA-Spezifikation
  3. I. Verhalten in der Umgebung
  4. I. Interrupt- und Erweiterungsmodell
  5. II. Design und Verifikation nach DVCon Europe
  6. III. Prototyping mit dem Vega-Board
  7. III. SDK-Komponenten
  8. IV. Fazit

Das könnte Sie auch interessieren

Verwandte Artikel

NXP Semiconductor Netherlands B.V., NXP Semiconductors Germany, NXP Semiconductors Marketing and Sales Unternehmensbereich derPh-GmbH