mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-22 16:45:32 +00:00
Finished presentation intro
Also some other tidy up.
This commit is contained in:
parent
20c2708383
commit
9a9aa2c45a
11 changed files with 259 additions and 614 deletions
|
@ -10,7 +10,93 @@ terminated using the newline character or a semicolon (;). Empty lines and lines
|
|||
starting with the hash sign (#) are ignored. See :ref:`sec:typusecase` for an
|
||||
example synthesis script.
|
||||
|
||||
The command ``help`` can be used to access the command reference manual.
|
||||
The command ``help`` can be used to access the command reference manual, with
|
||||
``help <command>`` providing details for a specific command. ``yosys -H`` or
|
||||
``yosys -h <command>`` will do the same outside of an interactive prompt. The
|
||||
entire reference manual is also available here at :doc:`/cmd_ref`.
|
||||
|
||||
Example commands
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Commands for design navigation and investigation:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
cd # a shortcut for 'select -module <name>'
|
||||
ls # list modules or objects in modules
|
||||
dump # print parts of the design in RTLIL format
|
||||
show # generate schematics using graphviz
|
||||
select # modify and view the list of selected objects
|
||||
|
||||
Commands for executing scripts or entering interactive mode:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
shell # enter interactive command mode
|
||||
history # show last interactive commands
|
||||
script # execute commands from script file
|
||||
tcl # execute a TCL script file
|
||||
|
||||
Commands for reading and elaborating the design:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
read_rtlil # read modules from RTLIL file
|
||||
read_verilog # read modules from Verilog file
|
||||
hierarchy # check, expand and clean up design hierarchy
|
||||
|
||||
|
||||
Commands for high-level synthesis:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
proc # translate processes to netlists
|
||||
fsm # extract and optimize finite state machines
|
||||
memory # translate memories to basic cells
|
||||
opt # perform simple optimizations
|
||||
|
||||
|
||||
Commands for technology mapping:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
techmap # generic technology mapper
|
||||
abc # use ABC for technology mapping
|
||||
dfflibmap # technology mapping of flip-flops
|
||||
hilomap # technology mapping of constant hi- and/or lo-drivers
|
||||
iopadmap # technology mapping of i/o pads (or buffers)
|
||||
flatten # flatten design
|
||||
|
||||
Commands for writing the results:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
write_blif # write design to BLIF file
|
||||
write_btor # write design to BTOR file
|
||||
write_edif # write design to EDIF netlist file
|
||||
write_rtlil # write design to RTLIL file
|
||||
write_spice # write design to SPICE netlist file
|
||||
write_verilog # write design to Verilog file
|
||||
|
||||
|
||||
Script-Commands for standard synthesis tasks:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
synth # generic synthesis script
|
||||
synth_xilinx # synthesis for Xilinx FPGAs
|
||||
|
||||
|
||||
Commands for model checking:
|
||||
|
||||
.. code-block:: yoscrypt
|
||||
|
||||
sat # solve a SAT problem in the circuit
|
||||
miter # automatically create a miter circuit
|
||||
scc # detect strongly connected components (logic loops)
|
||||
|
||||
Selections intro
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Most commands can operate not only on the entire design but also specifically on
|
||||
selected parts of the design. For example the command dump will print all
|
||||
|
@ -24,5 +110,6 @@ selection.
|
|||
|
||||
The selection mechanism is very powerful. For example the command above will
|
||||
print all wires that are connected to the ``\A`` port of a ``$add`` cell.
|
||||
Detailed documentation of the select framework can be found in the command
|
||||
reference for the ``select`` command.
|
||||
Detailed documentation of the select framework can be found under
|
||||
:doc:`/using_yosys/more_scripting/selections` or in the command reference at
|
||||
:doc:`/cmd/select`.
|
||||
|
|
|
@ -59,6 +59,60 @@ Things you can't do
|
|||
|
||||
.. _nextpnr: https://github.com/YosysHQ/nextpnr
|
||||
|
||||
Typical applications for Yosys
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
- Synthesis of final production designs
|
||||
- Pre-production synthesis (trial runs before investing in other tools)
|
||||
- Conversion of full-featured Verilog to simple Verilog
|
||||
- Conversion of Verilog to other formats (BLIF, BTOR, etc)
|
||||
- Demonstrating synthesis algorithms (e.g. for educational purposes)
|
||||
- Framework for experimenting with new algorithms
|
||||
- Framework for building custom flows (Not limited to synthesis but also formal
|
||||
verification, reverse engineering, ...)
|
||||
|
||||
Benefits of open source HDL synthesis
|
||||
-------------------------------------
|
||||
|
||||
- Cost (also applies to ``free as in free beer`` solutions):
|
||||
|
||||
Today the cost for a mask set in $\unit[180]{nm}$ technology is far less than
|
||||
the cost for the design tools needed to design the mask layouts. Open Source
|
||||
ASIC flows are an important enabler for ASIC-level Open Source Hardware.
|
||||
|
||||
- Availability and Reproducibility:
|
||||
|
||||
If you are a researcher who is publishing, you want to use tools that everyone
|
||||
else can also use. Even if most universities have access to all major
|
||||
commercial tools, you usually do not have easy access to the version that was
|
||||
used in a research project a couple of years ago. With Open Source tools you
|
||||
can even release the source code of the tool you have used alongside your data.
|
||||
|
||||
- Framework:
|
||||
|
||||
Yosys is not only a tool. It is a framework that can be used as basis for other
|
||||
developments, so researchers and hackers alike do not need to re-invent the
|
||||
basic functionality. Extensibility was one of Yosys' design goals.
|
||||
|
||||
- All-in-one:
|
||||
|
||||
Because of the framework characteristics of Yosys, an increasing number of features
|
||||
become available in one tool. Yosys not only can be used for circuit synthesis but
|
||||
also for formal equivalence checking, SAT solving, and for circuit analysis, to
|
||||
name just a few other application domains. With proprietary software one needs to
|
||||
learn a new tool for each of these applications.
|
||||
|
||||
- Educational Tool:
|
||||
|
||||
Proprietary synthesis tools are at times very secretive about their inner
|
||||
workings. They often are ``black boxes``. Yosys is very open about its
|
||||
internals and it is easy to observe the different steps of synthesis.
|
||||
|
||||
.. note:: Yosys is licensed under the ISC license:
|
||||
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.
|
||||
|
||||
The extended Yosys universe
|
||||
---------------------------
|
||||
|
||||
|
|
|
@ -1,8 +1,52 @@
|
|||
Test suites
|
||||
===========
|
||||
|
||||
Build tests
|
||||
-----------
|
||||
.. TODO: copypaste
|
||||
|
||||
Benchmarking
|
||||
Continuously checking the correctness of Yosys and making sure that new features
|
||||
do not break old ones is a high priority in Yosys. Two external test suites
|
||||
have been built for Yosys: VlogHammer and yosys-bigsim. In addition to that,
|
||||
yosys comes with approx 200 test cases used in ``make test``. A debug build of
|
||||
Yosys also contains a lot of asserts and checks the integrity of the internal
|
||||
state after each command.
|
||||
|
||||
VlogHammer
|
||||
----------
|
||||
|
||||
VlogHammer is a Verilog regression test suite developed to test the different
|
||||
subsystems in Yosys by comparing them to each other and to the output created by
|
||||
some other tools (Xilinx Vivado, Xilinx XST, Altera Quartus II, ...).
|
||||
|
||||
Yosys Subsystems tested: Verilog frontend, const folding, const eval, technology
|
||||
mapping, simulation models, SAT models.
|
||||
|
||||
Thousands of auto-generated test cases containing code such as:
|
||||
|
||||
.. code-block:: verilog
|
||||
|
||||
assign y9 = $signed(((+$signed((^(6'd2 ** a2))))<$unsigned($unsigned(((+a3))))));
|
||||
assign y10 = (-((+((+{2{(~^p13)}})))^~(!{{b5,b1,a0},(a1&p12),(a4+a3)})));
|
||||
assign y11 = (~&(-{(-3'sd3),($unsigned($signed($unsigned({p0,b4,b1}))))}));
|
||||
|
||||
Some bugs in Yosys were found and fixed thanks to VlogHammer. Over 50 bugs in
|
||||
the other tools used as external reference where found and reported so far.
|
||||
|
||||
yosys-bigsim
|
||||
------------
|
||||
|
||||
yosys-bigsim is a collection of real-world open-source Verilog designs and test
|
||||
benches. yosys-bigsim compares the testbench outputs of simulations of the original
|
||||
Verilog code and synthesis results.
|
||||
|
||||
The following designs are included in yosys-bigsim (excerpt):
|
||||
|
||||
- ``openmsp430`` -- an MSP430 compatible 16 bit CPU
|
||||
- ``aes_5cycle_2stage`` -- an AES encryption core
|
||||
- ``softusb_navre`` -- an AVR compatible 8 bit CPU
|
||||
- ``amber23`` -- an ARMv2 compatible 32 bit CPU
|
||||
- ``lm32`` -- another 32 bit CPU from Lattice Semiconductor
|
||||
- ``verilog-pong`` -- a hardware pong game with VGA output
|
||||
- ``elliptic_curve_group`` -- ECG point-add and point-scalar-mul core
|
||||
- ``reed_solomon_decoder`` -- a Reed-Solomon Error Correction Decoder
|
||||
|
||||
Code available at https://github.com/YosysHQ/yosys-bigsim
|
||||
|
|
|
@ -4,6 +4,6 @@ Using Yosys (advanced)
|
|||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
more_scripting
|
||||
more_scripting/index
|
||||
memory_mapping
|
||||
yosys_flows
|
||||
|
|
|
@ -5,4 +5,5 @@ More scripting
|
|||
|
||||
opt_passes
|
||||
selections
|
||||
synth
|
||||
troubleshooting
|
|
@ -11,26 +11,26 @@ This chapter outlines these optimizations.
|
|||
Simple optimizations
|
||||
--------------------
|
||||
|
||||
The Yosys pass opt runs a number of simple optimizations. This includes removing
|
||||
The Yosys pass ``opt`` runs a number of simple optimizations. This includes removing
|
||||
unused signals and cells and const folding. It is recommended to run this pass
|
||||
after each major step in the synthesis script. At the time of this writing the
|
||||
opt pass executes the following passes that each perform a simple optimization:
|
||||
``opt`` pass executes the following passes that each perform a simple optimization:
|
||||
|
||||
- Once at the beginning of opt:
|
||||
- Once at the beginning of ``opt``:
|
||||
|
||||
- opt_expr
|
||||
- opt_merge -nomux
|
||||
- ``opt_expr``
|
||||
- ``opt_merge -nomux``
|
||||
|
||||
- Repeat until result is stable:
|
||||
|
||||
- opt_muxtree
|
||||
- opt_reduce
|
||||
- opt_merge
|
||||
- opt_rmdff
|
||||
- opt_clean
|
||||
- opt_expr
|
||||
- ``opt_muxtree``
|
||||
- ``opt_reduce``
|
||||
- ``opt_merge``
|
||||
- ``opt_rmdff``
|
||||
- ``opt_clean``
|
||||
- ``opt_expr``
|
||||
|
||||
The following section describes each of the opt\_ passes.
|
||||
The following section describes each of the ``opt_`` passes.
|
||||
|
||||
The opt_expr pass
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
@ -40,7 +40,7 @@ described in :ref:`chapter:celllib`. This means a cell with all
|
|||
constant inputs is replaced with the constant value this cell drives. In some
|
||||
cases this pass can also optimize cells with some constant inputs.
|
||||
|
||||
.. table:: Const folding rules for $_AND\_ cells as used in opt_expr.
|
||||
.. table:: Const folding rules for ``$_AND_`` cells as used in opt_expr.
|
||||
:name: tab:opt_expr_and
|
||||
:align: center
|
||||
|
||||
|
@ -65,26 +65,26 @@ cases this pass can also optimize cells with some constant inputs.
|
|||
.. How to format table?
|
||||
|
||||
:numref:`Table %s <tab:opt_expr_and>` shows the replacement rules used for
|
||||
optimizing an $_AND\_ gate. The first three rules implement the obvious const
|
||||
folding rules. Note that ‘any' might include dynamic values calculated by other
|
||||
optimizing an ``$_AND_`` gate. The first three rules implement the obvious const
|
||||
folding rules. Note that 'any' might include dynamic values calculated by other
|
||||
parts of the circuit. The following three lines propagate undef (X) states.
|
||||
These are the only three cases in which it is allowed to propagate an undef
|
||||
according to Sec. 5.1.10 of IEEE Std. 1364-2005 :cite:p:`Verilog2005`.
|
||||
|
||||
The next two lines assume the value 0 for undef states. These two rules are only
|
||||
used if no other substitutions are possible in the current module. If other
|
||||
substitutions are possible they are performed first, in the hope that the ‘any'
|
||||
substitutions are possible they are performed first, in the hope that the 'any'
|
||||
will change to an undef value or a 1 and therefore the output can be set to
|
||||
undef.
|
||||
|
||||
The last two lines simply replace an $_AND\_ gate with one constant-1 input with
|
||||
a buffer.
|
||||
The last two lines simply replace an ``$_AND_`` gate with one constant-1 input
|
||||
with a buffer.
|
||||
|
||||
Besides this basic const folding the opt_expr pass can replace 1-bit wide $eq
|
||||
and $ne cells with buffers or not-gates if one input is constant.
|
||||
Besides this basic const folding the opt_expr pass can replace 1-bit wide
|
||||
``$eq`` and ``$ne`` cells with buffers or not-gates if one input is constant.
|
||||
|
||||
The opt_expr pass is very conservative regarding optimizing $mux cells, as these
|
||||
cells are often used to model decision-trees and breaking these trees can
|
||||
The opt_expr pass is very conservative regarding optimizing ``$mux`` cells, as
|
||||
these cells are often used to model decision-trees and breaking these trees can
|
||||
interfere with other optimizations.
|
||||
|
||||
The opt_muxtree pass
|
||||
|
@ -107,16 +107,16 @@ The opt_reduce pass
|
|||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is a simple optimization pass that identifies and consolidates identical
|
||||
input bits to $reduce_and and $reduce_or cells. It also sorts the input bits to
|
||||
ease identification of shareable $reduce_and and $reduce_or cells in other
|
||||
passes.
|
||||
input bits to ``$reduce_and`` and ``$reduce_or`` cells. It also sorts the input
|
||||
bits to ease identification of shareable ``$reduce_and`` and ``$reduce_or``
|
||||
cells in other passes.
|
||||
|
||||
This pass also identifies and consolidates identical inputs to multiplexer
|
||||
cells. In this case the new shared select bit is driven using a $reduce_or cell
|
||||
that combines the original select bits.
|
||||
cells. In this case the new shared select bit is driven using a ``$reduce_or``
|
||||
cell that combines the original select bits.
|
||||
|
||||
Lastly this pass consolidates trees of $reduce_and cells and trees of $reduce_or
|
||||
cells to single large $reduce_and or $reduce_or cells.
|
||||
Lastly this pass consolidates trees of ``$reduce_and`` cells and trees of
|
||||
``$reduce_or`` cells to single large ``$reduce_and`` or ``$reduce_or`` cells.
|
||||
|
||||
These three simple optimizations are performed in a loop until a stable result
|
||||
is produced.
|
||||
|
@ -124,8 +124,9 @@ is produced.
|
|||
The opt_rmdff pass
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
||||
This pass identifies single-bit d-type flip-flops ($_DFF\_, $dff, and $adff
|
||||
cells) with a constant data input and replaces them with a constant driver.
|
||||
This pass identifies single-bit d-type flip-flops (``$_DFF_``, ``$dff``, and
|
||||
``$adff`` cells) with a constant data input and replaces them with a constant
|
||||
driver.
|
||||
|
||||
The opt_clean pass
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
|
@ -141,9 +142,10 @@ This pass performs trivial resource sharing. This means that this pass
|
|||
identifies cells with identical inputs and replaces them with a single instance
|
||||
of the cell.
|
||||
|
||||
The option -nomux can be used to disable resource sharing for multiplexer cells
|
||||
($mux and $pmux. This can be useful as it prevents multiplexer trees to be
|
||||
merged, which might prevent opt_muxtree to identify possible optimizations.
|
||||
The option ``-nomux`` can be used to disable resource sharing for multiplexer
|
||||
cells (``$mux`` and ``$pmux.`` This can be useful as it prevents multiplexer
|
||||
trees to be merged, which might prevent ``opt_muxtree`` to identify possible
|
||||
optimizations.
|
||||
|
||||
FSM extraction and encoding
|
||||
---------------------------
|
||||
|
@ -187,12 +189,12 @@ fsm pass simply executes the following other passes:
|
|||
The fsm_detect pass identifies FSM state registers and marks them using the
|
||||
``\fsm_encoding = "auto"`` attribute. The fsm_extract extracts all FSMs marked
|
||||
using the ``\fsm_encoding`` attribute (unless ``\fsm_encoding`` is set to
|
||||
"none") and replaces the corresponding RTL cells with a $fsm cell. All other
|
||||
fsm\_ passes operate on these $fsm cells. The fsm_map call finally replaces the
|
||||
$fsm cells with RTL cells.
|
||||
"none") and replaces the corresponding RTL cells with a ``$fsm`` cell. All other
|
||||
``fsm_`` passes operate on these ``$fsm`` cells. The fsm_map call finally
|
||||
replaces the ``$fsm`` cells with RTL cells.
|
||||
|
||||
Note that these optimizations operate on an RTL netlist. I.e. the fsm pass
|
||||
should be executed after the proc pass has transformed all RTLIL::Process
|
||||
Note that these optimizations operate on an RTL netlist. I.e. the ``fsm`` pass
|
||||
should be executed after the proc pass has transformed all ``RTLIL::Process``
|
||||
objects to RTL cells.
|
||||
|
||||
The algorithms used for FSM detection and extraction are influenced by a more
|
||||
|
@ -207,11 +209,12 @@ description:
|
|||
|
||||
- Does not already have the ``\fsm_encoding`` attribute.
|
||||
- Is not an output of the containing module.
|
||||
- Is driven by single $dff or $adff cell.
|
||||
- The ``\D``-Input of this $dff or $adff cell is driven by a multiplexer tree
|
||||
that only has constants or the old state value on its leaves.
|
||||
- Is driven by single ``$dff`` or ``$adff`` cell.
|
||||
- The ``\D``-Input of this ``$dff`` or ``$adff`` cell is driven by a
|
||||
multiplexer tree that only has constants or the old state value on its
|
||||
leaves.
|
||||
- The state value is only used in the said multiplexer tree or by simple
|
||||
relational cells that compare the state value to a constant (usually $eq
|
||||
relational cells that compare the state value to a constant (usually ``$eq``
|
||||
cells).
|
||||
|
||||
This heuristic has proven to work very well. It is possible to overwrite it by
|
||||
|
@ -246,10 +249,10 @@ information is determined:
|
|||
The state registers (and asynchronous reset state, if applicable) is simply
|
||||
determined by identifying the driver for the state signal.
|
||||
|
||||
From there the $mux-tree driving the state register inputs is recursively
|
||||
traversed. All select inputs are control signals and the leaves of the $mux-tree
|
||||
are the states. The algorithm fails if a non-constant leaf that is not the state
|
||||
signal itself is found.
|
||||
From there the ``$mux-tree`` driving the state register inputs is recursively
|
||||
traversed. All select inputs are control signals and the leaves of the
|
||||
``$mux-tree`` are the states. The algorithm fails if a non-constant leaf that is
|
||||
not the state signal itself is found.
|
||||
|
||||
The list of control outputs is initialized with the bits from the state signal.
|
||||
It is then extended by adding all values that are calculated by cells that
|
||||
|
@ -281,17 +284,17 @@ transition table. For each state:
|
|||
|
||||
6. If step 4 was successful: Emit transition
|
||||
|
||||
Finally a $fsm cell is created with the generated transition table and added to
|
||||
the module. This new cell is connected to the control signals and the old
|
||||
Finally a ``$fsm`` cell is created with the generated transition table and added
|
||||
to the module. This new cell is connected to the control signals and the old
|
||||
drivers for the control outputs are disconnected.
|
||||
|
||||
FSM optimization
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The fsm_opt pass performs basic optimizations on $fsm cells (not including state
|
||||
recoding). The following optimizations are performed (in this order):
|
||||
The fsm_opt pass performs basic optimizations on ``$fsm`` cells (not including
|
||||
state recoding). The following optimizations are performed (in this order):
|
||||
|
||||
- Unused control outputs are removed from the $fsm cell. The attribute
|
||||
- Unused control outputs are removed from the ``$fsm`` cell. The attribute
|
||||
``\unused_bits`` (that is usually set by the opt_clean pass) is used to
|
||||
determine which control outputs are unused.
|
||||
|
9
docs/source/using_yosys/more_scripting/synth.rst
Normal file
9
docs/source/using_yosys/more_scripting/synth.rst
Normal file
|
@ -0,0 +1,9 @@
|
|||
Introduction to synthesis
|
||||
-------------------------
|
||||
|
||||
The following commands are executed by the ``synth`` command:
|
||||
|
||||
.. literalinclude:: /cmd/synth.rst
|
||||
:start-at: begin:
|
||||
:end-before: .. raw:: latex
|
||||
:dedent:
|
|
@ -78,8 +78,8 @@ It is possible to only work on this simpler version:
|
|||
|
||||
When trying to understand what a command does, creating a small test case to
|
||||
look at the output of ``dump`` and ``show`` before and after the command has
|
||||
been executed can be helpful. The :doc:`/using_yosys/selections` document has
|
||||
more information on using these commands.
|
||||
been executed can be helpful. The :doc:`/using_yosys/more_scripting/selections`
|
||||
document has more information on using these commands.
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue