HDL et vérification

Voulant un registre à décalage à deux étages, on a écrit le code ci-dessus avec des affectations bloquantes (=). Quel problème survient ?

always @(posedge clk) begin
    q1 = d;
    q2 = q1;
end
  1. Aq2 reçoit q1 mis à jour au même front (c'est-à-dire d), et le circuit ne retarde que d'un étage
  2. Bq1 et q2 restent indéfiniment à 0
  3. COn obtient correctement un registre à décalage à deux étages, sans problème
Afficher la réponse et l'explication

Réponse : A. q2 reçoit q1 mis à jour au même front (c'est-à-dire d), et le circuit ne retarde que d'un étage

Avec l'affectation bloquante, q1 prend immédiatement la valeur de d à la première ligne, et q2 reçoit à la deuxième q1 mis à jour, c'est-à-dire d. q2 prend donc la même valeur que q1, et le retard n'est que d'un étage, en simulation comme dans le circuit synthétisé. En écrivant « q1 <= d; q2 <= q1; », q2 reçoit q1 d'avant le front et l'on obtient le registre à décalage à deux étages voulu. Inverser l'ordre des lignes peut fonctionner, mais c'est une source d'erreurs.

S'entraîner sur ce thème Retour au thème

Autres questions sur HDL et vérification

  1. Quelle est la règle générale d'usage des types d'affectation en Verilog ?
  2. Que signifie l'écriture « always @(*) » en Verilog ?
  3. Voulant un circuit combinatoire, on a écrit le code ci-dessus. Quel problème peut survenir ?
  4. Voulant un circuit combinatoire, on a écrit le code ci-dessus. Que produit la synthèse logique ?
  5. Quelle combinaison de cause et de remède explique l'apparition d'un verrou dans la description ci-dessus ?

Comparatifs sur ce thème