Je lisais cette page http://www.asic-world.com/verilog/verilog_one_day3.html quand je suis tombé sur ce qui suit:
Nous devons normalement réinitialiser les bascules, donc chaque fois que lhorloge fait le transition de 0 à 1 (posedge), on vérifie si la réinitialisation est affirmée (réinitialisation synchrone), puis on continue avec la logique normale. Si nous regardons de près, nous voyons que dans le cas de la logique combinatoire, nous avons eu « = » pour laffectation, et pour le bloc séquentiel nous avons eu lopérateur « < = ». Eh bien, « = » bloque laffectation et « < = » est une affectation non bloquante. « = » exécute le code séquentiellement à lintérieur dun début / fin, tandis que le non-blocage « < = » sexécute en parallèle.
Jétais assez sûr que les affectations non bloquantes étaient séquentielles tandis que les affectations bloquantes étaient parallèles. Après tout, vous pouvez effectuer des affectations de blocage avec des instructions assign en dehors de always blocks, et celles-ci sexécutent toutes en parallèle. Est-ce une erreur ou est-ce que le comportement est différent à lintérieur dun bloc toujours? Et, si le comportement EST différent à lintérieur dun bloc toujours, peut-on faire des affectations non bloquantes en dehors dun bloc toujours?
Réponse
était assez sûr que les affectations non bloquantes étaient séquentielles tandis que les affectations bloquantes étaient parallèles.
Laffectation de blocage sexécute « en série » car une affectation de blocage bloque lexécution de linstruction suivante jusquà ce quelle se termine. Par conséquent, les résultats de linstruction suivante peuvent dépendre de lachèvement de la première.
Une affectation non bloquante sexécute en parallèle car elle décrit les affectations qui se produisent toutes en même temps. Le résultat dune déclaration sur la 2ème ligne ne dépendra pas des résultats de la déclaration sur la 1ère ligne. Au lieu de cela, la deuxième ligne sexécutera comme si la première ligne ne sétait pas encore produite.
Commentaires
Réponse
Les instructions dassignation ne sont ni « bloquantes » ni « non bloquantes », elles sont « continues ». La sortie dune instruction assign est toujours égale à la fonction spécifiée de ses entrées. Les affectations bloquantes et non bloquantes nexistent que dans les blocs always.
Une affectation bloquante prend effet dès quelle est traitée. Une affectation non bloquante a lieu à la fin du traitement du « delta temporel » actuel.
Les blocs always peuvent être utilisés pour modéliser la logique combinatoire ou séquentielle (systemverilog a always_comb et always_ff pour rendre cela explicite). Lors de la modélisation logique combinatoire, il est généralement plus efficace d’utiliser = mais cela n’a généralement pas vraiment d’importance.
Lors de la modélisation de la logique séquentielle (par exemple, always @ (posedge clk)), vous utilisez normalement des assingments non bloquants. Cela vous permet de déterminer « létat après le front de lhorloge » en termes de « létat avant le front de lhorloge ».
Il est parfois utile dutiliser des affectations de blocage dans des blocs séquentiels toujours comme des « variables ». Si vous faites cela, alors il y a deux règles clés à garder à lesprit.
- Ne pas accéder à un reg défini avec des affectations de blocage à lintérieur dun bloc séquentiel toujours de lextérieur du bloc toujours affecté dans lequel il est affecté.
- Ne mélangez pas les affectations de blocage et non de blocage au même reg.
Le non-respect de ces règles est susceptible dentraîner des échecs de synthèse et / ou des différences de comportement entre la simulation et la synthèse.
Commentaires
- » » Naccédez pas à un reg défini avec des affectations de blocage à lintérieur dun séquentiel toujours bloque de lextérieur le bloque toujours est attribué dans. » » Pouvez-vous lexpliquer?
- Différents blocs séquentiels nont toujours pas de définition ordre. Ainsi, la lecture dun ensemble » reg » avec un assingment bloquant dans un bloc always à partir dun autre bloc always conduira à un comportement imprévisible.
- Et même si cela semble fonctionner en simulation, un outil de synthèse devrait regarder cela et dire » nope « . Jutilise les regs locaux pour ces variables intermédiaires et je massure quils sont toujours attribués à chaque horloge avant dêtre lus, de sorte quaucun ‘ stockage ‘ est implicite.
- IIRC au moins en quart de temps, il est uniquement considéré comme un avertissement et non comme une erreur.
- Vous ne devriez pas utiliser une affectation non bloquante en logique combinatoire, cela peut se bloquer la simulation. Pour plus de détails, reportez-vous à cette réponse: electronics.stackexchange.com/a/506047/238188
Réponse
Le terme Affectation de blocage déroute les gens car le mot blocage semble suggérer une logique séquentielle dans le temps. Mais dans la logique synthétisée cela ne signifie pas cela , car tout fonctionne en parallèle .
Peut-être un terme moins déroutant serait affectation immédiate , qui différencierait encore les résultats intermédiaires de la logique combinatoire de la entrées vers des éléments de mémoire non transparents (par exemple des registres cadencés), qui peuvent avoir une affectation retardée .
Dun point de vue légaliste, tout fonctionne très bien. Vous pouvez, en fait, considérer l =
comme une opération bloquante (séquentielle dans le temps) même dans always_comb
séquences. Cependant, la distinction entre séquentiel temporel et parallèle ne fait absolument aucune différence dans ce cas car le always_comb
est défini pour se répéter jusquà ce que la séquence dinstructions converge vers un état stable – ce qui est exactement ce que le circuit matériel fera (sil répond aux exigences de synchronisation).
Le sous-ensemble synthétisable de Verilog (et en particulier SystemVerilog) est extrêmement simple et facile à utiliser – une fois que vous connaissez les idiomes nécessaires. Il suffit de passer outre l’utilisation intelligente de la terminologie associée aux éléments dits comportementaux dans le langage.
Commentaires
- Dans les styles de codage comportementaux ( par rapport à RTL ), la distinction entre bloquant et non bloquant peut être pertinente. Dans certains cas, loutil de synthèse peut être en mesure de déduire un RTL fonctionnellement équivalent à partir de conceptions de composants comportementaux.
- Bien sûr, la procédurale mode de SystemVerilog, applicable en particulier aux instructions
initial
dans des blocsprogram
, utilise (séquentielle dans le temps) affectation de blocage exclusivement. Ceci est utile pour la conception de testbench , mais généralement pas pour la spécification RTL.
assign
se produisent en dehors des blocs always et sont généralement utilisées pour décrire à combinatoire (non verrouillé ) logique (bien que toujours bloque, à quelques exceptions près, décrit la logique séquentielle). AFAIK, les instructionsassign
exécutent toujours » en parallèle » chaque fois que leur LHS change de valeur .