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?
assign
instructions 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, lesassign
instructions s'exécutent toujours "en parallèle" chaque fois que leur LHS a un changement de valeur.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.
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.
la source
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 dealways_comb
séquences. Cependant, la distinction entre séquentiel temporel et parallèle ne fait absolument aucune différence dans ce cas, car lealways_comb
bloc 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.
la source
initial
instructions dans lesprogram
blocs, 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.