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