Un «verrou» est différent d'un «bascule» en ce qu'un FF ne modifie sa sortie qu'en réponse à un front d'horloge. Un verrou peut changer sa sortie en réponse à autre chose qu'une horloge. Par exemple, un SR-Latch a un ensemble et une entrée de réinitialisation et si l'un ou l'autre est actif, la sortie peut changer. Là où un SR-FF ne répond qu'à un ensemble ou à une réinitialisation lorsqu'il y a aussi un front d'horloge.
Dans un FPGA, vous voulez que votre logique soit entièrement synchrone. Cela signifie que tous les éléments de stockage (comme les FF) sont tous synchronisés à partir d'une seule source d'horloge. Tout ce qui est asynchrone à cette horloge doit être traité très soigneusement sinon des erreurs de synchronisation se produiront.
Un verrou est essentiellement un élément de stockage asynchrone. Il n'a pas d'entrée d'horloge et ne peut donc être synchronisé avec aucune horloge. Je dois noter qu'il existe des FF avec réinitialisation asynchrone et entrées de réinitialisation, et celles-ci doivent être traitées avec le même soin que les verrous normaux.
Entrer dans tous les problèmes de synchronisation que les verrous peuvent causer est bien au-delà de ce qui peut être couvert ici, mais permettez-moi de vous donner un exemple:
Disons que vous avez un SR-Latch et que vous souhaitez qu'il soit défini chaque fois qu'un compteur 8 bits atteint une certaine valeur. Je ne suis pas sûr du code Verilog, mais en VHDL, le code est: set <= '1' when count = "11010010" else '0'; Ce signal défini va à l'entrée définie sur notre SR-Latch.
La logique qui en résulte est purement combinatoire; un mélange de portes et, ou de portes et d'onduleurs (ou LUT). Mais les chemins du signal à travers cette logique combinatoire ne sont pas toujours parfaits et le signal "set" pourrait avoir des défauts. Le chemin du signal à travers un groupe particulier de portes pourrait prendre plus de temps qu'un autre groupe, provoquant l'activation de la sortie définie pendant un bref instant avant que la sortie ne se stabilise.
Ce problème de sortie pourrait entraîner le réglage de notre SR-Latch, même s'il n'était pas censé le faire. Si nous passons d'un SR-Latch à un SR-FF, cadencé à la même horloge que le compteur, alors le SR-FF attendra un cycle d'horloge entier avant de changer d'état. En substance, il attendra que le signal défini se stabilise avant de le regarder.
Si les chemins à travers la logique combinatoire pour le signal défini sont simplement routés différemment (provoquant des retards différents), alors le comportement de pépin changera également. La logique peut fonctionner correctement, mais parce que vous avez modifié quelque chose de complètement indépendant, cette logique est acheminée différemment et le bug apparaît donc. La température et la tension changeront également la synchronisation du signal et peuvent donc changer le comportement de pépin.
Cette incertitude dans le timing est pourquoi vous devez éviter les verrous dans votre logique. Les FF sont beaucoup plus sûrs à utiliser. C'est pourquoi votre compilateur vous avertit des verrous, car il est facile de faire un verrou par erreur et vous ne le voulez probablement pas de toute façon.
Bien sûr, des verrous sont parfois nécessaires. Vous devez simplement les utiliser très rarement, uniquement lorsque cela est absolument nécessaire, puis vous devez concevoir la logique correctement afin qu'il n'y ait aucun problème possible.