Wie viele Gatter braucht ein Entwurf?
Eine Netzliste ist eine Schaltung als Liste von Gattern und Flipflops. Ein Syntheseprogramm baut sie aus Ihrer Beschreibung. Wie viele Zellen darin stehen, bestimmt Fläche und Preis des Chips.
Zwei Beschreibungen derselben Funktion können verschieden viele Zellen brauchen, und ein kleiner Fehler macht aus einer Beschreibung ungewollt einen Speicher.
Am Ende dieser Lektion
Notiz
Ich kann an einer Netzliste ablesen, wie viele Zellen ein Entwurf braucht und ob er einen Latch enthält.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Synthese | macht aus einer Beschreibung eine Liste von Gattern | yosys |
| Netzliste | die Schaltung als Liste ihrer Zellen und Verbindungen | |
| Zelle | ein Gatter oder ein Flipflop in der Netzliste | |
| Flipflop | eine Zelle, die ein Bit bei der Taktflanke speichert | |
| Latch | ein Speicher ohne Takt, meist ungewollt | $_DLATCH_P_ |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Synthese macht aus Text eine Zellenliste
Ein Simulator führt Ihre Beschreibung aus. Ein Syntheseprogramm wie yosys macht etwas anderes: Es baut aus ihr die Netzliste, also die Gatter, die ein Chip wirklich bräuchte.
Der Befehl hdl gates ruft yosys auf und zählt die Zellen. Zwei Beschreibungen können dieselbe Wahrheitstabelle haben und trotzdem verschieden viele Zellen ergeben.
Zwei Schreibweisen, eine Funktion
// Zwei Beschreibungen derselben Funktion.
assign y = (a & b) | (a & c); // wahl1: 3 Zellen
assign y = a & (b | c); // wahl2: 2 ZellenAusklammern spart eine Zelle
| Entwurf | Beschreibung | Zellen laut yosys |
|---|---|---|
| wahl1 | (a & b) | (a & c) | 3: zwei UND, ein ODER |
| wahl2 | a & (b | c) | 2 |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
In den Ordner hdl wechseln
cd ~/hdlHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Entwurf wahl1.v schreiben
printf '%s\n' 'module wahl1(input a, input b, input c, output y);' ' assign y = (a & b) | (a & c);' 'endmodule' > wahl1.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Entwurf wahl2.v schreiben
printf '%s\n' 'module wahl2(input a, input b, input c, output y);' ' assign y = a & (b | c);' 'endmodule' > wahl2.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zellen von wahl1 zählen
hdl gates wahl1.v wahl1Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zellen von wahl2 zählen
hdl gates wahl2.v wahl2Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Jedes gespeicherte Bit braucht ein Flipflop
Gatter allein speichern nichts. Ein Zähler, der sich seine Zahl merkt, braucht für jedes Bit ein Flipflop. Der Rest sind Gatter, die den nächsten Wert ausrechnen.
Schätzen Sie vor dem Befehl: Wie viele Flipflops hat ein Zähler, der bei jedem Takt um eins zählt und drei Bits breit ist? Die Datei zaehler3.v zählt dazu bei einem Reset auf 0.
Den Zähler zaehler3.v schreiben
printf '%s\n' 'module zaehler3(input clk, input rst, output reg [2:0] q);' ' always @(posedge clk) if (rst) q <= 0; else q <= q + 1;' 'endmodule' > zaehler3.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zellen von zaehler3 zählen
hdl gates zaehler3.v zaehler3Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein fehlender else-Zweig baut einen Latch
Ein Latch ist ein Speicher ohne Takt. Er entsteht, wenn ein Ausgang nicht in jedem Fall einen Wert bekommt. Dann muss die Schaltung den alten Wert behalten, und dafür baut yosys einen Latch.
Das ist fast immer ein Fehler: Der Latch hängt von keinem Takt ab, und der Entwurf verhält sich schwer vorhersagbar. Setzen Sie den Ausgang deshalb in jedem Zweig.
Mit und ohne else
// Fehlt der else-Zweig, muss y seinen Wert behalten: ein Latch.
always @(*)
if (frei) q = d;
// Mit else q = 0; ist q in jedem Fall gesetzt: nur ein UND.Den Entwurf speicher.v schreiben
printf '%s\n' 'module speicher(input frei, input d, output reg q);' ' always @(*) if (frei) q = d;' 'endmodule' > speicher.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zellen von speicher zählen
hdl gates speicher.v speicherHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Entwurf ohne Latch schreiben
printf '%s\n' 'module ohne_speicher(input frei, input d, output reg q);' ' always @(*) if (frei) q = d; else q = 0;' 'endmodule' > ohne_speicher.vHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Die Zellen ohne Latch zählen
hdl gates ohne_speicher.v ohne_speicherHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Ein häufiger Fehler
Warnung
Viele denken, ein fehlender else-Zweig heiße: Dann passiert nichts, der Ausgang ist 0. In Hardware heißt es: Der Ausgang behält seinen alten Wert. Dafür baut die Synthese einen Latch. Geben Sie dem Ausgang deshalb in jedem Zweig einen Wert.