workstation/README.md

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