Peut Verilog des variables locale particulière portée à toujours bloquer?
J'ai parfois s'avérer utile d'utiliser le blocage des missions pour des "variables locales" à l'intérieur cadencé toujours blocs. Cela peut aider à réduire vers le bas sur le code à répétition.
Pour éviter accidentellement en utilisant la même variable dans une autre toujours de bloc (qui peut être non-déterministe pour la simulation), je tiens à donner une portée locale. Est-il un gentil synthesizable façon de faire cela?
Quelque chose comme:
module sum3(
input clk,
input [7:0] in1,
input [7:0] in2,
input [7:0] in3,
output reg [7:0] result,
output reg [7:0] result_p1);
begin :sum
reg [7:0] sum_temp; //local variable
always @(posedge clk) begin
sum_temp = in1 + in2 + in3;
result <= sum_temp;
result_p1 <= sum_temp + 1;
end
end
endmodule
(ModelSim semble être d'accord avec cela, mais Synplify ne semble pas comme elle.)
Votre code a plusieurs erreurs de compilation avec les 2 simulateurs j'ai utilisé (VCS et Incisif).
Édité pour corriger les erreurs de compilation.
Tous les commentaires de l'électeur?
Édité pour corriger les erreurs de compilation.
Tous les commentaires de l'électeur?
OriginalL'auteur mksuth | 2014-09-15
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de la sémantique dans la plaine, Verilog, mais selon la SystemVerilog LRM article 6.21:
Donc le suivant est légal de syntaxe dans SystemVerilog:
Remarque que je me suis déplacé à la déclaration de la variable
sum_temp
dans le processus, ce qui limite la portée et la suppression de la nécessité de lasum
bloc. Cette compile sur Modelsim et de la Riviera (exemple sur EDA aire de Jeux).Si votre outil ne prend pas en charge cette syntaxe, élever un bug!
begin
déclaration fait l'astuce, par exemplebegin:sum
. @Chiggs, Si vous voulez faire cette modif, puis je pense que c'est la meilleure réponse.OriginalL'auteur Chiggs
La norme sythesizable façon est d'utiliser en continu d'une mission avec un
wire
:Je ne nuira pas à la lisibilité.
assignments end up far away from where the variables are used
: Qu'entendez-vous par loin? C'est la tâche de placer le routeur et que vous n'avez pas besoin de s'inquiéter. Si vous voulez utiliser lesdifferent intermediate values
utiliser un autrereg
pour elle à l'intérieur de la toujours bloquer.Je ne suis qu'en se référant à la lisibilité du code. Si le
always
bloc occupé des centaines de lignes de code, puis à l'aide d'unwire
pour une "variable intermédiaire", pourrait entraîner l'affectation d'être loin (dans le code), d'où lawire
est effectivement utilisé à l'intérieur de laalways
bloc. À mon avis, le code est plus lisible lors de l'affectation de la variable et l'utilisation de la variable sont regroupés dans le code.regroupés: fourni que c'est faisable. Btw, des centaines de lignes de code dans un
always
bloc est le problème. Pourquoi ne pas vous casser en plusieurs toujours blocs de manière adaptée? Aussi vous pouvez utiliser des boucles...Aussi, je crois que cela pollue le module de l'espace de noms, ce qui sera un problème si vous voulez des noms simples pour la variable temp comme "je" (pensez à un indice de tableau).
OriginalL'auteur toolic
En dépit de l'orientation, à l'aide de blocage des affectations à l'intérieur cadencé toujours blocs est ok, et parfois, comme vous l'avez mentionné utile. Voir ici: https://stackoverflow.com/a/4774450/1383356
Certains outils ne peut cependant soutenir les variables définies à l'intérieur d'un bloc début-fin.
Sinon, vous pouvez essayer de mettre certains ou de la totalité du corps de la toujours bloquer dans une tâche:
Verilog les tâches peuvent avoir accès aux variables globales et locales. Ils peuvent aussi inclure des non-blocage des affectations.
OriginalL'auteur Ari