Icarus Verilog
Go to file
steve 18eb34921f Add support for non-constant delays in delay statements,
Support evaluating ! in constant expressions, and
 move some code from netlist.cc to net_proc.cc.
2000-07-07 04:53:53 +00:00
examples Update to use iverilog. 2000-05-14 19:41:22 +00:00
ivlpp Handle errors from parser slightly differently. 2000-06-30 15:49:44 +00:00
solaris Solaris pkg files. 2000-06-16 18:58:45 +00:00
vpi Interpret the depth paramter of dumpvars. 2000-06-03 02:22:15 +00:00
vvm unop_not can take out width same as in width. 2000-07-06 18:12:28 +00:00
.cvsignore syn-rules.cc.output is generated. 2000-05-16 04:05:59 +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
INSTALL autoconf the makefiles. 1999-04-25 21:54:33 +00:00
LineInfo.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
Makefile.in Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
Module.cc Module ports are really special PEIdent 2000-05-16 04:05:15 +00:00
Module.h Module ports are really special PEIdent 2000-05-16 04:05:15 +00:00
PDelays.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
PDelays.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
PEvent.cc Named events as far as the pform. 2000-04-01 19:31:57 +00:00
PEvent.h Catch event declarations during scope elaborate. 2000-04-09 17:44:30 +00:00
PExpr.cc Allow unary operators in constant expressions. 2000-06-30 15:50:20 +00:00
PExpr.h Allow unary operators in constant expressions. 2000-06-30 15:50:20 +00:00
PFunction.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
PGate.cc Carry assignment strength to pform. 2000-05-06 15:41:56 +00:00
PGate.h Carry assignment strength to pform. 2000-05-06 15:41:56 +00:00
PTask.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
PTask.h Redesign the implementation of scopes and parameters. 2000-03-08 04:36:53 +00:00
PUdp.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
PWire.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
PWire.h Move signal elaboration to a seperate pass. 2000-05-02 16:27:38 +00:00
README.txt Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
Statement.cc Add support for procedural continuous assignment. 2000-05-11 23:37:26 +00:00
Statement.h Add support for procedural continuous assignment. 2000-05-11 23:37:26 +00:00
compiler.h Switch to control warnings. 2000-03-17 21:50:25 +00:00
config.guess cannonical make targets, and strip on install. 1999-10-23 16:55:51 +00:00
config.sub cannonical make targets, and strip on install. 1999-10-23 16:55:51 +00:00
configure.in Detect some hosts that do not support -rdynamic. 2000-06-16 19:00:06 +00:00
cprop.cc Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
design_dump.cc Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
dup_expr.cc Import MCD support from Stephen Tell, and add 2000-05-07 18:20:07 +00:00
elab_expr.cc Catch part select of memories as an error. 2000-05-19 01:55:09 +00:00
elab_net.cc Connect all the l and r bits of a NE expression. 2000-07-06 18:13:24 +00:00
elab_pexpr.cc Support concatenation in parameter expressions. 2000-06-13 05:22:16 +00:00
elab_scope.cc Catch event declarations during scope elaborate. 2000-04-09 17:44:30 +00:00
elab_sig.cc Move signal elaboration to a seperate pass. 2000-05-02 16:27:38 +00:00
elaborate.cc Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
emit.cc Add support for procedural continuous assignment. 2000-05-11 23:37:26 +00:00
eval.cc Redesign the implementation of scopes and parameters. 2000-03-08 04:36:53 +00:00
eval_tree.cc Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
expr_synth.cc Move signal tables to the NetScope class. 2000-05-02 00:58:11 +00:00
functor.cc Move signal tables to the NetScope class. 2000-05-02 00:58:11 +00:00
functor.h Catch some simple identity compareoptimizations. 2000-04-20 00:28:03 +00:00
install-sh autoconf the makefiles. 1999-04-25 21:54:33 +00:00
iverilog.c Catch errors from compile that leave the low 8 bits empty. 2000-06-30 04:42:23 +00:00
iverilog.man Add the module option to iverilog. 2000-05-17 03:53:29 +00:00
lexor.lex properly match unconnected_drive directive. (Wen-jung Tseng) 2000-06-27 04:36:29 +00:00
lexor_keyword.gperf Detect the signed keyword. 2000-04-02 04:25:39 +00:00
lexor_keyword.h Support localparam. 2000-03-12 17:09:40 +00:00
link_const.cc Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
lpm.txt Add the synth functor to do generic synthesis 1999-11-01 02:07:40 +00:00
main.cc Use yacc based synthesizer. 2000-05-13 20:55:47 +00:00
mangle.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +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_design.cc Move signal elaboration to a seperate pass. 2000-05-02 16:27:38 +00:00
net_event.cc Globally merge redundant event objects. 2000-05-31 02:26:49 +00:00
net_force.cc NetCAssign needs to incr_eref its lval to lock it down. 2000-05-12 01:22:41 +00:00
net_link.cc Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
net_proc.cc Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
net_scope.cc Move memories to the NetScope object. 2000-05-02 03:13:30 +00:00
net_udp.cc New and improved combinational primitives. 2000-03-29 04:37:10 +00:00
netlist.cc Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
netlist.h Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
netlist.txt Redesign the implementation of scopes and parameters. 2000-03-08 04:36:53 +00:00
netmisc.h Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
nodangle.cc Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
pad_to_width.cc Move signal tables to the NetScope class. 2000-05-02 00:58:11 +00:00
parse.y Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
parse_misc.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
parse_misc.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
pform.cc Better parsing of expressions lists will empty expressoins. 2000-05-23 16:03:13 +00:00
pform.h Deliver gate output strengths to the netlist. 2000-05-08 05:30:19 +00:00
pform_dump.cc Better parsing of expressions lists will empty expressoins. 2000-05-23 16:03:13 +00:00
propinit.cc Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
set_width.cc Handle width expansion of shift operators. 2000-06-18 03:29:52 +00:00
svector.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
syn-rules.y Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00
synth.cc Use yacc based synthesizer. 2000-05-13 20:55:47 +00:00
t-null.cc Ignore more things in null target. 2000-06-14 20:29:39 +00:00
t-verilog.cc Named events really should be expressed with PEIdent 2000-04-12 04:23:57 +00:00
t-vvm.cc Add support for non-constant delays in delay statements, 2000-07-07 04:53:53 +00:00
t-xnf.cc Use nexus type to get nexus name. 2000-06-28 18:38:54 +00:00
target.cc Add support for procedural continuous assignment. 2000-05-11 23:37:26 +00:00
target.h Add support for procedural continuous assignment. 2000-05-11 23:37:26 +00:00
targets.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
util.cc Catch memory word parameters to tasks. 2000-04-28 16:50:53 +00:00
util.h missing header file. 2000-04-29 04:53:44 +00:00
verilog.1 add the -m flag. 2000-01-21 05:41:51 +00:00
verilog.sh Fix up compiling with configured -ldl switch. 2000-02-05 06:40:35 +00:00
verilog.spec Update to final release. 2000-06-21 19:09:54 +00:00
verinum.cc Fix subract of short value form long one. 2000-06-12 03:56:51 +00:00
verinum.h Some compilers do not accept the not symbol. 2000-02-23 04:43:43 +00:00
verireal.cc Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
verireal.h Macintosh compilers do not support ident. 2000-02-23 02:56:53 +00:00
vpi.txt Convert vvm to implement system tasks with vpi. 1999-08-15 01:23:56 +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 automatically generate macro interface code. 2000-04-23 23:03:13 +00:00
xnf2pcf.sh xilinx support from Larry Doolittle 1999-08-20 15:08:57 +00:00
xnfio.cc Redesign Links to include the Nexus class that 2000-06-25 19:59:41 +00:00

README.txt

		THE ICARUS VERILOG COMPILATION SYSTEM 
			   September 18, 1999		


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 and an XNF (Xilinx Netlist Format) generator. See
"vvm.txt" and "xnf.txt" for further details on these back-end
processors. In the future, backends are expected for EDIF/LPM,
structural Verilog, etc.

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.

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 to, so a basic POSIX
	  make will not work. Linux systems typically come with a
	  satisfactory make.

	- ISO C++ Compiler
	  The ivl and ivlpp programs are written in C++ and makes use
	  of templates and some of the standard C++ library. egcs
	  compilers with the associated libstdc++ are known to work.

	- bison

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

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

2.3 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.) Do this as
root.

  make install

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 ivl 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 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 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 target code generator to used is given by the -t flag on the
command line.

4.0 Running Verilog

The preferred way to invoke the compiler 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

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

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

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

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

-s <module>
	Normally, ivl will elaborate the only module in the source
	file. If there are multiple modules, use this option to select
	the module to be used as the top-level module.

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

-v
	Print version and copyright information for ivl.

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

For csh - 

  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


5.0 Unsupported Constructs

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

  - Min/Typ/Max expressions: Example:  a = (1 : 6 : 14);

  - `timescale directive

  - 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 type not supported.

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


6.0 CREDITS

Except where otherwise noted, ivl and ivlpp are Copyright Stephen
Williams. The proper notices are in the head of each file. However,
I have 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>
	Yasuhisa Kato <ykato@mac.com>
        James Lee <jml@seva.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>
	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.