Hardwarebeschreibungssprachen und Verifikation

Ein zweistufiges Schieberegister sollte entstehen, wurde aber wie oben mit blockierenden Zuweisungen (=) geschrieben. Welches Problem tritt auf?

always @(posedge clk) begin
    q1 = d;
    q2 = q1;
end
  1. Aq2 erhält das an derselben Flanke aktualisierte q1 (also d), und die Schaltung verzögert nur um eine Stufe
  2. BDie Werte von q1 und q2 bleiben dauerhaft 0
  3. CEs entsteht korrekt ein zweistufiges Schieberegister, es gibt kein Problem
Antwort und Erläuterung anzeigen

Antwort: A. q2 erhält das an derselben Flanke aktualisierte q1 (also d), und die Schaltung verzögert nur um eine Stufe

Bei blockierenden Zuweisungen wird q1 in der ersten Zeile sofort auf den Wert von d aktualisiert, und q2 erhält in der zweiten Zeile das aktualisierte q1, also d. Daher ist q2 gleich q1 und verzögert sowohl in der Simulation als auch in der synthetisierten Schaltung nur um eine Stufe. Schreibt man „q1 <= d; q2 <= q1;“, erhält q2 das q1 vor der Flanke, und es entsteht wie beabsichtigt ein zweistufiges Schieberegister. Bei umgekehrter Zeilenreihenfolge kann es zwar funktionieren, ist aber fehleranfällig.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Hardwarebeschreibungssprachen und Verifikation

  1. Welche Richtlinie zur Verwendung der Zuweisungsarten in Verilog ist allgemein korrekt?
  2. Was bedeutet „always @(*)“ in Verilog?
  3. Die obige Beschreibung sollte eine kombinatorische Schaltung sein. Welches mögliche Problem ist korrekt beschrieben?
  4. Was entsteht bei der Logiksynthese, wenn wie oben als kombinatorische Schaltung gedachter Code geschrieben wird?
  5. Welche Kombination aus Grund für das Entstehen eines Latches in der obigen Beschreibung und Gegenmaßnahme ist korrekt?

Vergleiche zu diesem Thema