1 COMPILER DIRECTIVES Copyright 2002, Michael D. Ciletti A compiler directive may be used to control the compilation of a Verilog description. The grave accent mark, `, denotes a compiler directive. A directive is effective from the point at which it is declared to the point at which another directive overrides it, even across file boundaries. Compiler directives may appear anywhere in the source description, but it is recommended that they appear outside a module declaration. This appendix presents those directives that are part of IEEE-1364. Other directives may also be used, depending on the vendor. `celldefine and `endcelldefine The `celldefine and `endcelldefine directives mark a module as a cell for use with PLI in other applications. `defaultnettype The `defaultnettype directive allows the user to override the ordinary default type (wire) of implicitly declared nets. It must be used outside a module. It specifies the default type of all nets that are declared in modules that are declared after the directive. Syntax: default_nettype_compiler_directive ::= `default_nettype net_type net_type ::= wire | tri | tri0 | wand | triand | tri1 | wor | trior | trireg `define and `undef The `define directive defines a text macro for substitution in the source code. For example, a state code of 3'b010 can be replaced by the following directive: `define wait_state 3'b010 Notice that the directive and the text macro are separated by only white space, and the line declaring the text macro is not terminated by a semicolon. The `undef directive undefines a previously defined text macro. 2 Syntax: text_macro_definition ::= `define text_macro_name macro_text text_macro_name ::= text_macro_identifier [ (list_of_formal_arguments)] list_of_formal_arguments ::= formal_argument_identifier { , formal_argument_identifier } The syntax for using a text macro is given below. Syntax: text_macro_usage ::= `text_macro_identifer [ ( list_of_actual_arguments)] list_of_actual_arguments ::= actual_argument { ,actual_argument } actual_argument ::= expression The syntax for the `undef compiler directive is given below: Syntax: undefined_compiler_directive ::= `undef text_macro_name `ifdef, `else, `endif These compiler directives conditionally include lines of a Verilog source description in a compilation. The `ifdef directive is used with a variable name. The compiler checks whether the variable named is defined (by a previous `define directive). If so, the lines of code that follow the directive are included in the compilation. If the variable is not defined, and if the `else directive exists, the lines of code that follow the `else directive are compiled. The `endif directive establishes the boundary of the code that is conditionally compiled. This group of directives affords versatility to a description. For example, the compilation may select between different implementations of the same functionality, select between different delay information, and select different stimulus for a simulation. Example: The directives below check whether the DISABLE_TIMESCALES variable is defined. If it not defined, the `timescale directive is compiled. `ifdef DISABLE_TIMESCALES 3 `else `timescale 1 ns / 10 ps Example: module or_gates (y_out, x1_in, x2_in); output y_out; input x1_in, x2_in; `ifdef BEHAVIORAL y_out = x1_in | x2_in; `else or G1 (y_out, x1_in, x2_in); endmodule Syntax: conditional_compilation_directive ::= `ifdef text_macro_name first_group_of_lines [ `else second_group_of_lines `endif ] `include The `include directive inserts the contents of a file into another file during compilation. Syntax: include_compiler_directive ::= `include “filename” `resetall The `resetall directive sets all compiler directives to their default values. `timescale The `timescale directive specifies the time_unit and time_precision for measurement of delay and time values in all modules that follow the directive until another `timescale directive is read. Syntax: timescale_directive ::= `timescale time_unit / time_precision The units and precision associated with the directive are listed below: 4 Character String s ms us ns ps fs Physical Unit seconds milliseconds microseconds nanoseconds picoseconds femtoseconds Example: The directive `timescale 10 ns / 10 ps specifies that time information is to be interpreted in units of 10s of ns, to the accuracy of 10 ps. The minimum rising delay value (3.213) for the instantiation of the nand primitive shown below will be interpreted as 32.13 ns. If the timescale directive is `timescale 10ns / 1 ps the maximum falling delay value (4.237) will be interpreted as 42.370 ns by a simulator. nand #(3.213: 3.225:3.643, 4.112:4.237:4.413) (y, x1, x2); Also see the $timeformat system task. `nounconnected_drive and `unconnected_drive The `unconnected_drive and `nounconnected_drive directives cause all unconnected input ports of modules between the directives to be pulled up or pulled down, depending on the argument of the `unconnected_drive directive. The allowed arguments are pull0 and pull1.