Spécification de code Verilog et expérience en écriture FPGA

1. Spécification du code Verilog

1. Attribuer une valeur initiale

Ne pas attribuer de valeurs initiales aux variables lors de leur déclaration. L'opération d'affectation de valeur initiale doit être effectuée dans l'état de réinitialisation. Il est également recommandé que les variables de registre utilisent la borne de réinitialisation pour s'assurer que lorsque le système est sous tension ou en désordre, le système peut être restauré à l'état initial via la réinitialisation. opération. Il est recommandé d'utiliser une logique de front positif pour l'horloge et une logique de front négatif pour la réinitialisation. Lors de la réinitialisation, tous les signaux du bloc d'instructions doivent recevoir des valeurs initiales et les signaux pertinents ne doivent pas être manqués.

2. À propos de l'instruction always

(1) N'utilisez pas la logique de front montant et de front descendant de la même horloge dans les deux blocs toujours à moins que cela ne soit absolument nécessaire, sinon cela introduira des problèmes relativement compliqués de qualité d'horloge et de contraintes de synchronisation

(2) Il est interdit d'utiliser les deux fronts de l'horloge comme condition de déclenchement en même temps dans un bloc toujours. La compilation et la simulation peuvent être effectuées selon l'idée du concepteur, mais de tels circuits ne sont souvent pas synthétisables, ou le circuit la fonction après synthèse ne répondra pas aux attentes

(3) Ne pas avoir plusieurs instructions conditionnelles parallèles ou non pertinentes dans un bloc toujours, utiliser plusieurs instructions toujours pour les décrire séparément

3. À propos de l'horloge et de l'asynchronie

La conception synchrone doit être utilisée autant que possible dans la conception. Lorsqu'il est nécessaire d'utiliser une logique asynchrone, les signaux entre différents domaines d'horloge doivent être traités de manière synchrone et les signaux associés ne peuvent pas être utilisés directement, sinon un circuit métastable sera généré.

4. À propos de la synthèse

En général, les variables de signal ne doivent pas être directement utilisées pour des opérations telles que la multiplication *, la division / et le reste %. Une fois ces opérateurs synthétisés, la structure et la synchronisation ne sont souvent pas faciles à contrôler. Le module IP optimisé correspondant ou le module intégré dans la bibliothèque de processus doit être utilisé. Mais les constantes de type paramètre peuvent utiliser ce type d'opérateur, car le compilateur calculera le résultat de l'opération constante au début de la compilation, et ne consommera pas de ressources matérielles redondantes.

5. À propos de l'instanciation

Lors de l'instanciation, le signal connecté à l'extrémité d'entrée peut être une variable de type reg ou filaire, et le signal connecté à l'extrémité de sortie doit être une variable de type filaire. Mais lorsque le signal de port est déclaré, le signal d'entrée doit être une variable de type fil, et le signal de sortie peut être une variable de type reg ou de type fil. Lorsque plusieurs modules sont instanciés, le nom du module vient en premier, suivi du nom instancié, et les noms instanciés ne peuvent pas être identiques.

2. Quelques principes importants

1. Lors de la modélisation de circuits séquentiels, utilisez une affectation non bloquante

2. Lors de la modélisation du circuit de verrouillage, utilisez une affectation non bloquante

3. Lors de l'écriture d'une logique combinatoire avec toujours bloquer, utilisez l'affectation de blocage

4. Lors de l'établissement de circuits logiques séquentiels et combinatoires dans le même bloc toujours en même temps, utilisez une affectation non bloquante

5. Ne pas utiliser l'affectation non bloquante et l'affectation bloquante en même temps dans le même bloc toujours

6. N'attribuez pas de valeurs à la même variable dans plusieurs blocs toujours

#Suivre les principes ci-dessus aidera à écrire correctement du matériel synthétisable et peut éliminer 90 % à 100 % du phénomène de risque de concurrence qui peut survenir pendant la simulation.

3. Erreur de synchronisation

L'utilisation continue de la logique combinatoire peut entraîner des erreurs de synchronisation dues aux longs chemins de données,

Solution : ajoutez des registres sur des chemins longs pour la mise en mémoire tampon des données.

1. La logique de combinaison est rarement utilisée pour le traitement de données à grande vitesse, car le débit de données est trop rapide, ce qui est sujet aux risques de concurrence.

2. Pour le traitement de flux de données à grande vitesse, effectuez d'abord un cache,

3. Pour le traitement de données à grande vitesse, essayez d'utiliser des instructions non bloquantes, car l'utilisation d'instructions bloquantes continues entraînera des erreurs de synchronisation lorsque le flux de données est trop rapide. À l'origine, le résultat des instructions bloquantes est le même que celui des instructions non bloquantes. - déclarations bloquantes.

4. Les calculs compliqués ne peuvent pas être effectués en une seule étape.


Résumé personnel, il peut y avoir des erreurs.

Je suppose que tu aimes

Origine blog.csdn.net/QUACK_G/article/details/124574796
conseillé
Classement