3
0
Fork 0
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:
Krystine Sherwin 2023-08-03 09:20:30 +12:00
parent 20c2708383
commit 9a9aa2c45a
No known key found for this signature in database
11 changed files with 259 additions and 614 deletions

View file

@ -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`.

View file

@ -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
---------------------------

View file

@ -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

View file

@ -4,6 +4,6 @@ Using Yosys (advanced)
.. toctree::
:maxdepth: 2
more_scripting
more_scripting/index
memory_mapping
yosys_flows

View file

@ -5,4 +5,5 @@ More scripting
opt_passes
selections
synth
troubleshooting

View file

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

View 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:

View file

@ -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