Altifigence Academy

15 / 37 · Konzept

Nichtblockierende Zuweisung und gleichzeitige Zustandsaktualisierung

Alten und neuen Zustand für korrektes Lesen von Pipeline- und Zähler-RTL trennen.

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.

SystemVerilog
always_ff @(posedge clk) begin
  if (rst) begin
    a <= 8'd0;
    b <= 8'd0;
  end else begin
    a <= d;
    b <= a;
  end
end
ak+1=dk,bk+1=aka_{k+1}=d_k,\qquad b_{k+1}=a_k

Bei 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.

a und b lesen denselben bisherigen Zustand
Wellenformdaten anzeigen
Wellenformdaten: Jedes Zeichen steht für ein Intervall, ein Punkt hält den vorherigen Zustand und p ist ein Taktzyklus.
SignalWellenformBuswerte
edge234E0 → E1 → E2
d2345 → 9 → 2
a after2345 → 9 → 2
b after2340 → 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.

Deine Auswahl gilt für diesen Browser. Du kannst sie jederzeit in der Fußzeile ändern.