Cette page fait partie d’une série de pages consacrée au timing. Les pages précédentes ont expliqué la théorie derrière les calculs de timing, montré comment écrire plusieurs contraintes temporelles et abordé les principes de la convergence temporelle (timing closure). Cette page ouvre la discussion sur les contraintes temporelles d’entrées-sorties.
Introduction
Jusqu’à présent, toute la discussion sur les contraintes temporelles a concerné des chemins (paths) internes au FPGA. Il est enfin temps de parler des contraintes qui pilotent le timing des ports d’entrées-sorties du FPGA.
Mais avant de parler des contraintes temporelles, il est nécessaire de connaître les différentes méthodes de synchronisation entre le FPGA et le composant externe. Des contraintes écrites sans tenir compte de ce sujet peuvent ne valoir pas grand-chose. De plus, la logique responsable de l’interface d’entrées-sorties risque d’être écrite de façon inadaptée. Dans les cas extrêmes, il peut même manquer au PCB le câblage nécessaire pour garantir un fonctionnement correct des entrées-sorties.
Munie de la connaissance nécessaire sur la synchronisation avec le composant externe, il est possible de choisir les bonnes commandes de contraintes temporelles. Les aspects pratiques sont expliqués sur la page suivante.
Sur cette page, je suppose que vous connaissez les registres IOB (IOB registers).
Distribution de l’horloge
Tant que les chemins étaient internes au FPGA, il n’était pas nécessaire de se préoccuper du décalage d’horloge (clock skew) entre les deux extrémités du chemin : les outils étaient responsables de la distribution de l’horloge, et les calculs de timing tenaient déjà compte de ce décalage.
Avec les contraintes temporelles d’entrées-sorties, c’est différent : un côté du chemin se trouve dans un composant externe, hors du FPGA. Pour se synchroniser avec les signaux de données, ce composant s’appuie sur une horloge qu’il reçoit sur l’une de ses broches. Mais avec quoi cette horloge est-elle synchronisée ?
La stratégie est généralement l’une des deux suivantes :
- Horloge système synchrone (system synchronous clock) : le composant externe est connecté au même signal d’horloge que la broche d’horloge du FPGA. Cette stratégie est aussi appelée horloge commune (common clock).
- Horloge source synchrone (source synchronous clock) : un signal d’horloge dédié est fourni avec les signaux de données. En règle générale, les signaux de données changent d’état en même temps que l’horloge : soit sur son front montant, soit sur son front descendant.
Ces deux stratégies sont examinées plus en détail ci-dessous. Pour l’horloge source synchrone, il existe une différence importante selon que les signaux de données sont des entrées ou des sorties. Ces scénarios sont donc traités séparément.
Horloge système synchrone
La méthode la plus simple pour synchroniser plusieurs composants sur un PCB consiste à tous les connecter à une même horloge. C’est ce qu’on appelle l’horloge système synchrone (system synchronous clock), ou horloge commune (common clock).
L’avantage de cette méthode est que les paramètres temporels de tous les composants sont relatifs à un même signal d’horloge. L’horloge est donc la même des deux côtés du point de vue des calculs de timing. Ainsi, pour un signal de données qui se propage entre deux composants sur le PCB, le calcul ressemble à celui d’un chemin interne au FPGA : le chemin commence par un délai de l’horloge vers la sortie (clock-to-output), relatif au premier front d’horloge. À l’autre extrémité, la condition sur tsu est relative au second front d’horloge. La méthode de l’horloge système synchrone signifie que ces deux fronts appartiennent à la même horloge.
Travailler avec une horloge système synchrone est donc simple, mais cette méthode ne convient qu’à des fréquences relativement faibles. Rappelons, d’après l’introduction aux calculs de timing, que la période minimale de l’horloge est la somme de plusieurs paramètres temporels : le délai de l’horloge vers la sortie de la première bascule, le délai de propagation (propagation delay) et le temps de préparation tsu de la seconde bascule. Pour un port de sortie, le délai de l’horloge vers la sortie est relativement important, car c’est le temps nécessaire à la piste du PCB pour atteindre la tension requise. Mais cela ne s’arrête pas là : il faut aussi y ajouter le décalage d’horloge et les autres incertitudes liées à l’horloge. Une fois tout additionné, la période minimale de l’horloge n’a plus rien d’impressionnant.
En règle générale, une horloge système synchrone ne convient pas aux entrées-sorties dont le débit dépasse 100 MHz. Mais cela dépend beaucoup des composants concernés. En réalité, certains composants électroniques ont des exigences temporelles très difficiles à satisfaire avec une horloge système synchrone, même à des fréquences bien plus faibles. De tels composants sont l’une des raisons pour lesquelles il est important de planifier le timing des entrées-sorties avant de fabriquer le PCB.
set_input_delay et set_output_delay (expliqués sur la page suivante) sont les contraintes les plus adaptées à une horloge système synchrone.
Horloge source synchrone
Il est très fréquent qu’une interface entre deux composants sur un PCB s’appuie sur une horloge fournie par l’un de ces deux composants. Naturellement, la situation diffère selon que cette horloge est générée par le FPGA ou par le composant externe.
Il y a donc quatre scénarios pertinents :
- Les données et l’horloge sont des sorties générées par le FPGA. Ce scénario relativement facile est traité séparément sur la page consacrée aux sorties source synchrones (source-synchronous outputs).

- Les données et l’horloge sont générées par le composant externe. Le FPGA les reçoit donc comme signaux d’entrée. Une page consacrée aux entrées source synchrones (source-synchronous inputs) traite ce scénario.

- L’horloge est générée par le FPGA, mais les données sont bidirectionnelles (ou ce sont des entrées). C’est un cas particulier des entrées source synchrones. Le fait que l’horloge soit générée par le FPGA ne change pas grand-chose : les données en entrée sont synchronisées avec l’horloge sur le PCB. Cette horloge présente un délai par rapport à l’horloge interne du FPGA. Voir la page consacrée aux sorties source synchrones pour plus de détails sur ce scénario.

- L’horloge est générée par le composant externe et les données sont bidirectionnelles. Pour ce qui entre dans le FPGA, cela ressemble au scénario où les données sont générées par le composant externe (horloge source synchrone). Quant aux sorties du FPGA, elles se comportent comme n’importe quelle sortie synchrone avec une horloge externe. Ces sorties sont donc organisées comme si elles étaient en système synchrone.
Entrées asynchrones
Certaines entrées ne sont associées à aucune horloge. Par exemple, les boutons-poussoirs, l’I²C, la RS232 et divers signaux d’état provenant de composants externes ne sont pas synchronisés avec une horloge. Ces signaux sont en général beaucoup plus lents que l’horloge interne du FPGA. La solution habituelle consiste donc à les échantillonner (sampling) avec des bascules (de préférence des registres IOB (IOB registers)), puis à poursuivre avec les techniques classiques de conception logique.
Ces entrées ne sont pas synchronisées avec l’horloge utilisée pour l’échantillonnage. Le registre IOB (ou la bascule connectée au port) joue donc le rôle d’une garde de métastabilité. Pour chaque port, il faut donc prévoir une seconde bascule, comme lors d’un changement de domaine d’horloge entre horloges non liées (unrelated clocks). Sinon, il y a un risque de comportements imprévisibles et bizarres, même si les signaux d’entrée sont lents et que la conception semble bien fonctionner pour le moment.
Les contraintes temporelles doivent être écrites de manière à garantir un comportement reproductible : il convient de suivre les mêmes recommandations que pour les registres IOB, même si les bascules ne sont pas placées dans les blocs IOB. Pour être encore plus prudent, c’est une bonne idée d’ajouter une contrainte temporelle dédiée au rôle de garde de métastabilité de ces registres (ceci est expliqué sur une autre page).
Chemins faux (false paths)
Les chemins faux (false paths) pour les ports d’entrées-sorties sont en principe les mêmes que pour les chemins internes au FPGA : la commande set_false_path demande qu’aucune exigence de timing ne soit appliquée à des ports spécifiques.
Les chemins faux ont déjà été discutés en ce qui concerne les chemins internes au FPGA. Sur la même base, la motivation derrière les chemins faux pour les ports d’entrées-sorties est principalement de conserver une liste vide de chemins non contraints. Cette liste doit rester vide afin qu’il soit plus facile de repérer un port auquel des contraintes temporelles manquent à cause d’une erreur.
Les chemins faux ne devraient être utilisés que lorsque le timing du port est totalement dépourvu de sens. Par exemple, avec des LED et des interrupteurs DIP.
Exemples de contraintes SDC :
set_false_path -to [get_ports led_0] set_false_path -from [get_ports dip_switch_0]
Résumé
Cette page a présenté quelques stratégies de synchronisation entre le FPGA et le composant externe. La stratégie choisie influence à la fois la conception logique et les contraintes temporelles.
Fort de ces connaissances, il est temps d’aborder l’écriture des contraintes temporelles d’entrées-sorties.
