Détecter les registres non réinitialisés


8

Lors de l'écriture de Verilog, j'utilise une variété de "linters" qui donneront des erreurs et des avertissements. Ce sont mon simulateur (ModelSim), mon compilateur (Quartus II), ainsi qu'un linter (Verilator). Ensemble, j'ai une bonne couverture pour les pièges courants, tels que les décalages de taille de bus et les verrous déduits.

Malheureusement, aucun des trois outils ne détecte les registres qui ne sont pas réinitialisés. Pour voir ce que je veux dire, considérez ce qui suit.

reg a;
reg b;

always @(posedge clk_i or posedge rst_i) begin
  if(rst_i) begin
    a <= 1'b0; // Reset a
    // Ooops, forgot to reset b
  end else begin
    // Do stuff with a and b
  end
end

Comment puis-je faire en sorte que mes outils détectent automatiquement les registres qui ne sont pas réinitialisés?


2
"les registres qui ne sont pas réinitialisés" ne sont pas nécessairement une mauvaise chose (au moins dans une conception en silicium), ce qui peut être la raison pour laquelle ils ne sont pas des avertissements dans les outils à charpie. En général, vous souhaitez uniquement réinitialiser les registres qui doivent être réinitialisés, car l'ajout de réinitialisations aux bascules augmente leur surface et la charge sur le réseau de réinitialisation. Si vous avez un bus de données 256 bits et un signal «valide» d'un bit, il n'est pas nécessaire de réinitialiser les données si vous réinitialisez le valide.
Tim

Synplicity (outil de synthèse) donne des avertissements sur de telles choses. Ennuyeux parce qu'ils sont souvent intentionnels ... mais peuvent aider à votre situation (en supposant que Synplicity fait Verilog, je n'ai jamais essayé)
Brian Drummond

La question indique qu'une variété de linters sont utilisés, ModelSim, Quartus II et Verilator. Ces outils ont des capacités de peluchage limitées et les types de problèmes qu'ils recherchent sont assez étroits.
travisbartley

Réponses:


3

Aucun des outils que vous avez mentionnés n'est un véritable outil à peluches. Ces outils ne sont pas censés vous donner une bonne couverture de peluches.

J'ai vu deux outils de charpie commerciaux et les deux avaient des règles pour détecter les flops non réinitialisés.

Je vois trois options:

  1. Si la réponse de David Kessner fonctionne pour vous - chemin à parcourir.
  2. Obtenez un outil à peluches décent qui fera le travail.
  3. Écrivez un script qui détectera les flops non réinitialisés.

Maintenant, # 2 n'est peut-être pas aussi simple. Je ne sais pas s'il existe de bons linters gratuits, et les professionnels sont chers et vous prendront beaucoup de temps à installer.

# 3 est l'approche que j'utiliserais. Si vous connaissez un langage de script (Perl, Python, ...), il vous faudra au maximum un jour pour écrire un script qui recherche les flops non réinitialisés. Si vous ne connaissez aucun langage de script, il y a StackOverflow où vous pouvez demander de l'aide - quelques jours et vous avez terminé. Cela ajoutera également un autre outil dans votre boîte à outils personnelle qui est très apprécié des concepteurs frontaux - l'écriture de scripts de traitement de texte.

Bonne chance!


4

Lorsque j'exécute Modelsim sur mes conceptions VHDL, cela me donne des avertissements à Time = 0ps sur la logique avec des signaux d'entrée de type «X» ou «U». J'oublie le message d'avertissement exact. Le fait de parcourir ces avertissements peut me dire ce que je n'ai pas initialisé.


1

Je me fie à des tests fonctionnels plutôt qu'à des outils de peluchage pour cela, j'ai tendance à basculer la réinitialisation et à rejouer des parties du banc de test. Si l'appareil fonctionne correctement après la réinitialisation, vous avez soit réinitialisé suffisamment l'espace d'état, soit votre banc d'essai n'est pas bon!


0

Parfois, les outils de conception génèrent une série de rapports qui vous fournissent toutes sortes d'informations intéressantes. Par exemple, Xilinx peut appeler cela un rapport de carte, qui vous indique quels composants logiques ont été mappés à quels composants physiques.

Dans l'exemple ci-dessus, reg a serait mappé sur un FDCE (Flip flop, D, avec effacement asynchrone et activation de l'horloge), tandis que reg b serait mappé sur un FDE (Flip flop, D et activation de l'horloge). Cela vous dirait que reg b n'a pas de réinitialisation.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.