web-dev-qa-db-fra.com

Utilisation de l'affichage dans Verilog

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?

5
user4685154

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 
5
Morgan

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 .

3
sharvil111