Icarus Verilog
Go to file
Cary R 5cd8bb3a88 Merge branch 'master' of github.com:steveicarus/iverilog 2022-12-27 16:30:42 -08:00
.github ci: Windows: Add gperf to dependency list 2022-12-26 15:07:34 -08:00
Documentation ivtest: Document the ivest/regress-vNN.list file. 2022-12-26 20:10:56 -05:00
cadpli Update cppcheck to not run posix and add some -U flags 2021-01-02 13:23:59 -08:00
driver Allow io-range-error warnings to be disabled (issue #788) 2022-12-18 12:12:26 +00:00
driver-vpi Fix iverilog-vpi on Windows to handle more than one source file (issue #602) 2022-03-26 18:13:18 +00:00
examples updated FSF-address 2012-08-29 10:12:10 -07:00
ivlpp ivlpp: Handle multi-line comments in macros 2022-12-26 16:12:01 -08:00
ivtest Merge branch 'master' of github.com:steveicarus/iverilog 2022-12-27 16:30:42 -08:00
libmisc Use default copy-constructor for LineInfo 2022-04-17 09:14:38 +02:00
libveriuser Update driver and acc/tf directories with changes suggested by cppcheck 2021-01-02 13:45:41 -08:00
msys2 Fix CI on Windows again. 2022-01-07 23:33:41 +00: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 Better handling of root selection for BLIF target. 2022-02-27 18:11:00 -08:00
tgt-fpga Update tgt- directories with cppcheck suggested fixes 2021-01-02 13:31:26 -08:00
tgt-null Update cppcheck to not run posix and add some -U flags 2021-01-02 13:23:59 -08:00
tgt-pal Update cppcheck to not run posix and add some -U flags 2021-01-02 13:23:59 -08:00
tgt-pcb Update cppcheck to not run posix and add some -U flags 2021-01-02 13:23:59 -08:00
tgt-sizer Update cppcheck to not run posix and add some -U flags 2021-01-02 13:23:59 -08:00
tgt-stub Add compiler and the start of vvp support for ->> 2021-02-19 23:21:51 -08:00
tgt-verilog Update tgt- directories with cppcheck suggested fixes 2021-01-02 13:31:26 -08:00
tgt-vhdl Clean up warnings 2022-12-18 10:18:10 -05:00
tgt-vlog95 Support type parameters 2022-12-11 13:50:14 -08:00
tgt-vvp Support type parameters 2022-12-11 13:50:14 -08:00
vhdlpp Clean up warnings 2022-12-18 10:18:10 -05:00
vpi Update to latest FST files 2022-12-27 11:42:07 -08:00
vvp devel: Fix ci build vvp test 2022-12-26 17:16:26 -05: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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00: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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
INSTALL Fix configure scripts to work with autoconf 2.70. 2021-01-01 18:42:01 +00:00
Makefile.in data_type_t: Remove figure_packed_base_type() method 2022-09-15 10:07:10 +02:00
Module.cc Support parameters without default value 2022-02-13 18:21:56 +01:00
Module.h Support parameters without default value 2022-02-13 18:21:56 +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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
PDelays.h Replace svector with std::vector 2022-05-15 21:56:48 +02: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 Add support for typed constructor calls 2022-12-21 20:03:33 -08:00
PExpr.h Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
PFunction.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
PGate.cc Support SV [size] dimension for module and gate instances (issue #553). 2021-11-06 00:02:38 +00:00
PGate.h Replace svector with std::vector 2022-05-15 21:56:48 +02:00
PGenerate.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
PGenerate.h Warn when a negative value is assigned to a genvar (-g2001 only) (issue #567) 2021-12-13 21:30:31 +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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00: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 Allow to attach additional information to typedefs 2022-12-11 10:18:22 -08:00
PScope.h Support type parameters 2022-12-11 13:50:14 -08: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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
PTask.h Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
PUdp.cc Replace svector with std::vector 2022-05-15 21:56:48 +02:00
PUdp.h Replace svector with std::vector 2022-05-15 21:56:48 +02:00
PWire.cc Remove ivl_variable_type_t from PWire 2022-12-11 17:08:24 -08:00
PWire.h Remove ivl_variable_type_t from PWire 2022-12-11 17:08:24 -08:00
QUICK_START.txt Clean up spurious trailing white space. 2004-10-04 01:10:51 +00:00
README.md Clean up Nonstandard behaviors section of README.md 2022-09-13 20:20:39 -04:00
Statement.cc Replace svector with std::vector 2022-05-15 21:56:48 +02:00
Statement.h Add support for void cast function call 2022-12-17 11:19:30 -08: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 Fix configure scripts to work with autoconf 2.70. 2021-01-01 18:42:01 +00:00
async.cc nodangle functor accounts for NexusSet links 2014-05-08 15:05:09 -07:00
attributes.txt
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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
config.guess Updated config.guess and config.sub. 2015-05-04 18:40:53 +01:00
config.h.in Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
config.sub Updated config.guess and config.sub. 2015-05-04 18:40:53 +01:00
configure.ac Use C++11 for building the project 2022-10-15 12:32:02 +02:00
constants.vams Non-controversial whitespace cleanup 2008-09-04 21:31:30 -07:00
cppcheck.sup Update compiler with suggestions from cppcheck 2021-01-02 14:04:46 -08:00
cprop.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
cygwin.txt Clean up spurious trailing white space. 2004-10-04 01:10:51 +00:00
design_dump.cc Make the for_step of for loops optional 2022-12-11 16:39:53 -08: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 Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00: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 NetEConstEnum: Remove unused scope_ field 2022-01-17 20:21:28 +01:00
elab_expr.cc Report an error for size casts with a negative value 2022-12-26 16:07:22 -08:00
elab_lval.cc Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
elab_net.cc Add error checking for continuous unpacked array assignments 2022-12-17 15:29:38 -08:00
elab_scope.cc Report error when trying to declare class methods with static lifetime 2022-12-21 19:28:46 -08:00
elab_sig.cc Allow io-range-error warnings to be disabled (issue #788) 2022-12-18 12:12:26 +00:00
elab_sig_analog.cc updated FSF-address 2012-08-29 10:12:10 -07:00
elab_type.cc Report error for packed struct default member values 2022-12-27 08:46:53 -08:00
elaborate.cc Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
elaborate_analog.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
emit.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
eval_attrib.cc Support full set of constant expressions in attributes 2022-02-12 17:40:45 +01:00
eval_tree.cc eval_tree: Use ivl_assert() instead of assert() 2022-03-03 10:15:32 +01:00
exposenodes.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
expr_synth.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
extensions.txt Spelling fixes 2008-01-29 20:24:24 -08:00
functor.cc Update compiler with suggestions from cppcheck 2021-01-02 14:04:46 -08:00
functor.h Update compiler with suggestions from cppcheck 2021-01-02 14:04:46 -08:00
glossary.txt
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 Support type parameters 2022-12-11 13:50:14 -08:00
ivl_alloc.h Changes for ivl_alloc.h 2015-07-22 09:14:24 -07:00
ivl_assert.h Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
ivl_target.h Support type parameters 2022-12-11 13:50:14 -08: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 Use consistent format for compiler lexor warning messages. 2022-12-22 11:03:11 +00:00
lexor_keyword.gperf Add #include <cstdarg> to all source files that use va_list. 2022-10-12 15:31:35 +13: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 Correctly handle separate port type declaration for `integer` and `time` 2022-03-28 10:40:06 +02:00
load_module.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
lpm.txt
main.cc Support parameters without default value 2022-02-13 18:21:56 +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 Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
net_design.cc Support type parameters 2022-12-11 13:50:14 -08:00
net_event.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
net_expr.cc Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
net_func.cc Remove `NetUserFunc::data_type()` 2022-09-14 13:50:20 +02:00
net_func_eval.cc Remove pre C++11 compatibility code for unique_ptr 2022-10-15 12:32:02 +02:00
net_link.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
net_modulo.cc updated FSF-address 2012-08-29 10:12:10 -07:00
net_nex_input.cc Let void functions in always_comb block contribute to sensitivity list 2022-12-26 16:08:03 -08:00
net_nex_output.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
net_proc.cc Make the for_step of for loops optional 2022-12-11 16:39:53 -08:00
net_scope.cc Support type parameters 2022-12-11 13:50:14 -08:00
net_tran.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
net_udp.cc Replace svector with std::vector 2022-05-15 21:56:48 +02:00
netclass.cc Allow objects to be assigned to a variable of a base class 2022-12-17 14:16:47 -08:00
netclass.h Allow objects to be assigned to a variable of a base class 2022-12-17 14:16:47 -08:00
netdarray.cc Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
netdarray.h Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
netenum.cc Support type identifier base type for enum 2022-03-25 21:55:34 +01:00
netenum.h Support type identifier base type for enum 2022-03-25 21:55:34 +01:00
netlist.cc Handle context signedness and width expansion for method return types 2022-04-14 11:55:09 +02:00
netlist.h Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
netlist.txt updated FSF-address 2012-08-29 10:12:10 -07:00
netmisc.cc Fix $left/$right for C-style unpacked arrays 2022-12-17 09:23:21 -08:00
netmisc.h Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
netparray.cc Add error checking for continuous unpacked array assignments 2022-12-17 15:29:38 -08:00
netparray.h Add error checking for continuous unpacked array assignments 2022-12-17 15:29:38 -08:00
netqueue.cc Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
netqueue.h Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
netscalar.cc Handle strings as class object properties. 2013-01-27 20:10:25 -08:00
netscalar.h netreal_t: Report as signed and scalar 2022-04-12 18:48:59 +02:00
netstruct.cc Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
netstruct.h Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
nettypes.cc Add error checking for continuous unpacked array assignments 2022-12-17 15:29:38 -08:00
nettypes.h Add error checking for continuous unpacked array assignments 2022-12-17 15:29:38 -08:00
netvector.cc Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
netvector.h Improve type compatibility checking for dynamic arrays and queues 2022-10-08 14:01:41 +02:00
nodangle.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
pad_to_width.cc Add support for explicit cast to enum 2022-01-17 20:21:28 +01:00
parse.y Add support for `this.super` 2022-12-25 09:19:21 -08:00
parse_api.h Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
parse_misc.cc Don't automatically add the "warning: " prefix in VLwarn(). 2022-12-22 10:34:56 +00:00
parse_misc.h Remove prototype for unimplemented variant of VLerror(). 2022-12-22 10:18:54 +00:00
pform.cc Merge pull request #824 from larsclausen/class-lifetime 2022-12-24 17:33:29 -08:00
pform.h Fix variable initialization in class methods 2022-12-21 19:28:35 -08:00
pform_analog.cc Add #include <cstdarg> to all source files that use va_list. 2022-10-12 15:31:35 +13:00
pform_disciplines.cc Add #include <cstdarg> to all source files that use va_list. 2022-10-12 15:31:35 +13:00
pform_dump.cc Pretty print THIS_TOKEN and SUPER_TOKEN 2022-12-25 09:19:21 -08:00
pform_package.cc Use consistent format for compiler parser error messages. 2022-12-22 10:13:26 +00:00
pform_pclass.cc Fix variable initialization in class methods 2022-12-21 19:28:35 -08:00
pform_types.cc Add support for forward type declarations 2022-12-11 10:19:59 -08:00
pform_types.h Do not allow to create objects of virtual classes 2022-12-13 21:27:53 -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 Add support for vpiInstance as the type code in calls to vpi_iterate(). 2021-04-21 09:01:50 +01:00
swift.txt
symbol_search.cc Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
syn-rules.y Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00: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 Make the for_step of for loops optional 2022-12-11 16:39:53 -08: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 Support type parameters 2022-12-11 13:50:14 -08:00
t-dll-expr.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
t-dll-proc.cc Add support for handling `super` keyword 2022-12-25 09:19:21 -08:00
t-dll.cc Clean up warnings 2022-12-18 10:18:10 -05:00
t-dll.h Support type parameters 2022-12-11 13:50:14 -08:00
t-dll.txt Spelling and related fixes 2011-04-27 10:36:00 -07:00
target.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
target.h Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
util.h Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
va_math.txt Remove obsolete VAMS $log function. 2010-04-27 12:09:07 -07:00
verilog.spec devel: Step devel past v12 to v13 2022-12-26 12:56:19 -05:00
verinum.cc Fix string handling of escaped special characters. 2022-03-05 18:49:30 -08:00
verinum.h Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
verireal.cc Remove some dead code 2022-02-03 07:04:39 -08:00
verireal.h Remove some dead code 2022-02-03 07:04:39 -08: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 devel: Step devel past v12 to v13 2022-12-26 12:56:19 -05:00
vpi.txt Update vpi.txt. 2019-10-23 10:04:58 +01:00
vpi_modules.cc Remove "using namespace std" from compiler header files and fix the fallout. 2021-11-04 16:55:03 +00:00
vpi_user.h Add basic support for vpiBit 2020-05-31 00:27:15 -07:00
xilinx-hint.txt

README.md

The ICARUS Verilog Compilation System

Copyright 2000-2019 Stephen Williams

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.

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.

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.ac. The 2.53 or later versions are known to work, autoconf 2.13 is reported to not work.

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.

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

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

Uninstallation

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

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.

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.

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

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.

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.

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.

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

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.

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.

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.

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.

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.

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.

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.