Différence entre affectation bloquante et non bloquante Verilog


15

Je lisais cette page http://www.asic-world.com/verilog/verilog_one_day3.html lorsque je suis tombé sur ce qui suit:

Nous devons normalement réinitialiser les bascules, donc chaque fois que l'horloge passe de 0 à 1 (posedge), nous vérifions si la réinitialisation est affirmée (réinitialisation synchrone), puis nous continuons avec une logique normale. Si nous regardons attentivement, nous voyons que dans le cas de la logique combinatoire, nous avions "=" pour l'affectation, et pour le bloc séquentiel, nous avions l'opérateur "<=". Eh bien, "=" est une affectation bloquante et "<=" est une affectation non bloquante. "=" exécute le code séquentiellement à l'intérieur d'un début / fin, tandis que le non blocage "<=" s'exé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 d'affectation en dehors des blocs Always, et celles-ci s'exécutent toutes en parallèle. Est-ce une erreur ou le comportement est-il différent dans un bloc toujours? Et, si le comportement EST différent à l'intérieur d'un bloc Always, des affectations non bloquantes peuvent-elles être effectuées en dehors d'un bloc Always?

Réponses:


21

était assez sûr que les affectations non bloquantes étaient séquentielles tandis que les affectations bloquantes étaient parallèles.

L'affectation de blocage s'exécute "en série" car une affectation de blocage bloque l' exécution de l'instruction suivante jusqu'à ce qu'elle se termine. Par conséquent, les résultats de l'instruction suivante peuvent dépendre de la première exécution.

L'affectation non bloquante s'exécute en parallèle car elle décrit les affectations qui se produisent toutes en même temps. Le résultat d'une 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 2e ligne s'exécutera comme si la 1ère ligne ne s'était pas encore produite.


Alors, qu'en est-il des assignations? Sont-ils simplement dans une classe entière?
Void Star

4
Oui, les assigninstructions se produisent en dehors des blocs Always et sont généralement utilisées pour décrire la logique combinatoire (non verrouillée) (tandis que les blocs Always, à quelques exceptions près, décrivent la logique séquentielle). AFAIK, les assigninstructions s'exécutent toujours "en parallèle" chaque fois que leur LHS a un changement de valeur.
Le photon

D'accord ... Je commence à avoir l'impression que Verilog n'est tout simplement pas le langage le plus élégamment conçu. Ça va être comme apprendre C était.
Void Star

1
Verilog a été conçu pour "décrire" le matériel qui existe déjà. L'utiliser comme langage pour concevoir (synthétiser) du matériel est un hack.
Le Photon

4
si Verilog "comme l'apprentissage de C" est un problème, jetez un œil à VHDL. Certaines personnes ont des préférences assez fortes pour l'un ou l'autre. Pour certains, VHDL est tout simplement trop verbeux. Pour moi, c'est beaucoup mieux pensé. (la sémantique d'affectation des signaux / variables est beaucoup plus claire que le blocage / non par exemple). stackoverflow.com/questions/13954193/… et sigasi.com/content/vhdls-crown-jewel Vous pouvez le préférer ou le détester. Mais ça vaut le coup d'oeil.
Brian Drummond

6

Les instructions d'affectation ne sont ni "bloquantes" ni "non bloquantes", elles sont "continues". La sortie d'une instruction assign est toujours égale à la fonction spécifiée de ses entrées. Les affectations "bloquantes" et "non bloquantes" n'existent qu'au sein de blocs toujours.

Une affectation de blocage prend effet immédiatement après son traitement. 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 de la 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, toujours @ (posedge clk)), vous utilisez normalement des évaluations non bloquantes. Cela vous permet de déterminer "l'état après le front d'horloge" en termes de "l'état avant le front d'horloge".

Il est parfois utile d'utiliser des affectations de blocage dans des blocs séquentiels toujours en tant que "variables". Si vous faites cela, il y a deux règles clés à garder à l'esprit.

  1. N'accédez pas à un registre défini avec des affectations de blocage à l'intérieur d'un bloc séquentiel toujours depuis l'extérieur du bloc toujours dans lequel il est affecté.
  2. Ne mélangez pas les affectations bloquantes et non bloquantes au même reg.

Le non-respect de ces règles est susceptible d'entraîner des échecs de synthèse et / ou des différences de comportement entre simulation et synthèse.


"" N'accédez pas à un registre défini avec des affectations de blocage à l'intérieur d'un bloc séquentiel toujours depuis l'extérieur du bloc toujours dans lequel il est affecté. "" Pouvez-vous s'il vous plaît l'expliquer?
user125575

Différents blocs séquentiels n'ont toujours pas d'ordre défini. Ainsi, la lecture d'un ensemble "reg" avec une assignation de blocage dans un bloc toujours d'un autre bloc toujours conduira à un comportement imprévisible.
Peter Green

Et même s'il semble fonctionner en simulation, un outil de synthèse devrait examiner cela et dire «non». J'utilise des regs locaux pour ces variables intermédiaires, et je m'assure qu'ils sont toujours affectés à chaque horloge avant d'être lus, de sorte qu'aucun 'stockage' n'est impliqué.
greggo

IIRC au moins in quartus, il est seulement considéré comme un avertissement et non comme une erreur.
Peter Green

5

Le terme affectation de blocage déroute les gens car le mot blocage semble suggérer une logique séquentielle dans le temps. Mais en logique synthétisée, cela ne signifie pas cela , car tout fonctionne en parallèle .

Un terme moins déroutant serait peut-être l'affectation immédiate , qui différencierait toujours les résultats intermédiaires de la logique combinatoire des entrées aux éléments de mémoire non transparents (par exemple les registres cadencés), qui peuvent avoir une affectation retardée .

D'un point de vue légaliste, tout fonctionne très bien. En fait, vous pouvez considérer l'opération =comme un blocage (séquentiel temporel) même au sein de always_combséquences. Cependant, la distinction entre séquentiel temporel et parallèle ne fait absolument aucune différence dans ce cas, car le always_combbloc est défini pour se répéter jusqu'à ce que la séquence d'instructions converge vers un état stable - ce qui est exactement ce que les circuits matériels feront (s'il respecte le timing). exigences).

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 dépasser l'utilisation intelligente de la terminologie associée aux soi-disant éléments comportementaux du langage.


Dans les styles de codage comportemental ( par rapport à RTL ), la distinction entre blocage et non-blocage peut être pertinente. Dans certains cas, l'outil de synthèse peut être en mesure de déduire un RTL fonctionnellement équivalent à partir de conceptions de composants comportementaux.
nobar

Bien sûr, le mode procédural de SystemVerilog, applicable en particulier aux initialinstructions dans les programblocs, utilise exclusivement l' affectation de blocage (séquentielle dans le temps) . Ceci est utile pour la conception du banc de test , mais généralement pas pour la spécification RTL.
nobar
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.