## Bluespec
#### Typkonvertierung
<img src="https://hackmd.io/_uploads/Hk7E1qtYh.png" alt="Girl in a jacket" width="50%">
- `pack(Type)`: Konvertiert zu Bit
- `unpack(Bit)`: Konvertiert zu Type
- `zeroExtend(Bool/Int/UInt`): Erweitert die Breite mit Nullen am Ende
- `signExtend(Bool/Int/UInt)`: Erweitert die Breite mit Ersetzung des MSB
- `truncate(Type)`: Kürzt die Breite
- `fromInteger(Type)`: Integer zu Type
- `valueOf(Numeric)`: Integer
#### Pipeline
- dynamisch: Latenz datenabhängig
- statisch: Konstante Latenz von der Eingabe zur Ausgabe
- elastisch: Daten in unterschiedlichen Stufen schreiten mit unterschiedlichem Fortschritt durch Pipeline voran
- starr: !elastisch
#### FIFO
- Einfache FIFO's: `mkFIFO`
- Wenn leer, kein `deq` möglich
- Wenn voll, kein `enq` möglich
- Pipeline FIFO's: `mkPiplineFIFO`
- Wenn FIFO voll, eng möglich, wenn gleichzeitig `deq` stattfindet (`first` gibt alten Wert zurück)
- Bypass FIFO's: `mkBypassFIFO`
- Wenn FIFO leer, deq möglich, wenn enq stattfindet (`first` gibt neuen Wert zurück)
- `toGet(FIFO)`/`toPut(FIFO)`: Transformiert eine FIFO zu Get/Put Interface
- get: deq, put: enq
#### Attribute
- (* synthesize *)
- Modul wird ohne "flattening" synthetisiert. Das Attribut kann nicht angewendet werden wenn
- Typ muss Modul sein und nicht definierte aus ModuleCollect
- Das Interface enthält polymorphische Typen
- Interface enthält Methoden/Submodule, die nicht in Wires umgewandelt werden können
- Wenn andere Inputs für das Modul nicht in Bits konvertierbar sind
- (* descending_urgency = "r1, r2” *)
- Rules in absteigender Dringlichkeit aufgelistet
- Rules mit höherer Dringlichkeit **können** Rules mit niedrigerer Dringlichkeit **unterdrücken**
- (* execution_order = "r1, r2" * )
- Rules müssen in der angegebenen Reihenfolge ausgeführt werden. Wenn zwei Rules nicht in der angegebenen Reihenfolge ausgeführt werden können, dann werden diese zum Konflikt geführt.
- (* preempts = "r1, r2" *)
- Erlaubt einer gefeuerten Regel das Feuern einer anderen Regel zu **unterdrücken**
- (* mutually_exclusive = "r1, r2" *)
- Sorgt dafür, dass nur eine der angegebenen Rules feuern wird, wenn dies nicht der Fall sein sollte, dann wird ein Fehler geworfen.
- (* conflict_free *)
- Überschreibt die Deduktion des Schedulers und sagt, dass eine Rule kein Konflikte beinhaltet. Falls der Compiler einen Konflikt zwischen zwei Rules findet, welcher jedoch vom Hardware-Designer als falsch bewiesen werden kann, dann kann dieses Attribut eingesetzt werden um den Konflikt zu lösen.
- (* fire_when_enabled *)
- Wenn eine Rule feuern kann, also ihre impliziten und expliziten Guards wahr sind, dann muss die rule auch feuern. Wenn dies nicht der Fall ist (z.B. durch Konflikte), wird der Compiler einen Fehler werfen. (Wird genutzt um sicherzustellen, dass eine rule auch wirklich ausgeführt wird, wenn sie es kann)
- (* always_ready *), (* always_enabled *)
- Alle Methoden (vor Interface) oder spezifische haben diese Eigenschaft (vor Methode)
- (* ready = "methodname"*)
- Ready Port verwendet den Standard RDY_methodname für die Methode
- (* enable = "methodname" *)
- Enable Port verwendet den Standard EN_methodname für die Methode
- (* result = "name" *)
- Standardmäßig heißt der Ausgabe Port = Methodenname
- Überschreibt Value und ActionValue Methoden Ausgabe Port Name mit `name`
- (* prefix = "name"*)
- Standardmäßig heißt der Eingabe Port = Methodenname
- Überschreibt Eingabe Port Name mit `name`
- (* port = "name" *)
- Argumentnamen ändern
#### Vector
- Use a register containing a vector when you will be updating the entire vector together, at once, in a single rule (atomically).
- Use a vector of registers when you will be updating a single element at a time
#### String Formatter
- %d Output a number in decimal format
- %b Output a number in binary format
- %o Output a number in octal format
- %h Output a number in hexadecimal format
- %s Output a string (argument must be a string)
#### Endliche Automaten
- mkFSM(Stmt): Diese FSM können wir beliebig oft mit `fsm.start()` innerhalb einer Rule starten und mit `fsm.done()` prüfen, ob sie ihr Statement abgearbeitet hat
- mkAutoFSM(Stmt): Diese FSM wird direkt bei der Instanziierung gestartet und kann nicht nochmal ausgeführt werden und endet mit `$finish(0)`.
- mkFSMWithPred(Stmt, Bool): iese FSM verhält sich wie mkFSM, mit dem Unterschied, dass sie nach dem Start nur ausgeführt wird wenn die Bedingung bool erfüllt ist.
- seq ... endseq: Sequentielle Ausführung
- par .. endpar: Parallele Ausführung
## Theorie
-
- Problemdimensionen bei FPGA, ASIC, GPGPU
- Performanzanforderung
- Energiebudget
- Entwicklungszeit und -kosten
- Technologie Mapping FPGA vs ASIC
- ASIC: Logik auf primitive Gatter
- FPGA: Logik auf LUTs, Flip-Flops, etc.
- Auswirkung von Chipgröße auf Anzahl der kaputten Chips
- Kleinere Chips heißt mehr Ausbeute
- Macht man die Chips größer, so steigt auch der Anteil an defekter Chips
- HLS: High-Level Synthese z.B. von Java oder C++ zu Hardware
- System-on-Chip
- Ein System-On-Chip (SOC) ist ein Chip der ein ganzes Rechnrsystem auf einem Chip vereint
- Typische Komponenten:
- Prozessor Cores
- Speicher
- Schnittstellen
- Audio
- DSP (Digital Signal Processor)
- Video
- DISP
- Face
- Imaging
- GPU
- USB
- SD
- System Bus
- Neon-Einheit von ARM Prozessoren setzen SIMD Rechenarchitekturen um
- Soft Core:
- A soft-core processor is a processor implemented using the FPGA fabric.
- Mehr Chipfläche als Hard Cores
- langsamer
- Hard Core:
- A hard-core processor is a processor that's actually physically implemented as a structure in the silicon.
#### FPGA (Field Programmable Gate Array)
- Programmierbar d.h. die Funktionalität kann geändert sein
- Vorteil: Übere kürzere Zeiträume können relevante Funktionen verwendet werden und wenn sie nicht mehr gebraucht werden, kann man den FPGA woanders einsetzen
- Nachteil: Geringerer Geschwindigkeit und höhere Kosten
- Kleine vs große FPGA-Bausteine innerhalb einer Familie
- Die FPGA-Bausteine unterscheiden sich meistens in der größe ihrer konfigurierbaren Chipfäche, also die Anzahl der CLB's und DSP's. Weiterhin können sie sich an der Anzahl der Ports unterscheiden.
- Unterscheidung von verschiedenen FPGA's
- Architekturfamilie
- Geschwindigkeitsklasse
- Fläche und Slice Anordnung
- Energieverbrauch
- Space Hording
#### ASIC (Application Specific Integrated Circuit)
- Funktionalität ist spezifisch. Da sie spezifisch sind, können sie effektiver und effizienter umgesetzt werden
- Nachteil: nach dem Bau ihrer Funktion müssen sie für mind. 5-10 Jahre relevant bleiben
#### TaPaSCo (The Task Parallel System Composer)
Dient der Komposition und Evaluation von parallelen (und homogenen) Systemarchitekturen auf FPGA's. Hierbei erleichtert TaPaSCo durch seine Platform/Architektur-Unterteilung die Wiederverwertbarkeit von Designs, sodass mehr Zeit in die Lösung des eigentlichen Problems investiert werden kann, als in die Integration der Hardware auf unterschiedlichen Plattformen. Weiterhin erleichtert TaPaSCo durch den DSE-Job die Evaluation von Kompositionen
- 0x00: Startaddresse (STA)
- 0x04: Interrupt Enable Register (IE)
- 0x08: Global interrupt enable Register (GIE)
- 0x0c: Interrupt Acknowledge Register (IPA)
- 0x10: Return Value
- 0x20 + ((n-1) * 0x10): n. Argument/Register
#### Advanced eXtensible Interface (AXI)
- Handshake: Der Handshake dient dazu sicherzustellen, dass Daten vom Master angelegt wurden und dass der Slave diese auch entgegen nehmen kann, so dass die Daten korrekt übertragen werden.
- AXI Burst-Transfers vs sequentielle Transfers: Bei AXI Burst-Transfers muss nur eine Startadresse gesetzt werden um bis zu 256 Werte hinterneinander zu übertragen. Dies spart einiges an Zeit, da nicht jeder Wert einzeln übertragen werden muss.
- Funktion von AXI im SoC: Bus; Verbindung von Komponenten
- Typen:
- AXI4
- Mächtigste Implementierung, benötigt am meisten Chip-Fläche
- Unterstützt memory-mapped I/O (Adressen und Daten)
- Erlaubt effiziente Übertragung von ganzen Datengruppen (burst transfer)
- AXI4-Lite
- Einfacher, braucht aber weniger Chip-Fläche
- Unterstützt memory-mapped I/O (Adressen und Daten)
- Aber nur noch Übertragung von Einzeldaten, keine Burst-Transfers mehr
- AXI4-Stream
- Spezialisierte Realisierung
- Überträgt nur reine Datenströme (keine Adressen mehr, damit ungeeignet für memory-mapped I/O)
- Unbegrenzt lange Bursts
- Unidirektionale Datenübertragung von Master zu Slave (Bidirektionale Übertragung benötigt zwei separate AXI4-Streams)
- Mapped IO: AXI und AXI-Line. Nur AXI kann Bursts
- Wieso Burst? Weniger Handshake, weniger Overhead (Effizienz des Datenverkehrs zwischen Master und Slave)
- Keine Daten mehr aufnehmen, wenn RReady auf 0 gesetzt wird
- ACP:
- Erlaubt cache-kohärente Ausführung zusammen mit CPU (shared memory model)
- Liefert Daten schnell, solange sie im Cache liegen
- Teilt sich aber L2 Cache mit CPU
- Nach erfolglosem Zugriff auf Cache (Miss) Zugriff auf externen DDR3-SDRAM
- HP:
- Ist cache-inkohärent zu CPU
- Greift immer auf DDR3-SDRAM zu (PL-interne Caches wären aber möglich)
- Belastet nicht CPU L2 Cache (z.B. keine Verdrängung von Cache-Lines)
- Funktion in System-on-Chip: Kommunikation zwischen Schnittstellen
#### Design Space Exploration
- Idee:
- Optimierung der Hardware, um die Patterson Wall am besten zu lösen
- Es werden alle Möglichkeiten ausprobiert und die Effizienz der einzelnen Designs verglichen
- Hierbei kann man auf Durchsatz und Latenz optimieren
- Welchen Problemen steht der Hardwaredesigner gegenüber, die eine effiziente manuelle Design Space Exploration verhindern?
- Eine manuelle DSE wird durch die sehr hohe Anzahl an Eingangsparametern verhindert und dadurch, dass die Optimierung allein durch ausprobieren von verschiedenen Lösungen möglich ist
- Eine optimale Lösung kann nicht verifiziert werden, da dieses Problem NP-Schwer ist
- Unsicherheiten, die eine Design Space Exploration erschweren. Wie versucht Tapasco damit umzugehen?
- Platzbedarf und Performance sind Unsicherheiten
- TaPaSCo versucht diese zu bewältigen in dem es die Unsicherheiten durch Heuristiken optimiert und sich so an eine optimale Lösung annähern kann
- Welche Auswirkungen hat ein hoher Füllstand des FPGA (Utilization) auf die Leistung des Gesamtsystems?
Ein hoher Füllstand des FPGA bedeutet, dass die Komponenten einen langen Weg haben um untereinander zu kommunizieren. Deshalb erhöht sich der kritische Pfad und die maximale Taktfrequenz des Designs auf dem FPGA sinkt und das System wird dadurch langsamer
#### Xilinx Zynq 7000
- Realisierung von Cache-Kohärenz
- Realisierung durch die Snoop-Control-Unit mit Hilfe des MESI Protokoll
- Dadurch Kohärent verbunden sind die beiden L1-D$ Caches der Prozessoren, weiterhin der L2-Cache, wie auch die Programmable Logic über den ACP (Accerlerated Coherent port)
- Anwendung On-Chip-Memory (OCM) auf Zynq 000
- Geringere Latenz für die Anforderung von Daten
- Der DDR3-SDRAM hat einen höheren Durchsatz, kann jedoch bis zu 4 mal länger brauchen bis er das erste Datum übergibt. Deshalb wird bei Situationen, in denen man sicher sein möchte das man nach einer gewissen Anzahl von Takten sein Datum erhält, der OCM trotz seines geringeren Durchsatzes verwendet
- Speicher: L1 Cache (I-Cache & D-Cache), L2 Cache, OCM (On-Chip-Memory), SRAM