15 / 37 · Konzept
Nichtblockierende Zuweisung und gleichzeitige Zustandsaktualisierung
Alten und neuen Zustand für korrektes Lesen von Pipeline- und Zähler-RTL trennen.
Lektionen sind frei lesbar. Schreibe dich ein, um deinen Fortschritt zu speichern.
Rechte Seiten verwenden den alten Zustand
In taktgebundenem RTL wertet <= die rechte Seite aus und übernimmt sie in der nichtblockierendenNonblocking Sequenzielle RTL-Zuweisung mit <=. Nach Auswertung der rechten Seite wird die Aktualisierung geplant, sodass Register derselben Flanke den alten Zustand verwenden. Aktualisierungsphase. So aktualisieren sich mehrere RegisterRegister Speichert einen Zustand aus mehreren Bits. Die synchronen Register dieses Kurses übernehmen festgelegte Eingaben an Taktflanken. Mehr erfahren an derselben Flanke, ohne dass neue Werte allein wegen der Zeilenreihenfolge durch mehrere Stufen laufen.
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
endBei a=b=0 und Eingaben 5,9,2 werden (a, b) nach den Flanken (5,0),(9,5),(2,9). Würde die zweite Zeile bereits das neue a lesen, verschwände eine Pipeline-StufePipeline Teilt Berechnungen durch Register in Stufen und verarbeitet mehrere Eingaben überlappend. Daten, valid und Steuersignale müssen stufengerecht ausgerichtet sein. Mehr erfahren.
Jede Spalte dokumentiert eine steigende FlankeSteigende Flanke Übergang des Takts von 0 auf 1. Nicht zu verwechseln mit dem gesamten hohen Pegelintervall CLK=1. Mehr erfahren. Eingänge gelten unmittelbar davor, Zustände mit „after“ unmittelbar nach der Aktualisierung. Die Spalten zeigen die Reihenfolge der Abtastungen, keine physische LaufzeitLaufzeit Zeit nach einer Eingangsänderung, bis der Ausgang auf dem richtigen Wert stabil ist. Logische Äquivalenz und zeitliche Eigenschaften sind getrennte Aussagen. Mehr erfahren. Anfangs a=b=0. Während a das neue d speichert, speichert b das alte a; deshalb liegen die Reihen um eine Stufe versetzt.
Wellenformdaten anzeigen
| Signal | Wellenform | Buswerte |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a after | 234 | 5 → 9 → 2 |
| b after | 234 | 0 → 5 → 9 |
Warum blockierende Zuweisungen riskant sind
Bei a=d; b=a; im selben Block kann b bereits das neue a verwenden. Die Reihenfolge gegenüber anderen sequenziellen Blöcken kann außerdem Races verursachen. Verwenden Sie grundsätzlich blocking für kombinatorische Berechnung und nonblocking für Zustand; Ausnahmen nur mit erklärbarer Ereignisbedeutung.
Mehrfache Zuweisungen an dasselbe Register vermeiden
Werden in einer Prozedur mehrere nonblocking-Zuweisungen an q ausgeführt, kann die zuletzt ausgeführte gewinnen. Verstecken Sie Priorität nicht in unabhängigen ifs, sondern nutzen Sie if / else if / else oder eine explizite Folgezustandsvariable. Mehrere Blöcke dürfen dasselbe Register nicht treiben.
Schreiben Sie bei der RTL-Prüfung für jedes Register genau eine Folgezustandsgleichung auf. Zwei Gleichungen oder fehlende Definitionen unter bestimmten Bedingungen sind Anlass, die Steuerprioritäten erneut zu prüfen.
Selbst ausprobieren
Bei anfänglich a=1, b=4 wird a<=b; b<=a; im selben Taktblock ausgeführt. Welche Zustände entstehen nach einer und zwei Flanken?
Erklärung lesen
Nach einer Flanke (4,1), nach zwei (1,4). Beide Zuweisungen lesen denselben alten Zustand und tauschen die Werte. Bei a=b; b=a; können dagegen beide zum alten b werden; das ist nicht äquivalent.