01signal.com

Utiliser les registres internes du bloc d'E/S

Introduction

Dans un FPGA, chaque port d'E/S possède sa propre petite zone dans le tissu logique (logic fabric). Cette zone, appelée IOB (Input/Output Block), contient tout ce qu'il faut pour prendre en charge les fonctionnalités du port d'E/S : des circuits analogiques qui assurent des tensions et des courants corrects sur la broche d'E/S, ainsi que quelques éléments logiques spéciaux.

Je précise que le terme « IOB » appartient à la terminologie employée par AMD (anciennement Xilinx). Chaque fabricant de FPGA utilise un terme différent.

Un IOB contient presque toujours des registres IOB. Ces registres sont des bascules (flip-flops) connectées directement à la broche du port d'E/S.

Certaines bascules sont destinées à une broche configurée en entrée : leur entrée D est connectée à la broche du port d'E/S. Une telle bascule effectue donc un échantillonnage (sampling) du signal qui arrive du monde extérieur.

D'autres bascules sont destinées à une broche configurée en sortie. Leur sortie Q est connectée à la broche.

La structure des IOB varie selon le FPGA. Certains IOB sont complexes et riches en fonctionnalités ; d'autres ont une structure plus simple. Il n'est pas rare que le registre IOB fasse partie d'un élément logique plus vaste, par exemple un SERDES. Ainsi, même si aucune bascule n'est explicitement représentée sur le schéma de la documentation qui décrit l'IOB, il reste tout à fait possible que les broches d'E/S du FPGA aient des registres IOB.

Pourquoi utiliser des registres IOB ?

La principale motivation pour utiliser des registres IOB est le timing : grâce à la proximité de ces registres avec la broche du port d'E/S, le délai entre l'horloge et la sortie (clock-to-output) est imbattable. Pour les entrées également, un registre IOB a les meilleures chances de respecter le timing exigé.

Mais même lorsqu'il est facile de satisfaire les exigences temporelles, il y a une bonne raison d'insister sur les registres IOB : la répétabilité. Sinon, le délai entre la broche du port d'E/S et la bascule sera différent pour chaque implémentation du projet FPGA. En effet, les outils ont le droit de placer la bascule à un endroit différent à chaque fois. Ils peuvent aussi modifier le délai de routage, tant que les contraintes temporelles (timing constraints) sont satisfaites. Cela ne pose pas de problème tant que la conception du circuit imprimé (PCB) est correcte et que l'interface avec les composants externes est bien planifiée. En revanche, lorsque de tels problèmes existent, la différence de délai d'une implémentation à l'autre peut prêter à confusion : quelque chose ne fonctionne pas, vous corrigez un élément de la conception, et le problème semble disparaître. Mais ce qui a réellement fait la différence, c'est un léger changement du timing des E/S quelque part.

Le recours aux registres IOB garantit que l'interface électrique avec les composants externes ne change pas involontairement pendant le développement de la logique du FPGA. Cela facilite l'isolement des problèmes lorsqu'ils surviennent.

Demander l'utilisation des registres IOB

Il peut être nécessaire de demander explicitement aux outils FPGA d'utiliser des registres IOB. C'est généralement l'outil de synthèse (synthesizer) qui est chargé de le faire ; on peut donc utiliser avec Vivado un attribut de synthèse de ce type :

(* IOB = "TRUE" *) input the_input,

Il est aussi possible de faire la même chose dans le fichier XDC :

set_property IOB true [get_ports the_input]

Une autre option consiste à ajouter un attribut de synthèse sur le registre connecté à l'entrée :

(* IOB = "TRUE" *) reg the_input_samp;

Remarque : un attribut placé dans le fichier XDC peut ne pas suffire. Il est souvent nécessaire que l'outil de synthèse duplique les registres afin de placer des bascules dans l'IOB. C'est le cas lorsque la sortie de la bascule est aussi utilisée par la logique ordinaire du FPGA. En effet, la sortie de la bascule qui se trouve dans l'IOB ne peut être utilisée que pour le port concerné. Il faut donc une autre bascule pour produire la même sortie, afin qu'elle puisse être utilisée dans le tissu logique. Un attribut de synthèse (comme celui ci-dessus) est souvent requis dans cette situation.

Avec Quartus, des commandes de ce type peuvent être ajoutées au fichier QSF :

set_instance_assignment -name FAST_INPUT_REGISTER ON -to the_input
set_instance_assignment -name FAST_OUTPUT_REGISTER ON -to the_output

Chaque outil a une façon un peu différente d'arriver à ce résultat.

Contraintes temporelles

Y a-t-il une raison d'écrire des contraintes temporelles (timing constraints) pour un port qui utilise un registre IOB ? Après tout, il n'y a qu'une seule position possible pour le registre IOB. Peut-on en conclure sans risque que le timing sera toujours le même, avec ou sans contraintes temporelles ?

Si, il y a principalement deux bonnes raisons d'écrire des contraintes temporelles, même lorsqu'on utilise des registres IOB.

La première raison est de garantir qu'un registre IOB est bien utilisé. Parfois, une modification de la conception logique peut involontairement empêcher l'utilisation des registres IOB pour tous les ports ou pour certains d'entre eux. Les outils signalent rarement ce problème. À la place, une bascule qui n'est pas dans l'IOB est utilisée sans qu'on le remarque. Une contrainte temporelle peut empêcher cette situation : si elle ne peut être satisfaite que lorsque toutes les bascules concernées sont dans leurs IOB, leur retrait ne se fera pas en silence : la contrainte temporelle échouera.

La deuxième raison est que les outils peuvent insérer un délai volontaire entre la broche du port d'E/S et le registre IOB (même si tous les FPGA ne permettent pas cette fonctionnalité). Le but de ce délai est d'améliorer le timing vis-à-vis de la thold (voir cet exemple avec Quartus). On peut empêcher cette manipulation indésirable grâce à une contrainte temporelle qui ne peut être satisfaite qu'en l'absence de ce délai supplémentaire.

La commande set_max_delay est généralement la contrainte temporelle adaptée pour garantir une utilisation cohérente des registres IOB. Si les outils FPGA prennent en charge l'option « datapath_only » avec cette commande (ou une fonctionnalité similaire), c'est encore mieux.

Conclusion

Les registres IOB devraient être utilisés chaque fois que c'est possible. Les outils FPGA ne le font pas toujours d'eux-mêmes ; il faut donc parfois fournir un petit effort pour y parvenir. La récompense de cet effort n'est pas seulement un timing optimal, mais aussi un comportement reproductible des ports d'E/S.

Cette page a été traduite de l’anglais par une machine. En cas de doute, veuillez vous reporter au texte original
Copyright © 2021-2026. All rights reserved. (dcc38493)