Je suis nouveau sur verilog et je comprends que ce n'est pas un langage séquentiel. Donc, je voulais demander s'il y avait un moyen d'afficher les résultats dans un module après une exécution? Parce que l'affichage devrait toujours être à l'intérieur du bloc initial
et donc je ne peux pas utiliser l'affichage à des fins de débogage. Voici un exemple de code qui pourrait mieux expliquer mon problème-
module A(a,b,c);
input a,b;
output c;
assign c=a&b;
initial
$display("%b",c);
endmodule
module testbench11;
reg a,b;
wire c;
A a1(a,b,c);
initial
$monitor(,$time,"a=%b,b=%b,c=%b",a,b,c);
initial
begin
#0 a=1'b0;b=1'b0;
#3 a=1'b0;b=1'b0;
#3 a=1'b0;b=1'b0;
end
endmodule
Je veux donc afficher le résultat de c
après chaque occurrence de temps afin de vérifier si j'obtiens la sortie souhaitée. Il peut sembler afficher des résultats à la fin dans ce cas, mais dans certains problèmes complexes, je voulais utiliser display
à des fins de débogage tout comme j'utilise printf
en C. Existe-t-il un moyen de le faire que dans verilog?
Parce que l'affichage doit toujours être à l'intérieur du bloc
initial
et donc je ne peux pas utiliser l'affichage à des fins de débogage.
Je ne sais pas d'où vous venez, c'est la même chose que presque tout sauf assign
en ce sens qu'il doit être utilisé à l'intérieur d'un bloc, intial
ou always
.
Pour l'utiliser pour déboguer à l'intérieur du module:
module A(a,b,c);
input a,b;
output c;
assign c = a&b;
always @*
$display("%b",c);
endmodule
Il est préférable d'afficher et de vérifier à partir du niveau supérieur en gardant le code du module propre. pour utiliser display
dans le testench, vous pouvez faire:
Le même format qu'à l'intérieur du module:
always @* begin
$display("%b",c);
end
Ou pour savoir que vous affichez après chaque étape de relance:
initial begin
#0 a=1'b0;b=1'b0;
#1 $display("%b",c);
#3 a=1'b0;b=1'b0;
#1 $display("%b",c);
#3 a=1'b0;b=1'b0;
#1 $display("%b",c);
end
Verilog/SystemVerilog contient une file d'attente d'événements bien organisée. Toutes les instructions de chaque horodatage s'exécutent en fonction de cette file d'attente. Voici quelques-unes des différentes tâches du système d'affichage.
$ display s'exécute dans région ACTIVE , donc s'il y a des non affectation de blocage (qui s'exécute dans la région INACTIVE), elle ne sera pas affichée par $ display. Cela affiche une seule ligne de sortie.
$ write s'exécute également dans région ACTIVE , mais un appel explicite à la nouvelle ligne (\n ) est requis pour insérer une autre ligne. Cette tâche système est généralement utilisée lorsque vous souhaitez afficher un tableau multidimensionnel à l'aide de la boucle for. Ceci est similaire à l'affichage sauf le caractère (\ n).
$ strobe s'exécute dans la région MONITOR/POSTPONED , c'est-à-dire à la horodatage de fin. Par conséquent, la valeur mise à jour est indiquée par $ strobe.
$ monitor s'affiche chaque fois que l'un de ses paramètres d'affichage change. Un seul moniteur $ par simulation doit être utilisé. Monitor, comme son nom l'indique, surveille les signaux en continu et s'exécute si toute valeur de signal change.
Pour votre code, à afficher à différents points, le changement de code suivant peut être effectué.
initial
#5 $display("%b",c); // display after some arbitrary time.
initial
begin
repeat(5)
begin
wait(c);
$display("%b",c); // display after change in c 5 times.
end
end
initial
begin
forever
begin
#1;
$display("%b",c); // display c at every timestamp
end
end
always @(c)
$display("%b",c); // display after any change in c
always @(a,b,c)
$display("%b",c); // display after any change in a or b or c
Pour afficher à chaque changement, $ monitor est utile. $ display peut être utilisé comme ci-dessus mais cela rendra votre code désordonné. N'oubliez pas qu'il ne doit y avoir qu'un un moniteur $ dans votre code. Il n'y a pas une telle limite dans $ display.
Ce ne sont que quelques-unes des méthodes, de nombreuses autres sont disponibles. Pour plus d'informations, consultez les liens this et this .