Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Industrial programming >> Verilog

Verilog `ifdef Bedingte Kompilierung

Verilog unterstützt einige Compiler-Direktiven, die den Compiler im Wesentlichen anweisen, den Code auf eine bestimmte Weise zu behandeln. Beispielsweise kann ein Teil des Codes eine Implementierung einer bestimmten Funktion darstellen, und es sollte eine Möglichkeit geben, den Code nicht in das Design aufzunehmen, wenn die Funktion nicht verwendet wird.

Dies kann mit conditional gelöst werden Kompilierung, bei der der Designer den Code in Compiler-Direktiven einschließen kann, die den Compiler anweisen, den Code für die Kompilierung entweder einzuschließen oder auszuschließen, wenn das angegebene benannte Flag gesetzt ist.

Syntax

Bedingte Kompilierung kann mit Verilog `ifdef erreicht werden und `ifndef Schlüsselwörter. Diese Schlüsselwörter können überall im Design erscheinen und ineinander verschachtelt sein.

Das Schlüsselwort `ifdef weist den Compiler einfach an, den Codeabschnitt bis zum nächsten `else einzufügen oder `endif wenn das gegebene Makro namens FLAG mit einem `define definiert ist Richtlinie.

  
  
// Style #1: Only single `ifdef
`ifdef <FLAG>
	// Statements
`endif

// Style #2: `ifdef with `else part
`ifdef <FLAG>
	// Statements
`else
	// Statements
`endif

// Style #3: `ifdef with additional ifdefs
`ifdef <FLAG1>
	// Statements
`elsif <FLAG2>
	// Statements
`elsif <FLAG3>
	// Statements
`else
	// Statements
`endif

  

Das Schlüsselwort `ifndef weist den Compiler einfach an, das Stück Code bis zum nächsten `else einzuschließen oder `endif wenn das gegebene Makro namens FLAG nicht ist definiert mit einem `define Richtlinie.

Designbeispiel mit `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

  

Testbench

  
  
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

  

Beachten Sie, dass rstn standardmäßig nicht während der Kompilierung des Designs enthalten ist und daher nicht in der Portliste erscheint. Wenn jedoch ein Makro namens INCLUDE_RSTN entweder in einer Verilog-Datei definiert ist, die Teil der Kompilierungsliste von Dateien ist, oder über die Befehlszeile an den Compiler übergeben wird, wird rstn in die Kompilierung eingeschlossen und das Design wird es enthalten.

Experimentieren Sie mit dem Hinzufügen und Entfernen von +define+INCLUDE_RSTN zu den 'Compile &Run Options' im linken Bereich, um den Unterschied zu erfahren.

Verilog `ifdef `elsif Beispiel

Das folgende Beispiel enthält zwei Anzeigeanweisungen in separatem `ifdef Geltungsbereiche, die keinen Standard-`else haben Teil dazu. Das bedeutet also, dass standardmäßig nichts angezeigt wird. Wenn das Makro entweder MACRO definiert ist, wird die entsprechende Anzeigenachricht mitgeliefert und während der Simulation angezeigt

  
  
module tb;
  initial begin

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

  
Simulationsprotokoll
# With no macros defined
ncsim> run
ncsim: *W,RNQUIE: Simulation is complete.

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

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

Verilog `ifndef `elsif Beispiel

Derselbe Code kann mit `ifndef geschrieben werden und die Ergebnisse werden genau das Gegenteil sein.

  
  
module tb;
  initial begin

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

  
Simulationsprotokoll
# With no macros defined
ncsim> run
This is MACRO1
ncsim: *W,RNQUIE: Simulation is complete.

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

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

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

Verilog-verschachteltes `ifdef-Beispiel

`ifdef und seine Flavors können ineinander verschachtelt werden, um mit definierten Makros komplexe Methoden zum Einschließen und Ausschließen von Code zu erstellen.

  
  
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

  
Simulationsprotokoll
# Without defining any macro
ncsim> run
FLAG is not defined
ncsim: *W,RNQUIE: Simulation is complete.

# With +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.

# With +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.

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

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

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

Beachten Sie, dass, solange das übergeordnete Makro nicht definiert ist, die Definition anderer verschachtelter Makros darin nicht kompiliert wird. NEST1_A- oder WHITE-Makrodefinitionen ohne FLAG führen beispielsweise nicht dazu, dass der Compiler den verschachtelten Code aufgreift.


Verilog

  1. Verilog-Tutorial
  2. Verilog-Verkettung
  3. Verilog-Aufgaben
  4. Verilog-Blockierung und Nicht-Blockierung
  5. Verilog-Funktionen
  6. Verilog-Aufgabe
  7. Verilog-Taktgenerator
  8. Verilog-Anzeigeaufgaben
  9. Verilog Math-Funktionen
  10. Verilog-Zeitformat