VHDL: utilisation de l'opérateur '*' lors de l'implémentation de multiplicateurs dans la conception


10

Les FPGA actuels ont intégré des blocs DSP, les derniers FPGA ont même intégré des unités à virgule flottante conformes à la norme IEEE-754.

Il est possible de créer une entité / un module DSP à l'aide d'une interface graphique après avoir sélectionné les paramètres requis, puis l'instancier dans la conception.

Quand devons-nous effectuer une telle microgestion dans une conception de blocs DSP instantanés réels et quand devons-nous simplement entrer un opérateur '*' dans le code et laisser l'outil de synthèse gérer les détails de bas niveau? Ce qui est mieux?

Il existe de nombreux types d'algorithmes de multiplication en matière de multiplication binaire. Depuis que nous avons intégré des blocs DSP sur silicium et même des multiplicateurs à virgule flottante, cela signifie-t-il que tous ces algorithmes ne sont pas devenus obsolètes.


Quel FPGA a des FPU conformes 754 dans le tissu?
Martin Thompson

Réponses:


6

Je l'ai fait moi-même plusieurs fois.

Généralement, les outils de conception choisiront entre une implémentation de structure et une tranche DSP en fonction des paramètres de synthèse.

Par exemple, pour Xilinx ISE, dans les paramètres du processus de synthèse, Options HDL, il y a un paramètre "-use_dsp48" avec les options: Auto, AutoMax, Oui, Non. Comme vous pouvez l'imaginer, cela contrôle la force avec laquelle les outils essaient de placer Tranches DSP. J'ai eu une fois un problème où j'ai multiplié un entier par 3, ce qui a déduit une tranche DSP - sauf que je déduisais déjà manuellement chaque tranche DSP de la puce, donc le synthé a échoué! J'ai modifié le paramètre sur Non, car j'utilisais déjà chaque tranche dsp.

C'est probablement une bonne règle de base (je viens de me réconcilier): si votre conception est cadencée à moins de 50 MHz et que vous allez probablement utiliser moins de 50% des tranches DSP de la puce, utilisez simplement le *, + et - opérateurs. cela déduira les tranches DSP sans registre de pipeline. Cela limite vraiment la vitesse de pointe. (Je n'ai aucune idée de ce qui se passe lorsque vous utilisez la division)

Cependant, s'il semble que vous allez exécuter les tranches plus près de la vitesse maximale de la tranche DSP (333 MHz pour la vitesse normale Spartan 6). Si vous allez utiliser toutes les tranches, vous devez les déduire manuellement .

Dans ce cas, vous avez deux options.

Option 1: utilisez manuellement le modèle d'instanciation DSP brut. Option 2: utilisez un bloc IP de Xilinx Core Generator. (J'utiliserais cette option. En même temps, vous apprendrez tout sur la génération de base, ce qui vous aidera à l'avenir)

Avant d'effectuer l'une ou l'autre de ces opérations, lisez les deux premières pages du guide d'utilisation de la tranche DSP. Dans le cas du Spartan 6, (DSP48A1), ce serait le document Xilinx UG389: http://www.xilinx.com/support/documentation/user_guides/ug389.pdf

Considérez d'abord l'option Core Generator. Je crée généralement un projet de test dans Core Generator pour la partie avec laquelle je travaille, où je crée un certain nombre de blocs IP juste pour apprendre le système. Ensuite, lorsque je suis prêt à en ajouter un à ma conception dans ISE, je clique avec le bouton droit dans la hiérarchie de conception, je clique sur une nouvelle source et je sélectionne "IP (Générateur de base et assistant d'architecture)" afin de pouvoir modifier et régénérer le bloc directement de mon projet.

Dans Core gen, jetez un œil aux différents blocs IP parmi lesquels vous pouvez choisir - il y en a quelques dizaines, dont la plupart sont plutôt cool.

Le noyau multiplicateur est ce que vous devez regarder en premier. Consultez chaque page et cliquez sur le bouton de la fiche technique. Les parties importantes sont les largeurs de bits entières, les étages de pipeline (latence) et tous les signaux de contrôle. Cela produit le bloc le plus simple possible en supprimant tous les ports dont vous n'avez pas besoin.

Lorsque je construisais un filtre IIR d'ordre 5 par 3 l'année dernière, j'ai dû utiliser le modèle d'instanciation manuelle car je construisais une implémentation très personnalisée, avec 2 tranches DSP cadencées 4x plus rapidement que la fréquence d'échantillonnage. C'était une douleur totale.


13

Si vous voulez simplement multiplier deux nombres et qu'ils conviennent au bloc DSP, l' *opérateur doit déduire un bloc DSP. Sinon, renvoyez l'outil de synthèse :)

Cependant, pour tirer parti des combinaisons plus complexes de la fonctionnalité DSP, il faut souvent instancier directement le bloc et configurer ses paramètres. Exemples de choses qui peuvent ne pas bien correspondre par inférence (en utilisant le Xilinx DSP48E1 comme exemple):

  • Utilisation de pré-additionneur
  • Utilisation du post-accumulateur
  • Utilisation d'un détecteur de motif
  • Utilisation de l'unité logique

Et surtout des combinaisons de ce qui précède.

Les outils de synthèse ne sont pas encore assez bons pour cartographier des combinaisons complètement arbitraires de logique et d'arithmétique aussi efficacement que vous pourriez l'espérer.


4

S'il y a des blocs DSP présents, vous devez les utiliser si vous le pouvez, car ce sera plus efficace que d'utiliser des LUT pour faire la même chose. Sauf si vous n'avez pas besoin d'une multiplication haute performance, auquel cas vous devez implémenter, par exemple, un additionneur pipeliné et un registre à décalage pour économiser de l'espace.

Cependant, j'examinerais la possibilité d'inférer des blocs DSP avant d'entrer dans les outils GUI. Le manuel Xilinx XST contient des «recettes» HDL pour savoir comment instancier des blocs DSP avec du verilog / VHDL pur. Fondamentalement, si vous ajoutez suffisamment de registres avant et / ou après les multiplicateurs, XST utilisera un bloc DSP pour implémenter l'opération automatiquement. Vous pouvez vérifier dans les journaux de synthèse pour voir s'il infère correctement les blocs DSP. Je suppose qu'Altera a quelque chose de similaire.

Soit dit en passant, je réfléchissais à cela il y a quelques minutes car je travaille actuellement sur une implémentation de twers Mersenne qui utilise uniquement un multiplicateur pour la graine initiale. Ma mise en œuvre de la première passe ne respecte pas le calendrier, mais la fonctionnalité est correcte. XST a également mis l'opération de multiplication en blocs DSP, mais elle n'est pas optimisée, donc elle s'exécute environ deux fois moins vite que je le souhaiterais. Je vais probablement réimplémenter la multiplication à l'aide d'une technique de décalage et d'ajout qui prendra 32 fois plus de cycles d'horloge, mais ne nécessitera plus de multiplicateur matériel.


Pourquoi ne devrait-il pas échouer lors de l'utilisation du multiplicateur matériel?
quantum231

La multiplication non pipelinée 32 bits par 32 bits prend apparemment plus de 8 ns.
alex.forencich

hmm je vois, n'a pas considéré cela. Les blocs DSP ne sont donc pas pipelinés. Je me demande comment exactement ils implémentent la multiplication. Est-ce vraiment un multiplicateur parallèle dur?
quantum231

Je pense qu'il peut être configuré pour fonctionner de différentes manières. Selon le manuel XST, l'ajout d'un nombre suffisant de registres à l'entrée et à la sortie permettra à XST d'utiliser un multiplicateur en pipeline dans une tranche DSP48. Dans mon cas, il n'y avait qu'un seul registre de sortie et aucun registre d'entrée, il n'a donc pas pu en profiter. Comme ce n'était que pour l'initialisation (amorçage du PRNG), j'ai remplacé la multiplication parallèle par un multiplicateur série en bits pour économiser sur l'utilisation des ressources.
alex.forencich

2

Cela dépend de l'optimisation dont vous avez besoin et de la portée de votre conception. C'est un peu comme un logiciel, en optimisant en utilisant un peu d'assemblage ou en laissant le compilateur choisir les instructions. Vous pouvez également avoir des compromis taille / vitesse afin que vous ne puissiez pas vous permettre un multiplicateur combinatoire à double précision.

Je ne savais pas où se trouvaient les multiplicateurs FP câblés dans les FPGA.

Un véritable opérateur de multiplication conforme IEEE P754 adapté à un processeur implique plus qu'un grand multiplicateur: vous devez ajouter les exposants, décaler les dénormals, gérer les infinis et quelques drapeaux pour la plupart inutiles (inexact, sous-dépassement ...)


Les FPGA de dernière génération comme la série Altera 10 ont des multiplicateurs à virgule flottante conformes IEEE-754 sur le matériel lui-même! Je n'ai cependant pas eu l'occasion de les utiliser moi-même.
quantum231

Si nous avons intégré des blocs DSP, alors FPGA devrait les utiliser à la place du multiplicateur combinatoire ou utiliser un autre algorithme qui, par exemple, utilise un bloc de mémoire, n'est-ce pas?
quantum231

2

J'ai lu ce document http://www2.warwick.ac.uk/fac/sci/eng/staff/saf/papers/fpl2014-ronak.pdf :

Alors que les fonctions qui tiennent dans un seul bloc DSP peuvent être synthétisées efficacement à partir du code RTL en pipeline, nous avons constaté que les fonctions plus complexes nécessitant plusieurs blocs DSP souffrent de performances inférieures. Une description RTL standard d'une fonction mathématique peut être fortement canalisée, par exemple après chaque opération, cependant, puisque ce pipeline peut ne pas prendre en compte la structure et les étapes internes du bloc DSP, la conception synthétisée résultante peut présenter des performances inférieures aux normes car les blocs DSP sont combinés d'une manière qui ne leur permet pas de fonctionner à pleine vitesse.

J'aimerais pouvoir trouver la source de leurs outils pour vérifier leurs résultats.

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.