HDL et vérification
always @(*) begin
sum = sum + in;
endLe 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 ?
- AIl n'y a pas de problème ; on synthétise un circuit qui ajoute in à sum une fois à chaque changement de in
- BUn signal manque dans la liste de sensibilité, si bien que la simulation et la synthèse divergent ; il faut écrire @(in)
- 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.