Icarus Verilog
Go to file
steve ba8465abd2 Support pragma comments. 2002-02-15 05:20:58 +00:00
driver Support print of version number. 2002-02-03 07:05:36 +00:00
examples The -f flag is obsolete. 2001-02-01 17:12:44 +00:00
ivlpp Support pragma comments. 2002-02-15 05:20:58 +00:00
solaris Update for 0.6 release 2002-01-23 02:43:14 +00:00
tgt-fpga Support compile on MacosX 10.1.1 (Timothy J. Wood) 2001-11-17 17:57:58 +00:00
tgt-null Support compile on MacosX 10.1.1 (Timothy J. Wood) 2001-11-17 17:57:58 +00:00
tgt-pal Support compile on MacosX 10.1.1 (Timothy J. Wood) 2001-11-17 17:57:58 +00:00
tgt-stub The IVL_SIT_WIRE type does not exist, it is a 2001-12-15 02:13:17 +00:00
tgt-verilog The IVL_SIT_WIRE type does not exist, it is a 2001-12-15 02:13:17 +00:00
tgt-vvp Fix parameter bit select check for magic constants. 2002-02-03 05:53:00 +00:00
vpi Add writememb (Tom Verbeure) 2002-02-06 04:50:22 +00:00
vpip Support compile on MacosX 10.1.1 (Timothy J. Wood) 2001-11-17 17:57:58 +00:00
vvm Load modules with RTLD_LAZY 2002-01-23 04:54:37 +00:00
vvp get bin or hex string values of memory words. 2002-02-06 04:48:34 +00:00
.cvsignore Add install of examples for Windows. 2001-08-03 17:06:47 +00:00
Attrib.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
Attrib.h Add Attrib class for holding NetObj attributes. 2000-12-04 17:37:03 +00:00
BUGS.txt Handle scope of parameters. 1999-08-06 04:05:28 +00:00
COPYING autoconf the makefiles. 1999-04-25 21:54:33 +00:00
HName.cc include malloc.h only when available. 2002-01-05 04:36:06 +00:00
HName.h Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
INSTALL autoconf the makefiles. 1999-04-25 21:54:33 +00:00
LineInfo.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
LineInfo.h Change LineInfo to store const C strings. 2000-11-30 17:31:42 +00:00
Makefile.in Support print of version number. 2002-02-03 07:05:36 +00:00
Module.cc Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
Module.h Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
PDelays.cc Do not delete delay expressions of UDP instances. 2001-12-29 20:19:31 +00:00
PDelays.h Do not delete delay expressions of UDP instances. 2001-12-29 20:19:31 +00:00
PEvent.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
PEvent.h Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
PExpr.cc Support elaborate_net for PEString objects. 2001-12-30 21:32:03 +00:00
PExpr.h Support elaborate_net for PEString objects. 2001-12-30 21:32:03 +00:00
PFunction.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
PGate.cc Use NetScope instead of string for scope path. 2001-11-22 06:20:59 +00:00
PGate.h Use NetScope instead of string for scope path. 2001-11-22 06:20:59 +00:00
PTask.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
PTask.h Use NetScope instead of string for scope path. 2001-11-22 06:20:59 +00:00
PUdp.h More UDP consolidation from Stephan Boettcher. 2001-04-22 23:09:45 +00:00
PWire.cc Detect scalar/vector declarion mismatch. 2002-01-26 05:28:28 +00:00
PWire.h Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
QUICK_START.txt Spelling error 2001-07-27 02:41:28 +00:00
README.txt Release 0.6 updates. 2002-02-04 00:48:30 +00:00
Statement.cc Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
Statement.h Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
autoconf.sh Make lexor_keyword.cc for distributions. 2002-01-07 04:59:21 +00:00
check.conf make check uses vvp instead of vvm. 2002-01-05 04:36:43 +00:00
compiler.h Add support for +libext+ in command files. 2001-11-16 05:07:19 +00:00
config.guess Update config.sub and config.guess scripts. 2001-07-22 19:50:55 +00:00
config.h.in Include HAVE_SYS_WAIT in config.h (PR#306) 2001-10-18 16:16:23 +00:00
config.sub Update config.sub and config.guess scripts. 2001-07-22 19:50:55 +00:00
configure.in Detect bison and flex in configure.in 2001-12-30 17:20:33 +00:00
cprop.cc Comments about xor evaluation. 2002-02-03 00:06:28 +00:00
cygwin.txt Fix some Cygwin DLL handling. (Venkat Iyer) 2001-09-30 16:45:10 +00:00
design_dump.cc Include s indicator in dump of signed numbers. 2001-12-31 00:02:33 +00:00
dosify.c Add install of examples for Windows. 2001-08-03 17:06:47 +00:00
dup_expr.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
elab_anet.cc Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
elab_expr.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
elab_lval.cc Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
elab_net.cc No implicit declaration in assign l-values. 2002-01-23 05:23:17 +00:00
elab_pexpr.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
elab_scope.cc Properly handle empty target in positionla parameter override. 2001-12-30 04:47:57 +00:00
elab_sig.cc Detect scalar/vector declarion mismatch. 2002-01-26 05:28:28 +00:00
elaborate.cc elaborate deassign lval as done for assign. 2002-01-23 05:56:22 +00:00
emit.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
eval.cc constant eval of arithmetic with x and z. 2001-12-29 22:10:10 +00:00
eval_rconst.cc eval_const uses scope instead of a string path. 2001-11-07 04:01:59 +00:00
eval_tree.cc Propagate sign in unary minus. 2002-02-01 05:09:14 +00:00
expr_synth.cc Synthesize reduction logic. 2001-12-30 17:06:52 +00:00
functor.cc Support multiple root modules (Philip Blundell) 2001-10-19 21:53:24 +00:00
functor.h Add support for modulus (Eric Aardoom) 2000-09-17 21:26:15 +00:00
glossary.txt Add the glossary file. 2001-05-15 15:09:08 +00:00
ieee1364-notes.txt Handle x in l-value of set/x 2002-01-26 02:08:07 +00:00
install-sh autoconf the makefiles. 1999-04-25 21:54:33 +00:00
iverilog.conf Handle part selects in l-values of DFF devices. 2001-11-29 01:58:18 +00:00
ivl.def Add ivl_logic_delay function to ivl_target. 2001-12-06 03:11:00 +00:00
ivl_target.h Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
lexor.lex Support pragma comments. 2002-02-15 05:20:58 +00:00
lexor_keyword.gperf Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
lexor_keyword.h Support localparam. 2000-03-12 17:09:40 +00:00
link_const.cc Change the NetAssign_ class to refer to the signal 2001-08-25 23:50:02 +00:00
load_module.cc Close library files after parsing. 2001-11-20 23:36:34 +00:00
lpm.txt Add the synth functor to do generic synthesis 1999-11-01 02:07:40 +00:00
macosx.txt Support compile on MacosX 10.1.1 (Timothy J. Wood) 2001-11-17 17:57:58 +00:00
main.cc Add support for +libext+ in command files. 2001-11-16 05:07:19 +00:00
mangle.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
mingw.txt More make install details. 2001-10-09 23:05:10 +00:00
mkinstalldirs autoconf the makefiles. 1999-04-25 21:54:33 +00:00
named.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
net_assign.cc Change the NetAssign_ class to refer to the signal 2001-08-25 23:50:02 +00:00
net_design.cc Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
net_event.cc event find_similar should not find self. 2002-02-02 06:13:38 +00:00
net_expr.cc include config.h to eliminate warnings. 2002-01-29 22:36:31 +00:00
net_force.cc Pass back target errors processing conditionals. 2002-01-19 19:02:08 +00:00
net_link.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
net_modulo.cc NetObj constructor finally requires a scope. 2001-10-28 01:14:53 +00:00
net_proc.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
net_scope.cc Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
net_udp.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
netlist.cc Propagate sign in unary minus. 2002-02-01 05:09:14 +00:00
netlist.h Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
netlist.txt Document time scale in netlists. 2000-07-23 18:06:15 +00:00
netmisc.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
netmisc.h FreeBSD port has a maintainer now. 2001-02-15 06:59:35 +00:00
nodangle.cc event find_similar should not find self. 2002-02-02 06:13:38 +00:00
pad_to_width.cc NetObj constructor finally requires a scope. 2001-10-28 01:14:53 +00:00
parse.y Detect incorrect function ports. 2002-01-23 03:35:17 +00:00
parse_api.h clean up API for restarting parser. 2001-10-21 20:18:56 +00:00
parse_misc.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
parse_misc.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
pform.cc Detect duplicate port declarations. 2002-01-31 04:10:15 +00:00
pform.h Drive strengths for continuous assignments. 2002-01-12 04:03:39 +00:00
pform_dump.cc Detect scalar/vector declarion mismatch. 2002-01-26 05:28:28 +00:00
set_width.cc Unary reduction operators are all 1-bit results. 2001-11-19 04:26:46 +00:00
svector.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
syn-rules.y Better synthesys of DFF w/ complex l-values. (Larry Doolittle) 2001-11-30 01:22:21 +00:00
synth.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
t-dll-api.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
t-dll-expr.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
t-dll-proc.cc Pass back target errors processing conditionals. 2002-01-19 19:02:08 +00:00
t-dll.cc Load modules with RTLD_LAZY 2002-01-23 04:54:37 +00:00
t-dll.h Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
t-dll.txt Spelling error. 2000-10-31 16:59:45 +00:00
t-vvm.cc Pass back target errors processing conditionals. 2002-01-19 19:02:08 +00:00
t-xnf.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
target.cc Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
target.h Add support for bit select of parameters. 2002-01-28 00:52:41 +00:00
targets.cc Create a config.h.in file to hold all the config 2001-07-25 03:10:48 +00:00
util.h Parser and pform use hierarchical names as hname_t 2001-12-03 04:47:14 +00:00
verilog.1 add the -m flag. 2000-01-21 05:41:51 +00:00
verilog.spec Add fpga.tgt to the file list. 2002-02-04 01:31:02 +00:00
verinum.cc Propagate sign in unary minus. 2002-02-01 05:09:14 +00:00
verinum.h In the context of range declarations, use elab_and_eval instead 2001-02-10 20:29:39 +00:00
verireal.cc Support more real arithmetic in delay constants. 2001-11-06 06:11:55 +00:00
verireal.h Support more real arithmetic in delay constants. 2001-11-06 06:11:55 +00:00
vpi.txt update documentation to describe vpi in vvp. 2001-06-12 23:32:49 +00:00
vpi_user.h Add the vpiLeft.. and vpiRightRange constants 2002-01-24 04:19:39 +00:00
vpithunk.c More space efficient use of constant strings (Larry Doolittle) 2002-01-22 00:06:56 +00:00
vpithunk.h Change the VPI call process so that loaded .vpi modules 2001-06-12 03:53:10 +00:00
vvm.txt No need for nobufz. 2000-05-11 01:44:52 +00:00
xilinx-hint.txt Update xilinx-hints.txt from Larry. 2000-02-13 04:06:49 +00:00
xnf.txt Use the iverilog command in documentation. 2000-08-01 21:32:40 +00:00
xnf2pcf.sh xilinx support from Larry Doolittle 1999-08-20 15:08:57 +00:00
xnfio.cc Scope/module names are char* instead of string. 2001-10-20 05:21:51 +00:00

README.txt

		THE ICARUS VERILOG COMPILATION SYSTEM 
			   September 17, 2000	


1.0 What is ICARUS Verilog?

Icarus Verilog is intended to compile ALL of the Verilog HDL as
described in the IEEE-1364 standard. Of course, it's not quite there
yet. It does currently handle a mix of structural and behavioral
constructs. For a view of the current state of Icarus Verilog, see its
home page at <http://www.icarus.com/eda/verilog>.
 
Icarus Verilog is not aimed at being a simulator in the traditional
sense, but a compiler that generates code employed by back-end
tools. These back-end tools currently include a simulator written in
C++ called VVM, another faster simulator called VVP, an XNF (Xilinx
Netlist Format) generator and an EDIF fpga netlist generator. In the
future, backends are expected for EDIF/LPM, structural Verilog, VHDL,
etc.

    For instructions on how to run Icarus Verilog,
    see the ``iverilog'' man page.


2.0 Building/Installing Icarus Verilog From Source

If you are starting from source, the build process is designed to be
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.

If you are building for Windows, see the mingw.txt file.

2.1 Compile Time Prerequisites

You need the following software to compile Icarus Verilog from source
on a UNIX-like system:

	- 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.

	- 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.

	- bison and flex

	- gperf 2.7
	  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.

	  A version problem with this program is the most common cause
	  of difficulty. See the Icarus Verilog FAQ.

2.2 Compilation

Unpack the tar-ball and cd into the verilog-######### directory
(presumably that is how you got to this README) and compile the source
with the commands:

  ./configure
  make

Normally, this command automatically figures out every thing it needs
to know. It generally works pretty well. There are a few flags to the
configure script that modify its behavior:

	--without-ipal
	    This turns off support for Icarus PAL, whether ipal
	    libraries are installed or not.

	--prefix=<root>
	    The default is /usr/local, which causes the tool suite to
	    be compiled for install in /usr/local/bin,
	    /usr/local/share/ivl, etc.

	    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.

2.3 (Optional) Testing

To run a simple test before installation, execute

  make check

The commands printed by this run might help you in running Icarus
Verilog on your own Verilog sources before the package is installed
by root.

2.4 Installation

Now install the files in an appropriate place. (The makefiles by
default install in /usr/local unless you specify a different prefix
with the --prefix=<path> flag to the configure command.) You may need
to do this as root to gain access to installation directories.

  make install

2.5 Uninstallation

The generated Makefiles also include the uninstall target. This should
remove all the files that ``make install'' creates.

3.0 How Icarus Verilog Works

This tool includes a parser which reads in Verilog (plus extensions)
and generates an internal netlist. The netlist is passed to various
processing steps that transform the design to more optimal/practical
forms, then is passed to a code generator for final output. The
processing steps and the code generator are selected by command line
switches.

3.1 Preprocessing

There is a separate program, ivlpp, that does the preprocessing. This
program implements the `include and `define directives producing
output that is equivalent but without the directives. The output is a
single file with line number directives, so that the actual compiler
only sees a single input file. See ivlpp/ivlpp.txt for details.

3.2 Parse

The Verilog compiler starts by parsing the Verilog source file. The
output of the parse in a list of Module objects in PFORM. The pform
(see pform.h) is mostly a direct reflection of the compilation
step. There may be dangling references, and it is not yet clear which
module is the root.

One can see a human readable version of the final PFORM by using the
``-P <path>'' flag to the compiler. This will cause iverilog to dump
the PFORM into the file named <path>.

3.3 Elaboration

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
netlist. (See netlist.txt.) Final semantic checks are performed during
elaboration, and some simple optimizations are performed. The netlist
includes all the behavioral descriptions, as well as gates and wires.

The elaborate() function performs the elaboration.

One can see a human readable version of the final, elaborated and
optimized netlist by using the ``-N <path>'' flag to the compiler. If
elaboration succeeds, the final netlist (i.e. after optimizations but
before code generation) will be dumped into the file named <path>.

Elaboration is actually performed it two steps: scopes and parameters
first, followed by the structural and behavioral elaboration.

3.3.1 Scope Elaboration

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
elab_scope.cc and elab_pexpr.cc files contain most of the code for
handling this phase.

The tail of the elaborate_scope behavior (after the pform is
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.

3.3.2 Netlist Elaboration

After the scopes and parameters are generated and the NetScope tree
fully formed, the elaboration runs through the pform again, this time
generating the structural and behavioral netlist. Parameters are
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.

3.4 Optimization

This is actually a collection of processing steps that perform
optimizations that do not depend on the target technology. Examples of
some useful transformations would be,

	- eliminate null effect circuitry,
	- combinational reduction
	- constant propagation

The actual functions performed are specified on the ivl command line by
the -F flags (See below).

3.5 Code Generation

This step takes the design netlist and uses it to drive the code
generator. (See target.h.) This may require transforming the
design to suit the technology.

The emit() method of the Design class performs this step. It runs
through the design elements, calling target functions as need arises
to generate actual output.

The user selects the target code generator with the -t flag on the
command line.

3.6 ATTRIBUTES

The parser accepts, as an extension to Verilog, the $attribute module
item. The syntax of the $attribute item is:

	$attribute (<identifier>, <key>, <value>);

The $attribute keyword looks like a system task invocation. The
difference here is that the parameters are more restricted then those
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
expressions, that give the key and the value of the attribute to be
attached to the identified object.

Attributes are [<key> <value>] pairs and are used to communicate with
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
for the attribute statement is the same, except that the <identifier>
names a primitive earlier in the compilation unit and the statement is
placed in global scope, instead of within a module. The semicolon is
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.

4.0 Running iverilog

The preferred way to invoke the compiler is with the iverilog(1)
command. This program invokes the preprocessor (ivlpp) and the
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.

4.1 Running IVL Directly (not recommended)

    NOTE: The preferred method of running Icarus Verilog is the
    iverilog command described above. The instructions below may
    change at any time without notice.

The ivl command is the compiler driver, that invokes the parser,
optimization functions and the code generator, but not the preprocessor.

Usage: ivl <options>... file
       ivl -h
       ivl -V

-F <name>
	Use this flag to request an optimization function be applied
	to the netlist before it is sent to the target output
	stage. Any number of -F options may be given, to specify a
	variety of processing steps. The steps will be applied in
	order, with the output of one uses as the input to the next.

	The function is specified by name. Use the "ivl -h" command to
	get a list of configured function names.

-h
	Print usage information, and exit.

-m <module>
	Cause a named VPI module to be included in the module
	list. This parameter appends the named module to the end of
	the VPI_MODULE_LIST. This is an ordered list of modules to be
	loaded into the simulation at runtime.

	This list can also be set with -fVPI_MODULE_LIST=<list> which
	sets the list completely. Then, -m after this will append
	module names to the list specified. The default list
	includes "system".

-N <file>
	Dump the elaborated netlist to the named file. The netlist is
	the folly elaborated netlist, after all the function modules
	are applied and right before the output generator is
	called. This is an aid for debugging the compiler, and the
	output generator in particular.

-o <file>
	Normally, the generated result is sent to standard
	output. Use the -o flag to specify an output file for the
	generated result.

-P <file>
	Write the PForm of the parsed input to the specified file.
	The pform is the compiler's understanding of the input after
	parsing and before elaboration. This is an aid for debugging
	the compiler.

-p <assign>
	Use this flag to set a parameter value. The format of the
	assignment is <key>=<value> where key is any string up to the
	first '=', and <value> is the rest of the option. If the '='
	is omitted, then the key is assigned the empty string.

	The useful keys are defined by the functions and the target in
	use. These assignments are specifically useful for passing
	target specific information to the target back-end, or
	options/parameters to optimization functions, if any are defined.

-s <module>
        Normally, ivl will locate all the modules that are defined but
        never instantiated, and use these as the design roots for 
        elaboration. This flag allows the choice of root module(s) to 
        be manually overridden. It can be used more than once on the
        command line if multiple root modules are needed.
        
-T [min|typ|max]
	Normally, ivl will select typ values from min:type:max
	expressions and print a warning. This flag tells the compiler
	exactly which value to choose, and suppresses the warning.

-t <name>
	Select the output format for the compiled result. Use the
	"ivl -h" command to get a list of configured targets.

-v	Print progress indications, and (if supported by the system)
	executions times in ivl precessing steps.

-V
	Print version and copyright information for ivl, and exit.

-y <dir>
	Add the specified directory to the library search path. If
	missing modules are discovered during elaboration, ivl will
	attempt to locate an implementation by searching the library
	directories for a Verilog source file with the same name as
	the module.

4.2 EXAMPLES

Example: Compiling "hello.vl"

------------------------ hello.vl ----------------------------
module main();
 
initial 
  begin
    $display("Hi there");
    $finish ;
  end

endmodule

--------------------------------------------------------------

Insure that "iverilog" is on your search path, and the vpi library 
is available.

To compile the program:

  iverilog hello.vl

(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.)

To run the program:

  ./a.out

You can use the "-o" switch to name the output command to be generated
by the compiler. See the iverilog(1) man page.

5.0 Unsupported Constructs

Icarus Verilog is in development - as such it still only supports a
(growing) subset of Verilog.  Below is a description of some of the
currently unsupported Verilog features. This list is not exhaustive,
and does not account for errors in the compiler. See the Icarus
Verilog web page for the current state of support for Verilog, and in
particular, browse the bug report database for reported unsupported
constructs.

  - block disable not supported, i.e.:

            begin : foo
	        [...]
		disable foo; // sorry
		[...]
	    end

  - Functions in structural contexts are not supported.

            assign foo = user_function(a,b); // sorry
	    always @(a or b) foo = user_function(a,b); // OK

  - real data types not supported. This includes real and
    realtime. However, floating point constants in delay expressions
    are supported so that `timescale works properly.

  - System functions are supported, but the compiler presumes that
    they return 32 bits. This is the typical case.

  - Specify blocks are parsed but ignored in general.

  - trireg is not supported. tri0 and tri1 are supported.

  - force to nets are not supported. Force to variables, and
    assign/deassign, are supported.

6.0 CREDITS

Except where otherwise noted, Icarus Verilog, ivl and ivlpp are
Copyright Stephen Williams. The proper notices are in the head of each
file. However, I have early on received aid in the form of fixes,
Verilog guidance, and especially testing from many people, including
(in alphabetical order):

	Eric Aardoom <eric_aardoom@yahoo.com>
	Stephan I. Boettcher <stephan@nevis.columbia.edu>
	Ed Carter <r47652@email.sps.mot.com>
	Larry Doolittle <LRDoolittle@lbl.gov>
	Guy Hutchison <ghutchis@pacbell.net>
	Ales Hvezda <ahvezda@seul.org>
	Venkat Iyer <venkat@comit.com>
	Yasuhisa Kato <ykato@mac.com>
        James Lee <jml@jmlzone.com>
	Peter Monta <pmonta@halibut.imedia.com>
	Daniel H. Nelsen <dhn@qedinc.com>
	Stefan Petersen <spe@geda.seul.org>
	Jason Schonberg <schonm@yahoo.com>
	Stuart Sutherland <stuart@sutherland.com>
	Stephen Tell <tell@cs.unc.edu>
        Stefan Theide <Stefan.Thiede@sv.sc.philips.com>
	Tom Verbeure
	Steve Wilson <stevew@home.com>

and others. Testers in particular include a larger community of people
interested in a GPL Verilog for Linux. Special thanks to Steve Wilson
for collecting and organizing the test suite code for all those testers.


6.1 PORT MAINTAINERS

This is a list of people who have created ports and precompiled
packages for various operating systems. These folks have graciously
taken on the task of building Icarus Verilog on their systems and
bundled it into neat packages.(+) If you want to be added to the list (or
removed from the list) send e-mail to me.

      FreeBSD/{Intel,alpha}
	Ying-Chieh Liao <ijliao@FreeBSD.org>

      Linux/{alpha,Intel} (RPMS)
	Stephen Williams <steve@icarus.com>

      Linux/* (.debs)
	Hamish Moffatt <hamish@rising.com.au>

      Macintosh -- MacO/S
	Yasuhisa Kato <ykato@mac.com>

      Mac O/S X
        Timothy J. Wood <tjw@omnigroup.com>

      NetBSD/*
	Dan McMahill <mcmahill@mtl.mit.edu>

      Solaris/SPARC packages (.pkg)
	Dan McMahill <mcmahill@mtl.mit.edu>

      Cygwin32/*
        Venkat Iyer <venkat@comit.com>

      Mingw32
        Venkat Iyer <venkat@comit.com>

(+) These are not the only systems where Icarus Verilog has been run,
just the systems where precompiled binaries are publicly available.


6.2 TEST SUITE MANAGER

Steve Wilson <stevew@home.com> or <stevew@intrinsix.com> has taken on
the large task of managing the test suite. He has maintained the
regression test scripts, the driver list, received submissions from
myself and others, and has written a great many tests on his own. Any
compiler writer, for any language, will tell you that the test suite
is at least as important as the compiler code itself.