Comment interpréter le blocage vs non bloquant les affectations en Verilog?
Je suis un peu confus sur la façon de blocage et les non bloquant les affectations sont interprétés quand il s'agit de dessiner un matériel diagramme. Devons-nous en déduire que non bloquant la cession donne nous un registre? Ensuite, selon cette déclaration c <= a+b
, c serait un registre à droite, mais pas de a et de b?
module add (input logic clock,
output logic[7:0] f);
logic[7:0] a, b, c;
always_ff @(posedge clock)
begin
a = b + c;
b = c + a;
c <= a + b;
end
assign f = c;
endmodule
- Je recommande cette présentation par une EDA légende: sutherland-hdl.com/papers/...
- SI l'inscription sur une liste en haut de la Verilog questions, après 5 ans, pour une raison quelconque. Je vais juste souligner quelque chose qui a été oubliée à partir de toutes les réponses: Verilog n'ai même pas de scores nbas relatives pendant plusieurs années, jusqu'à ce qu'il y a un accord général que le planificateur a été brisé. Mais un grand nombre de ASICs ont été construits dans les années, et beaucoup d'entre eux probablement travaillé, par la suite. Ils ont tous été intégré avec blocage des devoirs, qui codés à la fois combinatoire et logique séquentielle. Aller à la figure. Jan 3ème paragraphe est tout ce que vous devez savoir - vous pouvez ignorer tous les papiers, qui sont généralement des rationalisations.
Vous devez vous connecter pour publier un commentaire.
C'est certainement un peu difficile à obtenir autour de votre tête les différences entre le blocage et les non bloquant les affectations à l'origine. Mais pas de crainte, il y a une pratique de la règle de base:
Votre code ci-dessus est probablement pas le meilleur exemple. Sans savoir ce que additionneur/tongs de plage de la structure que vous étiez en train de construire, il y a le risque de devoir combo commentaires chemins (qui sont mauvais). Et puisque vous avez pas de bus d'entrée, vous êtes essentiellement en essayant de construire
a
,b
&c
hors de l'air mince!Mais pour répondre à votre question, toute variable assignée à l'intérieur d'un cadencé
always
bloc déduire une flipflop, à moins que sa affectées à l'aide du blocage de l'opérateur (=
) et utilisé comme un type d'une variable locale.Une des raisons importantes pour la suite de la règle du pouce et pas de mélange de blocage et les non bloquante des affectations dans un
always
bloc, c'est que le mixage de votre assignations peuvent causer de graves simulation de l'inadéquation entre RTL sims et porte-sims/matériel réel de l'opération. Le simulateur verilog traite=
et<=
tout à fait différemment. Le blocage des attributions de dire 'affecter la valeur de la variable tout de suite à l'instant'. Non bloquantes attributions de dire "comprendre ce qu'il faut affecter à cette variable, et de le stocker à l'écart de l'attribuer à un certain moment dans l'avenir'. Un bon livre à lire pour mieux comprendre ce qu'il est: voir Aussi: http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA.pdfLes classiques Verilog sagesse a tout faux. Il n'y a pas de problème avec l'utilisation de blocage des affectations d'un local variable. Cependant, vous ne devez jamais utiliser le blocage des missions pour la communication synchrone, comme ce n'est pas déterministe.
Un non-blocage de l'attribution dans un cadencé toujours bloquer toujours déduire un flip-flop, comme dicté par la sémantique.
Si un blocage de l'affectation dans un cadencé toujours bloquer en déduit un flip-flop ou pas dépend entièrement de la façon dont il est utilisé. Si c'est possible que la variable est en lecture avant d'être affecté, un flip-flop sera déduit. Sinon, c'est comme une variable temporaire et il entraînera une certaine logique combinatoire.
Veux juste ajouter à Jan Decaluwe de réponse. Il semble qu'il y a très peu de code dans la nature qui en fait effectivement utilise ce que Jan Decaluwe est décrit, même si elle est tout à fait juste. Mélange de blocage et les non-instructions de blocage est maintenant un tabou, grâce à M. Cummings.
Le problème est, la plupart des endroits, évitez d'utiliser des instructions de blocage pour les variables locales et il y a très peu de code dans l'immédiat, l'espace de recherche de Google qui ressemble donne un exemple de comment il est fait. Le seul endroit où j'ai trouvé le style de codage tel que mentionné par Jan est le code gagnant dans cet article. Et cela, je suis tombé accidentellement
J'ai eu du mal au cours de cette trop.
Mais tout d'abord, vous devez comprendre que la non-blocage ou de blocage est en fait rien à voir avec le fait que le verrou/ff serait créé!
Pour leur différence, vous pourriez le comprendre simplement(au début) par ce point: je. Si l'utilisation de blocage, les phrases après il n'a pas pu être exécutée jusqu'à ce que le bloc phrase LHS valeur assignée, car ce qui a changé pour LHS, pourrait être mis à jour et utilisé si la variable est utilisée. Cependant, pour les non-blocage, il ne bloquent pas la phrase suivante comme parallèle avec la phrase suivante(en fait RHS calcul doit être fait en premier, mais il n'a pas d'importance, l'ignorer quand vous confondre). Le membre de GAUCHE de ne pas modifier/mis à jour pour ce temps de l'exécution (mise à jour la prochaine fois, quand toujours bloquer déclenché de nouveau). Et la phrase suivante, l'utilisation de l'ancienne valeur, comme il mis à jour à la fin de l'exécution du cycle.
Un point clé est de savoir si dans vous code (toujours bloquer) il est en tout cas la variable non affectée de la valeur, mais pourrait se produire. Si vous ne passez pas de valeur et que le cas se produit, puis verrouiller/ff est créé pour garder la valeur.
Par exemple,
Suivantes pourraient également créer de verrouillage/ff:
--> verrouillage/ffs créé pour=1, b aucune cession, en=0 a aucune affectation.
En outre, lorsque vous avez le sentiment de posedge de clk
always @(posedge clk)
, il est lié à la fin avec le verrou/ff. Parce que, pour clk, il doit exister un bord négatif, et vous ne faites rien, à loquet/ffs sont créés afin de mettre tous les vieux de la valeur!il vous plaît, vous pouvez toujours interpréter le verilog numérique dans le domaine, vous devez comprendre ce qui va se passer si le même code que vous avez écrit sera converti en porte niveau , personnellement, je ne pas aller par la règle que de l'utilisation non bloquant dans seq ou de l'utilisation de blocage en combinatoire , cela permettra de limiter votre pensée . bâton pour le côté numérique de la seulement le code
voici ce qui va se produire si votre code est converti à niveau des portes d'embarquement viens de voir que vous voulez cela ne
merci
ce qui concerne
Rahul jain
Je peux répondre à votre question, mais je pense que l'un papier qui serait le mieux pour cela donc, je vous recommande la lecture de ce livre de Clifford Cummings. Il va effacer tous vos doutes et en plus il permettra de renforcer votre compréhension de verilog.
http://www.sunburst-design.com/papers/CummingsSNUG2000SJ_NBA_rev1_2.pdf