Icarus Verilog
Go to file
umarcor ae5be2b61f doc: add MSYS2 readme 2020-12-04 01:34:15 +01:00
.github ci/win: upload artifacts 2020-12-03 09:17:44 +01:00
cadpli Thoroughly fix parallel installation issues 2020-02-12 22:42:04 +08:00
driver Fix syntax in fprintf calls ("<" -> ","). 2020-12-02 11:32:19 +00:00
driver-vpi Thoroughly fix parallel installation issues 2020-02-12 22:42:04 +08:00
examples updated FSF-address 2012-08-29 10:12:10 -07:00
ivlpp Support escaped identifiers as macro names. 2020-10-09 11:38:16 +01:00
libmisc Put some buffer overflow checks in. 2019-11-21 18:35:43 -08:00
libveriuser Fix the libveriuser TF and ACC functions to work in callbacks. 2020-12-04 00:19:46 +00:00
msys2 doc: add MSYS2 readme 2020-12-04 01:34:15 +01:00
scripts Add the -Wimplicit-dimensions warning. 2016-02-06 16:07:50 -08:00
solaris Drop useless CVS stuff in .txt files 2009-03-11 10:34:52 -07:00
tgt-blif Update the user visible copyright to be 2020 2020-05-31 13:41:38 -07:00
tgt-fpga Thoroughly fix parallel installation issues 2020-02-12 22:42:04 +08:00
tgt-null Update the user visible copyright to be 2020 2020-05-31 13:41:38 -07:00
tgt-pal Thoroughly fix parallel installation issues 2020-02-12 22:42:04 +08:00
tgt-pcb Use GNU make pattern rules to handle multiple file output from bison. 2020-07-30 16:27:01 +01:00
tgt-sizer Update the user visible copyright to be 2020 2020-05-31 13:41:38 -07:00
tgt-stub Update the user visible copyright to be 2020 2020-05-31 13:41:38 -07:00
tgt-verilog Thoroughly fix parallel installation issues 2020-02-12 22:42:04 +08:00
tgt-vhdl Update the user visible copyright to be 2020 2020-05-31 13:41:38 -07:00
tgt-vlog95 Generate a unique name for mutli output gates 2020-12-01 21:12:40 -08:00
tgt-vvp Fix dynamic array assignment to make a copy of the rvalue. 2020-11-26 12:52:06 -08:00
vhdlpp Use GNU make pattern rules to handle multiple file output from bison. 2020-07-30 16:27:01 +01:00
vpi Report a package connot be dumped with most dumpers 2020-11-29 12:43:01 -08:00
vvp Fix segfault under mingw32 due to dynamic cast of invalid pointer value. 2020-12-02 12:27:42 +00:00
.gitattributes Attempt to allow native line endings in Windows git checkouts. 2015-05-01 22:55:19 +01:00
.gitignore Initial BLIF code generator. 2013-08-01 17:28:03 -07:00
AStatement.cc updated FSF-address 2012-08-29 10:12:10 -07:00
AStatement.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
Attrib.cc updated FSF-address 2012-08-29 10:12:10 -07:00
Attrib.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
BUGS.txt Fix broken links to SourceForge bug/patch trackers (GitHub issue #207). 2018-09-28 10:03:06 +01:00
COPYING Update COPYING to match FSF version and update tgt-vlog95/Makefile.in 2013-04-19 12:14:37 -07:00
HName.cc Have scope auto-rename generate names that use the index numbers 2015-09-29 17:44:28 -07:00
HName.h Have scope auto-rename generate names that use the index numbers 2015-09-29 17:44:28 -07:00
INSTALL autoconf the makefiles. 1999-04-25 21:54:33 +00:00
Makefile.in Use GNU make pattern rules to handle multiple file output from bison. 2020-07-30 16:27:01 +01:00
Module.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
Module.h Fix file/line reported for duplicate parameter declarations. 2019-09-27 22:19:30 +01:00
PClass.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PClass.h Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PDelays.cc Factor out common code for warning about inconsistent timescales. 2017-11-05 09:39:21 +00:00
PDelays.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
PEvent.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PEvent.h Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PExpr.cc An input port driven by a variable is not collapsible 2020-11-30 22:48:39 -08:00
PExpr.h An input port driven by a variable is not collapsible 2020-11-30 22:48:39 -08:00
PFunction.cc Handle the special case that constructor only chains. 2020-11-22 16:13:01 -08:00
PGate.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PGate.h Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PGenerate.cc Add support for local genvar declaration in generate loops. 2020-01-31 20:29:22 +00:00
PGenerate.h Add support for local genvar declaration in generate loops. 2020-01-31 20:29:22 +00:00
PModport.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PModport.h Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PNamedItem.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PNamedItem.h Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PPackage.cc Add packages and their own scope. 2013-02-17 17:00:15 -08:00
PPackage.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
PScope.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PScope.h Delay potential imports for task/function calls until end of scope. 2019-10-01 09:08:07 +01:00
PSpec.cc updated FSF-address 2012-08-29 10:12:10 -07:00
PSpec.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
PTask.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PTask.h Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
PUdp.cc updated FSF-address 2012-08-29 10:12:10 -07:00
PUdp.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
PWire.cc Record data type for all pform "wires" added the new way. 2019-12-22 11:03:50 +00:00
PWire.h Record data type for all pform "wires" added the new way. 2019-12-22 11:03:50 +00:00
QUICK_START.txt Clean up spurious trailing white space. 2004-10-04 01:10:51 +00:00
README.txt Fix GitHub issue #352 - typo in README.txt (%time -> $time). 2020-08-05 11:33:34 +01:00
Statement.cc Parse and elaborate unique and priority case statements 2019-10-05 16:23:04 -07:00
Statement.h Add the ability to delete an element of a queue 2020-07-25 00:49:42 -07:00
_pli_types.h.in Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
acc_user.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
aclocal.m4 aclocal.m4: fix the comment contradicts the previous line 2020-07-28 21:15:49 +08:00
async.cc nodangle functor accounts for NexusSet links 2014-05-08 15:05:09 -07:00
attributes.txt Support time0 resolution of combinational threads. 2003-09-04 20:28:05 +00:00
autoconf.sh Basic patch from github #44 2014-11-04 11:39:01 -08:00
check.conf Fix make check to support -tconf configuration method. 2003-12-12 04:36:48 +00:00
compiler.h Extract system function return types from VPI modules, not SFT files. 2019-10-21 13:40:40 +01:00
config.guess Updated config.guess and config.sub. 2015-05-04 18:40:53 +01:00
config.h.in GTKWave (fstapi.c) needs realpath() so check for it 2015-12-19 09:11:48 -08:00
config.sub Updated config.guess and config.sub. 2015-05-04 18:40:53 +01:00
configure.in Don't use libhistory if libreadline includes the history functions. 2020-08-06 23:58:45 +01:00
constants.vams Non-controversial whitespace cleanup 2008-09-04 21:31:30 -07:00
cppcheck.sup Update cppcheck waivers 2019-03-26 22:43:03 -07:00
cprop.cc Fix errors in constant propagation. 2013-10-26 23:49:43 +01:00
cygwin.txt Clean up spurious trailing white space. 2004-10-04 01:10:51 +00:00
design_dump.cc Enable support for providing a queue maximum index 2020-07-17 01:32:53 -07:00
developer-quick-start.txt Touch up new developer quick start 2008-10-31 20:44:54 -07:00
discipline.cc updated FSF-address 2012-08-29 10:12:10 -07:00
discipline.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
disciplines.vams Nature and discipline declarations syntax 2008-05-11 12:13:58 -07:00
dosify.c More spelling, comments only 2016-04-01 11:02:34 -07:00
dup_expr.cc Don't evaluate built-in system functions if they are overridden. 2019-10-19 16:12:17 +01:00
elab_anet.cc updated FSF-address 2012-08-29 10:12:10 -07:00
elab_expr.cc Support passing class objects as task/function arguments (GitHub issure #391) 2020-11-24 17:16:46 +00:00
elab_lval.cc Support nested struct in continuous assign l-values 2020-11-29 18:18:55 -08:00
elab_net.cc An input port driven by a variable is not collapsible 2020-11-30 22:48:39 -08:00
elab_scope.cc Fix width of localparam created from genvar when using -gstrict-expr-width. 2020-10-01 11:33:24 +01:00
elab_sig.cc Detect and complain about some constructor chain errors 2020-11-22 15:31:40 -08:00
elab_sig_analog.cc updated FSF-address 2012-08-29 10:12:10 -07:00
elab_type.cc Enable support for providing a queue maximum index 2020-07-17 01:32:53 -07:00
elaborate.cc An input port driven by a variable is not collapsible 2020-11-30 22:48:39 -08:00
elaborate_analog.cc Remove some cppcheck warnings, etc. 2012-11-12 18:15:25 -08:00
emit.cc Support separate compilation units in SystemVerilog. 2017-10-31 20:38:59 +00:00
eval.cc Add support for power operator in eval_const() 2014-07-07 18:17:45 -07:00
eval_attrib.cc updated FSF-address 2012-08-29 10:12:10 -07:00
eval_tree.cc Add support for <-> in constant and procedural contexts 2020-07-07 23:29:19 -07:00
exposenodes.cc Fix space issues. 2016-02-28 22:09:39 -08:00
expr_synth.cc Add CA version of the <-> operator 2020-07-09 01:45:43 -07:00
extensions.txt Spelling fixes 2008-01-29 20:24:24 -08:00
functor.cc NetLatch class 2016-03-11 23:11:54 +00:00
functor.h NetLatch class 2016-03-11 23:11:54 +00:00
glossary.txt Add the glossary file. 2001-05-15 15:09:08 +00:00
ieee1364-notes.txt Spelling and related fixes 2011-04-27 10:36:00 -07:00
install-sh Clean up spurious trailing white space. 2004-10-04 01:10:51 +00:00
iverilog-vpi.man.in Add library search path option to iverilog-vpi (GitHub issue #145). 2017-01-29 09:32:14 +00:00
iverilog-vpi.sh Use functions instead of macros for VPI routine redirection in Windows. 2019-10-27 09:06:55 +00:00
ivl.def Fix GitHub issue #319 - export ivl_path_is_parallel for Windows DLLs. 2020-04-30 22:55:44 +01:00
ivl_alloc.h Changes for ivl_alloc.h 2015-07-22 09:14:24 -07:00
ivl_assert.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
ivl_target.h Add CA version of the <-> operator 2020-07-09 01:45:43 -07:00
ivl_target.txt Drop useless CVS stuff in .txt files 2009-03-11 10:34:52 -07:00
ivl_target_priv.h Allow classes to reference declarations in their enclosing scope(s). 2019-12-22 10:46:38 +00:00
lexor.lex Add support for <-> in constant and procedural contexts 2020-07-07 23:29:19 -07:00
lexor_keyword.gperf Basic patch from github #44 2014-11-04 11:39:01 -08:00
lexor_keyword.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
link_const.cc Enhanced support for asynchronous set/reset in synthesis. 2016-02-21 21:46:36 +00:00
load_module.cc Fix potential buffer overflows (GitHub issue #346). 2020-07-28 13:17:57 +01:00
lpm.txt Spelling fixes. 2003-01-30 16:23:07 +00:00
main.cc Merge pull request #328 from purdeaandrei/f_allow_libext_and_y_commands_to_be_given_in_any_order 2020-06-03 14:57:09 +01:00
mingw-cross.txt Improve mingw cross instructions. 2019-03-24 10:42:36 -07:00
mingw.txt doc: add MSYS2 readme 2020-12-04 01:34:15 +01:00
mkinstalldirs Update mkinstalldirs to handle paths with spaces. 2009-02-04 08:44:22 -08:00
named.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
net_analog.cc updated FSF-address 2012-08-29 10:12:10 -07:00
net_assign.cc Fix expression type for compressed assignment statements. 2016-02-23 16:53:01 +00:00
net_design.cc Allow nested scopes to use their parent's imports. 2019-09-27 22:19:30 +01:00
net_event.cc Add some synthesis checks for the always_comb/ff/latch blocks 2017-12-27 14:51:17 -08:00
net_expr.cc Fix expression type for packed struct member access (GitHub issue #386) 2020-11-20 16:50:11 +00:00
net_func.cc Non-method tasks/functions support default arguments. 2013-09-20 20:44:57 -07:00
net_func_eval.cc Fix auto_ptr deprecated warnings when building with recent GCC. 2018-10-06 17:15:31 +01:00
net_link.cc Synthesis rework. 2016-02-21 00:00:39 +00:00
net_modulo.cc updated FSF-address 2012-08-29 10:12:10 -07:00
net_nex_input.cc Fix for GitHub issue #277 - incorrect sensitivity calculation. 2019-10-28 21:01:42 +00:00
net_nex_output.cc Add some synthesis checks for the always_comb/ff/latch blocks 2017-12-27 14:51:17 -08:00
net_proc.cc Parse and elaborate unique and priority case statements 2019-10-05 16:23:04 -07:00
net_scope.cc Fix issue #298: elaborate types in the scope where they were declared. 2019-12-22 17:29:23 +00:00
net_tran.cc updated FSF-address 2012-08-29 10:12:10 -07:00
net_udp.cc updated FSF-address 2012-08-29 10:12:10 -07:00
netclass.cc Enable base class tasks to be used in an extended class. 2017-10-08 21:16:50 +01:00
netclass.h Add support for classes defined in $root scope. 2014-09-15 17:37:30 -07:00
netdarray.cc Add initial support for assigning between queues and darrays 2020-08-07 00:23:43 -07:00
netdarray.h A dynamic array can have a signed type so pass that correctly 2015-03-02 14:40:38 -08:00
netenum.cc Enumerations are compatible if their type definitions match. 2014-11-04 15:05:49 -08:00
netenum.h Enumerations are compatible if their type definitions match. 2014-11-04 15:05:49 -08:00
netlist.cc Fix GitHub issue #361 - explicit cast check on function return value. 2020-08-14 12:30:05 +01:00
netlist.h Fix expression type for packed struct member access (GitHub issue #386) 2020-11-20 16:50:11 +00:00
netlist.txt updated FSF-address 2012-08-29 10:12:10 -07:00
netmisc.cc A queue or darray can be assign from a queue or darray. 2020-08-05 23:19:32 -07:00
netmisc.h Improve handling of invalid packed and unpacked dimensions. 2019-09-14 09:10:52 +01:00
netparray.cc Work towards nested packed struct member vectors. 2014-12-23 13:52:38 -08:00
netparray.h Work towards nested packed struct member vectors. 2014-12-23 13:52:38 -08:00
netqueue.cc Add initial support for assigning between queues and darrays 2020-08-07 00:23:43 -07:00
netqueue.h Return the correct value when a queue or darray references an undefined element 2020-07-22 21:47:37 -07:00
netscalar.cc Handle strings as class object properties. 2013-01-27 20:10:25 -08:00
netscalar.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
netstruct.cc Handle enumerations as packed struct/union members. 2013-12-07 12:20:28 -08:00
netstruct.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
nettypes.cc Fix for GitHub issue 112 - index calculation for >2D packed arrays. 2016-07-09 23:33:33 +01:00
nettypes.h Spelling fixes 2015-04-13 11:35:12 -07:00
netvector.cc Generalize struct member type 2013-12-07 12:20:28 -08:00
netvector.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
nodangle.cc Spelling and whitespace 2016-03-14 12:25:50 -07:00
pad_to_width.cc Refactor to use new pad_to_width/cast_to_width functions. 2016-03-25 22:23:45 +00:00
parse.y Detect and complain about some constructor chain errors 2020-11-22 15:31:40 -08:00
parse_api.h Support separate compilation units in SystemVerilog. 2017-10-31 20:38:59 +00:00
parse_misc.cc remove Error:/Warning: prefix from VLerror/VLwarn 2019-07-23 18:58:20 +02:00
parse_misc.h Correctly handle explicit and wildcard package imports. 2019-09-27 22:19:30 +01:00
pform.cc Fix assertion failure when no value supplied with -P option (GitHub issue #377) 2020-10-24 22:48:00 +01:00
pform.h Add support for local genvar declaration in generate loops. 2020-01-31 20:29:22 +00:00
pform_analog.cc updated FSF-address 2012-08-29 10:12:10 -07:00
pform_class_type.cc Record data type for all pform "wires" added the new way. 2019-12-22 11:03:50 +00:00
pform_disciplines.cc updated FSF-address 2012-08-29 10:12:10 -07:00
pform_dump.cc Fix some errors in pform dumps. 2019-12-22 11:26:13 +00:00
pform_package.cc Correctly handle explicit and wildcard package imports. 2019-09-27 22:19:30 +01:00
pform_pclass.cc Detect and complain about some constructor chain errors 2020-11-22 15:31:40 -08:00
pform_string_type.cc Output an error message when a SV variable declaration reuses a name. 2018-02-18 17:51:56 +00:00
pform_struct_type.cc Record data type for all pform "wires" added the new way. 2019-12-22 11:03:50 +00:00
pform_types.cc Create new base class for all named items that can be added to a scope. 2019-09-27 22:19:30 +01:00
pform_types.h Detect and complain about some constructor chain errors 2020-11-22 15:31:40 -08:00
property_qual.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
sv_vpi_user.h Fix GitHub issue #324 - replace __CYGWIN32__ with __CYGWIN__. 2020-05-10 14:06:53 +01:00
svector.h A few updates based on cppcheck results 2017-10-23 00:22:01 -07:00
swift.txt Spelling fixes. 2003-07-15 03:49:22 +00:00
symbol_search.cc Add support for local genvar declaration in generate loops. 2020-01-31 20:29:22 +00:00
syn-rules.y Note the always_comb/ff/latch have not been looked at for synthesis 2017-12-03 20:17:42 -08:00
sync.cc nodangle functor accounts for NexusSet links 2014-05-08 15:05:09 -07:00
synth.cc Add preliminary support for always_comb, always_ff and always_latch 2017-11-20 07:50:05 -08:00
synth2.cc Fix GitHub issue #306 - segfault when synthesising deassign statement. 2020-02-09 18:22:58 +00:00
sys_funcs.cc Remove static system function return descriptors. 2019-10-21 13:49:19 +01:00
t-dll-analog.cc updated FSF-address 2012-08-29 10:12:10 -07:00
t-dll-api.cc Fix translation of module path connection type in vlog95 target. 2020-04-02 12:40:59 +01:00
t-dll-expr.cc Remove duplicate FILE_NAME() call 2020-07-23 18:49:54 -07:00
t-dll-proc.cc Parse and elaborate unique and priority case statements 2019-10-05 16:23:04 -07:00
t-dll.cc Return the correct value when a queue or darray references an undefined element 2020-07-22 21:47:37 -07:00
t-dll.h Fix translation of module path connection type in vlog95 target. 2020-04-02 12:40:59 +01:00
t-dll.txt Spelling and related fixes 2011-04-27 10:36:00 -07:00
target.cc Updated copyright notices. 2016-03-11 23:14:55 +00:00
target.h Updated copyright notices. 2016-03-11 23:14:55 +00:00
util.h Fix for GitHub issue #239 - segfault when library file has syntax errors. 2019-07-24 10:22:55 +01:00
va_math.txt Remove obsolete VAMS $log function. 2010-04-27 12:09:07 -07:00
verilog.spec Bump major version to 12. 2020-10-03 10:13:45 +01:00
verinum.cc Fix for GitHub issue #199: handle signed division overflow. 2018-06-12 21:59:58 +01:00
verinum.h Make a few constructors explicit. 2015-10-22 12:33:33 +02:00
verireal.cc updated FSF-address 2012-08-29 10:12:10 -07:00
verireal.h Update header files to use a more standard name to prevent rereading 2014-07-23 13:42:56 -07:00
veriuser.h Fix GitHub issue #324 - replace __CYGWIN32__ with __CYGWIN__. 2020-05-10 14:06:53 +01:00
version.c Fix some cppcheck warnings and bugs 2015-12-19 17:19:19 -08:00
version_base.h Bump major version to 12. 2020-10-03 10:13:45 +01:00
vpi.txt Update vpi.txt. 2019-10-23 10:04:58 +01:00
vpi_modules.cc Fix GitHub issue #324 - replace __CYGWIN32__ with __CYGWIN__. 2020-05-10 14:06:53 +01:00
vpi_user.h Add basic support for vpiBit 2020-05-31 00:27:15 -07:00
xilinx-hint.txt Spelling fixes. 2003-01-30 16:23:07 +00:00

README.txt

		THE ICARUS VERILOG COMPILATION SYSTEM
		Copyright 2000-2019 Stephen Williams


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 behavioural
constructs. For a view of the current state of Icarus Verilog, see its
home page at <http://iverilog.icarus.com/>.

Icarus Verilog is not aimed at being a simulator in the traditional
sense, but a compiler that generates code employed by back-end
tools.

    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 the 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 on 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
          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
          works fine either.

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

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

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

	- termcap
	  The readline library, in turn, uses termcap.

If you are building from git, you will also need software to generate
the configure scripts.

	- autoconf 2.53 or later
	  This generates configure scripts from configure.in. The 2.53
	  or later versions are known to work, autoconf 2.13 is
	  reported to *not* work.

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

If you are building from git, you have to run the command below before
compiling the source. This will generate the "configure" file, which is
automatically done when building from tarball.

  sh autoconf.sh

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

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

	--enable-suffix
	--enable-suffix=<your-suffix>
	--disable-suffix
	    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.

	--host=<host-type>
	    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.

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 is 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 ``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.)

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 behavioural 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 performed in two steps: scopes and parameters
first, followed by the structural and behavioural 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 file contains most of the code for handling this phase.

The tail of the elaborate_scope behaviour (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 behavioural 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 a collection of processing steps that perform
optimizations that do not depend on the target technology. Examples of
some useful transformations are

	- 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 the need arises
to generate actual output.

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

3.6 ATTRIBUTES

    NOTE: The $attribute syntax will soon be deprecated in favour of the
    Verilog-2001 attribute syntax, which is cleaner and standardized.

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

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.

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 EXAMPLES

Example: Compiling "hello.vl"

------------------------ hello.vl ----------------------------
module main();

initial
  begin
    $display("Hi there");
    $finish ;
  end

endmodule

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

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

  - System functions are supported, but the return value is a little
    tricky. See SYSTEM FUNCTION TABLE FILES in the iverilog man page.

  - Specify blocks are parsed but ignored in general.

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

  - tran primitives, i.e. tran, tranif1, tranif0, rtran, rtranif1
    and rtranif0 are not supported.

  - Net delays, of the form "wire #N foo;" do not work. Delays in
    every other context do work properly, including the V2001 form
    "wire #5 foo = bar;"

  - Event controls inside non-blocking assignments are not supported.
    i.e.: a <= @(posedge clk) b;

  - Macro arguments are not supported. `define macros are supported,
    but they cannot take arguments.

5.1 Nonstandard Constructs or Behaviors

Icarus Verilog includes some features that are not part of the
IEEE1364 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 "extensions.txt" documentation for
more details.

    $is_signed(<expr>)
	This system function returns 1 if the expression contained is
	signed, or 0 otherwise. This is mostly of use for compiler
	regression tests.

    $sizeof(<expr>)
    $bits(<expr>)
	The $bits system function returns the size in bits of the
	expression that is its argument. The result of this
	function is undefined if the argument doesn't have a
	self-determined size.

	The $sizeof function is deprecated in favour of $bits, which is
	the same thing, but included in the SystemVerilog definition.

    $simtime
	The $simtime system function returns as a 64bit value the
	simulation time, unscaled by the time units of local
	scope. This is different from the $time and $stime functions
	which return the scaled times. This function is added for
	regression testing of the compiler and run time, but can be
	used by applications who really want the simulation time.

	Note that the simulation time can be confusing if there are
	lots of different `timescales within a design. It is not in
	general possible to predict what the simulation precision will
	turn out to be.

    $mti_random()
    $mti_dist_uniform
	These functions are similar to the IEEE1364 standard $random
	functions, but they use the Mersenne Twister (MT19937)
	algorithm. This is considered an excellent random number
	generator, but does not generate the same sequence as the
	standardized $random.

    Builtin system functions

	Certain of the system functions have well-defined meanings, so
	can theoretically be evaluated at compile-time, instead of
	using runtime VPI code. Doing so means that VPI cannot
	override the definitions of functions handled in this
	manner. On the other hand, this makes them synthesizable, and
	also allows for more aggressive constant propagation. The
	functions handled in this manner are:

		$bits
		$signed
		$sizeof
		$unsigned

	Implementations of these system functions in VPI modules will
	be ignored.

    Preprocessing Library Modules

	Icarus Verilog does preprocess modules that are loaded from
	libraries via the -y mechanism. However, the only macros
	defined during the compilation of that file are those that it
	defines itself (or includes) or that are defined in the
	command line or command file.

	Specifically, macros defined in the non-library source files
	are not remembered when the library module is loaded. This is
	intentional. If it were otherwise, then compilation results
	might vary depending on the order that libraries are loaded,
	and that is too unpredictable.

	It is said that some commercial compilers do allow macro
	definitions to span library modules. That's just plain weird.

    Width in %t Time Formats

	Standard Verilog does not allow width fields in the %t formats
	of display strings. For example, this is illegal:

		$display("Time is %0t", $time);

	Standard Verilog instead relies on the $timeformat to
	completely specify the format.

	Icarus Verilog allows the programmer to specify the field
	width. The "%t" format in Icarus Verilog works exactly as it
	does in standard Verilog. However, if the programmer chooses
	to specify a minimum width (i.e., "%5t"), then for that display
	Icarus Verilog will override the $timeformat minimum width and
	use the explicit minimum width.

    vpiScope iterator on vpiScope objects.

	In the VPI, the normal way to iterate over vpiScope objects
	contained within a vpiScope object, is the vpiInternalScope
	iterator. Icarus Verilog adds support for the vpiScope
	iterator of a vpiScope object, that iterates over *everything*
	the is contained in the current scope. This is useful in cases
	where one wants to iterate over all the objects in a scope
	without iterating over all the contained types explicitly.

    time 0 race resolution.

	Combinational logic is routinely modelled using always
	blocks. However, this can lead to race conditions if the
	inputs to the combinational block are initialized in initial
	statements. Icarus Verilog slightly modifies time 0 scheduling
	by arranging for always statements with ANYEDGE sensitivity
	lists to be scheduled before any other threads. This causes
	combinational always blocks to be triggered when the values in
	the sensitivity list are initialized by initial threads.

    Nets with Types

	Icarus Verilog supports an extended syntax that allows nets
	and regs to be explicitly typed. The currently supported types
	are logic, bool and real. This implies that "logic" and "bool"
	are new keywords. Typical syntax is:

	wire real foo = 1.0;
	reg logic bar, bat;

	... and so forth. The syntax can be turned off by using the
	-g2 flag to iverilog, and turned on explicitly with the -g2x
	flag to iverilog.

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. Testers, in
particular, include a larger community of people interested in a GPL
Verilog for Linux.