Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Industrial programming >> Verilog

Verilog `ifdef : Compilation Conditionnelle Expliquée

Verilog prend en charge quelques directives de compilateur qui indiquent essentiellement au compilateur de traiter le code d'une certaine manière. Par exemple, une partie du code peut représenter une implémentation d'une certaine fonctionnalité et il devrait y avoir un moyen de ne pas inclure le code dans la conception si la fonctionnalité n'est pas utilisée.

Cela peut être résolu avec la compilation conditionnelle où le concepteur peut envelopper le code dans des directives de compilateur qui disent au compilateur d'inclure ou d'exclure le code pour la compilation lorsque le drapeau nommé donné est défini.

Syntaxe

La compilation conditionnelle peut être réalisée avec les mots-clés Verilog `ifdef et `ifndef. Ces mots-clés peuvent apparaître n'importe où dans la conception et peuvent être imbriqués les uns dans les autres.

Le mot-clé `ifdef dit simplement au compilateur d'inclure le morceau de code jusqu'au prochain `else ou `endif si la macro donnée appelée FLAG est définie en utilisant une directive `define.

// Style #1: Seulement `ifdef simple
`ifdef <FLAG>
// Instructions
`endif

// Style #2: `ifdef avec partie `else
`ifdef <FLAG>
// Instructions
`else
// Instructions
`endif

// Style #3: `ifdef avec `ifdef additionnels
`ifdef <FLAG1>
// Instructions
`elsif <FLAG2>
// Instructions
`elsif <FLAG3>
// Instructions
`else
// Instructions
`endif

Le mot-clé `ifndef dit simplement au compilateur d'inclure le morceau de code jusqu'au prochain `else ou `endif si la macro donnée appelée FLAG n'est pas définie en utilisant une directive `define.

Exemple de Conception avec `ifdef

module my_design (
  input clk, d,
  `ifdef INCLUDE_RSTN
  input rstn,
  `endif
  output reg q
);
  always @ (posedge clk) begin
    `ifdef INCLUDE_RSTN
    if (!rstn) begin
      q <= 0;
    end else
    `endif
    begin
      q <= d;
    end
  end
endmodule

Banc de Test

module tb;
  reg clk, d, rstn;
  wire q;
  reg [3:0] delay;
  my_design u0 (
    .clk(clk),
    .d(d),
    `ifdef INCLUDE_RSTN
    .rstn(rstn),
    `endif
    .q(q)
  );
  always #10 clk = ~clk;
  initial begin
    integer i;
    {d, rstn, clk} <= 0;
    #20 rstn <= 1;
    for (i = 0 ; i < 20; i=i+1) begin
      delay = $random;
      #(delay) d <= $random;
    end
    #20 $finish;
  end
endmodule

Notez que par défaut, rstn ne sera pas inclus pendant la compilation de la conception et n'apparaîtra donc pas dans la liste des ports. Cependant, si une macro appelée INCLUDE_RSTN est soit définie dans un fichier Verilog qui fait partie de la liste de compilation des fichiers, soit passée en ligne de commande au compilateur, rstn sera inclus dans la compilation et la conception l'aura.

Expérimentez en ajoutant et supprimant +define+INCLUDE_RSTN depuis 'Compile & Run Options' sur le panneau de gauche pour voir la différence.

Exemple Verilog `ifdef `elsif

L'exemple suivant a deux instructions display dans des portées `ifdef séparées qui n'ont pas de partie `else par défaut. Cela signifie que par défaut rien ne sera affiché. Si la macro MACRO1 ou MACRO2 est définie, le message display correspondant est inclus et sera affiché pendant la simulation.

module tb;
  initial begin
    `ifdef MACRO1
      $display ("This is MACRO1");
    `elsif MACRO2
      $display ("This is MACRO2");
    `endif
  end
endmodule

Journal de Simulation

# Sans macro définie
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+MACRO1
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+MACRO2
ncsim> run
This is MACRO2
ncsim: *W,RNQUIE: Simulation is complete.

Exemple Verilog `ifndef `elsif

Le même code peut être écrit avec `ifndef et les résultats seront juste l'opposé.

module tb;
  initial begin
    `ifndef MACRO1
      $display ("This is MACRO1");
    `elsif MACRO2
      $display ("This is MACRO2");
    `endif
  end
endmodule

Journal de Simulation

# Sans macro définie
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+MACRO1
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+MACRO2
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+MACRO1 +define+MACRO2
ncsim> run
This is MACRO2
ncsim: *W,RNQUIE: Simulation is complete.

Exemple Verilog `ifdef Imbriqué

`ifdef et ses variantes peuvent être imbriqués les uns dans les autres pour créer des façons complexes d'inclusion et d'exclusion de code avec des macros définies.

module tb;
  initial begin
    `ifdef FLAG
      $display ("FLAG is defined");
      `ifdef NEST1_A
        $display ("FLAG and NEST1_A are defined");
        `ifdef NEST2
          $display ("FLAG, NEST1_A and NEST2 are defined");
        `endif
      `elsif NEST1_B
        $display ("FLAG and NEST1_B are defined");
        `ifndef WHITE
          $display ("FLAG and NEST1_B are defined, but WHITE is not");
        `else
          $display ("FLAG, NEST1_B and WHITE are defined");
        `endif
      `else
        $display ("Only FLAG is defined");
      `endif
    `else
      $display ("FLAG is not defined");
    `endif
  end
endmodule

Journal de Simulation

# Sans définir de macro
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+FLAG +define+NEST1_B
ncsim> run
FLAG is defined
FLAG and NEST1_B are defined
FLAG and NEST1_B are defined, but WHITE is not
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+FLAG +define+NEST1_B +define+WHITE
ncsim> run
FLAG is defined
FLAG and NEST1_B are defined
FLAG, NEST1_B and WHITE are defined
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+FLAG
ncsim> run
FLAG is defined
Only FLAG is defined
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+WHITE
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# Avec +define+NEST1_A
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

Notez que tant que la macro parente n'est pas définie, la définition de toute autre macro imbriquée dans celle-ci ne fait pas compiler le code imbriqué par le compilateur. Par exemple, les définitions de macro NEST1_A ou WHITE sans FLAG ne font pas que le compilateur prenne le code imbriqué.

Verilog

  1. Maîtriser Verilog : Tutoriel complet pour la conception de circuits numériques
  2. Maîtriser la concaténation Verilog : Guide pratique
  3. Comprendre les affectations Verilog : Types, Syntaxe et Bonnes Pratiques
  4. Verilog Blocking vs Non-Blocking : Différences Clés Expliquées
  5. Maîtriser les Fonctions Verilog pour une Conception RTL Efficace
  6. Comprendre les Tasks Verilog : Fonctions vs Tasks, Syntaxe et Utilisation
  7. Générateur d'Horloge Verilog : Guide de Conception et d'Implémentation
  8. Maîtriser les Tâches d'Affichage Verilog : Débogage et Journalisation Efficaces
  9. Maîtriser les Fonctions Mathématiques Verilog pour une Conception Matérielle Efficace