Compiler Directives

The ` character (referred to as the back tick, open quote, or grave accent character) introduces a language construct used to implement compiler directives. The behavior dictated by a compiler directive takes effect as soon as the compiler reads the directive. The directive remains in effect for the rest of the compilation unless a different compiler directive specifies otherwise. A compiler directive in one file can therefore control compilation behavior in multiple description files.

Verilog-AMS generally support the following compiler directives:

`default_discipline
`default_transition
`define
`else
`endif
`ifdef
`ifndef
`include
`resetall
`timescale
`undef

This is only a partial list the directives that are generally available.

`define, `undef

Defines (`define) give a name to a collection of characters. Once defined, that name can be used in lieu of the characters. The name is then referred to as a macro. Any valid identifier, including keywords already in use, can be used as a name. Once defined, the macro is referenced using its name preceded by a tick. Undefines (`undef) remove the macro.

Example:

`define size 8
electrical [0:`size-1] out;

`include

Includes (`include) are replaced by the contents of a file. It takes the filename as an argument, which can either be specified with a relative or absolute path to the file. Included files may include other files, etc.

Example:

`include "disciplines.vams"

`ifdef, `ifndef, `else, `endif

Sections of code can be conditionally ignored using the `ifdef and `ifndef directives. It takes a macro name as an argument. With `ifdef the text that follows is ignored up to a matching `else or `endif if the argument is undefined and accepted otherwise. If `else is used, then the text between it and the matching `endif is ignored if the argument is defined, and accepted otherwise. This logic is inverted for the `ifndef directive.

Verilog-AMS supports a predefined macro to allow modules to be written that work with both IEEE 1364-1995 Verilog HDL and Verilog-AMS. The predefined macro is called __VAMS_ENABLE__.

Example:

`ifdef __VAMS_ENABLE__
    parameter integer del = 1 from [1:100];
`else
    parameter del = 1;
`endif

`resetall

When the `resetall compiler directive is encountered during compilation, all compiler directives are set to their default values. This is useful for ensuring that only those directives that are desired when compiling a particular source file are active. To do so, place `resetall at the beginning of each source text file, followed immediately by the directives desired in the file.

`timescale

The `timescale compiler directive defines the time unit and the time precision for the modules that follow it. The time unit and time precision is specified using either 1, 10, or 100 followed by a measurement unit of either s, ms, us, ns, ps, or fs, which represents seconds, milliseconds, microseconds, nanoseconds, picoseconds, or femptoseconds.

Example:

`timescale 10ns / 1ns

The first value given specifies the units of time used in the file and the second specifies the precision of time. The values affect the way delays are specified and the return value from the $realtime function. Both are rounded to the time precision and given in multiples of the time unit. Thus, with the specification given in the example above, #55.79 corresponds to a delay of 558ns (55.79 × 10ns rounded to the nearest 1 ns).

Note

Verilog-AMS allows numbers to be specified with the SI scale factors and so with Verilog-AMS files it is generally preferable to set the time unit to be 1s and then specify the delay directly.

For example:

`timescale 1s / 1ns

Then in the example above the delay would be specified as #557.9n rather than 55.79, which is easier to read and less error prone.