# Command File Format

The basic format of a command file is one source file or compiler argument per line. Command files may also have comments of various form, and options for controlling the compiler.

## Comments

Lines that start with a “#” character are comments. All text after the “#” character, is ignored.

The “//” character sequence also starts a comment that continues to the end of the line.

The “/*” and “*/” character sequences surround multi-line comments. All the text between the comment start and comment end sequences is ignored, even when that text spans multiple lines. This style of comment does not nest, so a “/*” sequence within a multi-line comment is probably an error.

## Plus-args

Outside of comments, lines that start with a “+” character are compiler arguments. These are called plusargs but they are not the same as extended arguments passed to the “vvp” command. The supported plusargs are definitively listed in the iverilog manual page.

The plusargs lines are generally “+<name>+…” where the name is the name of an switch, and the arguments are separated by “+” characters, as in:

    +libext+.v+.V+.ver

With plusargs lines, the “+” character separates tokens, and not white space, so arguments, which may include file paths, may include spaces. A plusarg line is terminated by the line end.

The line in the command file may also be a “-y” argument. This works exactly the same as the:

    -y <path>

argument to the compiler; it declares a library directory. The “-y” syntax is also a shorthand for the “+libdir” plusarg, which is a more general form:

    +libdir+<path>...

## File Names

Any lines that are not comments, compiler arguments or plusargs are taken by the compiler to be a source file. The path can contain any characters (other then comment sequences) including blanks, although leading and trailing white space characters are stripped. The restriction of one file name per line is in support of operating systems that can name files any which way. It is not appropriate to expect white spaces to separate file names.

## Variable Substitution

The syntax “$(name)” is a variable reference, and may be used anywhere within filenames or directory names. The contents of the variable are read from the environment and substituted in place of the variable reference. In Windows, these environment variables are the very same variables that are set through the Control Panel->System dialog box, and in UNIX these variables are environment variables as exported by your shell.

Variables are useful for giving command files some installation independence. For example, one can import a vendor library with the line:

    -y $(VENDOR)/verilog/library

in the command file, and the next programmer will be able to use this command file without editing it to point to the location of VENDOR on his machine. Note the use of forward slashes as a directory separator. This works even under Windows, so always use forward slashes in file paths and Windows and UNIX users will be able to share command files.

## An Example

This sample:

    # This is a comment in a command file.
    # The -y statement declares a library
    # search directory
    -y $(PROJ_LIBRARY)/prims
    #
    # This plusarg tells the compiler that
    # files in libraries may have .v or .vl
    # extensions.
    +libext+.v+.vl
    #
    main.v // This is a source file
    #
    # This is a file name with blanks.
    C:/Project Directory/file name.vl

is a command file that demonstrates the major syntactic elements of command files. It demonstrates the use of comments, variables, plusargs and file names. It contains a lot of information about the hypothetical project, and suggests that command files can be used to describe the project as a whole fairly concisely.

The syntax of command files is rich enough that they can be used to document and control the assembly and compilation of large Verilog programs. It is not unusual to have command files that are hundreds of lines long, although judicious use of libraries can lead to very short command files even for large designs. It is also practical to have different command files that pull together combinations of sources and compiler arguments to make different designs from the same Verilog source files.

## Summary

Given the above description of the command file format, the following is a list of the special records with their meaning.

- +libdir+*dir-path*

  Specify directories to be searched for library modules. The dir-path can have multiple directories, separated by “+” characters.

- +libdir-nocase+dir-path

  This is the same as “+libdir+”, but when searching “nocase” libraries for module files, case will not be taken as significant. This is useful when the library is on a case insensitive file system.

- +libext+*suffix-string*

  Declare the suffix strings to use when searching library directories for Verilog files. The compiler may test a list of suffix strings to support a variety of naming conventions.

- -y dir-path

  This is like “+libdir+” but each line takes only one path. Like “+libdir+” there can be multiple “-y” records to declare multiple library directories. This is similar to the “-y” flag on the iverilog command line.

- -v file-name or -l file-name

  This declares a library file. A library file is just like any other Verilog source file, except that modules declared within it are not implicitly possible root modules.

  NOTE: The “-l” alias is new as of 2 October 2016. It will become available in releases and snapshots made after that date.

- +incdir+*include-dir-path*

  Declare a directory or list of directories to search for files included by the “include” compiler directive. The directories are searched in order. This is similar to the “-I” flag on the iverilog command line.

- +define+*name=value*

  Define the preprocessor symbol “name” to have the string value “value”. If the value (and the “=”) are omitted, then it is assumed to be the string “1”. This is similar to the “-D” on the iverilog command line.

- +timescale+*units/precision*

  Define the default timescale. This is the timescale that is used if there is no other timescale directive in the Verilog source. The compiler default default is “+timescale+1s/1s”, which this command file setting can change. The format of the units/precision is the same as that for the timescale directive in the verilog source.

- +toupper-filename

  This token causes file names after this in the command file to be translated to uppercase. this helps with situations where a directory has passed through a DOS machine (or a FAT file system) and in the process the file names become munged. This is not meant to be used in general, but only in emergencies.

- +tolower-filename

  The is the lowercase version of “+toupper-filename”.

- +parameter+*name=value*

  This token causes the compiler to override a parameter value for a top-level module. For example, if the module main has the parameter WIDTH, set the width like this “+parameter+main.WIDTH=5”. Note the use of the complete hierarchical name. This currently only works for parameters defined in root (top level) modules and a defparam may override the command file value.

- +vhdl-work+*path*

  When compiling VHDL, this token allows control over the directory to use for holding working package declarations. For example, “+vhdl-work+workdir” will cause the directory “workdir” to be used as a directory for holding working working copies of package headers.