From 76047fd83a466672429ff61a139ec17e42e06ecd Mon Sep 17 00:00:00 2001 From: Nish Tahir Date: Tue, 13 Sep 2022 20:08:16 -0400 Subject: [PATCH] Convert README.txt to Markdown --- README.txt => README.md | 216 +++++++++++++++++++++------------------- 1 file changed, 115 insertions(+), 101 deletions(-) rename README.txt => README.md (75%) diff --git a/README.txt b/README.md similarity index 75% rename from README.txt rename to README.md index d04dab88c..53a6dc842 100644 --- a/README.txt +++ b/README.md @@ -1,24 +1,24 @@ - THE ICARUS VERILOG COMPILATION SYSTEM - Copyright 2000-2019 Stephen Williams +# The ICARUS Verilog Compilation System + +Copyright 2000-2019 Stephen Williams -1.0 What is ICARUS Verilog? +## 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 . +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. +> For instructions on how to run Icarus Verilog, see the `iverilog` man page. -2.0 Building/Installing Icarus Verilog From Source +## 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 @@ -26,75 +26,80 @@ 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. +> If you are building on Windows, see the mingw.txt file. -2.1 Compile Time Prerequisites +### 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. +- 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. +- 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. +- 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. +- 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. + 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. +- 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. +- termcap + The readline library, in turn, uses termcap. -If you are building from git, you will also need software to generate -the configure scripts. + > 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. +- 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. -2.2 Compilation +### Compilation -Unpack the tar-ball and cd into the verilog-######### directory +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= The default is /usr/local, which causes the tool suite to be compiled for install in /usr/local/bin, @@ -121,32 +126,37 @@ configure script that modify its behaviour: 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 +### (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 +### 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= flag to the configure command.) You may need +with the `--prefix=` flag to the configure command.) You may need to do this as root to gain access to installation directories. +``` make install +``` -2.5 Uninstallation +### Uninstallation The generated Makefiles also include the uninstall target. This should -remove all the files that ``make install'' creates. +remove all the files that `make install` creates. -3.0 How Icarus Verilog Works +## 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 @@ -155,28 +165,28 @@ 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 +### Preprocessing There is a separate program, ivlpp, that does the preprocessing. This -program implements the `include and `define directives producing +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 +### 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 +(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 '' flag to the ``ivl'' subcommand. This will cause ivl -to dump the pform into the file named . (Note that this is not -normally done, unless debugging the ``ivl'' subcommand.) +`-P ` flag to the `ivl` subcommand. This will cause ivl +to dump the pform into the file named ``. (Note that this is not +normally done, unless debugging the `ivl` subcommand.) -3.3 Elaboration +### Elaboration This phase takes the pform and generates a netlist. The driver selects (by user request or lucky guess) the root module to elaborate, @@ -185,29 +195,29 @@ 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. +The `elaborate()` function performs the elaboration. One can see a human-readable version of the final, elaborated and -optimized netlist by using the ``-N '' flag to the compiler. If +optimized netlist by using the `-N ` 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 . +before code generation) will be dumped into the file named ``. Elaboration is performed in two steps: scopes and parameters first, followed by the structural and behavioural elaboration. -3.3.1 Scope 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. +`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 +#### Netlist Elaboration After the scopes and parameters are generated and the NetScope tree fully formed, the elaboration runs through the pform again, this time @@ -216,7 +226,7 @@ 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 +### Optimization This is a collection of processing steps that perform optimizations that do not depend on the target technology. Examples of @@ -226,46 +236,47 @@ some useful transformations are - combinational reduction - constant propagation -The actual functions performed are specified on the ivl command line by -the -F flags (see below). +The actual functions performed are specified on the `ivl` command line by +the `-F` flags (see below). -3.5 Code Generation +### 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 +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 +The user selects the target code generator with the `-t` flag on the command line. -3.6 ATTRIBUTES +### ATTRIBUTES - NOTE: The $attribute syntax will soon be deprecated in favour of the - Verilog-2001 attribute syntax, which is cleaner and standardized. +> 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 (, , ); +``` 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 must be an identifier. This will be -the item to get an attribute. The and are strings, not +of a system task. The `` must be an identifier. This will be +the item to get an attribute. The `` and `` are strings, not expressions, that give the key and the value of the attribute to be attached to the identified object. -Attributes are [ ] pairs and are used to communicate with +Attributes are `[ ]` 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 +for the attribute statement is the same, except that the `` 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. @@ -280,18 +291,19 @@ 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 +## Running iverilog -The preferred way to invoke the compiler is with the iverilog(1) +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. +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 +## EXAMPLES -Example: Compiling "hello.vl" +Example: Compiling `"hello.vl"` +``` ------------------------ hello.vl ---------------------------- module main(); @@ -304,25 +316,27 @@ initial endmodule -------------------------------------------------------------- - -Ensure that "iverilog" is on your search path, and the vpi library +``` +Ensure that `iverilog` is on your search path, and the vpi library is available. To compile the program: - iverilog hello.vl - +``` + 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. -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 +## 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 @@ -337,22 +351,22 @@ constructs. - Specify blocks are parsed but ignored in general. - - trireg is not supported. tri0 and tri1 are supported. + - `trireg` is not supported. `tri0` and `tri1` are supported. - - tran primitives, i.e. tran, tranif1, tranif0, rtran, rtranif1 - and rtranif0 are not 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 + - 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;" + `wire #5 foo = bar;` - Event controls inside non-blocking assignments are not supported. - i.e.: a <= @(posedge clk) b; + i.e.: `a <= @(posedge clk) b;` - - Macro arguments are not supported. `define macros are supported, + - Macro arguments are not supported. `` `define `` macros are supported, but they cannot take arguments. -5.1 Nonstandard Constructs or Behaviors +## 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 @@ -483,7 +497,7 @@ more details. -g2 flag to iverilog, and turned on explicitly with the -g2x flag to iverilog. -6.0 CREDITS +## CREDITS Except where otherwise noted, Icarus Verilog, ivl and ivlpp are Copyright Stephen Williams. The proper notices are in the head of each