Hardwarebeschreibungssprachen und Verifikation

always @(*) begin
    sum = sum + in;
end

Der obige Code wurde in der Absicht geschrieben, einen Akkumulator zu bauen, der den Eingang in fortlaufend aufaddiert. Welche Kombination aus dem Problem dieses Codes und seiner Korrektur ist richtig?

  1. AEs gibt kein Problem; es wird eine Schaltung synthetisiert, die sum bei jeder Änderung von in einmal um in erhöht
  2. BIn der Sensitivitätsliste fehlt ein Signal, sodass Simulation und Synthese voneinander abweichen; man schreibt stattdessen @(in)
  3. CDer Ausgang des Addierers wird ohne Flipflop auf seinen eigenen Eingang zurückgeführt, sodass sich der Wert nie stabilisiert; man schreibt sum <= sum + in; innerhalb von always @(posedge clk), um einmal pro Takt zu addieren
Antwort und Erläuterung anzeigen

Antwort: C. Der Ausgang des Addierers wird ohne Flipflop auf seinen eigenen Eingang zurückgeführt, sodass sich der Wert nie stabilisiert; man schreibt sum <= sum + in; innerhalb von always @(posedge clk), um einmal pro Takt zu addieren

always @(*) beschreibt eine kombinatorische Schaltung, daher ergibt dieser Code eine Schaltung, in der ein Addierer mit sum als Eingang mit seinem Ausgang direkt sum treibt. Ohne Flipflop ändert jede Änderung am Ausgang des Addierers seinen Eingang, und der Wert läuft immer weiter um, ohne sich zu stabilisieren: Es entsteht eine kombinatorische Schleife. Die statische Timing-Analyse kann damit nicht umgehen, und viele Werkzeuge für Lint und Logiksynthese geben Warnungen oder Fehler aus. Eine Schaltung, die Werte aufsummiert, braucht ein Flipflop, das den Wert bei jeder steigenden Taktflanke einmal aktualisiert: Man verwendet eine nicht blockierende Zuweisung innerhalb von always @(posedge clk) und setzt den Anfangswert per Reset.

Dieses Thema üben Zur Themenseite

Passende Rechner

Weitere Fragen zu Hardwarebeschreibungssprachen und Verifikation

  1. Welche Aussage zum wesentlichen Unterschied zwischen einer in einer HDL wie Verilog geschriebenen Beschreibung und einem Softwareprogramm, etwa in C, ist korrekt?
  2. Was ist der Zweck von module in Verilog?
  3. Welche Aussage zum Unterschied zwischen den Typen wire und reg in Verilog ist korrekt?
  4. Welche Schaltung stellt die obige assign-Anweisung in Verilog dar?
  5. Welche Schaltung erzeugt die obige Verilog-Beschreibung bei der Logiksynthese?

Vergleiche zu diesem Thema