2016-11-12 15:33:28 -06:00
|
|
|
|
```
|
|
|
|
|
yosys -- Yosys Open SYnthesis Suite
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2018-10-16 09:51:58 -05:00
|
|
|
|
Copyright (C) 2012 - 2018 Clifford Wolf <clifford@clifford.at>
|
2013-02-27 02:41:04 -06:00
|
|
|
|
|
2016-11-12 15:33:28 -06:00
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
|
|
|
purpose with or without fee is hereby granted, provided that the above
|
|
|
|
|
copyright notice and this permission notice appear in all copies.
|
2013-02-27 02:41:04 -06:00
|
|
|
|
|
2016-11-12 15:33:28 -06:00
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
|
|
|
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
|
|
|
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
|
|
|
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
|
|
|
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
|
|
|
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
|
|
|
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
yosys – Yosys Open SYnthesis Suite
|
2013-01-05 04:13:26 -06:00
|
|
|
|
===================================
|
|
|
|
|
|
2013-02-28 07:17:57 -06:00
|
|
|
|
This is a framework for RTL synthesis tools. It currently has
|
|
|
|
|
extensive Verilog-2005 support and provides a basic set of
|
|
|
|
|
synthesis algorithms for various application domains.
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2013-02-28 07:17:57 -06:00
|
|
|
|
Yosys can be adapted to perform any synthesis job by combining
|
|
|
|
|
the existing passes (algorithms) using synthesis scripts and
|
2013-03-16 15:20:38 -05:00
|
|
|
|
adding additional passes as needed by extending the yosys C++
|
|
|
|
|
code base.
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
|
|
Yosys is free software licensed under the ISC license (a GPL
|
2013-03-16 15:20:38 -05:00
|
|
|
|
compatible license that is similar in terms to the MIT license
|
2013-01-05 04:13:26 -06:00
|
|
|
|
or the 2-clause BSD license).
|
|
|
|
|
|
|
|
|
|
|
2013-07-21 08:04:37 -05:00
|
|
|
|
Web Site
|
|
|
|
|
========
|
|
|
|
|
|
|
|
|
|
More information and documentation can be found on the Yosys web site:
|
2016-11-12 15:33:28 -06:00
|
|
|
|
http://www.clifford.at/yosys/
|
2013-07-21 08:04:37 -05:00
|
|
|
|
|
2017-02-07 08:12:31 -06:00
|
|
|
|
Setup
|
|
|
|
|
======
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
2013-03-18 13:26:35 -05:00
|
|
|
|
You need a C++ compiler with C++11 support (up-to-date CLANG or GCC is
|
2013-10-11 15:25:23 -05:00
|
|
|
|
recommended) and some standard tools such as GNU Flex, GNU Bison, and GNU Make.
|
2017-02-04 10:02:13 -06:00
|
|
|
|
TCL, readline and libffi are optional (see ``ENABLE_*`` settings in Makefile).
|
2016-11-19 10:34:13 -06:00
|
|
|
|
Xdot (graphviz) is used by the ``show`` command in yosys to display schematics.
|
2017-02-07 08:12:31 -06:00
|
|
|
|
|
2016-09-03 11:49:53 -05:00
|
|
|
|
For example on Ubuntu Linux 16.04 LTS the following commands will install all
|
2014-09-01 20:52:46 -05:00
|
|
|
|
prerequisites for building yosys:
|
|
|
|
|
|
2016-09-03 11:49:53 -05:00
|
|
|
|
$ sudo apt-get install build-essential clang bison flex \
|
2018-05-15 07:19:05 -05:00
|
|
|
|
libreadline-dev gawk tcl-dev libffi-dev git \
|
2016-09-03 11:49:53 -05:00
|
|
|
|
graphviz xdot pkg-config python3
|
2014-04-18 03:19:46 -05:00
|
|
|
|
|
2017-02-07 08:12:31 -06:00
|
|
|
|
Similarily, on Mac OS X MacPorts or Homebrew can be used to install dependencies:
|
|
|
|
|
|
2017-09-27 18:52:20 -05:00
|
|
|
|
$ brew tap Homebrew/bundle && brew bundle
|
2017-02-09 16:08:21 -06:00
|
|
|
|
$ sudo port install bison flex readline gawk libffi \
|
2018-05-15 07:19:05 -05:00
|
|
|
|
git graphviz pkgconfig python36
|
2017-02-07 08:12:31 -06:00
|
|
|
|
|
2018-05-06 11:22:18 -05:00
|
|
|
|
On FreeBSD use the following command to install all prerequisites:
|
|
|
|
|
|
|
|
|
|
# pkg install bison flex readline gawk libffi\
|
2018-05-15 07:19:05 -05:00
|
|
|
|
git graphviz pkgconfig python3 python36 tcl-wrapper
|
2018-05-06 11:22:18 -05:00
|
|
|
|
|
|
|
|
|
On FreeBSD system use gmake instead of make. To run tests use:
|
|
|
|
|
% MAKE=gmake CC=cc gmake test
|
|
|
|
|
|
2018-09-19 03:16:53 -05:00
|
|
|
|
For Cygwin use the following command to install all prerequisites, or select these additional packages:
|
|
|
|
|
|
|
|
|
|
setup-x86_64.exe -q --packages=bison,flex,gcc-core,gcc-g++,git,libffi-devel,libreadline-devel,make,pkg-config,python3,tcl-devel
|
|
|
|
|
|
2015-01-20 14:59:50 -06:00
|
|
|
|
There are also pre-compiled Yosys binary packages for Ubuntu and Win32 as well
|
|
|
|
|
as a source distribution for Visual Studio. Visit the Yosys download page for
|
2016-11-12 15:33:28 -06:00
|
|
|
|
more information: http://www.clifford.at/yosys/download.html
|
2013-03-18 13:26:35 -05:00
|
|
|
|
|
2014-09-01 20:52:46 -05:00
|
|
|
|
To configure the build system to use a specific compiler, use one of
|
2013-03-18 13:26:35 -05:00
|
|
|
|
|
2014-09-01 20:52:46 -05:00
|
|
|
|
$ make config-clang
|
|
|
|
|
$ make config-gcc
|
2013-03-18 13:26:35 -05:00
|
|
|
|
|
|
|
|
|
For other compilers and build configurations it might be
|
|
|
|
|
necessary to make some changes to the config section of the
|
|
|
|
|
Makefile.
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
2016-11-12 15:33:28 -06:00
|
|
|
|
$ vi Makefile # ..or..
|
2014-04-18 03:19:46 -05:00
|
|
|
|
$ vi Makefile.conf
|
2013-03-18 13:26:35 -05:00
|
|
|
|
|
|
|
|
|
To build Yosys simply type 'make' in this directory.
|
|
|
|
|
|
2013-01-06 07:40:15 -06:00
|
|
|
|
$ make
|
|
|
|
|
$ make test
|
|
|
|
|
$ sudo make install
|
|
|
|
|
|
2013-11-27 02:08:35 -06:00
|
|
|
|
Note that this also downloads, builds and installs ABC (using yosys-abc
|
2015-08-14 15:23:01 -05:00
|
|
|
|
as executable name).
|
2013-06-08 16:48:19 -05:00
|
|
|
|
|
2017-02-07 08:12:31 -06:00
|
|
|
|
Getting Started
|
|
|
|
|
===============
|
|
|
|
|
|
2013-03-16 15:20:38 -05:00
|
|
|
|
Yosys can be used with the interactive command shell, with
|
|
|
|
|
synthesis scripts or with command line arguments. Let's perform
|
2013-01-06 07:40:15 -06:00
|
|
|
|
a simple synthesis job using the interactive command shell:
|
|
|
|
|
|
|
|
|
|
$ ./yosys
|
|
|
|
|
yosys>
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
the command ``help`` can be used to print a list of all available
|
|
|
|
|
commands and ``help <command>`` to print details on the specified command:
|
2013-02-28 07:17:57 -06:00
|
|
|
|
|
|
|
|
|
yosys> help help
|
|
|
|
|
|
2015-08-14 15:23:01 -05:00
|
|
|
|
reading the design using the Verilog frontend:
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
yosys> read_verilog tests/simple/fiedler-cooley.v
|
|
|
|
|
|
|
|
|
|
writing the design to the console in yosys's internal format:
|
|
|
|
|
|
|
|
|
|
yosys> write_ilang
|
|
|
|
|
|
2014-06-15 04:51:51 -05:00
|
|
|
|
elaborate design hierarchy:
|
|
|
|
|
|
|
|
|
|
yosys> hierarchy
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
convert processes (``always`` blocks) to netlist elements and perform
|
2013-01-06 07:40:15 -06:00
|
|
|
|
some simple optimizations:
|
|
|
|
|
|
|
|
|
|
yosys> proc; opt
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
display design netlist using ``xdot``:
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
2013-04-27 07:41:46 -05:00
|
|
|
|
yosys> show
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
the same thing using ``gv`` as postscript viewer:
|
2013-04-27 07:41:46 -05:00
|
|
|
|
|
|
|
|
|
yosys> show -format ps -viewer gv
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
translating netlist to gate logic and perform some simple optimizations:
|
|
|
|
|
|
|
|
|
|
yosys> techmap; opt
|
|
|
|
|
|
2015-08-14 15:23:01 -05:00
|
|
|
|
write design netlist to a new Verilog file:
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
yosys> write_verilog synth.v
|
|
|
|
|
|
2013-12-08 08:42:27 -06:00
|
|
|
|
a similar synthesis can be performed using yosys command line options only:
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
2014-06-15 04:51:51 -05:00
|
|
|
|
$ ./yosys -o synth.v -p hierarchy -p proc -p opt \
|
|
|
|
|
-p techmap -p opt tests/simple/fiedler-cooley.v
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
or using a simple synthesis script:
|
|
|
|
|
|
|
|
|
|
$ cat synth.ys
|
|
|
|
|
read_verilog tests/simple/fiedler-cooley.v
|
2014-06-15 04:51:51 -05:00
|
|
|
|
hierarchy; proc; opt; techmap; opt
|
2013-01-06 07:40:15 -06:00
|
|
|
|
write_verilog synth.v
|
|
|
|
|
|
2013-01-16 10:32:11 -06:00
|
|
|
|
$ ./yosys synth.ys
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
It is also possible to only have the synthesis commands but not the read/write
|
|
|
|
|
commands in the synthesis script:
|
|
|
|
|
|
|
|
|
|
$ cat synth.ys
|
2014-06-15 04:51:51 -05:00
|
|
|
|
hierarchy; proc; opt; techmap; opt
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
$ ./yosys -o synth.v tests/simple/fiedler-cooley.v synth.ys
|
|
|
|
|
|
2014-09-01 20:52:46 -05:00
|
|
|
|
The following very basic synthesis script should work well with all designs:
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
# check design hierarchy
|
|
|
|
|
hierarchy
|
|
|
|
|
|
2014-09-01 20:52:46 -05:00
|
|
|
|
# translate processes (always blocks)
|
|
|
|
|
proc; opt
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
# detect and optimize FSM encodings
|
|
|
|
|
fsm; opt
|
|
|
|
|
|
2014-09-01 20:52:46 -05:00
|
|
|
|
# implement memories (arrays)
|
|
|
|
|
memory; opt
|
|
|
|
|
|
2013-01-06 07:40:15 -06:00
|
|
|
|
# convert to gate logic
|
|
|
|
|
techmap; opt
|
|
|
|
|
|
2013-12-08 08:42:27 -06:00
|
|
|
|
If ABC is enabled in the Yosys build configuration and a cell library is given
|
2016-11-19 12:51:50 -06:00
|
|
|
|
in the liberty file ``mycells.lib``, the following synthesis script will
|
|
|
|
|
synthesize for the given cell library:
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
# the high-level stuff
|
2014-09-01 20:52:46 -05:00
|
|
|
|
hierarchy; proc; fsm; opt; memory; opt
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
# mapping to internal cell library
|
2013-02-28 07:17:57 -06:00
|
|
|
|
techmap; opt
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
|
|
|
|
# mapping flip-flops to mycells.lib
|
|
|
|
|
dfflibmap -liberty mycells.lib
|
|
|
|
|
|
|
|
|
|
# mapping logic to mycells.lib
|
|
|
|
|
abc -liberty mycells.lib
|
|
|
|
|
|
|
|
|
|
# cleanup
|
2014-01-29 04:11:10 -06:00
|
|
|
|
clean
|
2013-01-06 07:40:15 -06:00
|
|
|
|
|
2013-10-31 05:15:00 -05:00
|
|
|
|
If you do not have a liberty file but want to test this synthesis script,
|
2016-11-19 10:34:13 -06:00
|
|
|
|
you can use the file ``examples/cmos/cmos_cells.lib`` from the yosys sources.
|
2013-10-31 05:15:00 -05:00
|
|
|
|
|
2015-11-12 06:15:19 -06:00
|
|
|
|
Liberty file downloads for and information about free and open ASIC standard
|
|
|
|
|
cell libraries can be found here:
|
2014-06-28 05:11:42 -05:00
|
|
|
|
|
2016-11-12 15:33:28 -06:00
|
|
|
|
- http://www.vlsitechnology.org/html/libraries.html
|
|
|
|
|
- http://www.vlsitechnology.org/synopsys/vsclib013.lib
|
2014-06-28 05:11:42 -05:00
|
|
|
|
|
2016-11-19 12:51:50 -06:00
|
|
|
|
The command ``synth`` provides a good default synthesis script (see
|
|
|
|
|
``help synth``). If possible a synthesis script should borrow from ``synth``.
|
|
|
|
|
For example:
|
2014-09-14 09:09:06 -05:00
|
|
|
|
|
|
|
|
|
# the high-level stuff
|
|
|
|
|
hierarchy
|
|
|
|
|
synth -run coarse
|
|
|
|
|
|
|
|
|
|
# mapping to internal cells
|
|
|
|
|
techmap; opt -fast
|
|
|
|
|
dfflibmap -liberty mycells.lib
|
|
|
|
|
abc -liberty mycells.lib
|
|
|
|
|
clean
|
|
|
|
|
|
2013-01-06 07:40:15 -06:00
|
|
|
|
Yosys is under construction. A more detailed documentation will follow.
|
|
|
|
|
|
|
|
|
|
|
2013-01-05 04:13:26 -06:00
|
|
|
|
Unsupported Verilog-2005 Features
|
|
|
|
|
=================================
|
|
|
|
|
|
|
|
|
|
The following Verilog-2005 features are not supported by
|
|
|
|
|
yosys and there are currently no plans to add support
|
|
|
|
|
for them:
|
|
|
|
|
|
2015-08-14 15:23:01 -05:00
|
|
|
|
- Non-synthesizable language features as defined in
|
2013-01-05 04:13:26 -06:00
|
|
|
|
IEC 62142(E):2005 / IEEE Std. 1364.1(E):2002
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``tri``, ``triand``, ``trior``, ``wand`` and ``wor`` net types
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``config`` keyword and library map files
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``disable``, ``primitive`` and ``specify`` statements
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
|
|
|
|
- Latched logic (is synthesized as logic with feedback loops)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Verilog Attributes and non-standard features
|
|
|
|
|
============================================
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``full_case`` attribute on case statements is supported
|
|
|
|
|
(also the non-standard ``// synopsys full_case`` directive)
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``parallel_case`` attribute on case statements is supported
|
|
|
|
|
(also the non-standard ``// synopsys parallel_case`` directive)
|
2013-03-01 01:03:00 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``// synopsys translate_off`` and ``// synopsys translate_on``
|
2016-11-12 15:33:28 -06:00
|
|
|
|
directives are also supported (but the use of ``` `ifdef .. `endif ```
|
2013-01-05 04:13:26 -06:00
|
|
|
|
is strongly recommended instead).
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``nomem2reg`` attribute on modules or arrays prohibits the
|
2014-10-30 03:12:55 -05:00
|
|
|
|
automatic early conversion of arrays to separate registers. This
|
|
|
|
|
is potentially dangerous. Usually the front-end has good reasons
|
|
|
|
|
for converting an array to a list of registers. Prohibiting this
|
|
|
|
|
step will likely result in incorrect synthesis results.
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``mem2reg`` attribute on modules or arrays forces the early
|
2013-03-24 05:13:32 -05:00
|
|
|
|
conversion of arrays to separate registers.
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``nomeminit`` attribute on modules or arrays prohibits the
|
|
|
|
|
creation of initialized memories. This effectively puts ``mem2reg``
|
|
|
|
|
on all memories that are written to in an ``initial`` block and
|
2015-02-14 04:21:12 -06:00
|
|
|
|
are not ROMs.
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``nolatches`` attribute on modules or always-blocks
|
2013-01-05 04:13:26 -06:00
|
|
|
|
prohibits the generation of logic-loops for latches. Instead
|
2013-10-16 09:16:06 -05:00
|
|
|
|
all not explicitly assigned values default to x-bits. This does
|
|
|
|
|
not affect clocked storage elements such as flip-flops.
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``nosync`` attribute on registers prohibits the generation of a
|
2013-03-25 11:13:14 -05:00
|
|
|
|
storage element. The register itself will always have all bits set
|
|
|
|
|
to 'x' (undefined). The variable may only be used as blocking assigned
|
|
|
|
|
temporary variable within an always block. This is mostly used internally
|
2015-08-14 15:23:01 -05:00
|
|
|
|
by yosys to synthesize Verilog functions and access arrays.
|
2013-03-25 11:13:14 -05:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``onehot`` attribute on wires mark them as onehot state register. This
|
2015-02-04 11:52:54 -06:00
|
|
|
|
is used for example for memory port sharing and set by the fsm_map pass.
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``blackbox`` attribute on modules is used to mark empty stub modules
|
2013-03-28 03:20:10 -05:00
|
|
|
|
that have the same ports as the real thing but do not contain information
|
|
|
|
|
on the internal configuration. This modules are only used by the synthesis
|
2015-08-14 15:23:01 -05:00
|
|
|
|
passes to identify input and output ports of cells. The Verilog backend
|
2013-11-22 08:01:12 -06:00
|
|
|
|
also does not output blackbox modules on default.
|
2013-03-28 03:20:10 -05:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``keep`` attribute on cells and wires is used to mark objects that should
|
2013-11-05 08:52:29 -06:00
|
|
|
|
never be removed by the optimizer. This is used for example for cells that
|
|
|
|
|
have hidden connections that are not part of the netlist, such as IO pads.
|
2016-11-19 10:34:13 -06:00
|
|
|
|
Setting the ``keep`` attribute on a module has the same effect as setting it
|
2014-09-29 05:51:54 -05:00
|
|
|
|
on all instances of the module.
|
2013-10-16 09:16:06 -05:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``keep_hierarchy`` attribute on cells and modules keeps the ``flatten``
|
2015-02-25 05:46:00 -06:00
|
|
|
|
command from flattening the indicated cells and modules.
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``init`` attribute on wires is set by the frontend when a register is
|
2016-11-19 12:51:50 -06:00
|
|
|
|
initialized "FPGA-style" with ``reg foo = val``. It can be used during
|
|
|
|
|
synthesis to add the necessary reset logic.
|
2013-11-19 18:49:37 -06:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``top`` attribute on a module marks this module as the top of the
|
|
|
|
|
design hierarchy. The ``hierarchy`` command sets this attribute when called
|
|
|
|
|
with ``-top``. Other commands, such as ``flatten`` and various backends
|
2013-11-23 22:03:43 -06:00
|
|
|
|
use this attribute to determine the top module.
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``src`` attribute is set on cells and wires created by to the string
|
|
|
|
|
``<hdl-file-name>:<line-number>`` by the HDL front-end and is then carried
|
2015-04-24 15:04:05 -05:00
|
|
|
|
through the synthesis. When entities are combined, a new |-separated
|
|
|
|
|
string is created that contains all the string from the original entities.
|
|
|
|
|
|
2016-11-12 15:33:28 -06:00
|
|
|
|
- In addition to the ``(* ... *)`` attribute syntax, yosys supports
|
|
|
|
|
the non-standard ``{* ... *}`` attribute syntax to set default attributes
|
|
|
|
|
for everything that comes after the ``{* ... *}`` statement. (Reset
|
|
|
|
|
by adding an empty ``{* *}`` statement.)
|
2013-01-05 04:13:26 -06:00
|
|
|
|
|
2016-05-20 09:21:35 -05:00
|
|
|
|
- In module parameter and port declarations, and cell port and parameter
|
|
|
|
|
lists, a trailing comma is ignored. This simplifies writing verilog code
|
|
|
|
|
generators a bit in some cases.
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- Modules can be declared with ``module mod_name(...);`` (with three dots
|
2015-01-31 17:57:12 -06:00
|
|
|
|
instead of a list of module ports). With this syntax it is sufficient
|
2014-08-04 08:19:24 -05:00
|
|
|
|
to simply declare a module port as 'input' or 'output' in the module
|
|
|
|
|
body.
|
|
|
|
|
|
2015-08-14 15:23:01 -05:00
|
|
|
|
- When defining a macro with `define, all text between triple double quotes
|
2014-08-13 06:03:38 -05:00
|
|
|
|
is interpreted as macro body, even if it contains unescaped newlines. The
|
2015-08-14 15:23:01 -05:00
|
|
|
|
tipple double quotes are removed from the macro body. For example:
|
2014-08-13 06:03:38 -05:00
|
|
|
|
|
|
|
|
|
`define MY_MACRO(a, b) """
|
|
|
|
|
assign a = 23;
|
|
|
|
|
assign b = 42;
|
|
|
|
|
"""
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The attribute ``via_celltype`` can be used to implement a Verilog task or
|
2014-08-18 07:29:30 -05:00
|
|
|
|
function by instantiating the specified cell type. The value is the name
|
|
|
|
|
of the cell type to use. For functions the name of the output port can
|
|
|
|
|
be specified by appending it to the cell type separated by a whitespace.
|
|
|
|
|
The body of the task or function is unused in this case and can be used
|
|
|
|
|
to specify a behavioral model of the cell type for simulation. For example:
|
|
|
|
|
|
|
|
|
|
module my_add3(A, B, C, Y);
|
|
|
|
|
parameter WIDTH = 8;
|
|
|
|
|
input [WIDTH-1:0] A, B, C;
|
|
|
|
|
output [WIDTH-1:0] Y;
|
|
|
|
|
...
|
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
module top;
|
|
|
|
|
...
|
|
|
|
|
(* via_celltype = "my_add3 Y" *)
|
|
|
|
|
(* via_celltype_defparam_WIDTH = 32 *)
|
|
|
|
|
function [31:0] add3;
|
|
|
|
|
input [31:0] A, B, C;
|
|
|
|
|
begin
|
|
|
|
|
add3 = A + B + C;
|
|
|
|
|
end
|
|
|
|
|
endfunction
|
|
|
|
|
...
|
|
|
|
|
endmodule
|
|
|
|
|
|
2014-08-22 07:37:14 -05:00
|
|
|
|
- A limited subset of DPI-C functions is supported. The plugin mechanism
|
2016-11-19 10:34:13 -06:00
|
|
|
|
(see ``help plugin``) can be used to load .so files with implementations
|
2016-09-05 21:58:18 -05:00
|
|
|
|
of DPI-C routines. As a non-standard extension it is possible to specify
|
2016-11-19 10:34:13 -06:00
|
|
|
|
a plugin alias using the ``<alias>:`` syntax. For example:
|
2014-08-22 07:37:14 -05:00
|
|
|
|
|
|
|
|
|
module dpitest;
|
|
|
|
|
import "DPI-C" function foo:round = real my_round (real);
|
|
|
|
|
parameter real r = my_round(12.345);
|
|
|
|
|
endmodule
|
|
|
|
|
|
|
|
|
|
$ yosys -p 'plugin -a foo -i /lib/libm.so; read_verilog dpitest.v'
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- Sized constants (the syntax ``<size>'s?[bodh]<value>``) support constant
|
2015-08-14 15:23:01 -05:00
|
|
|
|
expressions as <size>. If the expression is not a simple identifier, it
|
2016-11-19 10:34:13 -06:00
|
|
|
|
must be put in parentheses. Examples: ``WIDTH'd42``, ``(4+2)'b101010``
|
2014-06-12 04:54:20 -05:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The system tasks ``$finish`` and ``$display`` are supported in initial blocks
|
2016-09-05 21:58:18 -05:00
|
|
|
|
in an unconditional context (only if/case statements on parameters
|
2015-09-18 03:01:08 -05:00
|
|
|
|
and constant values). The intended use for this is synthesis-time DRC.
|
|
|
|
|
|
2014-06-12 04:54:20 -05:00
|
|
|
|
|
2016-10-14 08:39:33 -05:00
|
|
|
|
Non-standard or SystemVerilog features for formal verification
|
|
|
|
|
==============================================================
|
|
|
|
|
|
2018-08-05 23:30:33 -05:00
|
|
|
|
- Support for ``assert``, ``assume``, ``restrict``, and ``cover`` is enabled
|
2017-02-04 10:02:13 -06:00
|
|
|
|
when ``read_verilog`` is called with ``-formal``.
|
2016-10-14 08:39:33 -05:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The system task ``$initstate`` evaluates to 1 in the initial state and
|
2016-10-14 08:39:33 -05:00
|
|
|
|
to 0 otherwise.
|
|
|
|
|
|
2018-02-23 06:14:47 -06:00
|
|
|
|
- The system function ``$anyconst`` evaluates to any constant value. This is
|
2017-02-09 06:51:44 -06:00
|
|
|
|
equivalent to declaring a reg as ``rand const``, but also works outside
|
|
|
|
|
of checkers. (Yosys also supports ``rand const`` outside checkers.)
|
2016-10-14 08:39:33 -05:00
|
|
|
|
|
2018-02-23 06:14:47 -06:00
|
|
|
|
- The system function ``$anyseq`` evaluates to any value, possibly a different
|
2017-02-09 06:51:44 -06:00
|
|
|
|
value in each cycle. This is equivalent to declaring a reg as ``rand``,
|
|
|
|
|
but also works outside of checkers. (Yosys also supports ``rand``
|
|
|
|
|
variables outside checkers.)
|
2016-10-14 08:39:33 -05:00
|
|
|
|
|
2018-02-26 04:58:44 -06:00
|
|
|
|
- The system functions ``$allconst`` and ``$allseq`` can be used to construct
|
|
|
|
|
formal exist-forall problems. Assumptions only hold if the trace satisfies
|
|
|
|
|
the assumtion for all ``$allconst/$allseq`` values. For assertions and cover
|
|
|
|
|
statements it is sufficient if just one ``$allconst/$allseq`` value triggers
|
|
|
|
|
the property (similar to ``$anyconst/$anyseq``).
|
2018-02-23 06:14:47 -06:00
|
|
|
|
|
2018-04-06 07:37:43 -05:00
|
|
|
|
- Wires/registers decalred using the ``anyconst/anyseq/allconst/allseq`` attribute
|
|
|
|
|
(for example ``(* anyconst *) reg [7:0] foobar;``) will behave as if driven
|
|
|
|
|
by a ``$anyconst/$anyseq/$allconst/$allseq`` function.
|
|
|
|
|
|
2016-11-19 12:51:50 -06:00
|
|
|
|
- The SystemVerilog tasks ``$past``, ``$stable``, ``$rose`` and ``$fell`` are
|
|
|
|
|
supported in any clocked block.
|
2016-10-14 08:39:33 -05:00
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The syntax ``@($global_clock)`` can be used to create FFs that have no
|
2018-06-01 06:25:42 -05:00
|
|
|
|
explicit clock input ($ff cells). The same can be achieved by using
|
|
|
|
|
``@(posedge <netname>)`` or ``@(negedge <netname>)`` when ``<netname>``
|
|
|
|
|
is marked with the ``(* gclk *)`` Verilog attribute.
|
2016-10-14 08:39:33 -05:00
|
|
|
|
|
|
|
|
|
|
2014-06-12 04:54:20 -05:00
|
|
|
|
Supported features from SystemVerilog
|
|
|
|
|
=====================================
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
When ``read_verilog`` is called with ``-sv``, it accepts some language features
|
2014-06-12 04:54:20 -05:00
|
|
|
|
from SystemVerilog:
|
|
|
|
|
|
2016-11-19 10:34:13 -06:00
|
|
|
|
- The ``assert`` statement from SystemVerilog is supported in its most basic
|
|
|
|
|
form. In module context: ``assert property (<expression>);`` and within an
|
|
|
|
|
always block: ``assert(<expression>);``. It is transformed to a $assert cell.
|
2014-02-01 06:04:49 -06:00
|
|
|
|
|
2017-02-04 10:02:13 -06:00
|
|
|
|
- The ``assume``, ``restrict``, and ``cover`` statements from SystemVerilog are
|
|
|
|
|
also supported. The same limitations as with the ``assert`` statement apply.
|
2016-07-13 09:56:17 -05:00
|
|
|
|
|
2016-11-19 12:51:50 -06:00
|
|
|
|
- The keywords ``always_comb``, ``always_ff`` and ``always_latch``, ``logic``
|
|
|
|
|
and ``bit`` are supported.
|
2014-02-01 06:50:23 -06:00
|
|
|
|
|
2017-02-09 06:51:44 -06:00
|
|
|
|
- Declaring free variables with ``rand`` and ``rand const`` is supported.
|
|
|
|
|
|
|
|
|
|
- Checkers without a port list that do not need to be instantiated (but instead
|
|
|
|
|
behave like a named block) are supported.
|
2017-02-08 07:38:15 -06:00
|
|
|
|
|
2016-07-13 09:56:17 -05:00
|
|
|
|
- SystemVerilog packages are supported. Once a SystemVerilog file is read
|
2016-11-19 10:34:13 -06:00
|
|
|
|
into a design with ``read_verilog``, all its packages are available to
|
2016-07-13 09:56:17 -05:00
|
|
|
|
SystemVerilog files being read into the same design afterwards.
|
|
|
|
|
|
2018-10-13 13:34:44 -05:00
|
|
|
|
- SystemVerilog interfaces (SVIs) are supported. Modports for specifying whether
|
|
|
|
|
ports are inputs or outputs are supported.
|
|
|
|
|
|
2016-05-20 09:21:35 -05:00
|
|
|
|
|
2016-04-03 07:26:46 -05:00
|
|
|
|
Building the documentation
|
|
|
|
|
==========================
|
|
|
|
|
|
2016-05-09 05:43:49 -05:00
|
|
|
|
Note that there is no need to build the manual if you just want to read it.
|
|
|
|
|
Simply download the PDF from http://www.clifford.at/yosys/documentation.html
|
|
|
|
|
instead.
|
|
|
|
|
|
2016-04-03 07:26:46 -05:00
|
|
|
|
On Ubuntu, texlive needs these packages to be able to build the manual:
|
|
|
|
|
|
|
|
|
|
sudo apt-get install texlive-binaries
|
|
|
|
|
sudo apt-get install texlive-science # install algorithm2e.sty
|
|
|
|
|
sudo apt-get install texlive-bibtex-extra # gets multibib.sty
|
|
|
|
|
sudo apt-get install texlive-fonts-extra # gets skull.sty and dsfont.sty
|
|
|
|
|
sudo apt-get install texlive-publishers # IEEEtran.cls
|
|
|
|
|
|
2016-09-05 21:58:18 -05:00
|
|
|
|
Also the non-free font luximono should be installed, there is unfortunately
|
2016-04-03 07:26:46 -05:00
|
|
|
|
no Ubuntu package for this so it should be installed separately using
|
|
|
|
|
`getnonfreefonts`:
|
|
|
|
|
|
|
|
|
|
wget https://tug.org/fonts/getnonfreefonts/install-getnonfreefonts
|
|
|
|
|
sudo texlua install-getnonfreefonts # will install to /usr/local by default, can be changed by editing BINDIR at MANDIR at the top of the script
|
|
|
|
|
getnonfreefonts luximono # installs to /home/user/texmf
|
|
|
|
|
|
|
|
|
|
Then execute, from the root of the repository:
|
|
|
|
|
|
|
|
|
|
make manual
|
|
|
|
|
|
|
|
|
|
Notes:
|
|
|
|
|
|
|
|
|
|
- To run `make manual` you need to have installed yosys with `make install`,
|
|
|
|
|
otherwise it will fail on finding `kernel/yosys.h` while building
|
|
|
|
|
`PRESENTATION_Prog`.
|