9. Compiler Directive
(1) `elseif
//`define ELSIF `define ELSIF2 `define ELSIF3 `ifdef ELSIF module elsif_test; initial $display("Fail"); endmodule `elsif ELSIF2 module elsif_test2; initial $display("Pass"); endmodule `endif
Here is "preout.v" preprocessed by Veritak preprocessor.
`line 1 "F:\regression_test\elsif_test1.v"
module elsif_test2;
initial $display("Pass");
endmodule
Here is rather complexed example.
//Jan.13.2005 `define ELSIF1 `define ELSIF2 `define ELSIF3 //`define ELSIF4 `define ELSIF5 `define ELSIF6 //`define ELSIF7 //`define ELSIF8 //`define ELSIF9 `define ELSIF10 `define ELSIF11 `define ELSIF12 `define ELSIF13 //`define IF1 `define IF2 `define IF3 //`define IF4 `define IF5 `define IF6 module elsif_test2; `ifdef IF1 `ifdef IF2 initial $display("Fail"); `ifdef IF3 initial $display("Fail"); `elsif ELSIF3 initial $display("Fail"); `ifndef IF4 initial $display("Fail"); `elsif ELSIF4 initial $display("Fail"); `elsif ELSIF5 initial $display("Fail"); `endif `endif `elsif ELSIF6 initial $display("Fail"); `endif `elsif ELSIF7 initial $display("Fail"); `elsif ELSIF8 initial $display("Fail"); `elsif ELSIF9 initial $display("OK9"); `else `ifndef IF4 initial $display("OK10"); `elsif ELSIF4 initial $display("Fail"); `elsif ELSIF5 initial $display("Fail"); `endif `ifdef IF4 initial $display("Fail"); `elsif ELSIF4 initial $display("Fail"); `elsif ELSIF5 initial $display("OK10"); `endif `endif endmodule
Here is a preprocessed output.
`line 1 "F:\regression_test\elsif_test2.v"
module elsif_test2;
initial $display("OK10");
initial $display("OK10");
endmodule
(2) `define macro
Macro can be used. However this coding style is obsolete.
`define wordsize 8 `define var_nand(dly) nand #dly `define first_half "string is %b" `define max(a,b)((a) > (b) ? (a) : (b)) module define_test; reg [1:`wordsize] data; wire q21,q2; reg n10,n11; //define a nand with variable delay `var_nand(2) g1 (q21, n10, n11); `var_nand(5) g2 (q22, n10, n11); //Following is illegal example. not closed "" //`define first_half "start of string //$display (`first_half end of string"); initial begin n10=1'b1; n11=1'b1; #10; $display (`first_half, `max(q21+n10,q22+n11)); end endmodule
Preprocessed output is as follows.
`line 1 "F:\regression_test\define_test.v" module define_test; reg [1: 8] data; wire q21,q2; reg n10,n11; nand # 2 g1 (q21, n10, n11); nand # 5 g2 (q22, n10, n11); initial begin n10=1'b1; n11=1'b1; #10; $display ( "string is %b", ( ( q21+n10 ) > ( q22+n11 ) ? ( q21+n10 ) : ( q22+n11 ) )); end endmodule