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
- Aq2 erhält das an derselben Flanke aktualisierte q1 (also d), und die Schaltung verzögert nur um eine Stufe
- BDie Werte von q1 und q2 bleiben dauerhaft 0
- 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.