170 lines
6.6 KiB
Markdown
170 lines
6.6 KiB
Markdown
# RISC-V Linux-Workstation auf dem ML507
|
|
|
|
Dieses Repository enthält die Implementierung einer RISC-V-Workstation
|
|
für das Xilinx ML507-Entwicklungsboard mit Unterstützung für das Booten
|
|
von Linux von einer SD-Karte. Die Workstation wurde im Rahmen einer
|
|
[Masterarbeit] an der Universität Leipzig entwickelt.
|
|
|
|
## Kompilieren der RISC-V-Toolchain und des Linux-Bootimage
|
|
|
|
Da für die Synthese der Workstation aufgrund der Kompilierung des enthaltenen
|
|
Bootloaders ebenfalls eine RISC-V-Toolchain nötig ist, wird diese zuerst
|
|
zusammen mit dem Linux-Bootimage erzeugt.
|
|
|
|
```sh
|
|
cd freedom-u-sdk
|
|
make
|
|
```
|
|
|
|
Falls dabei bei einem „Bleeding edge“-System wie Arch-Linux Fehler auftreten,
|
|
können nach Bedarf die im `patches`-Ordner verfügbaren Patches angewendet
|
|
werden. Weitere Details zum Freedom-SDK finden sich u.a. im
|
|
[Freedom U500 VC707 FPGA Dev Kit Getting Started Guide].
|
|
|
|
Anschließend wird das erzeugte Bootimage auf eine SD-Karte übertragen. Dabei
|
|
darf kein Partitionslayout vorhanden sein.
|
|
|
|
```sh
|
|
sudo dd if=work/bbl.bin of=/dev/sd-card bs=1M
|
|
sudo sync
|
|
```
|
|
|
|
Während des Kompilierens wird im Ordner `freedom-u-sdk/toolchain` eine RISC-V
|
|
GCC-Toolchain erstellt. Der Unterordner `bin` sollte für die folgenden
|
|
Schritte zur `PATH`-Umgebungsvariablen hinzugefügt werden.
|
|
|
|
## Synthese der Workstation für das ML507-Entwicklungsboard
|
|
|
|
### Erzeugen des Rocket-SOC
|
|
|
|
Zuerst wird der Rocket-SoC ohne das BootROM erzeugt:
|
|
|
|
```sh
|
|
cd freedom
|
|
make -f Makefile.u500ml507devkit verilog
|
|
```
|
|
|
|
Anschließend muss der dabei generierte DeviceTree
|
|
`sifive.freedom.unleashed.u500ml507devkit.U500ML507DevKitConfig.dts`
|
|
im Ordner `builds/u500ml507devkit` wie folgt angepasst werden:
|
|
|
|
1. Der verwendete Systemtakt muss zuerst im `soc`-Abschnitt definiert werden:
|
|
sysclk: sysclk {
|
|
#clock-cells = <0>;
|
|
compatible = "fixed-clock";
|
|
clock-frequency = <60000000>;
|
|
};
|
|
|
|
2. Anschließend wird er über `clocks = <&sysclk 0>;` in den `serial` und `spi`
|
|
Abschnitten referenziert.
|
|
3. Es muss ein Alias für den UART-Controller im Hauptlevel hinzugefügt werden:
|
|
aliases {
|
|
serial0 = &L8;
|
|
};
|
|
|
|
4. Die `dts`-Datei muss mit Hilfe des `dtc`-Programms kompiliert werden. Mit
|
|
dem Ergebniss sollte die in `builds/u500ml507devkit` vorhandenen `dtb`-
|
|
Datei überschrieben werden.
|
|
|
|
Um diese Schritte zu vereinfachen, enthält der `patches`-Ordner bereits
|
|
fertig angepasste `dts` und `dtb`-Dateien, mit denen die vorhandenen
|
|
ersetzt werden können.
|
|
|
|
Schließlich wird das noch fehlende BootROM erzeugt, wobei dabei auch
|
|
der Bootloader kompiliert wird:
|
|
|
|
```sh
|
|
make -f Makefile.u500ml507devkit romgen
|
|
```
|
|
|
|
### Erzeugen des MIG-Speichercontrollers
|
|
|
|
Da der von MIG erzeugte Speichercontroller nicht ohne weiteres weitergegeben
|
|
werden darf, muss er von Hand dem ISE-Projekt hinzugefügt werden. Falls beim
|
|
öffnen des ISE-Projektes eine Meldung bezüglich fehlender Dateien erscheint,
|
|
wurde entweder der Rocket-SoC nicht korrekt erzeugt oder nicht alle git-
|
|
Submodule korrekt geklont.
|
|
|
|
1. Rechtsklick auf das Projekt, *New Source…*
|
|
2. *IP (Core Generator & Architecture Wizard)* auswählen
|
|
3. Als Dateinamen `ddr2_controller` angeben, *Location* übernehmen
|
|
4. MIG auswählen (zB über die Suche), *Next*, *Finish* -> MIG startet
|
|
5. Prüfen, ob der korrekte FPGA ausgewählt ist
|
|
6. Bei den Ausgabeoptionen nochmals den Namen überprüfen und *Create Design*
|
|
auswählen
|
|
7. Es sollten keine PIN-kompatiblen FPGAs oder der PPC440 ausgewählt werden
|
|
8. `DDR2 SDRAM` als Speichertyp auswählen
|
|
9. 5000 ps / 200 MHz als Takt, bei *Memory Type* `SODIMMs`, bei *Memory Part*
|
|
das gewünschte Speichermodul (zB `MT4HTF3264HY-667` auf dem ML507) und bei
|
|
*Date Width* `64` auswählen; Prüfen, ob *Data Mask* aktiviert ist
|
|
10. Prüfen, ob als *Burst Length* `4` ausgewählt ist
|
|
11. Den Haken bei *Use PLL* deaktivieren
|
|
12. Auf der nächsten Seite muss nichts verändert werden
|
|
13. Bei der Pin-Auswahl *New Design* auswählen und zwei mal bestätigen
|
|
14. Die Zusammenfassung sollte wie unten lauten
|
|
15. Das Memory-Modell über *Decline* nicht erzeugen lassen
|
|
16. Die PCB-Informationen bestätigen und den Controller generieren
|
|
|
|
Anschließend kann die Workstation mit einem Doppelklick auf "Generate
|
|
Programming File" synthetisiert werden. Der erzeugte FPGA-Bitstream befindet
|
|
sich im Ordner `project/ise/work` und kann per Impact auf das FPGA geladen
|
|
werden. Details zum Anschluss der SD-Karte befinden sich im Unterordner
|
|
`sd-breakout`.
|
|
|
|
```text
|
|
CORE Generator Options:
|
|
Target Device : xc5vfx70t-ff1136
|
|
Speed Grade : -1
|
|
HDL : verilog
|
|
Synthesis Tool : ISE
|
|
MIG Output Options:
|
|
Module Name : ddr2_controller
|
|
No of Controllers : 1
|
|
Selected Compatible Device(s) : --
|
|
PPC440 : --
|
|
PowerPC440 Block Selection : --
|
|
FPGA Options:
|
|
PLL : disabled
|
|
Debug Signals : Disable
|
|
System Clock : Single-Ended
|
|
Limit to 2 Bytes per Bank : disabled
|
|
Extended FPGA Options:
|
|
DCI for DQ/DQS : enabled
|
|
DCI for Address/Control : disabled
|
|
Class for Address and Control : Class II
|
|
Controller Options:
|
|
Memory : DDR2_SDRAM
|
|
Design Clock Frequency : 5000 ps(200.00 MHz)
|
|
Memory Type : SODIMMs
|
|
Memory Part : MT4HTF3264HY-667
|
|
Equivalent Part(s) : --
|
|
Data Width : 64
|
|
Memory Depth : 1
|
|
ECC : ECC Disabled
|
|
Data Mask : enabled
|
|
Memory Options:
|
|
Burst Length (MR[2:0]) : 4(010)
|
|
Burst Type (MR[3]) : sequential(0)
|
|
CAS Latency (MR[6:4]) : 4(100)
|
|
Output Drive Strength (EMR[1]) : Fullstrength(0)
|
|
RTT (nominal) - ODT (EMR[6,2]) : 75ohms(01)
|
|
Additive Latency (EMR[5:3]) : 0(000)
|
|
FPGA Options:
|
|
IODELAY Performance Mode : HIGH
|
|
```
|
|
|
|
## Lizenzen
|
|
|
|
Alle Komponenten der Workstation sind, wenn nicht anders gekennzeichnet,
|
|
unter GPLv3 lizenziert. Der für den FPGA erzeugte Bitstream darf jedoch
|
|
nicht unter GPLv3 und damit gar nicht weitergegeben werden, da er den
|
|
MIG-Speichercontroller enthält, dessen Quellcode nur unter ganz bestimmten
|
|
Bedingungen modifiziert und weitergegeben werden darf.
|
|
|
|
Die Freedom-Platform ist unter der GPLv3-kompatiblen Apache2 Lizenz und
|
|
Rocket außerdem unter der BSD-Lizenz lizenziert. Linux ist ausschließlich
|
|
unter GPLv2 lizenziert.
|
|
|
|
[Masterarbeit]: https://klemens.schoelhorn.eu/abschlussarbeiten/
|
|
[Freedom U500 VC707 FPGA Dev Kit Getting Started Guide]: https://static.dev.sifive.com/SiFive-U500-vc707-gettingstarted-v0.2.pdf
|