2022-09-14 02:08:16 +02:00
|
|
|
# The ICARUS Verilog Compilation System
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2025-08-03 16:47:53 +02:00
|
|
|
Copyright 2000-2025 Stephen Williams
|
1998-11-23 01:20:22 +01:00
|
|
|
|
2023-09-12 02:49:24 +02:00
|
|
|
<details>
|
|
|
|
|
<summary><h2>Table of Contents</h2></summary>
|
|
|
|
|
|
|
|
|
|
1. [What is ICARUS Verilog?](#what-is-icarus-verilog)
|
|
|
|
|
2. [Building/Installing Icarus Verilog From Source](#buildinginstalling-icarus-verilog-from-source)
|
|
|
|
|
- [Compile Time Prerequisites](#compile-time-prerequisites)
|
|
|
|
|
- [Compilation](#compilation)
|
|
|
|
|
- [(Optional) Testing](#optional-testing)
|
|
|
|
|
- [Installation](#installation)
|
|
|
|
|
3. [How Icarus Verilog Works](#how-icarus-verilog-works)
|
|
|
|
|
- [Preprocessing](#preprocessing)
|
|
|
|
|
- [Parse](#parse)
|
|
|
|
|
- [Elaboration](#elaboration)
|
|
|
|
|
- [Optimization](#optimization)
|
|
|
|
|
- [Code Generation](#code-generation)
|
|
|
|
|
- [Attributes](#attributes)
|
|
|
|
|
4. [Running iverilog](#running-iverilog)
|
|
|
|
|
- [Examples](#examples)
|
|
|
|
|
5. [Unsupported Constructs](#unsupported-constructs)
|
|
|
|
|
6. [Nonstandard Constructs or Behaviors](#nonstandard-constructs-or-behaviors)
|
|
|
|
|
- [Builtin system functions](#builtin-system-functions)
|
|
|
|
|
- [Preprocessing Library Modules](#preprocessing-library-modules)
|
|
|
|
|
- [Width in %t Time Formats](#width-in-t-time-formats)
|
|
|
|
|
- [vpiScope iterator on vpiScope objects](#vpiscope-iterator-on-vpiscope-objects)
|
|
|
|
|
- [Time 0 Race Resolution](#time-0-race-resolution)
|
|
|
|
|
- [Nets with Types](#nets-with-types)
|
|
|
|
|
7. [Credits](#credits)
|
|
|
|
|
|
|
|
|
|
</details>
|
2022-09-14 02:08:16 +02:00
|
|
|
|
|
|
|
|
## What is ICARUS Verilog?
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2023-10-16 03:29:04 +02:00
|
|
|
Icarus Verilog is intended to compile ALL of the Verilog HDL, as
|
2025-08-03 16:47:53 +02:00
|
|
|
described in the IEEE 1364 standard. Of course, it's not quite there
|
|
|
|
|
yet. It also compiles a (slowly growing) subset of the SystemVerilog
|
|
|
|
|
language, as described in the IEEE 1800 standard. For a view of the
|
|
|
|
|
current state of Icarus Verilog, see its home page at
|
|
|
|
|
https://steveicarus.github.io/iverilog/.
|
2004-10-04 03:10:51 +02:00
|
|
|
|
2000-06-07 05:53:16 +02:00
|
|
|
Icarus Verilog is not aimed at being a simulator in the traditional
|
|
|
|
|
sense, but a compiler that generates code employed by back-end
|
2008-09-03 03:23:48 +02:00
|
|
|
tools.
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
> For instructions on how to run Icarus Verilog, see the `iverilog` man page.
|
2001-05-22 04:07:08 +02:00
|
|
|
|
|
|
|
|
|
2023-10-16 03:29:04 +02:00
|
|
|
## Building/Installing Icarus Verilog from Source
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2019-10-09 17:32:08 +02:00
|
|
|
If you are starting from the source, the build process is designed to be
|
1999-10-16 23:22:06 +02:00
|
|
|
as simple as practical. Someone basically familiar with the target
|
|
|
|
|
system and C/C++ compilation should be able to build the source
|
|
|
|
|
distribution with little effort. Some actual programming skills are
|
|
|
|
|
not required, but helpful in case of problems.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Compile Time Prerequisites
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
You can use:
|
|
|
|
|
```bash
|
2024-01-24 16:54:18 +01:00
|
|
|
apt install -y autoconf gperf make gcc g++ bison flex
|
2023-11-03 22:06:36 +01:00
|
|
|
```
|
2023-09-12 02:49:24 +02:00
|
|
|
|
1999-10-16 23:22:06 +02:00
|
|
|
You need the following software to compile Icarus Verilog from source
|
|
|
|
|
on a UNIX-like system:
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- GNU Make
|
|
|
|
|
The Makefiles use some GNU extensions, so a basic POSIX
|
|
|
|
|
make will not work. Linux systems typically come with a
|
|
|
|
|
satisfactory make. BSD based systems (i.e., NetBSD, FreeBSD)
|
|
|
|
|
typically have GNU make as the gmake program.
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- ISO C++ Compiler
|
|
|
|
|
The ivl and ivlpp programs are written in C++ and make use
|
|
|
|
|
of templates and some of the standard C++ library. egcs and
|
|
|
|
|
recent gcc compilers with the associated libstdc++ are known
|
|
|
|
|
to work. MSVC++ 5 and 6 are known to definitely *not* work.
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- bison and flex
|
|
|
|
|
OSX note: bison 2.3 shipped with MacOS including Catalina generates
|
|
|
|
|
broken code, but bison 3+ works. We recommend using the Fink
|
|
|
|
|
project version of bison and flex (finkproject.org), brew version
|
2025-08-03 16:47:53 +02:00
|
|
|
works fine too.
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- gperf 3.0 or later
|
|
|
|
|
The lexical analyzer doesn't recognize keywords directly,
|
|
|
|
|
but instead matches symbols and looks them up in a hash
|
|
|
|
|
table in order to get the proper lexical code. The gperf
|
|
|
|
|
program generates the lookup table.
|
2000-03-12 18:09:40 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
A version problem with this program is the most common cause
|
|
|
|
|
of difficulty. See the Icarus Verilog FAQ.
|
2000-09-17 21:06:58 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- readline 4.2 or later
|
|
|
|
|
On Linux systems, this usually means the readline-devel
|
|
|
|
|
rpm. In any case, it is the development headers of readline
|
|
|
|
|
that are needed.
|
2003-04-02 04:55:11 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- termcap
|
|
|
|
|
The readline library, in turn, uses termcap.
|
2003-04-02 04:55:11 +02:00
|
|
|
|
2022-09-14 02:20:39 +02:00
|
|
|
> If you are building from git, you will also need software to generate the configure scripts.
|
2003-11-08 20:27:50 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- autoconf 2.53 or later
|
|
|
|
|
This generates configure scripts from configure.ac. The 2.53
|
|
|
|
|
or later versions are known to work, autoconf 2.13 is
|
|
|
|
|
reported to *not* work.
|
2003-11-08 20:27:50 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Compilation
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2023-09-12 02:49:24 +02:00
|
|
|
<details>
|
2023-11-03 22:06:36 +01:00
|
|
|
<summary><h4><a href="https://github.com/steveicarus/iverilog/releases">Compiling From Release</a></h4></summary>
|
2023-09-12 02:49:24 +02:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
Unpack the tar-ball, `cd` into the `verilog-#########` directory,
|
|
|
|
|
and compile the source with the commands:
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```bash
|
2022-09-14 02:20:39 +02:00
|
|
|
./configure
|
|
|
|
|
make
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2023-09-12 02:49:24 +02:00
|
|
|
</details>
|
|
|
|
|
|
|
|
|
|
<details>
|
2023-11-03 22:06:36 +01:00
|
|
|
<summary><h4>Compiling From GitHub</h4></summary>
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2017-07-01 01:41:55 +02:00
|
|
|
If you are building from git, you have to run the command below before
|
2019-10-09 17:32:08 +02:00
|
|
|
compiling the source. This will generate the "configure" file, which is
|
2017-07-01 01:41:55 +02:00
|
|
|
automatically done when building from tarball.
|
|
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```bash
|
2022-09-14 02:20:39 +02:00
|
|
|
sh autoconf.sh
|
2023-09-12 02:49:24 +02:00
|
|
|
./configure
|
|
|
|
|
make
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2017-07-01 01:41:55 +02:00
|
|
|
|
2003-07-15 05:49:22 +02:00
|
|
|
Normally, this command automatically figures out everything it needs
|
2001-05-22 04:07:08 +02:00
|
|
|
to know. It generally works pretty well. There are a few flags to the
|
2019-10-09 17:32:08 +02:00
|
|
|
configure script that modify its behaviour:
|
2001-05-22 04:07:08 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2001-05-22 04:07:08 +02:00
|
|
|
--prefix=<root>
|
2022-09-14 02:10:24 +02:00
|
|
|
The default is /usr/local, which causes the tool suite to
|
|
|
|
|
be compiled for install in /usr/local/bin,
|
|
|
|
|
/usr/local/share/ivl, etc.
|
2001-05-22 04:07:08 +02:00
|
|
|
|
2022-09-14 02:10:24 +02:00
|
|
|
I recommend that if you are configuring for precompiled
|
|
|
|
|
binaries, use --prefix=/usr. On Solaris systems, it is
|
|
|
|
|
common to use --prefix=/opt. You can configure for a non-root
|
|
|
|
|
install with --prefix=$HOME.
|
2001-05-22 04:07:08 +02:00
|
|
|
|
2008-11-17 16:22:46 +01:00
|
|
|
--enable-suffix
|
|
|
|
|
--enable-suffix=<your-suffix>
|
|
|
|
|
--disable-suffix
|
2022-09-14 02:10:24 +02:00
|
|
|
Enable/disable changing the names of install files to use
|
|
|
|
|
a suffix string so that this version or install can co-
|
|
|
|
|
exist with other versions. This renames the installed
|
|
|
|
|
commands (iverilog, iverilog-vpi, vvp) and the installed
|
|
|
|
|
library files and include directory so that installations
|
|
|
|
|
with the same prefix but different suffix are guaranteed
|
|
|
|
|
to not interfere with each other.
|
2003-10-02 21:33:44 +02:00
|
|
|
|
2016-12-11 02:40:35 +01:00
|
|
|
--host=<host-type>
|
2022-09-14 02:10:24 +02:00
|
|
|
Compile iverilog for a different platform. You can use:
|
|
|
|
|
x64_64-w64-mingw32 for building 64-bit Windows executables
|
|
|
|
|
i686-w64-mingw32 for building 32-bit Windows executables
|
|
|
|
|
Both options require installing the required mingw-w64 packages.
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2023-09-12 02:49:24 +02:00
|
|
|
</details>
|
2016-12-11 02:40:35 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### (Optional) Testing
|
2001-04-26 18:04:39 +02:00
|
|
|
|
|
|
|
|
To run a simple test before installation, execute
|
|
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```bash
|
2022-09-14 02:20:39 +02:00
|
|
|
make check
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2001-04-26 18:04:39 +02:00
|
|
|
|
|
|
|
|
The commands printed by this run might help you in running Icarus
|
2002-01-19 20:22:39 +01:00
|
|
|
Verilog on your own Verilog sources before the package is installed
|
2001-04-26 18:04:39 +02:00
|
|
|
by root.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Installation
|
1999-10-16 23:22:06 +02:00
|
|
|
|
|
|
|
|
Now install the files in an appropriate place. (The makefiles by
|
|
|
|
|
default install in /usr/local unless you specify a different prefix
|
2022-09-14 02:08:16 +02:00
|
|
|
with the `--prefix=<path>` flag to the configure command.) You may need
|
2001-05-22 04:07:08 +02:00
|
|
|
to do this as root to gain access to installation directories.
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```bash
|
2022-09-14 02:10:24 +02:00
|
|
|
make install
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
1999-10-16 23:22:06 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Uninstallation
|
2001-05-22 04:07:08 +02:00
|
|
|
|
|
|
|
|
The generated Makefiles also include the uninstall target. This should
|
2022-09-14 02:08:16 +02:00
|
|
|
remove all the files that `make install` creates.
|
2001-05-22 04:07:08 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
## How Icarus Verilog Works
|
1999-05-09 03:29:38 +02:00
|
|
|
|
1999-05-10 02:29:35 +02:00
|
|
|
This tool includes a parser which reads in Verilog (plus extensions)
|
|
|
|
|
and generates an internal netlist. The netlist is passed to various
|
1998-11-23 01:20:22 +01:00
|
|
|
processing steps that transform the design to more optimal/practical
|
1999-09-19 00:24:24 +02:00
|
|
|
forms, then is passed to a code generator for final output. The
|
1998-11-23 01:20:22 +01:00
|
|
|
processing steps and the code generator are selected by command line
|
|
|
|
|
switches.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Preprocessing
|
1999-07-08 04:06:47 +02:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
There is a separate program, `ivlpp`, that does the preprocessing. This
|
2022-09-14 02:08:16 +02:00
|
|
|
program implements the `` `include `` and `` `define `` directives producing
|
1999-09-19 00:24:24 +02:00
|
|
|
output that is equivalent but without the directives. The output is a
|
|
|
|
|
single file with line number directives, so that the actual compiler
|
2023-11-03 22:06:36 +01:00
|
|
|
only sees a single input file. See `ivlpp/ivlpp.txt` for details.
|
1999-07-08 04:06:47 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Parse
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2002-01-19 20:22:39 +01:00
|
|
|
The Verilog compiler starts by parsing the Verilog source file. The
|
2003-07-15 05:49:22 +02:00
|
|
|
output of the parse is a list of Module objects in "pform". The pform
|
2022-09-14 02:08:16 +02:00
|
|
|
(see `pform.h`) is mostly a direct reflection of the compilation
|
1999-09-19 00:24:24 +02:00
|
|
|
step. There may be dangling references, and it is not yet clear which
|
1999-05-09 03:29:38 +02:00
|
|
|
module is the root.
|
|
|
|
|
|
2019-10-09 17:32:08 +02:00
|
|
|
One can see a human-readable version of the final pform by using the
|
2022-09-14 02:08:16 +02:00
|
|
|
`-P <path>` flag to the `ivl` subcommand. This will cause ivl
|
|
|
|
|
to dump the pform into the file named `<path>`. (Note that this is not
|
|
|
|
|
normally done, unless debugging the `ivl` subcommand.)
|
1999-05-10 02:29:35 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Elaboration
|
1999-05-09 03:29:38 +02:00
|
|
|
|
|
|
|
|
This phase takes the pform and generates a netlist. The driver selects
|
|
|
|
|
(by user request or lucky guess) the root module to elaborate,
|
|
|
|
|
resolves references and expands the instantiations to form the design
|
1999-09-19 00:24:24 +02:00
|
|
|
netlist. (See netlist.txt.) Final semantic checks are performed during
|
2000-09-17 21:06:58 +02:00
|
|
|
elaboration, and some simple optimizations are performed. The netlist
|
2019-10-09 17:32:08 +02:00
|
|
|
includes all the behavioural descriptions, as well as gates and wires.
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
The `elaborate()` function performs the elaboration.
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2019-10-09 17:32:08 +02:00
|
|
|
One can see a human-readable version of the final, elaborated and
|
2022-09-14 02:08:16 +02:00
|
|
|
optimized netlist by using the `-N <path>` flag to the compiler. If
|
2002-08-02 03:52:02 +02:00
|
|
|
elaboration succeeds, the final netlist (i.e., after optimizations but
|
2022-09-14 02:08:16 +02:00
|
|
|
before code generation) will be dumped into the file named `<path>`.
|
1999-05-10 02:29:35 +02:00
|
|
|
|
2019-10-09 17:32:08 +02:00
|
|
|
Elaboration is performed in two steps: scopes and parameters
|
|
|
|
|
first, followed by the structural and behavioural elaboration.
|
2000-03-08 05:36:53 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
#### Scope Elaboration
|
2000-03-08 05:36:53 +01:00
|
|
|
|
2000-06-07 05:53:16 +02:00
|
|
|
This pass scans through the pform looking for scopes and parameters. A
|
|
|
|
|
tree of NetScope objects is built up and placed in the Design object,
|
|
|
|
|
with the root module represented by the root NetScope object. The
|
2022-09-14 02:08:16 +02:00
|
|
|
`elab_scope.cc` file contains most of the code for handling this phase.
|
2000-03-08 05:36:53 +01:00
|
|
|
|
2019-10-09 17:32:08 +02:00
|
|
|
The tail of the elaborate_scope behaviour (after the pform is
|
2000-03-08 05:36:53 +01:00
|
|
|
traversed) includes a scan of the NetScope tree to locate defparam
|
|
|
|
|
assignments that were collected during scope elaboration. This is when
|
|
|
|
|
the defparam overrides are applied to the parameters.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
#### Netlist Elaboration
|
2000-03-08 05:36:53 +01:00
|
|
|
|
|
|
|
|
After the scopes and parameters are generated and the NetScope tree
|
2000-06-07 05:53:16 +02:00
|
|
|
fully formed, the elaboration runs through the pform again, this time
|
2019-10-09 17:32:08 +02:00
|
|
|
generating the structural and behavioural netlist. Parameters are
|
2000-03-08 05:36:53 +01:00
|
|
|
elaborated and evaluated by now so all the constants of code
|
|
|
|
|
generation are now known locally, so the netlist can be generated by
|
|
|
|
|
simply passing through the pform.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Optimization
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2019-10-09 17:32:08 +02:00
|
|
|
This is a collection of processing steps that perform
|
1999-05-09 03:29:38 +02:00
|
|
|
optimizations that do not depend on the target technology. Examples of
|
2002-08-02 03:52:02 +02:00
|
|
|
some useful transformations are
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2022-09-14 02:20:39 +02:00
|
|
|
- eliminate null effect circuitry
|
|
|
|
|
- combinational reduction
|
|
|
|
|
- constant propagation
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
The actual functions performed are specified on the `ivl` command line by
|
|
|
|
|
the `-F` flags (see below).
|
1999-05-09 03:29:38 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
### Code Generation
|
1999-05-09 03:29:38 +02:00
|
|
|
|
|
|
|
|
This step takes the design netlist and uses it to drive the code
|
2002-08-02 03:52:02 +02:00
|
|
|
generator (see target.h). This may require transforming the
|
1999-05-09 03:29:38 +02:00
|
|
|
design to suit the technology.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
The `emit()` method of the Design class performs this step. It runs
|
2019-10-09 17:32:08 +02:00
|
|
|
through the design elements, calling target functions as the need arises
|
1999-05-09 03:29:38 +02:00
|
|
|
to generate actual output.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
The user selects the target code generator with the `-t` flag on the
|
1999-05-09 03:29:38 +02:00
|
|
|
command line.
|
|
|
|
|
|
2023-09-12 02:49:24 +02:00
|
|
|
### Attributes
|
2000-09-17 21:06:58 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
> NOTE: The $attribute syntax will soon be deprecated in favour of the Verilog-2001 attribute syntax, which is cleaner and standardized.
|
2002-07-26 04:08:02 +02:00
|
|
|
|
2002-01-19 20:22:39 +01:00
|
|
|
The parser accepts, as an extension to Verilog, the $attribute module
|
2000-09-17 21:06:58 +02:00
|
|
|
item. The syntax of the $attribute item is:
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2000-09-17 21:06:58 +02:00
|
|
|
$attribute (<identifier>, <key>, <value>);
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2000-09-17 21:06:58 +02:00
|
|
|
|
|
|
|
|
The $attribute keyword looks like a system task invocation. The
|
2011-03-11 20:27:54 +01:00
|
|
|
difference here is that the parameters are more restricted than those
|
2022-09-14 02:08:16 +02:00
|
|
|
of a system task. The `<identifier>` must be an identifier. This will be
|
|
|
|
|
the item to get an attribute. The `<key>` and `<value>` are strings, not
|
2000-09-17 21:06:58 +02:00
|
|
|
expressions, that give the key and the value of the attribute to be
|
|
|
|
|
attached to the identified object.
|
|
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
Attributes are `[<key> <value>]` pairs and are used to communicate with
|
2000-09-17 21:06:58 +02:00
|
|
|
the various processing steps. See the documentation for the processing
|
|
|
|
|
step for a list of the pertinent attributes.
|
|
|
|
|
|
|
|
|
|
Attributes can also be applied to gate types. When this is done, the
|
|
|
|
|
attribute is given to every instantiation of the primitive. The syntax
|
2022-09-14 02:08:16 +02:00
|
|
|
for the attribute statement is the same, except that the `<identifier>`
|
2000-09-17 21:06:58 +02:00
|
|
|
names a primitive earlier in the compilation unit and the statement is
|
2019-10-09 17:32:08 +02:00
|
|
|
placed in the global scope, instead of within a module. The semicolon is
|
2000-09-17 21:06:58 +02:00
|
|
|
not part of a type attribute.
|
|
|
|
|
|
|
|
|
|
Note that attributes are also occasionally used for communication
|
|
|
|
|
between processing steps. Processing steps that are aware of others
|
|
|
|
|
may place attributes on netlist objects to communicate information to
|
|
|
|
|
later steps.
|
|
|
|
|
|
2002-05-28 07:20:41 +02:00
|
|
|
Icarus Verilog also accepts the Verilog 2001 syntax for
|
|
|
|
|
attributes. They have the same general meaning as with the $attribute
|
|
|
|
|
syntax, but they are attached to objects by position instead of by
|
|
|
|
|
name. Also, the key is a Verilog identifier instead of a string.
|
|
|
|
|
|
2023-11-03 22:09:14 +01:00
|
|
|
## Running `iverilog`
|
1999-09-19 00:24:24 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
The preferred way to invoke the compiler is with the `iverilog`(1)
|
2023-11-03 22:06:36 +01:00
|
|
|
command. This program invokes the preprocessor (`ivlpp`) and the
|
2022-09-14 02:08:16 +02:00
|
|
|
compiler (`ivl`) with the proper command line options to get the job
|
|
|
|
|
done in a friendly way. See the `iverilog`(1) man page for usage details.
|
1999-09-19 00:24:24 +02:00
|
|
|
|
2002-05-20 01:37:28 +02:00
|
|
|
|
2023-11-03 22:09:14 +01:00
|
|
|
### EXAMPLE: Hello World
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
Example: Compiling `"hello.vl"`
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```verilog
|
2023-11-03 22:09:14 +01:00
|
|
|
// ------------------------ hello.vl ----------------------------
|
|
|
|
|
|
1999-05-09 03:29:38 +02:00
|
|
|
module main();
|
2004-10-04 03:10:51 +02:00
|
|
|
|
|
|
|
|
initial
|
1999-05-09 03:29:38 +02:00
|
|
|
begin
|
2023-11-03 22:09:14 +01:00
|
|
|
$display("Hello World");
|
1999-05-09 03:29:38 +02:00
|
|
|
$finish ;
|
|
|
|
|
end
|
1998-11-18 05:25:22 +01:00
|
|
|
|
1999-05-09 03:29:38 +02:00
|
|
|
endmodule
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2023-11-03 22:09:14 +01:00
|
|
|
// --------------------------------------------------------------
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2022-09-14 02:20:39 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
Ensure that `iverilog` is on your search path, and the vpi library
|
1999-09-19 00:24:24 +02:00
|
|
|
is available.
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2000-09-17 21:06:58 +02:00
|
|
|
To compile the program:
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```bash
|
2022-09-14 02:08:16 +02:00
|
|
|
iverilog hello.vl
|
|
|
|
|
```
|
2022-09-14 02:20:39 +02:00
|
|
|
|
2023-11-03 22:09:14 +01:00
|
|
|
(The above presumes that `/usr/local/include` and `/usr/local/lib` are
|
|
|
|
|
part of the compiler search path, which is usually the case for `gcc`.)
|
1999-05-10 02:29:35 +02:00
|
|
|
|
2023-11-03 22:09:14 +01:00
|
|
|
To run the generated program:
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2023-11-03 22:06:36 +01:00
|
|
|
```bash
|
2022-09-14 02:10:24 +02:00
|
|
|
./a.out
|
2022-09-14 02:08:16 +02:00
|
|
|
```
|
2022-09-14 02:20:39 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
You can use the `-o` switch to name the output command to be generated
|
|
|
|
|
by the compiler. See the `iverilog`(1) man page.
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
## Unsupported Constructs
|
1998-11-18 05:25:22 +01:00
|
|
|
|
2000-09-17 21:06:58 +02:00
|
|
|
Icarus Verilog is in development - as such it still only supports a
|
|
|
|
|
(growing) subset of Verilog. Below is a description of some of the
|
2019-10-09 17:32:08 +02:00
|
|
|
currently unsupported Verilog features. This list is not exhaustive
|
2000-09-17 21:06:58 +02:00
|
|
|
and does not account for errors in the compiler. See the Icarus
|
2001-01-20 20:02:04 +01:00
|
|
|
Verilog web page for the current state of support for Verilog, and in
|
|
|
|
|
particular, browse the bug report database for reported unsupported
|
|
|
|
|
constructs.
|
1999-06-09 05:00:05 +02:00
|
|
|
|
2025-08-03 16:47:53 +02:00
|
|
|
- Specify blocks are parsed but ignored by default. When enabled
|
|
|
|
|
by the `-gspecify` compiler option, a subset of specify block
|
|
|
|
|
constructs are supported.
|
1999-06-19 23:06:16 +02:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- `trireg` is not supported. `tri0` and `tri1` are supported.
|
2000-12-05 23:31:38 +01:00
|
|
|
|
2022-09-14 02:08:16 +02:00
|
|
|
- Net delays, of the form `wire #N foo;` do not work. Delays in
|
2002-08-07 04:07:12 +02:00
|
|
|
every other context do work properly, including the V2001 form
|
2022-09-14 02:08:16 +02:00
|
|
|
`wire #5 foo = bar;`
|
2002-08-07 04:07:12 +02:00
|
|
|
|
2002-08-10 18:57:27 +02:00
|
|
|
- Event controls inside non-blocking assignments are not supported.
|
2022-09-14 02:08:16 +02:00
|
|
|
i.e.: `a <= @(posedge clk) b;`
|
2002-08-10 18:57:27 +02:00
|
|
|
|
2025-08-03 16:47:53 +02:00
|
|
|
The list of unsupported SystemVerilog constructs is too large to
|
|
|
|
|
enumerate here.
|
2002-08-24 02:52:49 +02:00
|
|
|
|
2025-08-03 19:19:45 +02:00
|
|
|
## Nonstandard Constructs and Behaviors
|
2005-07-07 18:22:49 +02:00
|
|
|
|
2025-08-03 19:19:45 +02:00
|
|
|
Icarus Verilog includes some features that are not part of the IEEE 1364
|
|
|
|
|
standard, but have well-defined meaning, and also sometimes gives nonstandard
|
|
|
|
|
(but extended) meanings to some features of the language that are defined.
|
|
|
|
|
See the "Icarus Verilog Extensions" and "Icarus Verilog Quirks" sections at
|
|
|
|
|
https://steveicarus.github.io/iverilog/ for more details.
|
2005-07-07 18:22:49 +02:00
|
|
|
|
2023-09-12 02:49:24 +02:00
|
|
|
## Credits
|
1999-07-08 04:06:47 +02:00
|
|
|
|
2023-10-16 03:29:04 +02:00
|
|
|
Except where otherwise noted, Icarus Verilog, ivl, and ivlpp are
|
2000-09-17 21:06:58 +02:00
|
|
|
Copyright Stephen Williams. The proper notices are in the head of each
|
2001-01-20 20:02:04 +01:00
|
|
|
file. However, I have early on received aid in the form of fixes,
|
2019-10-09 17:32:08 +02:00
|
|
|
Verilog guidance, and especially testing from many people. Testers, in
|
|
|
|
|
particular, include a larger community of people interested in a GPL
|
2003-08-03 05:55:11 +02:00
|
|
|
Verilog for Linux.
|