aboutsummaryrefslogtreecommitdiffstats
path: root/doc/using
diff options
context:
space:
mode:
author1138-4EB <1138-4EB@users.noreply.github.com>2017-02-19 08:12:30 +0100
committertgingold <tgingold@users.noreply.github.com>2017-12-10 12:02:05 +0100
commit4c1118d130c5b2dd8aef5ef486138db002dcfda7 (patch)
tree07a0819200358dd97d4e2f045851cc3f033a1c44 /doc/using
parenta1fb74c4fa69c035ea298c3d526a9a277c8db1f7 (diff)
downloadghdl-4c1118d130c5b2dd8aef5ef486138db002dcfda7.tar.gz
ghdl-4c1118d130c5b2dd8aef5ef486138db002dcfda7.tar.bz2
ghdl-4c1118d130c5b2dd8aef5ef486138db002dcfda7.zip
Removed numbers from folder names.
Diffstat (limited to 'doc/using')
-rw-r--r--doc/using/InvokingGHDL.rst1281
-rw-r--r--doc/using/QuickStartGuide.rst359
-rw-r--r--doc/using/Simulation.rst292
3 files changed, 1932 insertions, 0 deletions
diff --git a/doc/using/InvokingGHDL.rst b/doc/using/InvokingGHDL.rst
new file mode 100644
index 000000000..d4bcda438
--- /dev/null
+++ b/doc/using/InvokingGHDL.rst
@@ -0,0 +1,1281 @@
+.. _USING:Invoking:
+
+*************
+Invoking GHDL
+*************
+
+The form of the :program:`ghdl` command is::
+
+ ghdl command [options...]
+
+The GHDL program has several commands. The first argument selects
+the command. The options are used to slightly modify the action.
+
+No option is allowed before the command. Except for the run command,
+no option is allowed after a filename or a unit name.
+
+If the number of options is large and the command line length is
+beyond the system limit, you can use a response file. An argument that
+starts with a :samp:`@` is considered as a response file; it is replaced
+by arguments read from the file (separated by blanks and end of line).
+
+Design building commands
+=================
+
+The mostly used commands of GHDL are those to analyze and elaborate a design.
+
+Analysis command
+----------------
+
+.. index:: analysis
+
+.. index:: -a command
+
+Analyze one or several files::
+
+ ghdl -a [options...] file...
+
+The analysis command compiles one or more files, and creates an
+object file for each source file. The analysis command is selected with
+:option:`-a` switch. Any argument starting with a dash is an option, the
+others are filenames. No options are allowed after a filename
+argument. GHDL analyzes each filename in the given order, and stops the
+analysis in case of error (the following files are not analyzed).
+
+See :ref:`GHDL_options`, for details on the GHDL options. For example,
+to produce debugging information such as line numbers, use::
+
+ ghdl -a -g my_design.vhdl
+
+
+.. _Elaboration_command:
+
+Elaboration command
+-------------------
+
+.. index:: elaboration
+
+.. index:: -e command
+
+Elaborate a design::
+
+ ghdl -e [options..] primary_unit [secondary_unit]
+
+
+On GNU/Linux, if the GCC backend was enabled during the compilation of `GHDL`,
+the elaboration command creates an executable containing the code of the `VHDL`
+sources, the elaboration code and simulation code to execute a design
+hierarchy. The executable is created in the current directory.
+On Windows or if the GCC backend was not enabled, this command elaborates the design
+but does not generate anything.
+
+The elaboration command is selected with :option:`-e` switch, and must be
+followed by either:
+
+* a name of a configuration unit
+* a name of an entity unit
+* a name of an entity unit followed by a name of an architecture unit
+
+Name of the units must be a simple name, without any dot. You can
+select the name of the `WORK` library with the :option:`--work=NAME`
+option, as described in :ref:`GHDL_options`.
+
+See :ref:`Top_entity`, for the restrictions on the root design of a
+hierarchy.
+
+On GNU/Linux the filename of the executable is the name of the
+primary unit, or for the later case, the concatenation of the name of
+the primary unit, a dash, and the name of the secondary unit (or
+architecture). On Windows there is no executable generated.
+
+The :option:`-o` followed by a filename can override the default
+executable filename.
+
+For the elaboration command, `GHDL` re-analyzes all the
+configurations, entities, architectures and package declarations, and
+creates the default configurations and the default binding indications
+according to the LRM rules. It also generates the list of objects files
+required for the executable. Then, it links all these files with the
+runtime library.
+
+The actual elaboration is performed at runtime.
+
+On Windows this command can be skipped because it is also done by the
+run command.
+
+.. _Run_command:
+
+Run command
+-----------
+
+.. index:: run
+
+.. index:: -r command
+
+Run (or simulate) a design::
+
+ ghdl -r [options...] primary_unit [secondary_unit] [simulation_options...]
+
+
+The options and arguments are the same as for the elaboration command, :ref:`Elaboration_command`.
+
+On GNU/Linux this command simply determines the filename of the executable
+and executes it. Options are ignored. You may also directly execute
+the program. The executable must be in the current directory.
+
+This command exists for three reasons:
+
+* You don't have to create the executable program name.
+* It is coherent with the :option:`-a` and :option:`-e` commands.
+* It works with the Windows implementation, where the code is generated in
+ memory.
+
+On Windows this command elaborates and launches the simulation. As a consequence
+you must use the same options used during analysis.
+
+See :ref:`Simulation_and_runtime`, for details on options.
+
+Elaborate and run command
+-------------------------
+
+.. index:: elaborate and run
+
+.. index:: --elab-run command
+
+Elaborate and then simulate a design unit::
+
+ ghdl --elab-run [elab_options...] primary_unit [secondary_unit] [run_options...]
+
+
+This command acts like the elaboration command (see :ref:`Elaboration_command`)
+followed by the run command (see :ref:`Run_command`).
+
+.. _Bind_command:
+
+Bind command
+------------
+
+.. index:: binding
+
+.. index:: --bind command
+
+Bind a design unit and prepare the link step::
+
+ ghdl --bind [options] primary_unit [secondary_unit]
+
+
+This command is only available on GNU/Linux.
+
+This performs only the first stage of the elaboration command; the list
+of objects files is created but the executable is not built. This
+command should be used only when the main entry point is not ghdl.
+
+.. _Link_command:
+
+Link command
+------------
+
+.. index:: linking
+
+.. index:: --link command
+
+Link an already bound design unit::
+
+ ghdl --link [options] primary_unit [secondary_unit]
+
+This performs only the second stage of the elaboration command: the
+executable is created by linking the files of the object files list.
+This command is available only for completeness. The elaboration command is
+equivalent to the bind command followed by the link command.
+
+.. _List_link_command:
+
+List link command
+-----------------
+
+.. index:: --list-link command
+
+Display files which will be linked::
+
+ ghdl --list-link primary_unit [secondary_unit]
+
+This command is only available on GNU/Linux.
+
+This command may be used only after a bind command. GHDL displays all
+the files which will be linked to create an executable. This command is
+intended to add object files in a link of a foreign program.
+
+.. _Check_syntax_command:
+
+Check syntax command
+--------------------
+
+.. index:: checking syntax
+
+.. index:: -s command
+
+Analyze files but do not generate code::
+
+ ghdl -s [options] files
+
+This command may be used to check the syntax of files. It does not update
+the library.
+
+.. _Analyze_and_elaborate_command:
+
+Analyze and elaborate command
+-----------------------------
+
+.. index:: Analyze and elaborate command
+
+.. index:: -c command
+
+Analyze files and elaborate them at the same time.
+
+On GNU/Linux::
+
+ ghdl -c [options] file... -e primary_unit [secondary_unit]
+
+
+On Windows::
+
+ ghdl -c [options] file... -r primary_unit [secondary_unit]
+
+
+This command combines analysis and elaboration: files are analyzed and
+the unit is then elaborated. However, code is only generated during the
+elaboration. On Windows the simulation is launched.
+
+To be more precise, the files are first parsed, and then the elaboration
+drives the analysis. Therefore, there is no analysis order, and you don't
+need to care about it.
+
+All the units of the files are put into the `work` library. But, the
+work library is neither read from disk nor saved. Therefore, you must give
+all the files of the `work` library your design needs.
+
+The advantages over the traditional approach (analyze and then elaborate) are:
+
+* The compilation cycle is achieved in one command.
+* Since the files are only parsed once, the compilation cycle may be faster.
+* You don't need to know an analysis order
+* This command produces smaller executable, since unused units and subprograms
+ do not generate code.
+
+However, you should know that currently most of the time is spent in code
+generation and the analyze and elaborate command generate code for all units
+needed, even units of :samp:`std` and :samp:`ieee` libraries. Therefore,
+according to the design, the time for this command may be higher than the time
+for the analyze command followed by the elaborate command.
+
+This command is still experimental. In case of problems, you should go back
+to the traditional way.
+
+.. _GHDL_Options:
+
+GHDL options
+============
+
+.. index:: IEEE 1164
+
+.. index:: 1164
+
+.. index:: IEEE 1076.3
+
+.. index:: 1076.3
+
+Besides the options described below, `GHDL` passes any debugging options
+(those that begin with :option:`-g`) and optimizations options (those that
+begin with :option:`-O` or :option:`-f`) to `GCC`. Refer to the `GCC`
+manual for details.
+
+
+
+.. option::--work=<NAME>
+
+ .. index:: WORK library
+
+ Specify the name of the :samp:`WORK` library. Analyzed units are always
+ placed in the library logically named :samp:`WORK`. With this option,
+ you can set its name. By default, the name is :samp:`work`.
+
+ `GHDL` checks whether :samp:`WORK` is a valid identifier. Although being
+ more or less supported, the :samp:`WORK` identifier should not be an
+ extended identifier, since the filesystem may prevent it from correctly
+ working (due to case sensitivity or forbidden characters in filenames).
+
+ `VHDL` rules forbid you to add units to the :samp:`std` library.
+ Furthermore, you should not put units in the :samp:`ieee` library.
+
+
+.. option:: --workdir=<DIR>
+
+ Specify the directory where the :samp:`WORK` library is located. When this
+ option is not present, the :samp:`WORK` library is in the current
+ directory. The object files created by the compiler are always placed
+ in the same directory as the :samp:`WORK` library.
+
+ Use option :option:`-P` to specify where libraries other than :samp:`WORK`
+ are placed.
+
+
+.. option:: --std=<STD>
+
+ Specify the standard to use. By default, the standard is :samp:`93c`, which
+ means VHDL-93 accepting VHDL-87 syntax. For details on :samp:`STD` values see
+ :ref:`VHDL_standards`.
+
+
+.. option:: --ieee=<VER>
+
+ .. index:: ieee library
+ .. index:: synopsys library
+ .. index:: mentor library
+
+ Select the :samp:`IEEE` library to use. :samp:`VER` must be one of:
+
+ none
+ Do not supply an `IEEE` library. Any library clause with the :samp:`IEEE`
+ identifier will fail, unless you have created by your own a library with
+ the `IEEE` name.
+
+ standard
+ Supply an `IEEE` library containing only packages defined by
+ :samp:`ieee` standards. Currently, there are the multivalue logic system
+ packages :samp:`std_logic_1164` defined by IEEE 1164, the synthesis
+ packages , :samp:`numeric_bit` and :samp:`numeric_std` defined by IEEE
+ 1076.3, and the :samp:`vital` packages :samp:`vital_timing` and
+ :samp:`vital_primitives`, defined by IEEE 1076.4. The version of these
+ packages is defined by the VHDL standard used. See :ref:`VITAL_packages`,
+ for more details.
+
+ synopsys
+ Supply the former packages and the following additional packages:
+ :samp:`std_logic_arith`, :samp:`std_logic_signed`,
+ :samp:`std_logic_unsigned`, :samp:`std_logic_textio`.
+
+ These packages were created by some companies, and are popular. However
+ they are not standard packages, and have been placed in the `IEEE`
+ library without the permission from the :samp:`ieee`.
+
+ mentor
+ Supply the standard packages and the following additional package:
+ :samp:`std_logic_arith`. The package is a slight variation of a definitely
+ not standard but widely mis-used package.
+
+ To avoid errors, you must use the same `IEEE` library for all units of
+ your design, and during elaboration.
+
+
+.. option:: -P<DIRECTORY>
+
+ Add `DIRECTORY` to the end of the list of directories to be searched for
+ library files. A library is searched in `DIRECTORY` and also in
+ `DIRECTORY/LIB/vVV` (where `LIB` is the name of the library and `VV`
+ the vhdl standard).
+
+ The `WORK` library is always searched in the path specified by the
+ :option:`--workdir=` option, or in the current directory if the latter
+ option is not specified.
+
+
+.. option:: -fexplicit
+
+ When two operators are overloaded, give preference to the explicit declaration.
+ This may be used to avoid the most common pitfall of the :samp:`std_logic_arith`
+ package. See :ref:`IEEE_library_pitfalls`, for an example.
+
+ This option is not set by default. I don't think this option is a
+ good feature, because it breaks the encapsulation rule. When set, an
+ operator can be silently overridden in another package. You'd better to fix
+ your design and use the :samp:`numeric_std` package.
+
+
+.. option:: -frelaxed-rules
+
+ Within an object declaration, allow to reference the name (which
+ references the hidden declaration). This ignores the error in the
+ following code:
+
+ .. code-block:: VHDL
+
+ package pkg1 is
+ type state is (state1, state2, state3);
+ end pkg1;
+
+ use work.pkg1.all;
+ package pkg2 is
+ constant state1 : state := state1;
+ end pkg2;
+
+ Some code (such as Xilinx packages) have such constructs, which
+ are valid.
+
+ (The scope of the :samp:`state1` constant start at the `constant`
+ word. Because the constant :samp:`state1` and the enumeration literal
+ :samp:`state1` are homograph, the enumeration literal is hidden in the
+ immediate scope of the constant).
+
+ This option also relaxes the rules about pure functions. Violations
+ result in warnings instead of errors.
+
+
+.. option:: -fpsl
+
+ Enable parsing of PSL assertions within comments. See :ref:`PSL_implementation`,
+ for more details.
+
+
+.. option:: --no-vital-checks
+.. option:: --vital-checks
+
+ Disable or enable checks of restriction on VITAL units. Checks are enabled
+ by default.
+
+ Checks are performed only when a design unit is decorated by a VITAL attribute.
+ The VITAL attributes are :samp:`VITAL_Level0` and :samp:`VITAL_Level1`, both
+ declared in the :samp:`ieee.VITAL_Timing` package.
+
+ Currently, VITAL checks are only partially implemented. See
+ :ref:`VHDL_restrictions_for_VITAL`, for more details.
+
+
+.. option:: --syn-binding
+
+ Use synthesizer rules for component binding. During elaboration, if a
+ component is not bound to an entity using VHDL LRM rules, try to find
+ in any known library an entity whose name is the same as the component
+ name.
+
+ This rule is known as synthesizer rule.
+
+ There are two key points: normal VHDL LRM rules are tried first and
+ entities are searched only in known library. A known library is a
+ library which has been named in your design.
+
+ This option is only useful during elaboration.
+
+
+.. option:: --PREFIX=<PATH>
+
+ Use :file:`PATH` as the prefix path to find commands and pre-installed (std and
+ ieee) libraries.
+
+
+.. option:: --GHDL1=<COMMAND>
+
+ Use :samp:`COMMAND` as the command name for the compiler. If :samp:`COMMAND` is
+ not a path, then it is searched in the path.
+
+
+.. option:: --AS=<COMMAND>
+
+ Use :samp:`COMMAND` as the command name for the assembler. If :samp:`COMMAND` is
+ not a path, then it is searched in the path. The default is :samp:`as`.
+
+
+.. option:: --LINK=<COMMAND>
+
+ Use :samp:`COMMAND` as the linker driver. If :samp:`COMMAND` is
+ not a path, then it is searched in the path. The default is :samp:`gcc`.
+
+
+.. option:: -v
+
+ Be verbose. For example, for analysis, elaboration and make commands, GHDL
+ displays the commands executed.
+
+
+Passing options to other programs
+=================================
+
+These options are only available on GNU/Linux.
+
+For many commands, `GHDL` acts as a driver: it invokes programs to perform
+the command. You can pass arbitrary options to these programs.
+
+Both the compiler and the linker are in fact GCC programs. See the
+GCC manual for details on GCC options.
+
+
+
+.. option:: -Wc,<OPTION>
+
+ Pass `OPTION` as an option to the compiler.
+
+
+.. option:: -Wa,<OPTION>
+
+ Pass `OPTION` as an option to the assembler.
+
+
+.. option:: -Wl,<OPTION>
+
+ Pass `OPTION` as an option to the linker.
+
+GHDL Diagnostics Control
+========================
+
+.. option:: -fcolor-diagnostics
+.. option:: -fno-color-diagnostics
+
+ Control whether diagnostic messages are displayed in color. The
+ default is on when the standard output is a terminal.
+
+.. option:: -fdiagnostics-show-option
+.. option:: -fno-diagnostics-show-option
+
+ Control whether the warning option is displayed at the end of
+ warning messages, so that user can easily know how to disable it.
+
+
+GHDL warnings
+=============
+
+Some constructions are not erroneous but dubious. Warnings are diagnostic
+messages that report such constructions. Some warnings are reported only
+during analysis, others during elaboration.
+
+You could disable a warning by using the :samp:`--warn-no-XXX` or
+:samp:`-Wno-XX` instead of :samp:`--warn-XXX` or :samp:`-WXXX`.
+
+
+.. option:: --warn-reserved
+
+ Emit a warning if an identifier is a reserved word in a later VHDL standard.
+
+
+.. option:: --warn-default-binding
+
+ During analyze, warns if a component instantiation has neither
+ configuration specification nor default binding. This may be useful if you
+ want to detect during analyze possibly unbound component if you don't use
+ configuration. :ref:`VHDL_standards`, for more details about default binding
+ rules.
+
+
+.. option:: --warn-binding
+
+ During elaboration, warns if a component instantiation is not bound
+ (and not explicitly left unbound). Also warns if a port of an entity
+ is not bound in a configuration specification or in a component
+ configuration. This warning is enabled by default, since default
+ binding rules are somewhat complex and an unbound component is most
+ often unexpected.
+
+ However, warnings are even emitted if a component instantiation is
+ inside a generate statement. As a consequence, if you use the conditional
+ generate statement to select a component according to the implementation,
+ you will certainly get warnings.
+
+
+.. option:: --warn-library
+
+ Warns if a design unit replaces another design unit with the same name.
+
+
+.. option:: --warn-vital-generic
+
+ Warns if a generic name of a vital entity is not a vital generic name. This
+ is set by default.
+
+
+.. option:: --warn-delayed-checks
+
+ Warns for checks that cannot be done during analysis time and are
+ postponed to elaboration time. This is because not all procedure
+ bodies are available during analysis (either because a package body
+ has not yet been analysed or because `GHDL` doesn't read not required
+ package bodies).
+
+ These are checks for no wait statement in a procedure called in a
+ sensitized process and checks for pure rules of a function.
+
+
+.. option:: --warn-body
+
+ Emit a warning if a package body which is not required is analyzed. If a
+ package does not declare a subprogram or a deferred constant, the package
+ does not require a body.
+
+
+.. option:: --warn-specs
+
+ Emit a warning if an all or others specification does not apply.
+
+
+.. option:: --warn-unused
+
+ Emit a warning when a subprogram is never used.
+
+
+.. option:: --warn-error
+
+ When this option is set, warnings are considered as errors.
+
+
+.. option:: --warn-nested-comment
+
+ Emit a warning if a :samp:`/*` appears within a block comment (vhdl 2008).
+
+
+.. option:: --warn-parenthesis
+
+ Emit a warning in case of weird use of parenthesis
+
+
+.. option:: --warn-runtime-error
+
+ Emit a warning in case of runtime error that is detected during
+ analysis.
+
+
+Rebuilding commands
+===================
+
+Analyzing and elaborating a design consisting in several files can be tricky,
+due to dependencies. GHDL has a few commands to rebuild a design.
+
+Import command
+--------------
+
+.. index:: importing files
+
+.. index:: -i command
+
+Add files in the work design library::
+
+ ghdl -i [options] file...
+
+
+All the files specified in the command line are scanned, parsed and added in
+the libraries but as not yet analyzed. No object files are created.
+
+The purpose of this command is to localize design units in the design files.
+The make command will then be able to recursively build a hierarchy from
+an entity name or a configuration name.
+
+Since the files are parsed, there must be correct files. However, since they
+are not analyzed, many errors are tolerated by this command.
+
+Note that all the files are added to the work library. If you have many
+libraries, you must use the command for each library.
+
+See :ref:`Make_command`, to actually build the design.
+
+.. _Make_command:
+
+Make command
+------------
+
+.. index:: make
+
+.. index:: -m command
+
+
+Analyze automatically outdated files and elaborate a design::
+
+ ghdl -m [options] primary [secondary]
+
+
+The primary unit denoted by the :samp:`primary` argument must already be
+known by the system, either because you have already analyzed it (even
+if you have modified it) or because you have imported it. GHDL analyzes
+all outdated files. A file may be outdated because it has been modified
+(e.g. you just have edited it), or because a design unit contained in
+the file depends on a unit which is outdated. This rule is of course
+recursive.
+
+With the @code{-b} (bind only) option, GHDL will stop before the final linking
+step. This is useful when the main entry point is not GHDL and you're linking
+GHDL object files into a foreign program.
+
+With the :option:`-f` (force) option, GHDL analyzes all the units of the
+work library needed to create the design hierarchy. Not outdated units
+are recompiled. This is useful if you want to compile a design hierarchy
+with new compilation flags (for example, to add the *-g*
+debugging option).
+
+The make command will only re-analyze design units in the work library.
+GHDL fails if it has to analyze an outdated unit from another library.
+
+The purpose of this command is to be able to compile a design without prior
+knowledge of file order. In the VHDL model, some units must be analyzed
+before others (e.g. an entity before its architecture). It might be a
+nightmare to analyze a full design of several files, if you don't have
+the ordered list of file. This command computes an analysis order.
+
+The make command fails when a unit was not previously parsed. For
+example, if you split a file containing several design units into
+several files, you must either import these new files or analyze them so
+that GHDL knows in which file these units are.
+
+The make command imports files which have been modified. Then, a design
+hierarchy is internally built as if no units are outdated. Then, all outdated
+design units, using the dependencies of the design hierarchy, are analyzed.
+If necessary, the design hierarchy is elaborated.
+
+This is not perfect, since the default architecture (the most recently
+analyzed one) may change while outdated design files are analyzed. In
+such a case, re-run the make command of GHDL.
+
+Generate Makefile command
+-------------------------
+
+.. index:: --gen-makefile command
+
+Generate a Makefile to build a design unit::
+
+ ghdl --gen-makefile [options] primary [secondary]
+
+
+This command works like the make command (see :ref:`Make_command`), but only a
+makefile is generated on the standard output.
+
+Library commands
+================
+
+GHDL has a few commands which act on a library.
+
+Directory command
+-----------------
+
+.. index:: displaying library
+
+.. index:: --dir command
+.. option::--dir
+
+Display the name of the units contained in a design library::
+
+ ghdl --dir [options] [libs]
+
+The directory command, selected with the `--dir` command line argument
+displays the content of the design libraries (by default the
+:samp:`work` library). All options are
+allowed, but only a few are meaningful: :option:`--work=NAME`,
+:option:`--workdir=PATH` and :option:`--std=VER`.
+
+Clean command
+-------------
+
+.. index:: cleaning
+
+.. index:: --clean command
+
+Remove object and executable files but keep the library::
+
+ ghdl --clean [options]
+
+
+GHDL tries to remove any object, executable or temporary file it could
+have created. Source files are not removed.
+
+There is no short command line form for this option to prevent accidental
+clean up.
+
+.. _Remove_command:
+
+Remove command
+--------------
+
+.. index:: cleaning all
+
+.. index:: --remove command
+
+Do like the clean command but remove the library too::
+
+ ghdl --remove [options]
+
+
+There is no short command line form for this option to prevent accidental
+clean up. Note that after removing a design library, the files are not
+known anymore by GHDL.
+
+.. _Copy_command:
+
+Copy command
+------------
+
+.. index:: copying library
+
+.. index:: --copy command
+
+Make a local copy of an existing library::
+
+ ghdl --copy --work=name [options]
+
+
+Make a local copy of an existing library. This is very useful if you want to
+add unit to the :samp:`ieee` library:
+
+.. code-block:: shell
+
+ ghdl --copy --work=ieee --ieee=synopsys
+ ghdl -a --work=ieee numeric_unsigned.vhd
+
+
+.. _Create_a_Library:
+
+Create a Library
+----------------
+
+.. index:: create your own library
+
+A new library is created by compiling entities (packages etc.) into it::
+
+ ghdl -a --work=my_custom_lib my_file.vhd
+
+
+A library's source code is usually stored and compiled into its own directory,
+that you specify with the :option:`--workdir` option::
+
+ ghdl -a --work=my_custom_lib --workdir=my_custom_libdir my_custom_lib_srcdir/my_file.vhd
+
+
+See also the :option:`-PPATH` command line option.
+
+.. _Cross-reference_command:
+
+Cross-reference command
+=======================
+
+To easily navigate through your sources, you may generate cross-references::
+
+ ghdl --xref-html [options] file...
+
+
+This command generates an html file for each :samp:`file` given in the command
+line, with syntax highlighting and full cross-reference: every identifier is
+a link to its declaration. Besides, an index of the files is created too.
+
+The set of :samp:`file` are analyzed, and then, if the analysis is
+successful, html files are generated in the directory specified by the
+:option:`-o dir` option, or :file:`html/` directory by default.
+
+If the option :option:`--format=html2` is specified, then the generated html
+files follow the HTML 2.0 standard, and colours are specified with
+`<FONT>` tags. However, colours are hard-coded.
+
+If the option :option:`--format=css` is specified, then the generated html files
+follow the HTML 4.0 standard, and use the CSS-1 file :file:`ghdl.css` to
+specify colours. This file is generated only if it does not already exist (it
+is never overwritten) and can be customized by the user to change colours or
+appearance. Refer to a generated file and its comments for more information.
+
+File commands
+=============
+
+The following commands act on one or several files. They do not analyze
+files, therefore, they work even if a file has semantic errors.
+
+Pretty print command
+--------------------
+
+.. index:: --pp-html command
+
+.. index:: pretty printing
+
+.. index:: vhdl to html
+
+Generate HTML on standard output from VHDL::
+
+ ghdl --pp-html [options] file...
+
+
+The files are just scanned and an html file, with syntax highlighting is
+generated on standard output.
+
+Since the files are not even parsed, erroneous files or incomplete designs
+can be pretty printed.
+
+The style of the html file can be modified with the :option:`--format=` option.
+By default or when the :option:`--format=html2` option is specified, the output
+is an HTML 2.0 file, with colours set through `<FONT>` tags. When the
+:option:`--format=css` option is specified, the output is an HTML 4.0 file,
+with colours set through a CSS file, whose name is :file:`ghdl.css`.
+See :ref:`Cross-reference_command`, for more details about this CSS file.
+
+Find command
+------------
+
+.. index:: -f command
+
+Display the name of the design units in files::
+
+ ghdl -f file...
+
+
+The files are scanned, parsed and the names of design units are displayed.
+Design units marked with two stars are candidate to be at the apex of a
+design hierarchy.
+
+Chop command
+------------
+
+.. index:: --chop command
+
+Chop (or split) files at design unit::
+
+ ghdl --chop files
+
+
+`GHDL` reads files, and writes a file in the current directory for
+every design unit.
+
+The filename of a design unit is build according to the unit. For an
+entity declaration, a package declaration or a configuration the file
+name is :file:`NAME.vhdl`, where `NAME` is the name of the design
+unit. For a package body, the filename is :file:`NAME-body.vhdl`.
+Finally, for an architecture `ARCH` of an entity `ENTITY`, the
+filename is :file:`ENTITY-ARCH.vhdl`.
+
+Since the input files are parsed, this command aborts in case of syntax
+error. The command aborts too if a file to be written already exists.
+
+Comments between design units are stored into the most adequate files.
+
+This command may be useful to split big files, if your computer has not
+enough memory to compile such files. The size of the executable is
+reduced too.
+
+Lines command
+-------------
+
+.. index:: --lines command
+
+Display on the standard output lines of files preceded by line number::
+
+ ghdl --lines files
+
+
+Misc commands
+=============
+
+There are a few GHDL commands which are seldom useful.
+
+.. _Help_command:
+
+Help command
+------------
+
+.. index:: -h command
+
+.. index:: --help command
+
+Display (on the standard output) a short description of the all the commands
+available. If the help switch is followed by a command switch, then options
+for this later command are displayed::
+
+ ghdl --help
+ ghdl -h
+ ghdl -h command
+
+
+.. _Disp_config_command:
+
+Disp config command
+-------------------
+
+.. index:: --disp-config command
+
+.. index:: display configuration
+
+Display the program paths and options used by GHDL::
+
+ ghdl --disp-config [options]
+
+
+This may be useful to track installation errors.
+
+Disp standard command
+---------------------
+
+.. index:: --disp-standard command
+
+.. index:: display :samp:`std.standard`
+
+Display the :samp:`std.standard` package::
+
+ ghdl --disp-standard [options]
+
+
+Version command
+---------------
+
+.. index:: --version command
+
+.. index:: version
+
+Display the `GHDL` version and exit::
+
+ ghdl --version
+
+
+VPI build commands
+==================
+
+These commands simplify the compile and the link of a user vpi
+module. They are all wrapper: the arguments are in fact a whole
+command line that is executed with additional switches. Currently a
+unix-like compiler (like `cc`, `gcc` or `clang`) is expected: the additional
+switches use their syntax. The only option is `-v` which displays the
+command before its execution.
+
+.. _VPI_compile_command:
+
+VPI compile command
+-------------------
+
+.. index:: --vpi-compile command
+
+Add include path to the command and execute it::
+
+ ghdl --vpi-compile command
+
+This will execute::
+
+ command -Ixxx/include
+
+For example::
+
+ ghdl --vpi-compile gcc -c vpi1.c
+
+executes::
+
+ gcc -c vpi1.c -fPIC -Ixxx/include
+
+.. _VPI_link_command:
+
+VPI link command
+----------------
+
+.. index:: --vpi-link command
+
+Add library path and name to the command and execute it::
+
+ ghdl --vpi-link command
+
+This will execute::
+
+ command -Lxxx/lib -lghdlvpi
+
+For example::
+
+ ghdl --vpi-link gcc -o vpi1.vpi vpi1.o
+
+executes::
+
+ gcc -o vpi1.vpi vpi1.o --shared -Lxxx/lib -lghdlvpi
+
+
+.. _VPI_cflags_command:
+
+VPI cflags command
+------------------
+
+.. index:: --vpi-cflags command
+
+Display flags added by :option:`--vpi-compile`::
+
+ ghdl --vpi-cflags
+
+
+.. _VPI_ldflags_command:
+
+VPI ldflags command
+-------------------
+
+.. index:: --vpi-ldflags command
+
+Display flags added by :option:`--vpi-link`::
+
+ ghdl --vpi-ldflags
+
+.. _VPI_include_dir_command:
+
+VPI include dir command
+-----------------------
+
+.. index:: --vpi-include-dir command
+
+Display the include directory added by the compile flags::
+
+ ghdl --vpi-include-dir
+
+.. _VPI_library_dir_command:
+
+VPI library dir command
+-----------------------
+
+.. index:: --vpi-library-dir command
+
+Display the library directory added by the link flags::
+
+ ghdl --vpi-library-dir
+
+
+Installation Directory
+======================
+
+During analysis and elaboration `GHDL` may read the `std`
+and `ieee` files. The location of these files is based on the prefix,
+which is (in priority order):
+
+* the :option:`--PREFIX=` command line option
+
+* the :envvar:`GHDL_PREFIX` environment variable
+
+*
+ a built-in default path. It is a hard-coded path on GNU/Linux and the
+ value of the :samp:`HKLM\Software\Ghdl\Install_Dir` registry entry on Windows.
+
+You should use the :option:`--disp-config` command (:ref:`Disp_config_command` for details) to disp and debug installation problems.
+
+.. _ieee_library_pitfalls:
+
+IEEE library pitfalls
+=====================
+
+When you use options :option:`--ieee=synopsys` or :option:`--ieee=mentor`,
+the `IEEE` library contains non standard packages such as
+:samp:`std_logic_arith`.
+
+These packages are not standard because there are not described by an IEEE
+standard, even if they have been put in the `IEEE` library. Furthermore,
+they are not really de-facto standard, because there are slight differences
+between the packages of Mentor and those of Synopsys.
+
+Furthermore, since they are not well-thought, their use has pitfalls. For
+example, this description has error during compilation:
+
+.. code-block:: VHDL
+
+ library ieee;
+ use ieee.std_logic_1164.all;
+
+ -- A counter from 0 to 10.
+ entity counter is
+ port (val : out std_logic_vector (3 downto 0);
+ ck : std_logic;
+ rst : std_logic);
+ end counter;
+
+ library ieee;
+ use ieee.std_logic_unsigned.all;
+
+ architecture bad of counter
+ is
+ signal v : std_logic_vector (3 downto 0);
+ begin
+ process (ck, rst)
+ begin
+ if rst = '1' then
+ v <= x"0";
+ elsif rising_edge (ck) then
+ if v = "1010" then -- Error
+ v <= x"0";
+ else
+ v <= v + 1;
+ end if;
+ end if;
+ end process;
+
+ val <= v;
+ end bad;
+
+
+When you analyze this design, GHDL does not accept it (too long lines
+have been split for readability):
+
+.. code-block:: shell
+
+ ghdl -a --ieee=synopsys bad_counter.vhdl
+ bad_counter.vhdl:13:14: operator "=" is overloaded
+ bad_counter.vhdl:13:14: possible interpretations are:
+ ../../libraries/ieee/std_logic_1164.v93:69:5: implicit function "="
+ [std_logic_vector, std_logic_vector return boolean]
+ ../../libraries/synopsys/std_logic_unsigned.vhdl:64:5: function "="
+ [std_logic_vector, std_logic_vector return boolean]
+ ../translate/ghdldrv/ghdl: compilation error
+
+Indeed, the `"="` operator is defined in both packages, and both
+are visible at the place it is used. The first declaration is an
+implicit one, which occurs when the `std_logic_vector` type is
+declared and is an element to element comparison, the second one is an
+explicit declared function, with the semantic of an unsigned comparison.
+
+With some analyser, the explicit declaration has priority over the implicit
+declaration, and this design can be analyzed without error. However, this
+is not the rule given by the VHDL LRM, and since GHDL follows these rules,
+it emits an error.
+
+You can force GHDL to use this rule with the *-fexplicit* option.
+:ref:`GHDL_options`, for more details.
+
+However it is easy to fix this error, by using a selected name:
+
+.. code-block:: VHDL
+
+ library ieee;
+ use ieee.std_logic_unsigned.all;
+
+ architecture fixed_bad of counter
+ is
+ signal v : std_logic_vector (3 downto 0);
+ begin
+ process (ck, rst)
+ begin
+ if rst = '1' then
+ v <= x"0";
+ elsif rising_edge (ck) then
+ if ieee.std_logic_unsigned."=" (v, "1010") then
+ v <= x"0";
+ else
+ v <= v + 1;
+ end if;
+ end if;
+ end process;
+
+ val <= v;
+ end fixed_bad;
+
+
+It is better to only use the standard packages defined by IEEE, which
+provides the same functionalities:
+
+.. code-block:: VHDL
+
+ library ieee;
+ use ieee.numeric_std.all;
+
+ architecture good of counter
+ is
+ signal v : unsigned (3 downto 0);
+ begin
+ process (ck, rst)
+ begin
+ if rst = '1' then
+ v <= x"0";
+ elsif rising_edge (ck) then
+ if v = "1010" then
+ v <= x"0";
+ else
+ v <= v + 1;
+ end if;
+ end if;
+ end process;
+
+ val <= std_logic_vector (v);
+ end good;
+
+
+IEEE math packages
+==================
+
+.. index:: Math_Real
+
+.. index:: Math_Complex
+
+The :samp:`ieee` math packages (:samp:`math_real` and
+:samp:`math_complex`) provided with `GHDL` are fully compliant with
+the `IEEE` standard.
diff --git a/doc/using/QuickStartGuide.rst b/doc/using/QuickStartGuide.rst
new file mode 100644
index 000000000..bbaf3894d
--- /dev/null
+++ b/doc/using/QuickStartGuide.rst
@@ -0,0 +1,359 @@
+.. _USING:QuickStart:
+
+******************
+Quick Start Guide
+******************
+
+In this chapter, you will learn how to use the GHDL compiler by
+working on two examples.
+
+The hello world program
+=======================
+
+To illustrate the large purpose of VHDL, here is a commented VHDL
+"Hello world" program.
+
+.. code-block:: VHDL
+
+ -- Hello world program.
+ use std.textio.all; -- Imports the standard textio package.
+
+ -- Defines a design entity, without any ports.
+ entity hello_world is
+ end hello_world;
+
+ architecture behaviour of hello_world is
+ begin
+ process
+ variable l : line;
+ begin
+ write (l, String'("Hello world!"));
+ writeline (output, l);
+ wait;
+ end process;
+ end behaviour;
+
+Suppose this program is contained in the file :file:`hello.vhdl`.
+First, you have to compile the file; this is called `analysis` of a design
+file in VHDL terms.
+
+.. code-block:: shell
+
+ $ ghdl -a hello.vhdl
+
+This command creates or updates a file :file:`work-obj93.cf`, which
+describes the library `work`. On GNU/Linux, this command generates a
+file :file:`hello.o`, which is the object file corresponding to your
+VHDL program. The object file is not created on Windows.
+
+Then, you have to build an executable file.
+
+.. code-block:: shell
+
+ $ ghdl -e hello_world
+
+The :option:`-e` option means :dfn:`elaborate`. With this option, `GHDL`
+creates code in order to elaborate a design, with the :samp:`hello_world`
+entity at the top of the hierarchy.
+
+On GNU/Linux, if you have enabled the GCC backend during the compilation of `GHDL`,
+an executable program called :file:`hello_world` which can be run is generated:
+
+.. code-block:: shell
+
+ $ ghdl -r hello_world
+
+or directly:
+
+.. code-block:: shell
+
+ $ ./hello_world
+
+
+On Windows or if the GCC backend was not enabled, no file is created.
+The simulation is launched using this command:
+
+.. code-block:: shell
+
+ > ghdl -r hello_world
+
+
+The result of the simulation appears on the screen::
+
+ Hello world!
+
+
+A full adder
+============
+
+VHDL is generally used for hardware design. This example starts with
+a full adder described in the :file:`adder.vhdl` file:
+
+.. code-block:: VHDL
+
+ entity adder is
+ -- `i0`, `i1` and the carry-in `ci` are inputs of the adder.
+ -- `s` is the sum output, `co` is the carry-out.
+ port (i0, i1 : in bit; ci : in bit; s : out bit; co : out bit);
+ end adder;
+
+ architecture rtl of adder is
+ begin
+ -- This full-adder architecture contains two concurrent assignment.
+ -- Compute the sum.
+ s <= i0 xor i1 xor ci;
+ -- Compute the carry.
+ co <= (i0 and i1) or (i0 and ci) or (i1 and ci);
+ end rtl;
+
+
+You can analyze this design file:
+
+.. code-block:: shell
+
+ $ ghdl -a adder.vhdl
+
+
+You can try to execute the `adder` design, but this is useless,
+since nothing externally visible will happen. In order to
+check this full adder, a testbench has to be run. This testbench is
+very simple, since the adder is also simple: it checks exhaustively all
+inputs. Note that only the behaviour is tested, timing constraints are
+not checked. The file :file:`adder_tb.vhdl` contains the testbench for
+the adder:
+
+.. code-block:: VHDL
+
+ -- A testbench has no ports.
+ entity adder_tb is
+ end adder_tb;
+
+ architecture behav of adder_tb is
+ -- Declaration of the component that will be instantiated.
+ component adder
+ port (i0, i1 : in bit; ci : in bit; s : out bit; co : out bit);
+ end component;
+
+ -- Specifies which entity is bound with the component.
+ for adder_0: adder use entity work.adder;
+ signal i0, i1, ci, s, co : bit;
+ begin
+ -- Component instantiation.
+ adder_0: adder port map (i0 => i0, i1 => i1, ci => ci,
+ s => s, co => co);
+
+ -- This process does the real job.
+ process
+ type pattern_type is record
+ -- The inputs of the adder.
+ i0, i1, ci : bit;
+ -- The expected outputs of the adder.
+ s, co : bit;
+ end record;
+ -- The patterns to apply.
+ type pattern_array is array (natural range <>) of pattern_type;
+ constant patterns : pattern_array :=
+ (('0', '0', '0', '0', '0'),
+ ('0', '0', '1', '1', '0'),
+ ('0', '1', '0', '1', '0'),
+ ('0', '1', '1', '0', '1'),
+ ('1', '0', '0', '1', '0'),
+ ('1', '0', '1', '0', '1'),
+ ('1', '1', '0', '0', '1'),
+ ('1', '1', '1', '1', '1'));
+ begin
+ -- Check each pattern.
+ for i in patterns'range loop
+ -- Set the inputs.
+ i0 <= patterns(i).i0;
+ i1 <= patterns(i).i1;
+ ci <= patterns(i).ci;
+ -- Wait for the results.
+ wait for 1 ns;
+ -- Check the outputs.
+ assert s = patterns(i).s
+ report "bad sum value" severity error;
+ assert co = patterns(i).co
+ report "bad carry out value" severity error;
+ end loop;
+ assert false report "end of test" severity note;
+ -- Wait forever; this will finish the simulation.
+ wait;
+ end process;
+ end behav;
+
+
+As usual, you should analyze the design:
+
+.. code-block:: shell
+
+ $ ghdl -a adder_tb.vhdl
+
+And build an executable for the testbench:
+
+.. code-block:: shell
+
+ $ ghdl -e adder_tb
+
+You do not need to specify which object files are required: GHDL knows them
+and automatically adds them in the executable. Now, it is time to run the
+testbench:
+
+.. code-block:: shell
+
+ $ ghdl -r adder_tb
+ adder_tb.vhdl:52:7:(assertion note): end of test
+
+
+If your design is rather complex, you'd like to inspect signals. Signals
+value can be dumped using the VCD file format. The resulting file can be
+read with a wave viewer such as GTKWave. First, you should simulate your
+design and dump a waveform file:
+
+.. code-block:: shell
+
+ $ ghdl -r adder_tb --vcd=adder.vcd
+
+Then, you may now view the waves:
+
+.. code-block:: shell
+
+ $ gtkwave adder.vcd
+
+See :ref:`Simulation_options`, for more details on the :option:`--vcd` option and
+other runtime options.
+
+
+Starting with a design
+======================
+
+Unless you are only studying VHDL, you will work with bigger designs than
+the ones of the previous examples.
+
+Let's see how to analyze and run a bigger design, such as the DLX model
+suite written by Peter Ashenden which is distributed under the terms of the
+GNU General Public License. A copy is kept on
+http://ghdl.free.fr/dlx.tar.gz
+
+First, untar the sources:
+
+.. code-block:: shell
+
+ $ tar zxvf dlx.tar.gz
+
+
+In order not to pollute the sources with the library, it is a good idea
+to create a :file:`work/` subdirectory for the `WORK` library. To
+any GHDL commands, we will add the :option:`--workdir=work` option, so
+that all files generated by the compiler (except the executable) will be
+placed in this directory.
+
+.. code-block:: shell
+
+ $ cd dlx
+ $ mkdir work
+
+
+We will run the :samp:`dlx_test_behaviour` design. We need to analyze
+all the design units for the design hierarchy, in the correct order.
+GHDL provides an easy way to do this, by importing the sources:
+
+.. code-block:: shell
+
+ $ ghdl -i --workdir=work *.vhdl
+
+
+and making a design:
+
+.. code-block:: shell
+
+ $ ghdl -m --workdir=work dlx_test_behaviour
+
+
+Before this second stage, GHDL knows all the design units of the DLX,
+but no one have been analyzed. The make command of GHDL analyzes and
+elaborates a design. This creates many files in the :file:`work/`
+directory, and the :file:`dlx_test_behaviour` executable in the current
+directory.
+
+The simulation needs to have a DLX program contained in the file
+:file:`dlx.out`. This memory image will be be loaded in the DLX memory.
+Just take one sample:
+
+.. code-block:: shell
+
+ $ cp test_loop.out dlx.out
+
+
+And you can run the test suite:
+
+.. code-block:: shell
+
+ $ ghdl -r --workdir=work dlx_test_behaviour
+
+
+The test bench monitors the bus and displays each instruction executed.
+It finishes with an assertion of severity level note:
+
+.. code-block:: shell
+
+ dlx-behaviour.vhdl:395:11:(assertion note): TRAP instruction
+ encountered, execution halted
+
+
+Since the clock is still running, you have to manually stop the program
+with the :kbd:`C-c` key sequence. This behavior prevents you from running the
+test bench in batch mode. However, you may force the simulator to
+stop when an assertion above or equal a certain severity level occurs:
+
+.. code-block:: shell
+
+ $ ghdl -r --workdir=work dlx_test_behaviour --assert-level=note
+
+
+With this option, the program stops just after the previous message::
+
+ dlx-behaviour.vhdl:395:11:(assertion note): TRAP instruction
+ encountered, execution halted
+ error: assertion failed
+
+
+If you want to make room on your hard drive, you can either:
+
+* clean the design library with the GHDL command:
+
+ .. code-block:: shell
+
+ $ ghdl --clean --workdir=work
+
+ This removes the executable and all the object files. If you want to
+ rebuild the design at this point, just do the make command as shown
+ above.
+
+* remove the design library with the GHDL command:
+
+ .. code-block:: shell
+
+ $ ghdl --remove --workdir=work
+
+ This removes the executable, all the object files and the library file.
+ If you want to rebuild the design, you have to import the sources again,
+ and to make the design.
+
+* remove the :file:`work/` directory:
+
+ .. code-block:: shell
+
+ $ rm -rf work
+
+ Only the executable is kept. If you want to rebuild the design, create
+ the :file:`work/` directory, import the sources, and make the design.
+
+Sometimes, a design does not fully follow the VHDL standards. For example it
+uses the badly engineered :samp:`std_logic_unsigned` package. GHDL supports
+this VHDL dialect through some options::
+
+ --ieee=synopsys -fexplicit
+
+See :ref:`IEEE_library_pitfalls`, for more details.
+
diff --git a/doc/using/Simulation.rst b/doc/using/Simulation.rst
new file mode 100644
index 000000000..73c74bcd0
--- /dev/null
+++ b/doc/using/Simulation.rst
@@ -0,0 +1,292 @@
+.. _USING:Simulation:
+
+**********************
+Simulation and runtime
+**********************
+
+.. _simulation_options:
+
+Simulation options
+==================
+
+In most system environments, it is possible to pass options while
+invoking a program. Contrary to most programming languages, there is no
+standard method in VHDL to obtain the arguments or to set the exit
+status.
+
+In GHDL, it is impossible to pass parameters to your design. A later version
+could do it through the generics interfaces of the top entity.
+
+However, the GHDL runtime behaviour can be modified with some options; for
+example, it is possible to stop simulation after a certain time.
+
+The exit status of the simulation is :samp:`EXIT_SUCCESS` (0) if the
+simulation completes, or :samp:`EXIT_FAILURE` (1) in case of error
+(assertion failure, overflow or any constraint error).
+
+Here is the list of the most useful options. Some debugging options are
+also available, but not described here. The :option:`--help` options lists
+all options available, including the debugging one.
+
+
+
+.. option:: --assert-level=<LEVEL>
+
+ Select the assertion level at which an assertion violation stops the
+ simulation. `LEVEL` is the name from the `severity_level`
+ enumerated type defined in the `standard` package or the
+ :samp:`none` name.
+
+ By default, only assertion violation of severity level :samp:`failure`
+ stops the simulation.
+
+ For example, if `LEVEL` was :samp:`warning`, any assertion violation
+ with severity level :samp:`warning`, :samp:`error` or :samp:`failure` would
+ stop simulation, but the assertion violation at the :samp:`note` severity
+ level would only display a message.
+
+ Option :option:`--assert-level=none` prevents any assertion violation to stop
+ simulation.
+
+.. option:: --ieee-asserts=<POLICY>
+
+ Select how the assertions from :samp:`ieee` units are
+ handled. `POLICY` can be :samp:`enable` (the default),
+ :samp:`disable` which disables all assertion from :samp:`ieee` packages
+ and :samp:`disable-at-0` which disables only at start of simulation.
+
+ This option can be useful to avoid assertion message from
+ :samp:`ieee.numeric_std` (and other :samp:`ieee` packages).
+
+
+.. option:: --stop-time=<TIME>
+
+ Stop the simulation after :samp:`TIME`. :samp:`TIME` is expressed as a time
+ value, *without* any space. The time is the simulation time, not
+ the real clock time.
+
+ For example::
+
+ $ ./my_design --stop-time=10ns
+ $ ./my_design --stop-time=ps
+
+
+.. option:: --stop-delta=<N>
+
+ Stop the simulation after `N` delta cycles in the same current time.
+
+ .. index:: display time
+
+.. option:: --disp-time
+
+ Display the time and delta cycle number as simulation advances.
+
+
+.. option:: --disp-tree[=<KIND>]
+
+ .. index:: display design hierarchy
+
+ Display the design hierarchy as a tree of instantiated design entities.
+ This may be useful to understand the structure of a complex
+ design. `KIND` is optional, but if set must be one of:
+
+
+ * none
+ Do not display hierarchy. Same as if the option was not present.
+
+ * inst
+ Display entities, architectures, instances, blocks and generates statements.
+
+ * proc
+ Like :samp:`inst` but also display processes.
+
+ * port
+ Like :samp:`proc` but display ports and signals too.
+ If `KIND` is not specified, the hierarchy is displayed with the
+ :samp:`port` mode.
+
+
+.. option:: --no-run
+
+ Do not simulate, only elaborate. This may be used with
+ :option:`--disp-tree` to display the tree without simulating the whole
+ design.
+
+
+.. option:: --unbuffered
+
+ Disable buffering on stdout, stderr and files opened in write or append mode (TEXTIO).
+
+
+.. option:: --read-opt-file=<FILENAME>
+
+ Filter signals to be dumped to the wave file according to the wave option
+ file provided.
+
+ Here is a description of the wave option file format currently supported :
+
+ $ version = 1.1 # Optional
+
+ # Path format for signals in packages :
+ my_pkg.global_signal_a
+
+ # Path format for signals in entities :
+ /top/sub/clk
+
+ # Dumps every signals named reset in first level sub entities of top
+ /top/*/reset
+
+ # Dumps every signals named reset in recursive sub entities of top
+ /top/**/reset
+
+ # Dump every signals of sub2 which could be anywhere in design except on
+ # top level
+ /**/sub2/*
+
+ # Dump every signals of sub3 which must be a first level sub entity of the
+ # top level
+ /*/sub3/*
+
+ # Dump every signals of the first level sub entities of sub3 (but not
+ # those of sub3)
+ /**/sub3/*/*
+
+
+.. option:: --write-opt-file=<FILENAME>
+
+ If the wave option file doesn't exist, creates it with all the signals of
+ the design. Otherwise throws an error, because it won't erase an existing
+ file.
+
+
+.. option:: --vcd=<FILENAME>
+
+.. option:: --vcdgz=<FILENAME>
+
+ .. index:: vcd
+
+ .. index:: value change dump
+
+ .. index:: dump of signals
+
+ Option :option:`--vcd` dumps into the VCD file `FILENAME` the signal
+ values before each non-delta cycle. If `FILENAME` is :samp:`-`,
+ then the standard output is used, otherwise a file is created or
+ overwritten.
+
+ The :option:`--vcdgz` option is the same as the *--vcd* option,
+ but the output is compressed using the `zlib` (`gzip`
+ compression). However, you can't use the :samp:`-` filename.
+ Furthermore, only one VCD file can be written.
+
+ :dfn:`VCD` (value change dump) is a file format defined
+ by the `verilog` standard and used by virtually any wave viewer.
+
+ Since it comes from `verilog`, only a few VHDL types can be dumped. GHDL
+ dumps only signals whose base type is of the following:
+
+
+ * types defined in the :samp:`std.standard` package:
+
+ * :samp:`bit`
+
+ * :samp:`bit_vector`
+
+ * types defined in the :samp:`ieee.std_logic_1164` package:
+
+ * :samp:`std_ulogic`
+
+ * :samp:`std_logic` (because it is a subtype of :samp:`std_ulogic`)
+
+ * :samp:`std_ulogic_vector`
+
+ * :samp:`std_logic_vector`
+
+ * any integer type
+
+ I have successfully used `gtkwave` to view VCD files.
+
+ Currently, there is no way to select signals to be dumped: all signals are
+ dumped, which can generate big files.
+
+ It is very unfortunate there is no standard or well-known wave file
+ format supporting VHDL types. If you are aware of such a free format,
+ please mail me (:ref:`Reporting_bugs`).
+
+
+.. option:: --fst=<FILENAME>
+
+ Write the waveforms into a `fst`, that can be displayed by
+ `gtkwave`. The `fst` files are much smaller than VCD or
+ `GHW` files, but it handles only the same signals as the VCD format.
+
+
+.. option:: --wave=<FILENAME>
+
+ Write the waveforms into a `ghw` (GHdl Waveform) file. Currently, all
+ the signals are dumped into the waveform file, you cannot select a hierarchy
+ of signals to be dumped.
+
+ The format of this file was defined by myself and is not yet completely fixed.
+ It may change slightly. The :samp:`gtkwave` tool can read the GHW files.
+
+ Contrary to VCD files, any VHDL type can be dumped into a GHW file.
+
+
+.. option:: --psl-report=<FILENAME>
+
+ Write a report for PSL assertions and coverage at the end of
+ simulation. The file is written using the JSON format, but still
+ being human readable.
+
+
+.. option:: --sdf=<PATH>=<FILENAME>
+
+ Do VITAL annotation on `PATH` with SDF file :file:`FILENAME`.
+
+ `PATH` is a path of instances, separated with :samp:`.` or :samp:`/`.
+ Any separator can be used. Instances are component instantiation labels,
+ generate labels or block labels. Currently, you cannot use an indexed name.
+
+ Specifying a delay::
+
+ --sdf=min=<PATH>=<FILENAME>
+ --sdf=typ=<PATH>=<FILENAME>
+ --sdf=max=<PATH>=<FILENAME>
+
+ If the option contains a type of delay, that is :samp:`min=`,
+ :samp:`typ=` or :samp:`max=`, the annotator use respectively minimum,
+ typical or maximum values. If the option does not contain a type of delay,
+ the annotator use the typical delay.
+
+ See :ref:`Backannotation`, for more details.
+
+
+.. option:: --help
+
+ Display a short description of the options accepted by the runtime library.
+
+Debugging VHDL programs
+=======================
+
+.. index:: debugging
+
+.. index:: `__ghdl_fatal`
+
+Debugging VHDL programs using `GDB` is possible only on GNU/Linux systems.
+
+`GDB` is a general purpose debugger for programs compiled by `GCC`.
+Currently, there is no VHDL support for `GDB`. It may be difficult
+to inspect variables or signals in `GDB`, however, `GDB` is
+still able to display the stack frame in case of error or to set a breakpoint
+at a specified line.
+
+`GDB` can be useful to precisely catch a runtime error, such as indexing
+an array beyond its bounds. All error check subprograms call the
+`__ghdl_fatal` procedure. Therefore, to catch runtime error, set
+a breakpoint like this:
+
+ (gdb) break __ghdl_fatal
+
+When the breakpoint is hit, use the `where` or `bt` command to
+display the stack frames.