HDL et vérification

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

Le code ci-dessus a été écrit dans l'intention de réaliser un accumulateur qui additionne sans cesse l'entrée in. Quelle combinaison du problème de ce code et de sa correction est correcte ?

  1. AIl n'y a pas de problème ; on synthétise un circuit qui ajoute in à sum une fois à chaque changement de in
  2. BUn signal manque dans la liste de sensibilité, si bien que la simulation et la synthèse divergent ; il faut écrire @(in)
  3. CLa sortie de l'additionneur revient sur sa propre entrée sans passer par une bascule, si bien que la valeur ne se stabilise jamais ; il faut écrire sum <= sum + in; dans always @(posedge clk) pour additionner une fois par cycle d'horloge
Afficher la réponse et l'explication

Réponse : C. La sortie de l'additionneur revient sur sa propre entrée sans passer par une bascule, si bien que la valeur ne se stabilise jamais ; il faut écrire sum <= sum + in; dans always @(posedge clk) pour additionner une fois par cycle d'horloge

always @(*) décrit un circuit combinatoire : ce code devient donc un circuit dans lequel un additionneur qui prend sum en entrée attaque directement sum par sa sortie. Sans bascule, chaque changement de la sortie de l'additionneur modifie aussi son entrée, et la valeur circule sans fin sans se stabiliser : c'est une boucle combinatoire. L'analyse temporelle statique ne peut pas la traiter, et de nombreux outils de lint et de synthèse logique émettent des avertissements ou des erreurs. Un circuit qui accumule des valeurs a besoin d'une bascule qui met à jour la valeur une fois par front montant d'horloge : on utilise une affectation non bloquante dans always @(posedge clk), et l'on fixe aussi la valeur initiale par une réinitialisation.

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

Calculateurs associés

Autres questions sur HDL et vérification

  1. Quelle est la grande différence entre une description en HDL comme Verilog et un programme logiciel en C ou autre ?
  2. Quel est l'objectif de l'utilisation de module en Verilog ?
  3. Quelle est la différence entre les types wire et reg en Verilog ?
  4. Quel circuit représente l'instruction assign Verilog ci-dessus ?
  5. Quel circuit la synthèse logique produit-elle à partir de la description Verilog ci-dessus ?

Comparatifs sur ce thème