Crypto Core FPGA - Umstellung auf RISC-V

Übersetzung des Medium Artikels von MicroEngineer, für ein besseres Verständnis, habe ich die Erklärung zu diversen Fachbegriffen zusätzlich verlinkt.

 

Das Projekt Crypto Core FPGA wurde von Cortex ARM auf RISC-V überführt.

RISC-V ist viel Open-Source-freundlicher (MIT lizenziert), schneller als Cortex M1 (z.B. Hardware-Teiler, I- und D-Cache) und sehr flexibel (erweiterbar mit Plugins, kundenspezifischen Anweisungen,  ....).

Nachfolgend geht es um das kleine rote IOTA Crypto Core FPGA-Modul und seine internen Soft-Cpu- und Hardware-Beschleuniger.

Wie Sie wissen, endete das finanzierte IOTA Crypto Core Projekt offiziell am 3. September 2019, aber die Entwicklung geht weiter.... Der Schwerpunkt verlagerte sich vom Bau verschiedener Basismodule zur Weiterentwicklung des FPGA-Moduls für sichere Standalone-Anwendungen. Das bedeutet, dass Sie dieses Modul als Haupt-Mikrocontroller in eigenständigen Anwendungen verwenden und die Hardwarebeschleunigung für Algorithmen in IOTA verwenden können - auf einem Modul mit einer Größe von 30x26mm.

 

Es gibt ein Problem, über das ich nicht sehr glücklich bin.... Vielleicht erinnern Sie sich daran, was ich über die ARM-Lizenzierungsprobleme in Abschlussbericht geschrieben habe:

„Was ich jedoch ändern würde, wäre definitiv, die Cortex M1 Soft-CPU loszuwerden (die Lizenzierung von ARM ist suboptimal) und sie durch einen (wirklich) kostenlosen RISC V zu ersetzen. ARM vergibt die Lizenzen für die IP-Soft-Cores des Cortex M1 kostenlos, aber kein Teil ihrer IP-Soft-Cores darf in Open-Source-Code Repositories enthalten sein. Es war also ein ziemlicher Aufwand, die Lizenzierung zu umgehen - z.B. Anweisungen zu schreiben, wie man von der ARM-Website herunterladen und anschließend Quelldateien für das FPGA-Projekt patchen kann.“

Am Anfang habe ich mit dem Cortex M1 angefangen, weil ich mit ARM-Mikrocontrollern, der Toolchain, dem Debugging und so weiter vertraut war.... Da die Zeit knapp war, war es die logische Entscheidung, ARM auf dem FPGA-Modul einzusetzen. Die Umstellung auf RISC-V zu Projektbeginn hätte viele Unbekannte mit sich gebracht, die zu Problemen hätten führen können.

 

 

Was ist RISC-V?

Wikipedia sagt über RISC-V: RISC-V (ausgesprochen "risk-five") ist eine Open-Source-Hardware Befehlssatzarchitektur (ISA), die sich auf dem Designprinzip des Reduced Instruction Set Computer basiert (RISC).

Das bedeutet, dass der Befehlssatz offen und patentfrei ist. Es handelt sich nicht um eine tatsächliche Implementierung eines RISC-V-Mikrocontrollers, sondern um eine Spezifikation, welche Anforderungen eine Implementierung erfüllen muss, um RISC-V-kompatibel zu sein.

Es gibt bereits viele RISC-Vs da draußen - die meisten davon sind Soft-Cpus für FPGAs (riscv. org listet ca. 70) wie der PicoRV32 oder auch der VexRiscV (den ich für das FPGA-Modul verwendet habe, aber später mehr darüber). Ein Hauptmerkmal von RISC-V ist die Erweiterbarkeit. Gegenwärtig gibt es etwa 15 Standarderweiterungen, z.B.

  • M - Standarderweiterung für Integer-Multiplikation und Divisionen
  • A - Standarderweiterung für Atomic Instructions (dt. Kernanweisungen)
  • F - Standarderweiterung für Single-Precision Floating-Point (32-bit)
  • D - Standarderweiterung für Double-Precision Floating Point (64-bit)
  • und so weiter (klicken Sie hier für die vollständige Liste)

 

Es ermöglicht auch die Entwicklung neuer Erweiterungen mit kundenspezifischen Anweisungen - zum Beispiel für die Implementierung von trinären SIMD-Befehlsanweisungen, wie sie in einer reinen Software-Implementierung der Troika verwendet werden. Eine solche Anweisung könnte folgendes bewirken:

dst[1..0] = (src1[1..0] + src2[1..0]) % 3

dst[31..30] = (src1[31..30] + src2[31..30]) % 3

Dies wäre beispielsweise für Paritätsberechnungen in Troika hervorragend geeignet und würde nur eine einzige Anweisung erfordern, um 16 Trits mit Modulo 3 hinzuzufügen.

Es ist nur ein Beispiel - das IOTA Crypto Core FPGA hat eine Hardware-Troika-Beschleunigung, aber zusätzlich zu den hochspezialisierten Hardware-Beschleuniger-Kernalgorithmen in der Software könnten auch SIMD-CPU-Anweisungen, die an [I] gepackten trinären Daten arbeiten, von Vorteil sein.

Außerdem gibt es kleinere FPGAs, die nicht über genügend Ressourcen für eine echte Hardware-Beschleunigung verfügen, aber groß genug für eine RISC-V Soft-CPU sind. Software, die auf der CPU läuft, könnte mit Hilfe von trinären SIMD-Anweisungen schneller und/oder effizienter sein.

 

[I] gepackt bedeutet, dass ein Datenwort (in diesem Fall 32Bit) mehrere ähnliche Daten enthält. Zum Beispiel 2 Bit pro Trit, das 16 Trits in einem 32-Bit-Wort und trinäre SIMD Befehlsanweisungen liefert, können Berechnungen an jedem der Trits parallel durchführen, während gepackte Trits voneinander isoliert sind.

 

 

 

Warum VexRiscV?

VexRiscV war der Gewinner des Soft-CPU-Wettbewerbs 2018. Sein Konzept ist unglaublich - die Soft-CPU wird mit einer Reihe von Scala-Skripten erzeugt und kann durch Einfügen oder Entfernen von Plugins in die Skripte geändert werden.

Fast alles ist ein Plugin wie Hardware-Multiplikator, Debug-Schnittstelle, Befehls- und Datenbusse (mit oder ohne Cache) und selbst der Programmzähler (Befehlszähler) ist ein Plugin.

Es unterstützt verschiedene Bussysteme wie AXI4 (direkt unterstützt von Vivado von Xilinx), Avalon (hauptsächlich auf Altera/Intel-Systemen zu sehen), Wishbone (hauptsächlich von Kernen von opencores.org verwendet) und andere.

Auch benutzerdefinierte Anweisungen, die mit Scala geschrieben wurden, können problemlos in die CPU integriert werden.

VexRiscV unterstützt auch Simulationen der CPU mit QEMU, so dass alles ohne echte Hardware getestet werden kann.

Meiner Meinung nach ist dies ein unglaubliches Konzept und spiegelt die Flexibilität von RISC-V perfekt wider!

Es war auch wichtig, dass die Migration des Projekts von Cortex M1 nach RISC-V die Entwicklungsumgebung nicht wesentlich verändern sollte - und das tat sie auch nicht!

Das Cortex-M1-System könnte in Eclipse mit GnuARM-Plugin und OpenOCD + GDB zum Debuggen entwickelt werden.

Das RISC-V-System kann in Eclipse mit GnuARM-Plugin (ja - die Entwickler des GnuARM-Plugins haben bereits Unterstützung für RISC-V! hinzugefügt) und OpenOCD + GDB zum Debuggen entwickelt werden.

Natürlich benötigen Sie eine weitere GCC-Variante für RISC-V und eine weitere OpenOCD-Version, aber ausser an der Toolchain und dem Workflow hat sich nichts anderes geändert!

 

 

 

Wie ist die Performance?

Ich habe ein paar Leistungsvergleiche* gemacht. Die Zeit jeder Aufgabe wurde mit 10.000 Schleifen gemessen.

In jeder Aufgabe war der RISC-V schneller. Die Leistung der Bytes to Trits-Konvertierung sticht wirklich hervor - der Grund dafür ist, dass der RISC-V einen schnellen Hardware-Divider (Teiler) hat, während der Cortex M1 in der Software Divisionen nachbilden muss. Außerdem verfügt der RISC-V über einen Befehls- und Daten-Cache, was ihm einen Vorteil verschafft.

*: Bitte beachten Sie die logarithmische x-Achse.

 

 

 

Fazit

Die Überführung von ARM's Cortex M1 nach RISC-V - insbesondere nach VexRiscV - war nach meiner Einschätzung eine sehr gute Entscheidung. Der RISC-V ist schneller, ist MIT-lizenziert (kann kommerziell genutzt und in Open-Source-Repositorys eingebunden werden), ist flexibel (kann mit kundenspezifischen Anweisungen erweitert werden) und ist Plattformunabhängig (Cortex M1 war nur für Xilinx FPGAs kostenlos).

RISC-V auf Basis von VexRiscV kann auf ein $5 FPGA reduziert werden, das benutzerdefinierte trinäre SIMD-Befehle unterstützt - was mit dem Cortex M1 nicht möglich wäre.

 

Wer Thomas für seine wichtige Pionierarbeit ein Trinkgeld zukommen lassen möchte, der sollte dies über den Donate Button auf der IOTA-Ecosystem Webseite tun.