mirror of https://github.com/YosysHQ/yosys.git
parent
4f1cd66829
commit
045c04096e
|
@ -1,141 +0,0 @@
|
|||
.. _chapter:approach:
|
||||
|
||||
Approach
|
||||
========
|
||||
|
||||
Yosys is a tool for synthesising (behavioural) Verilog HDL code to target
|
||||
architecture netlists. Yosys aims at a wide range of application domains and
|
||||
thus must be flexible and easy to adapt to new tasks. This chapter covers the
|
||||
general approach followed in the effort to implement this tool.
|
||||
|
||||
Data- and control-flow
|
||||
----------------------
|
||||
|
||||
The data- and control-flow of a typical synthesis tool is very similar to the
|
||||
data- and control-flow of a typical compiler: different subsystems are called in
|
||||
a predetermined order, each consuming the data generated by the last subsystem
|
||||
and generating the data for the next subsystem (see :numref:`Fig. %s
|
||||
<fig:approach_flow>`).
|
||||
|
||||
.. figure:: ../images/approach_flow.*
|
||||
:class: width-helper
|
||||
:name: fig:approach_flow
|
||||
|
||||
General data- and control-flow of a synthesis tool
|
||||
|
||||
The first subsystem to be called is usually called a frontend. It does not
|
||||
process the data generated by another subsystem but instead reads the user
|
||||
input—in the case of a HDL synthesis tool, the behavioural HDL code.
|
||||
|
||||
The subsystems that consume data from previous subsystems and produce data for
|
||||
the next subsystems (usually in the same or a similar format) are called passes.
|
||||
|
||||
The last subsystem that is executed transforms the data generated by the last
|
||||
pass into a suitable output format and writes it to a disk file. This subsystem
|
||||
is usually called the backend.
|
||||
|
||||
In Yosys all frontends, passes and backends are directly available as commands
|
||||
in the synthesis script. Thus the user can easily create a custom synthesis flow
|
||||
just by calling passes in the right order in a synthesis script.
|
||||
|
||||
Internal formats in Yosys
|
||||
-------------------------
|
||||
|
||||
Yosys uses two different internal formats. The first is used to store an
|
||||
abstract syntax tree (AST) of a Verilog input file. This format is simply called
|
||||
AST and is generated by the Verilog Frontend. This data structure is consumed by
|
||||
a subsystem called AST Frontend [1]_. This AST Frontend then generates a design
|
||||
in Yosys' main internal format, the
|
||||
Register-Transfer-Level-Intermediate-Language (RTLIL) representation. It does
|
||||
that by first performing a number of simplifications within the AST
|
||||
representation and then generating RTLIL from the simplified AST data structure.
|
||||
|
||||
The RTLIL representation is used by all passes as input and outputs. This has
|
||||
the following advantages over using different representational formats between
|
||||
different passes:
|
||||
|
||||
- The passes can be rearranged in a different order and passes can be removed
|
||||
or inserted.
|
||||
|
||||
- Passes can simply pass-thru the parts of the design they don't change without
|
||||
the need to convert between formats. In fact Yosys passes output the same
|
||||
data structure they received as input and performs all changes in place.
|
||||
|
||||
- All passes use the same interface, thus reducing the effort required to
|
||||
understand a pass when reading the Yosys source code, e.g. when adding
|
||||
additional features.
|
||||
|
||||
The RTLIL representation is basically a netlist representation with the
|
||||
following additional features:
|
||||
|
||||
- An internal cell library with fixed-function cells to represent RTL datapath
|
||||
and register cells as well as logical gate-level cells (single-bit gates and
|
||||
registers).
|
||||
|
||||
- Support for multi-bit values that can use individual bits from wires as well
|
||||
as constant bits to represent coarse-grain netlists.
|
||||
|
||||
- Support for basic behavioural constructs (if-then-else structures and
|
||||
multi-case switches with a sensitivity list for updating the outputs).
|
||||
|
||||
- Support for multi-port memories.
|
||||
|
||||
The use of RTLIL also has the disadvantage of having a very powerful format
|
||||
between all passes, even when doing gate-level synthesis where the more advanced
|
||||
features are not needed. In order to reduce complexity for passes that operate
|
||||
on a low-level representation, these passes check the features used in the input
|
||||
RTLIL and fail to run when unsupported high-level constructs are used. In such
|
||||
cases a pass that transforms the higher-level constructs to lower-level
|
||||
constructs must be called from the synthesis script first.
|
||||
|
||||
.. _sec:typusecase:
|
||||
|
||||
Typical use case
|
||||
----------------
|
||||
|
||||
The following example script may be used in a synthesis flow to convert the
|
||||
behavioural Verilog code from the input file design.v to a gate-level netlist
|
||||
synth.v using the cell library described by the Liberty file :
|
||||
|
||||
.. code:: yoscrypt
|
||||
:number-lines:
|
||||
|
||||
# read input file to internal representation
|
||||
read_verilog design.v
|
||||
|
||||
# convert high-level behavioral parts ("processes") to d-type flip-flops and muxes
|
||||
proc
|
||||
|
||||
# perform some simple optimizations
|
||||
opt
|
||||
|
||||
# convert high-level memory constructs to d-type flip-flops and multiplexers
|
||||
memory
|
||||
|
||||
# perform some simple optimizations
|
||||
opt
|
||||
|
||||
# convert design to (logical) gate-level netlists
|
||||
techmap
|
||||
|
||||
# perform some simple optimizations
|
||||
opt
|
||||
|
||||
# map internal register types to the ones from the cell library
|
||||
dfflibmap -liberty cells.lib
|
||||
|
||||
# use ABC to map remaining logic to cells from the cell library
|
||||
abc -liberty cells.lib
|
||||
|
||||
# cleanup
|
||||
opt
|
||||
|
||||
# write results to output file
|
||||
write_verilog synth.v
|
||||
|
||||
A detailed description of the commands available in Yosys can be found in
|
||||
:ref:`cmd_ref`.
|
||||
|
||||
.. [1]
|
||||
In Yosys the term pass is only used to refer to commands that operate on the
|
||||
RTLIL data structure.
|
|
@ -1,233 +0,0 @@
|
|||
.. _chapter:eval:
|
||||
|
||||
Evaluation, conclusion, future Work
|
||||
===================================
|
||||
|
||||
The Yosys source tree contains over 200 test cases [1]_ which are used
|
||||
in the make test make-target. Besides these there is an external Yosys
|
||||
benchmark and test case package that contains a few larger designs .
|
||||
This package contains the designs listed in
|
||||
Tab. \ `[tab:yosys-test-designs] <#tab:yosys-test-designs>`__.
|
||||
|
||||
.. table:: Tests included in the yosys-tests package.
|
||||
|
||||
=========== ========= ================
|
||||
======================================================
|
||||
Test-Design Source Gates Description / Comments
|
||||
=========== ========= ================
|
||||
======================================================
|
||||
aes_core IWLS2005 :math:`41{,}837` AES Cipher written by Rudolf Usselmann
|
||||
i2c IWLS2005 :math:`1{,}072` WISHBONE compliant I2C Master by Richard Herveille
|
||||
openmsp430 OpenCores :math:`7{,}173` MSP430 compatible CPU by Olivier Girard
|
||||
or1200 OpenCores :math:`42{,}675` The OpenRISC 1200 CPU by Damjan Lampret
|
||||
sasc IWLS2005 :math:`456` Simple Async. Serial Comm. Device by Rudolf Usselmann
|
||||
simple_spi IWLS2005 :math:`690` MC68HC11E based SPI interface by Richard Herveille
|
||||
spi IWLS2005 :math:`2{,}478` SPI IP core by Simon Srot
|
||||
ss_pcm IWLS2005 :math:`279` PCM IO Slave by Rudolf Usselmann
|
||||
systemcaes IWLS2005 :math:`6{,}893` AES core (using SystemC to Verilog) by Javier Castillo
|
||||
usb_phy IWLS2005 :math:`515` USB 1.1 PHY by Rudolf Usselmann
|
||||
=========== ========= ================
|
||||
======================================================
|
||||
|
||||
Correctness of synthesis results
|
||||
--------------------------------
|
||||
|
||||
The following measures were taken to increase the confidence in the
|
||||
correctness of the Yosys synthesis results:
|
||||
|
||||
- Yosys comes with a large selection [2]_ of small test cases that are
|
||||
evaluated when the command make test is executed. During development
|
||||
of Yosys it was shown that this collection of test cases is
|
||||
sufficient to catch most bugs. The following more sophisticated test
|
||||
procedures only caught a few additional bugs. Whenever this happened,
|
||||
an appropriate test case was added to the collection of small test
|
||||
cases for make test to ensure better testability of the feature in
|
||||
question in the future.
|
||||
|
||||
- The designs listed in
|
||||
Tab. \ `[tab:yosys-test-designs] <#tab:yosys-test-designs>`__ where
|
||||
validated using the formal verification tool Synopsys Formality. The
|
||||
Yosys synthesis scripts used to synthesize the individual designs for
|
||||
this test are slightly different per design in order to broaden the
|
||||
coverage of Yosys features. The large majority of all errors
|
||||
encountered using these tests are false-negatives, mostly related to
|
||||
FSM encoding or signal naming in large array logic (such as in memory
|
||||
blocks). Therefore the fsm_recode pass was extended so it can be used
|
||||
to generate TCL commands for Synopsys Formality that describe the
|
||||
relationship between old and new state encodings. Also the method
|
||||
used to generate signal and cell names in the Verilog backend was
|
||||
slightly modified in order to improve the automatic matching of net
|
||||
names in Synopsys Formality. With these changes in place all designs
|
||||
in Tab. \ `[tab:yosys-test-designs] <#tab:yosys-test-designs>`__
|
||||
validate successfully using Formality.
|
||||
|
||||
- VlogHammer is a set of scripts that auto-generate a large collection
|
||||
of test cases [3]_ and synthesize them using Yosys and the following
|
||||
freely available proprietary synthesis tools.
|
||||
|
||||
- Xilinx Vivado WebPack (2013.2)
|
||||
|
||||
- Xilinx ISE (XST) WebPack (14.5)
|
||||
|
||||
- Altera Quartus II Web Edition (13.0)
|
||||
|
||||
The built-in SAT solver of Yosys is used to formally verify the Yosys
|
||||
RTL- and Gate-Level netlists against the netlists generated by this
|
||||
other tools. [4]_ When differences are found, the input pattern that
|
||||
result in different outputs are used for simulating the original
|
||||
Verilog code as well as the synthesis results using the following
|
||||
Verilog simulators.
|
||||
|
||||
- Xilinx ISIM (from Xilinx ISE 14.5 )
|
||||
|
||||
- Modelsim 10.1d (from Quartus II 13.0 )
|
||||
|
||||
- Icarus Verilog (no specific version)
|
||||
|
||||
The set of tests performed by VlogHammer systematically verify the
|
||||
correct behaviour of
|
||||
|
||||
- Yosys Verilog Frontend and RTL generation
|
||||
|
||||
- Yosys Gate-Level Technology Mapping
|
||||
|
||||
- Yosys SAT Models for RTL- and Gate-Level cells
|
||||
|
||||
- Yosys Constant Evaluator Models for RTL- and Gate-Level cells
|
||||
|
||||
against the reference provided by the other tools. A few bugs related
|
||||
to sign extensions and bit-width extensions where found (and have
|
||||
been fixed meanwhile) using this approach. This test also revealed a
|
||||
small number of bugs in the other tools (i.e. Vivado, XST, Quartus,
|
||||
ISIM and Icarus Verilog; no bugs where found in Modelsim using
|
||||
vlogHammer so far).
|
||||
|
||||
Although complex software can never be expected to be fully bug-free
|
||||
:cite:p:`MURPHY`, it has been shown that Yosys is mature and
|
||||
feature-complete enough to handle most real-world cases correctly.
|
||||
|
||||
Quality of synthesis results
|
||||
----------------------------
|
||||
|
||||
In this section an attempt to evaluate the quality of Yosys synthesis
|
||||
results is made. To this end the synthesis results of a commercial FPGA
|
||||
synthesis tool when presented with the original HDL code vs. when
|
||||
presented with the Yosys synthesis result are compared.
|
||||
|
||||
The OpenMSP430 and the OpenRISC 1200 test cases were synthesized using
|
||||
the following Yosys synthesis script:
|
||||
|
||||
::
|
||||
|
||||
hierarchy -check
|
||||
proc; opt; fsm; opt; memory; opt
|
||||
techmap; opt; abc; opt
|
||||
|
||||
The original RTL and the Yosys output where both passed to the Xilinx
|
||||
XST 14.5 FPGA synthesis tool. The following setting where used for XST:
|
||||
|
||||
::
|
||||
|
||||
-p artix7
|
||||
-use_dsp48 NO
|
||||
-iobuf NO
|
||||
-ram_extract NO
|
||||
-rom_extract NO
|
||||
-fsm_extract YES
|
||||
-fsm_encoding Auto
|
||||
|
||||
The results of this comparison is summarized in
|
||||
Tab. \ `[tab:synth-test] <#tab:synth-test>`__. The used FPGA resources
|
||||
(registers and LUTs) and performance (maximum frequency as reported by
|
||||
XST) are given per module (indentation indicates module hierarchy, the
|
||||
numbers are including all contained modules).
|
||||
|
||||
For most modules the results are very similar between XST and Yosys. XST
|
||||
is used in both cases for the final mapping of logic to LUTs. So this
|
||||
comparison only compares the high-level synthesis functions (such as FSM
|
||||
extraction and encoding) of Yosys and XST.
|
||||
|
||||
.. table:: Synthesis results (as reported by XST) for OpenMSP430 and
|
||||
OpenRISC 1200
|
||||
|
||||
============================ ==== ==== ========== ==== =====
|
||||
==========
|
||||
\
|
||||
Module Regs LUTs Max. Freq. Regs LUTs Max. Freq.
|
||||
openMSP430 689 2210 71 MHz 719 2779 53 MHz
|
||||
1em omsp_clock_module 21 30 645 MHz 21 30 644 MHz
|
||||
1em 1em omsp_sync_cell 2 — 1542 MHz 2 — 1542 MHz
|
||||
1em 1em omsp_sync_reset 2 — 1542 MHz 2 — 1542 MHz
|
||||
1em omsp_dbg 143 344 292 MHz 149 430 353 MHz
|
||||
1em 1em omsp_dbg_uart 76 135 377 MHz 79 139 389 MHz
|
||||
1em omsp_execution_unit 266 911 80 MHz 266 1034 137 MHz
|
||||
1em 1em omsp_alu — 202 — — 263 —
|
||||
1em 1em omsp_register_file 231 478 285 MHz 231 506 293 MHz
|
||||
1em omsp_frontend 115 340 178 MHz 118 527 206 MHz
|
||||
1em omsp_mem_backbone 38 141 1087 MHz 38 144 1087 MHz
|
||||
1em omsp_multiplier 73 397 129 MHz 102 1053 55 MHz
|
||||
1em omsp_sfr 6 18 1023 MHz 6 20 1023 MHz
|
||||
1em omsp_watchdog 24 53 362 MHz 24 70 360 MHz
|
||||
or1200_top 7148 9969 135 MHz 7173 10238 108 MHz
|
||||
1em or1200_alu — 681 — — 641 —
|
||||
1em or1200_cfgr — 11 — — 11 —
|
||||
1em or1200_ctrl 175 186 464 MHz 174 279 377 MHz
|
||||
1em or1200_except 241 451 313 MHz 241 353 301 MHz
|
||||
1em or1200_freeze 6 18 507 MHz 6 16 515 MHz
|
||||
1em or1200_if 68 143 806 MHz 68 139 790 MHz
|
||||
1em or1200_lsu 8 138 — 12 205 1306 MHz
|
||||
1em 1em or1200_mem2reg — 60 — — 66 —
|
||||
1em 1em or1200_reg2mem — 29 — — 29 —
|
||||
1em or1200_mult_mac 394 2209 240 MHz 394 2230 241 MHz
|
||||
1em 1em or1200_amultp2_32x32 256 1783 240 MHz 256 1770 241 MHz
|
||||
1em or1200_operandmuxes 65 129 1145 MHz 65 129 1145 MHz
|
||||
1em or1200_rf 1041 1722 822 MHz 1042 1722 581 MHz
|
||||
1em or1200_sprs 18 432 724 MHz 18 469 722 MHz
|
||||
1em or1200_wbmux 33 93 — 33 78 —
|
||||
1em or1200_dc_top — 5 — — 5 —
|
||||
1em or1200_dmmu_top 2445 1004 — 2445 1043 —
|
||||
1em 1em or1200_dmmu_tlb 2444 975 — 2444 1013 —
|
||||
1em or1200_du 67 56 859 MHz 67 56 859 MHz
|
||||
1em or1200_ic_top 39 100 527 MHz 41 136 514 MHz
|
||||
1em 1em or1200_ic_fsm 40 42 408 MHz 40 75 484 MHz
|
||||
1em or1200_pic 38 50 1169 MHz 38 50 1177 MHz
|
||||
1em or1200_tt 64 112 370 MHz 64 186 437 MHz
|
||||
============================ ==== ==== ========== ==== =====
|
||||
==========
|
||||
|
||||
Conclusion and future Work
|
||||
--------------------------
|
||||
|
||||
Yosys is capable of correctly synthesizing real-world Verilog designs.
|
||||
The generated netlists are of a decent quality. However, in cases where
|
||||
dedicated hardware resources should be used for certain functions it is
|
||||
of course necessary to implement proper technology mapping for these
|
||||
functions in Yosys. This can be as easy as calling the techmap pass with
|
||||
an architecture-specific mapping file in the synthesis script. As no
|
||||
such thing has been done in the above tests, it is only natural that the
|
||||
resulting designs cannot benefit from these dedicated hardware
|
||||
resources.
|
||||
|
||||
Therefore future work includes the implementation of
|
||||
architecture-specific technology mappings besides additional frontends
|
||||
(VHDL), backends (EDIF), and above all else, application specific
|
||||
passes. After all, this was the main motivation for the development of
|
||||
Yosys in the first place.
|
||||
|
||||
.. [1]
|
||||
Most of this test cases are copied from HANA or the ASIC-WORLD
|
||||
website .
|
||||
|
||||
.. [2]
|
||||
At the time of this writing 269 test cases.
|
||||
|
||||
.. [3]
|
||||
At the time of this writing over 6600 test cases.
|
||||
|
||||
.. [4]
|
||||
A SAT solver is a program that can solve the boolean satisfiability
|
||||
problem. The built-in SAT solver in Yosys can be used for formal
|
||||
equivalence checking, amongst other things. See
|
||||
Sec. \ \ `[cmd:sat] <#cmd:sat>`__ for details.
|
||||
|
||||
.. footbibliography::
|
|
@ -1,96 +0,0 @@
|
|||
.. _chapter:intro:
|
||||
|
||||
Introduction
|
||||
============
|
||||
|
||||
This document presents the Free and Open Source (FOSS) Verilog HDL synthesis
|
||||
tool "Yosys". Its design and implementation as well as its performance on
|
||||
real-world designs is discussed in this document.
|
||||
|
||||
History of Yosys
|
||||
----------------
|
||||
|
||||
A Hardware Description Language (HDL) is a computer language used to describe
|
||||
circuits. A HDL synthesis tool is a computer program that takes a formal
|
||||
description of a circuit written in an HDL as input and generates a netlist that
|
||||
implements the given circuit as output.
|
||||
|
||||
Currently the most widely used and supported HDLs for digital circuits are
|
||||
Verilog :cite:p:`Verilog2005,VerilogSynth` and :abbr:`VHDL (VHSIC HDL, where
|
||||
VHSIC is an acronym for Very-High-Speed Integrated Circuits)`
|
||||
:cite:p:`VHDL,VHDLSynth`. Both HDLs are used for test and verification purposes
|
||||
as well as logic synthesis, resulting in a set of synthesizable and a set of
|
||||
non-synthesizable language features. In this document we only look at the
|
||||
synthesizable subset of the language features.
|
||||
|
||||
In recent work on heterogeneous coarse-grain reconfigurable logic
|
||||
:cite:p:`intersynth` the need for a custom application-specific HDL synthesis
|
||||
tool emerged. It was soon realised that a synthesis tool that understood Verilog
|
||||
or VHDL would be preferred over a synthesis tool for a custom HDL. Given an
|
||||
existing Verilog or VHDL front end, the work for writing the necessary
|
||||
additional features and integrating them in an existing tool can be estimated to
|
||||
be about the same as writing a new tool with support for a minimalistic custom
|
||||
HDL.
|
||||
|
||||
The proposed custom HDL synthesis tool should be licensed under a Free and Open
|
||||
Source Software (FOSS) licence. So an existing FOSS Verilog or VHDL synthesis
|
||||
tool would have been needed as basis to build upon. The main advantages of
|
||||
choosing Verilog or VHDL is the ability to synthesize existing HDL code and to
|
||||
mitigate the requirement for circuit-designers to learn a new language. In order
|
||||
to take full advantage of any existing FOSS Verilog or VHDL tool, such a tool
|
||||
would have to provide a feature-complete implementation of the synthesizable HDL
|
||||
subset.
|
||||
|
||||
Basic RTL synthesis is a well understood field :cite:p:`LogicSynthesis`. Lexing,
|
||||
parsing and processing of computer languages :cite:p:`Dragonbook` is a
|
||||
thoroughly researched field. All the information required to write such tools
|
||||
has been openly available for a long time, and it is therefore likely that a
|
||||
FOSS HDL synthesis tool with a feature-complete Verilog or VHDL front end must
|
||||
exist which can be used as a basis for a custom RTL synthesis tool.
|
||||
|
||||
Due to the author's preference for Verilog over VHDL it was decided early on to
|
||||
go for Verilog instead of VHDL [#]_. So the existing FOSS Verilog synthesis
|
||||
tools were evaluated. The results of this evaluation are utterly devastating.
|
||||
Therefore a completely new Verilog synthesis tool was implemented and is
|
||||
recommended as basis for custom synthesis tools. This is the tool that is
|
||||
discussed in this document.
|
||||
|
||||
Structure of this document
|
||||
--------------------------
|
||||
|
||||
The structure of this document is as follows:
|
||||
|
||||
:numref:`Chapter %s <chapter:intro>` is this introduction.
|
||||
|
||||
:numref:`Chapter %s <chapter:basics>` covers a short introduction to the world
|
||||
of HDL synthesis. Basic principles and the terminology are outlined in this
|
||||
chapter.
|
||||
|
||||
:numref:`Chapter %s <chapter:approach>` gives the quickest possible outline to
|
||||
how the problem of implementing a HDL synthesis tool is approached in the case
|
||||
of Yosys.
|
||||
|
||||
:numref:`Chapter %s <chapter:overview>` contains a more detailed overview of the
|
||||
implementation of Yosys. This chapter covers the data structures used in Yosys
|
||||
to represent a design in detail and is therefore recommended reading for
|
||||
everyone who is interested in understanding the Yosys internals.
|
||||
|
||||
:numref:`Chapter %s <chapter:celllib>` covers the internal cell library used by
|
||||
Yosys. This is especially important knowledge for anyone who wants to understand
|
||||
the intermediate netlists used internally by Yosys.
|
||||
|
||||
:numref:`Chapter %s <chapter:prog>` gives a tour to the internal APIs of Yosys.
|
||||
This is recommended reading for everyone who actually wants to read or write
|
||||
Yosys source code. The chapter concludes with an example loadable module for
|
||||
Yosys.
|
||||
|
||||
Chapters :numref:`%s <chapter:verilog>`, :numref:`%s <chapter:opt>` and
|
||||
:numref:`%s <chapter:techmap>` cover three important pieces of the synthesis
|
||||
pipeline: The Verilog frontend, the optimization passes and the technology
|
||||
mapping to the target architecture, respectively.
|
||||
|
||||
Various appendices, including a :ref:`cmd_ref`, complete this document.
|
||||
|
||||
.. [#]
|
||||
A quick investigation into FOSS VHDL tools yielded similar grim results for
|
||||
FOSS VHDL synthesis tools.
|
|
@ -0,0 +1,44 @@
|
|||
{#
|
||||
|
||||
See https://github.com/pradyunsg/furo/blob/main/src/furo/theme/furo/page.html for the original
|
||||
block this is overwriting.
|
||||
|
||||
The part that is customized is between the "begin of custom part" and "end of custom part"
|
||||
comments below. It uses the same styles as the existing right sidebar code.
|
||||
|
||||
#}
|
||||
{% extends "furo/page.html" %}
|
||||
{% block right_sidebar %}
|
||||
<div class="toc-sticky toc-scroll">
|
||||
{# begin of custom part #}
|
||||
<div class="toc-title-container">
|
||||
<span class="toc-title">
|
||||
YosysHQ
|
||||
</span>
|
||||
</div>
|
||||
<div class="toc-tree-container yosyshq-links" style="padding-bottom: 0">
|
||||
<div class="toc-tree">
|
||||
<ul>
|
||||
<li></li>
|
||||
<li><a class="reference external" href="https://yosyshq.readthedocs.io">Docs</a></li>
|
||||
<li><a class="reference external" href="https://blog.yosyshq.com">Blog</a></li>
|
||||
<li><a class="reference external" href="https://www.yosyshq.com">Website</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{# end of custom part #}
|
||||
{% if not furo_hide_toc %}
|
||||
<div class="toc-title-container">
|
||||
<span class="toc-title">
|
||||
{{ _("On this page") }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="toc-tree-container">
|
||||
<div class="toc-tree">
|
||||
{{ toc }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
Appendix
|
||||
========
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:includehidden:
|
||||
|
||||
appendix/primer
|
||||
appendix/auxlibs
|
||||
appendix/auxprogs
|
||||
|
||||
appendix/APPNOTE_010_Verilog_to_BLIF.rst
|
||||
appendix/APPNOTE_011_Design_Investigation.rst
|
||||
appendix/APPNOTE_012_Verilog_to_BTOR.rst
|
||||
|
||||
bib
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:includehidden:
|
||||
|
||||
cmd_ref
|
|
@ -1,410 +0,0 @@
|
|||
.. _chapter:sota:
|
||||
|
||||
Evaluation of other OSS Verilog Synthesis Tools
|
||||
===============================================
|
||||
|
||||
In this appendix [1]_ the existing FOSS Verilog synthesis tools [2]_ are
|
||||
evaluated. Extremely limited or application specific tools (e.g. pure
|
||||
Verilog Netlist parsers) as well as Verilog simulators are not included.
|
||||
These existing solutions are tested using a set of representative
|
||||
Verilog code snippets. It is shown that no existing FOSS tool implements
|
||||
even close to a sufficient subset of Verilog to be usable as synthesis
|
||||
tool for a wide range existing Verilog code.
|
||||
|
||||
The packages evaluated are:
|
||||
|
||||
- Icarus Verilog [3]_
|
||||
|
||||
- Verilog-to-Routing (VTR) / Odin-II
|
||||
:cite:p:`vtr2012}`:raw-latex:`\cite{Odin`
|
||||
|
||||
- HDL Analyzer and Netlist Architect (HANA)
|
||||
|
||||
- Verilog front-end to VIS (vl2mv) :cite:p:`Cheng93vl2mv:a`
|
||||
|
||||
In each of the following sections Verilog modules that test a certain
|
||||
Verilog language feature are presented and the support for these
|
||||
features is tested in all the tools mentioned above. It is evaluated
|
||||
whether the tools under test successfully generate netlists for the
|
||||
Verilog input and whether these netlists match the simulation behavior
|
||||
of the designs using testbenches.
|
||||
|
||||
All test cases are verified to be synthesizeable using Xilinx XST from
|
||||
the Xilinx WebPACK suite.
|
||||
|
||||
Trivial features such as support for simple structural Verilog are not
|
||||
explicitly tested.
|
||||
|
||||
Vl2mv and Odin-II generate output in the BLIF (Berkeley Logic
|
||||
Interchange Format) and BLIF-MV (an extended version of BLIF) formats
|
||||
respectively. ABC is used to convert this output to Verilog for
|
||||
verification using testbenches.
|
||||
|
||||
Icarus Verilog generates EDIF (Electronic Design Interchange Format)
|
||||
output utilizing LPM (Library of Parameterized Modules) cells. The EDIF
|
||||
files are converted to Verilog using edif2ngd and netgen from Xilinx
|
||||
WebPACK. A hand-written implementation of the LPM cells utilized by the
|
||||
generated netlists is used for verification.
|
||||
|
||||
Following these functional tests, a quick analysis of the extensibility
|
||||
of the tools under test is provided in a separate section.
|
||||
|
||||
The last section of this chapter finally concludes these series of
|
||||
evaluations with a summary of the results.
|
||||
|
||||
.. code:: verilog
|
||||
:number-lines:
|
||||
|
||||
module uut_always01(clock,
|
||||
reset, count);
|
||||
|
||||
input clock, reset;
|
||||
output [3:0] count;
|
||||
reg [3:0] count;
|
||||
|
||||
always @(posedge clock)
|
||||
count <= reset ?
|
||||
0 : count + 1;
|
||||
|
||||
|
||||
|
||||
endmodule
|
||||
|
||||
.. code:: verilog
|
||||
|
||||
module uut_always02(clock,
|
||||
reset, count);
|
||||
|
||||
input clock, reset;
|
||||
output [3:0] count;
|
||||
reg [3:0] count;
|
||||
|
||||
always @(posedge clock) begin
|
||||
count <= count + 1;
|
||||
if (reset)
|
||||
count <= 0;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
[fig:StateOfTheArt_always12]
|
||||
|
||||
.. code:: verilog
|
||||
:number-lines:
|
||||
|
||||
module uut_always03(clock, in1, in2, in3, in4, in5, in6, in7,
|
||||
out1, out2, out3);
|
||||
|
||||
input clock, in1, in2, in3, in4, in5, in6, in7;
|
||||
output out1, out2, out3;
|
||||
reg out1, out2, out3;
|
||||
|
||||
always @(posedge clock) begin
|
||||
out1 = in1;
|
||||
if (in2)
|
||||
out1 = !out1;
|
||||
out2 <= out1;
|
||||
if (in3)
|
||||
out2 <= out2;
|
||||
if (in4)
|
||||
if (in5)
|
||||
out3 <= in6;
|
||||
else
|
||||
out3 <= in7;
|
||||
out1 = out1 ^ out2;
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
[fig:StateOfTheArt_always3]
|
||||
|
||||
.. _sec:blocking_nonblocking:
|
||||
|
||||
Always blocks and blocking vs. nonblocking assignments
|
||||
------------------------------------------------------
|
||||
|
||||
The "always"-block is one of the most fundamental non-trivial Verilog
|
||||
language features. It can be used to model a combinatorial path (with
|
||||
optional registers on the outputs) in a way that mimics a regular
|
||||
programming language.
|
||||
|
||||
Within an always block, if- and case-statements can be used to model
|
||||
multiplexers. Blocking assignments (:math:`=`) and nonblocking
|
||||
assignments (:math:`<=`) are used to populate the leaf-nodes of these
|
||||
multiplexer trees. Unassigned leaf-nodes default to feedback paths that
|
||||
cause the output register to hold the previous value. More advanced
|
||||
synthesis tools often convert these feedback paths to register enable
|
||||
signals or even generate circuits with clock gating.
|
||||
|
||||
Registers assigned with nonblocking assignments (:math:`<=`) behave
|
||||
differently from variables in regular programming languages: In a
|
||||
simulation they are not updated immediately after being assigned.
|
||||
Instead the right-hand sides are evaluated and the results stored in
|
||||
temporary memory locations. After all pending updates have been prepared
|
||||
in this way they are executed, thus yielding semi-parallel execution of
|
||||
all nonblocking assignments.
|
||||
|
||||
For synthesis this means that every occurrence of that register in an
|
||||
expression addresses the output port of the corresponding register
|
||||
regardless of the question whether the register has been assigned a new
|
||||
value in an earlier command in the same always block. Therefore with
|
||||
nonblocking assignments the order of the assignments has no effect on
|
||||
the resulting circuit as long as the left-hand sides of the assignments
|
||||
are unique.
|
||||
|
||||
The three example codes in
|
||||
:numref:`Fig. %s <fig:StateOfTheArt_always12>`
|
||||
and :numref:`Fig. %s <fig:StateOfTheArt_always3>`
|
||||
use all these features and can thus be used to test the synthesis tools
|
||||
capabilities to synthesize always blocks correctly.
|
||||
|
||||
The first example is only using the most fundamental Verilog features.
|
||||
All tools under test were able to successfully synthesize this design.
|
||||
|
||||
.. code:: verilog
|
||||
:number-lines:
|
||||
|
||||
module uut_arrays01(clock, we, addr, wr_data, rd_data);
|
||||
|
||||
input clock, we;
|
||||
input [3:0] addr, wr_data;
|
||||
output [3:0] rd_data;
|
||||
reg [3:0] rd_data;
|
||||
|
||||
reg [3:0] memory [15:0];
|
||||
|
||||
always @(posedge clock) begin
|
||||
if (we)
|
||||
memory[addr] <= wr_data;
|
||||
rd_data <= memory[addr];
|
||||
end
|
||||
|
||||
endmodule
|
||||
|
||||
[fig:StateOfTheArt_arrays]
|
||||
|
||||
The 2nd example is functionally identical to the 1st one but is using an
|
||||
if-statement inside the always block. Odin-II fails to synthesize it and
|
||||
instead produces the following error message:
|
||||
|
||||
::
|
||||
|
||||
ERROR: (File: always02.v) (Line number: 13)
|
||||
You've defined the driver "count~0" twice
|
||||
|
||||
Vl2mv does not produce an error message but outputs an invalid synthesis
|
||||
result that is not using the reset input at all.
|
||||
|
||||
Icarus Verilog also doesn't produce an error message but generates an
|
||||
invalid output for this 2nd example. The code generated by Icarus
|
||||
Verilog only implements the reset path for the count register,
|
||||
effectively setting the output to constant 0.
|
||||
|
||||
So of all tools under test only HANA was able to create correct
|
||||
synthesis results for the 2nd example.
|
||||
|
||||
The 3rd example is using blocking and nonblocking assignments and many
|
||||
if statements. Odin also fails to synthesize this example:
|
||||
|
||||
::
|
||||
|
||||
ERROR: (File: always03.v) (Line number: 8)
|
||||
ODIN doesn't handle blocking statements in Sequential blocks
|
||||
|
||||
HANA, Icarus Verilog and vl2mv create invalid synthesis results for the
|
||||
3rd example.
|
||||
|
||||
So unfortunately none of the tools under test provide a complete and
|
||||
correct implementation of blocking and nonblocking assignments.
|
||||
|
||||
Arrays for memory modelling
|
||||
---------------------------
|
||||
|
||||
Verilog arrays are part of the synthesizeable subset of Verilog and are
|
||||
commonly used to model addressable memory. The Verilog code in
|
||||
:numref:`Fig. %s <fig:StateOfTheArt_arrays>`
|
||||
demonstrates this by implementing a single port memory.
|
||||
|
||||
For this design HANA, vl2m and ODIN-II generate error messages
|
||||
indicating that arrays are not supported.
|
||||
|
||||
.. code:: verilog
|
||||
:number-lines:
|
||||
|
||||
module uut_forgen01(a, y);
|
||||
|
||||
input [4:0] a;
|
||||
output y;
|
||||
|
||||
integer i, j;
|
||||
reg [31:0] lut;
|
||||
|
||||
initial begin
|
||||
for (i = 0; i < 32; i = i+1) begin
|
||||
lut[i] = i > 1;
|
||||
for (j = 2; j*j <= i; j = j+1)
|
||||
if (i % j == 0)
|
||||
lut[i] = 0;
|
||||
end
|
||||
end
|
||||
|
||||
assign y = lut[a];
|
||||
|
||||
endmodule
|
||||
|
||||
[fig:StateOfTheArt_for]
|
||||
|
||||
Icarus Verilog produces an invalid output that is using the address only
|
||||
for reads. Instead of using the address input for writes, the generated
|
||||
design simply loads the data to all memory locations whenever the
|
||||
write-enable input is active, effectively turning the design into a
|
||||
single 4-bit D-Flip-Flop with enable input.
|
||||
|
||||
As all tools under test already fail this simple test, there is nothing
|
||||
to gain by continuing tests on this aspect of Verilog synthesis such as
|
||||
synthesis of dual port memories, correct handling of write collisions,
|
||||
and so forth.
|
||||
|
||||
.. code:: verilog
|
||||
:number-lines:
|
||||
|
||||
module uut_forgen02(a, b, cin, y, cout);
|
||||
|
||||
parameter WIDTH = 8;
|
||||
|
||||
input [WIDTH-1:0] a, b;
|
||||
input cin;
|
||||
|
||||
output [WIDTH-1:0] y;
|
||||
output cout;
|
||||
|
||||
genvar i;
|
||||
wire [WIDTH-1:0] carry;
|
||||
|
||||
generate
|
||||
for (i = 0; i < WIDTH; i=i+1) begin:adder
|
||||
wire [2:0] D;
|
||||
assign D[1:0] = { a[i], b[i] };
|
||||
if (i == 0) begin:chain
|
||||
assign D[2] = cin;
|
||||
end else begin:chain
|
||||
assign D[2] = carry[i-1];
|
||||
end
|
||||
assign y[i] = ^D;
|
||||
assign carry[i] = &D[1:0] | (^D[1:0] & D[2]);
|
||||
end
|
||||
endgenerate
|
||||
|
||||
assign cout = carry[WIDTH-1];
|
||||
|
||||
endmodule
|
||||
|
||||
[fig:StateOfTheArt_gen]
|
||||
|
||||
For-loops and generate blocks
|
||||
-----------------------------
|
||||
|
||||
For-loops and generate blocks are more advanced Verilog features. These
|
||||
features allow the circuit designer to add program code to her design
|
||||
that is evaluated during synthesis to generate (parts of) the circuits
|
||||
description; something that could only be done using a code generator
|
||||
otherwise.
|
||||
|
||||
For-loops are only allowed in synthesizeable Verilog if they can be
|
||||
completely unrolled. Then they can be a powerful tool to generate array
|
||||
logic or static lookup tables. The code in
|
||||
:numref:`Fig. %s <fig:StateOfTheArt_for>` generates a
|
||||
circuit that tests a 5 bit value for being a prime number using a static
|
||||
lookup table.
|
||||
|
||||
Generate blocks can be used to model array logic in complex parametric
|
||||
designs. The code in
|
||||
:numref:`Fig. %s <fig:StateOfTheArt_gen>` implements a
|
||||
ripple-carry adder with parametric width from simple assign-statements
|
||||
and logic operations using a Verilog generate block.
|
||||
|
||||
All tools under test failed to synthesize both test cases. HANA creates
|
||||
invalid output in both cases. Icarus Verilog creates invalid output for
|
||||
the first test and fails with an error for the second case. The other
|
||||
two tools fail with error messages for both tests.
|
||||
|
||||
Extensibility
|
||||
-------------
|
||||
|
||||
This section briefly discusses the extensibility of the tools under test
|
||||
and their internal data- and control-flow. As all tools under test
|
||||
already failed to synthesize simple Verilog always-blocks correctly, not
|
||||
much resources have been spent on evaluating the extensibility of these
|
||||
tools and therefore only a very brief discussion of the topic is
|
||||
provided here.
|
||||
|
||||
HANA synthesizes for a built-in library of standard cells using two
|
||||
passes over an AST representation of the Verilog input. This approach
|
||||
executes fast but limits the extensibility as everything happens in only
|
||||
two comparable complex AST walks and there is no universal intermediate
|
||||
representation that is flexible enough to be used in arbitrary
|
||||
optimizations.
|
||||
|
||||
Odin-II and vl2m are both front ends to existing synthesis flows. As
|
||||
such they only try to quickly convert the Verilog input into the
|
||||
internal representation of their respective flows (BLIF). So
|
||||
extensibility is less of an issue here as potential extensions would
|
||||
likely be implemented in other components of the flow.
|
||||
|
||||
Icarus Verilog is clearly designed to be a simulation tool rather than a
|
||||
synthesis tool. The synthesis part of Icarus Verilog is an ad-hoc add-on
|
||||
to Icarus Verilog that aims at converting an internal representation
|
||||
that is meant for generation of a virtual machine based simulation code
|
||||
to netlists.
|
||||
|
||||
Summary and Outlook
|
||||
-------------------
|
||||
|
||||
Table \ :numref:`tab:StateOfTheArt_sum` summarizes
|
||||
the tests performed. Clearly none of the tools under test make a serious
|
||||
attempt at providing a feature-complete implementation of Verilog. It
|
||||
can be argued that Odin-II performed best in the test as it never
|
||||
generated incorrect code but instead produced error messages indicating
|
||||
that unsupported Verilog features where used in the Verilog input.
|
||||
|
||||
In conclusion, to the best knowledge of the author, there is no FOSS
|
||||
Verilog synthesis tool other than Yosys that is anywhere near feature
|
||||
completeness and therefore there is no other candidate for a generic
|
||||
Verilog front end and/or synthesis framework to be used as a basis for
|
||||
custom synthesis tools.
|
||||
|
||||
Yosys could also replace vl2m and/or Odin-II in their respective flows
|
||||
or function as a pre-compiler that can translate full-featured Verilog
|
||||
code to the simple subset of Verilog that is understood by vl2m and
|
||||
Odin-II.
|
||||
|
||||
Yosys is designed for extensibility. It can be used as-is to synthesize
|
||||
Verilog code to netlists, but its main purpose is to be used as basis
|
||||
for custom tools. Yosys is structured in a language dependent Verilog
|
||||
front end and language independent synthesis code (which is in itself
|
||||
structured in independent passes). This architecture will simplify
|
||||
implementing additional HDL front ends and/or additional synthesis
|
||||
passes.
|
||||
|
||||
Chapter \ :numref:`<CHAPTER_eval>` contains a more detailed
|
||||
evaluation of Yosys using real-world designs that are far out of reach
|
||||
for any of the other tools discussed in this appendix.
|
||||
|
||||
…passed 2em …produced error 2em :math:`\skull` …incorrect output
|
||||
|
||||
[tab:StateOfTheArt_sum]
|
||||
|
||||
.. [1]
|
||||
This appendix is an updated version of an unpublished student
|
||||
research paper. :cite:p:`VerilogFossEval`
|
||||
|
||||
.. [2]
|
||||
To the author's best knowledge, all relevant tools that existed at
|
||||
the time of this writing are included. But as there is no formal
|
||||
channel through which such tools are published it is hard to give any
|
||||
guarantees in that matter.
|
||||
|
||||
.. [3]
|
||||
Icarus Verilog is mainly a simulation tool but also supported
|
||||
synthesis up to version 0.8. Therefore version 0.8.7 is used for this
|
||||
evaluation.)
|
|
@ -17,7 +17,7 @@ BigInt
|
|||
The files in ``libs/bigint/`` provide a library for performing arithmetic with
|
||||
arbitrary length integers. It is written by Matt McCutchen.
|
||||
|
||||
The BigInt library is used for evaluating constant expressions, e.g. using the
|
||||
The BigInt library is used for evaluating constant expressions, e.g. using the
|
||||
ConstEval class provided in kernel/consteval.h.
|
||||
|
||||
See also: http://mattmccutchen.net/bigint/
|
|
@ -9,7 +9,7 @@ yosys-config
|
|||
|
||||
The yosys-config tool (an auto-generated shell-script) can be used to query
|
||||
compiler options and other information needed for building loadable modules for
|
||||
Yosys. See Sec. \ :numref:`chapter:prog` for details.
|
||||
Yosys. See :ref:`chapter:prog` for details.
|
||||
|
||||
.. _sec:filterlib:
|
||||
|
||||
|
@ -17,7 +17,7 @@ yosys-filterlib
|
|||
---------------
|
||||
|
||||
The yosys-filterlib tool is a small utility that can be used to strip or extract
|
||||
information from a Liberty file. See :numref:`Sec. %s <sec:techmap_extern>` for
|
||||
information from a Liberty file. See :ref:`sec:techmap_extern` for
|
||||
details.
|
||||
|
||||
yosys-abc
|
|
@ -3,8 +3,8 @@
|
|||
|
||||
.. _chapter:basics:
|
||||
|
||||
Basic principles
|
||||
================
|
||||
A primer on digital circuit synthesis
|
||||
=====================================
|
||||
|
||||
This chapter contains a short introduction to the basic principles of digital
|
||||
circuit synthesis.
|
||||
|
@ -23,7 +23,7 @@ circuit to a functionally equivalent low-level representation of a circuit.
|
|||
:numref:`Figure %s <fig:Basics_abstractions>` lists the different levels of
|
||||
abstraction and how they relate to different kinds of synthesis.
|
||||
|
||||
.. figure:: ../images/basics_abstractions.*
|
||||
.. figure:: ../../images/basics_abstractions.*
|
||||
:class: width-helper
|
||||
:name: fig:Basics_abstractions
|
||||
|
||||
|
@ -161,7 +161,7 @@ At the logical gate level the design is represented by a netlist that uses only
|
|||
cells from a small number of single-bit cells, such as basic logic gates (AND,
|
||||
OR, NOT, XOR, etc.) and registers (usually D-Type Flip-flops).
|
||||
|
||||
A number of netlist formats exists that can be used on this level, e.g. the
|
||||
A number of netlist formats exists that can be used on this level, e.g. the
|
||||
Electronic Design Interchange Format (EDIF), but for ease of simulation often a
|
||||
HDL netlist is used. The latter is a HDL file (Verilog or VHDL) that only uses
|
||||
the most basic language constructs for instantiation and connecting of cells.
|
||||
|
@ -172,7 +172,7 @@ good) mapping of the logic gate netlist to an equivalent netlist of physically
|
|||
available gate types.
|
||||
|
||||
The simplest approach to logic synthesis is two-level logic synthesis, where a
|
||||
logic function is converted into a sum-of-products representation, e.g. using a
|
||||
logic function is converted into a sum-of-products representation, e.g. using a
|
||||
Karnaugh map. This is a simple approach, but has exponential worst-case effort
|
||||
and cannot make efficient use of physical gates other than AND/NAND-, OR/NOR-
|
||||
and NOT-Gates.
|
||||
|
@ -196,7 +196,7 @@ Physical gate level
|
|||
On the physical gate level only gates are used that are physically available on
|
||||
the target architecture. In some cases this may only be NAND, NOR and NOT gates
|
||||
as well as D-Type registers. In other cases this might include cells that are
|
||||
more complex than the cells used at the logical gate level (e.g. complete
|
||||
more complex than the cells used at the logical gate level (e.g. complete
|
||||
half-adders). In the case of an FPGA-based design the physical gate level
|
||||
representation is a netlist of LUTs with optional output registers, as these are
|
||||
the basic building blocks of FPGA logic cells.
|
||||
|
@ -345,7 +345,7 @@ covered by the Verilog synthesis standard and when writing new designs one
|
|||
should limit herself or himself to these cases.
|
||||
|
||||
In behavioural modelling, blocking assignments (=) and non-blocking assignments
|
||||
(<=) can be used. The concept of blocking vs. non-blocking assignment is one of
|
||||
(<=) can be used. The concept of blocking vs. non-blocking assignment is one of
|
||||
the most misunderstood constructs in Verilog :cite:p:`Cummings00`.
|
||||
|
||||
The blocking assignment behaves exactly like an assignment in any imperative
|
||||
|
@ -498,7 +498,7 @@ Then the synthesizable description is transformed to lower-level representations
|
|||
using a series of tools and the results are again verified using simulation.
|
||||
This process is illustrated in :numref:`Fig. %s <fig:Basics_flow>`.
|
||||
|
||||
.. figure:: ../images/basics_flow.*
|
||||
.. figure:: ../../images/basics_flow.*
|
||||
:class: width-helper
|
||||
:name: fig:Basics_flow
|
||||
|
||||
|
@ -515,8 +515,8 @@ Gate-Level Model are verified and the design process is finished.
|
|||
However, in any real-world design effort there will be multiple iterations for
|
||||
this design process. The reason for this can be the late change of a design
|
||||
requirement or the fact that the analysis of a low-abstraction model
|
||||
(e.g. gate-level timing analysis) revealed that a design change is required in
|
||||
order to meet the design requirements (e.g. maximum possible clock speed).
|
||||
(e.g. gate-level timing analysis) revealed that a design change is required in
|
||||
order to meet the design requirements (e.g. maximum possible clock speed).
|
||||
|
||||
Whenever the behavioural model or the system level model is changed their
|
||||
equivalence must be re-verified by re-running the simulations and comparing the
|
||||
|
@ -572,7 +572,7 @@ of lexical tokens given in :numref:`Tab. %s <tab:Basics_tokens>`.
|
|||
TOK_SEMICOLON \-
|
||||
============== ===============
|
||||
|
||||
The lexer is usually generated by a lexer generator (e.g. flex ) from a
|
||||
The lexer is usually generated by a lexer generator (e.g. flex ) from a
|
||||
description file that is using regular expressions to specify the text pattern
|
||||
that should match the individual tokens.
|
||||
|
||||
|
@ -586,7 +586,7 @@ use the Token-Type to make a decision on the grammatical role of a token.
|
|||
|
||||
The parser then transforms the list of tokens into a parse tree that closely
|
||||
resembles the productions from the computer languages grammar. As the lexer, the
|
||||
parser is also typically generated by a code generator (e.g. bison ) from a
|
||||
parser is also typically generated by a code generator (e.g. bison ) from a
|
||||
grammar description in Backus-Naur Form (BNF).
|
||||
|
||||
Let's consider the following BNF (in Bison syntax):
|
||||
|
@ -597,7 +597,7 @@ Let's consider the following BNF (in Bison syntax):
|
|||
assign_stmt: TOK_ASSIGN TOK_IDENTIFIER TOK_EQ expr TOK_SEMICOLON;
|
||||
expr: TOK_IDENTIFIER | TOK_NUMBER | expr TOK_PLUS expr;
|
||||
|
||||
.. figure:: ../images/basics_parsetree.*
|
||||
.. figure:: ../../images/basics_parsetree.*
|
||||
:class: width-helper
|
||||
:name: fig:Basics_parsetree
|
||||
|
||||
|
@ -610,7 +610,7 @@ whole as data structure in memory. Instead the parser calls user-specified code
|
|||
snippets (so-called reduce-functions) for all inner nodes of the parse tree in
|
||||
depth-first order.
|
||||
|
||||
In some very simple applications (e.g. code generation for stack machines) it is
|
||||
In some very simple applications (e.g. code generation for stack machines) it is
|
||||
possible to perform the task at hand directly in the reduce functions. But
|
||||
usually the reduce functions are only used to build an in-memory data structure
|
||||
with the relevant information from the parse tree. This data structure is called
|
||||
|
@ -626,7 +626,7 @@ Usually the AST is then converted into yet another representation that is more
|
|||
suitable for further processing. In compilers this is often an assembler-like
|
||||
three-address-code intermediate representation. :cite:p:`Dragonbook`
|
||||
|
||||
.. figure:: ../images/basics_ast.*
|
||||
.. figure:: ../../images/basics_ast.*
|
||||
:class: width-helper
|
||||
:name: fig:Basics_ast
|
||||
|
|
@ -8,4 +8,4 @@ Command line reference
|
|||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
cmd/*
|
||||
../cmd/*
|
||||
|
|
|
@ -7,11 +7,31 @@ author = 'YosysHQ GmbH'
|
|||
copyright ='2022 YosysHQ GmbH'
|
||||
|
||||
# select HTML theme
|
||||
html_theme = 'press'
|
||||
html_theme = 'furo'
|
||||
templates_path = ["_templates"]
|
||||
html_logo = '../static/logo.png'
|
||||
html_favicon = '../static/favico.png'
|
||||
html_css_files = ['yosyshq.css', 'custom.css']
|
||||
html_sidebars = {'**': ['util/searchbox.html', 'util/sidetoc.html']}
|
||||
|
||||
html_theme_options = {
|
||||
"sidebar_hide_name": True,
|
||||
|
||||
"light_css_variables": {
|
||||
"color-brand-primary": "#d6368f",
|
||||
"color-brand-content": "#4b72b8",
|
||||
"color-api-name": "#8857a3",
|
||||
"color-api-pre-name": "#4b72b8",
|
||||
"color-link": "#8857a3",
|
||||
},
|
||||
|
||||
"dark_css_variables": {
|
||||
"color-brand-primary": "#e488bb",
|
||||
"color-brand-content": "#98bdff",
|
||||
"color-api-name": "#8857a3",
|
||||
"color-api-pre-name": "#4b72b8",
|
||||
"color-link": "#be95d5",
|
||||
},
|
||||
}
|
||||
|
||||
# These folders are copied to the documentation's HTML output
|
||||
html_static_path = ['../static', "../images"]
|
||||
|
@ -20,14 +40,6 @@ html_static_path = ['../static', "../images"]
|
|||
pygments_style = 'colorful'
|
||||
highlight_language = 'none'
|
||||
|
||||
html_theme_options = {
|
||||
'external_links' : [
|
||||
('YosysHQ Docs', 'https://yosyshq.readthedocs.io'),
|
||||
('Blog', 'https://blog.yosyshq.com'),
|
||||
('Website', 'https://www.yosyshq.com'),
|
||||
],
|
||||
}
|
||||
|
||||
extensions = ['sphinx.ext.autosectionlabel', 'sphinxcontrib.bibtex']
|
||||
|
||||
# Ensure that autosectionlabel will produce unique names
|
||||
|
@ -41,8 +53,6 @@ bibtex_bibfiles = ['literature.bib']
|
|||
|
||||
# unused docs
|
||||
exclude_patterns = [
|
||||
"CHAPTER_Eval.rst",
|
||||
"appendix/CHAPTER_StateOfTheArt.rst"
|
||||
"test_suites.rst"
|
||||
]
|
||||
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
Getting started with Yosys
|
||||
==========================
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Supported platforms
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Introduction to scripting in Yosys
|
||||
----------------------------------
|
||||
|
||||
Example(s)
|
||||
----------
|
|
@ -0,0 +1,50 @@
|
|||
Example(s)
|
||||
----------
|
||||
|
||||
.. _sec:typusecase:
|
||||
|
||||
Typical use case
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
The following example script may be used in a synthesis flow to convert the
|
||||
behavioural Verilog code from the input file design.v to a gate-level netlist
|
||||
synth.v using the cell library described by the Liberty file :
|
||||
|
||||
.. code:: yoscrypt
|
||||
:number-lines:
|
||||
|
||||
# read input file to internal representation
|
||||
read_verilog design.v
|
||||
|
||||
# convert high-level behavioral parts ("processes") to d-type flip-flops and muxes
|
||||
proc
|
||||
|
||||
# perform some simple optimizations
|
||||
opt
|
||||
|
||||
# convert high-level memory constructs to d-type flip-flops and multiplexers
|
||||
memory
|
||||
|
||||
# perform some simple optimizations
|
||||
opt
|
||||
|
||||
# convert design to (logical) gate-level netlists
|
||||
techmap
|
||||
|
||||
# perform some simple optimizations
|
||||
opt
|
||||
|
||||
# map internal register types to the ones from the cell library
|
||||
dfflibmap -liberty cells.lib
|
||||
|
||||
# use ABC to map remaining logic to cells from the cell library
|
||||
abc -liberty cells.lib
|
||||
|
||||
# cleanup
|
||||
opt
|
||||
|
||||
# write results to output file
|
||||
write_verilog synth.v
|
||||
|
||||
A detailed description of the commands available in Yosys can be found in
|
||||
:ref:`cmd_ref`.
|
|
@ -0,0 +1,8 @@
|
|||
Getting started with Yosys
|
||||
==========================
|
||||
|
||||
.. toctree::
|
||||
|
||||
installation
|
||||
scripting_intro
|
||||
examples
|
|
@ -0,0 +1,63 @@
|
|||
Installation
|
||||
------------
|
||||
|
||||
Supported platforms
|
||||
~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Source tree and build system
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
The Yosys source tree is organized into the following top-level
|
||||
directories:
|
||||
|
||||
- | backends/
|
||||
| This directory contains a subdirectory for each of the backend modules.
|
||||
|
||||
- | frontends/
|
||||
| This directory contains a subdirectory for each of the frontend modules.
|
||||
|
||||
- | kernel/
|
||||
| This directory contains all the core functionality of Yosys. This includes
|
||||
the functions and definitions for working with the RTLIL data structures
|
||||
(rtlil.h and rtlil.cc), the main() function (driver.cc), the internal
|
||||
framework for generating log messages (log.h and log.cc), the internal
|
||||
framework for registering and calling passes (register.h and register.cc),
|
||||
some core commands that are not really passes (select.cc, show.cc, …) and a
|
||||
couple of other small utility libraries.
|
||||
|
||||
- | passes/
|
||||
| This directory contains a subdirectory for each pass or group of passes.
|
||||
For example as of this writing the directory passes/opt/ contains the code
|
||||
for seven passes: opt, opt_expr, opt_muxtree, opt_reduce, opt_rmdff,
|
||||
opt_rmunused and opt_merge.
|
||||
|
||||
- | techlibs/
|
||||
| This directory contains simulation models and standard implementations for
|
||||
the cells from the internal cell library.
|
||||
|
||||
- | tests/
|
||||
| This directory contains a couple of test cases. Most of the smaller tests
|
||||
are executed automatically when make test is called. The larger tests must
|
||||
be executed manually. Most of the larger tests require downloading external
|
||||
HDL source code and/or external tools. The tests range from comparing
|
||||
simulation results of the synthesized design to the original sources to
|
||||
logic equivalence checking of entire CPU cores.
|
||||
|
||||
The top-level Makefile includes frontends/\*/Makefile.inc,
|
||||
passes/\*/Makefile.inc and backends/\*/Makefile.inc. So when extending Yosys it
|
||||
is enough to create a new directory in frontends/, passes/ or backends/ with
|
||||
your sources and a Makefile.inc. The Yosys kernel automatically detects all
|
||||
commands linked with Yosys. So it is not needed to add additional commands to a
|
||||
central list of commands.
|
||||
|
||||
Good starting points for reading example source code to learn how to write
|
||||
passes are passes/opt/opt_rmdff.cc and passes/opt/opt_merge.cc.
|
||||
|
||||
See the top-level README file for a quick Getting Started guide and build
|
||||
instructions. The Yosys build is based solely on Makefiles.
|
||||
|
||||
Users of the Qt Creator IDE can generate a QT Creator project file using make
|
||||
qtcreator. Users of the Eclipse IDE can use the "Makefile Project with Existing
|
||||
Code" project type in the Eclipse "New Project" dialog (only available after the
|
||||
CDT plugin has been installed) to create an Eclipse project in order to
|
||||
programming extensions to Yosys or just browse the Yosys code base.
|
|
@ -0,0 +1,28 @@
|
|||
Scripting in Yosys
|
||||
------------------
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
Yosys reads and processes commands from synthesis scripts, command line
|
||||
arguments and an interactive command prompt. Yosys commands consist of a command
|
||||
name and an optional whitespace separated list of arguments. Commands are
|
||||
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.
|
||||
|
||||
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
|
||||
selected objects in the current design while dump foobar will only print the
|
||||
module foobar and dump \* will print the entire design regardless of the current
|
||||
selection.
|
||||
|
||||
.. code:: yoscrypt
|
||||
|
||||
dump */t:$add %x:+[A] \*/w:\* %i
|
||||
|
||||
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.
|
|
@ -1,82 +1,14 @@
|
|||
:Abstract:
|
||||
Most of today's digital design is done in HDL code (mostly Verilog or
|
||||
VHDL) and with the help of HDL synthesis tools.
|
||||
|
||||
In special cases such as synthesis for coarse-grain cell libraries or
|
||||
when testing new synthesis algorithms it might be necessary to write a
|
||||
custom HDL synthesis tool or add new features to an existing one. In
|
||||
these cases the availability of a Free and Open Source (FOSS) synthesis
|
||||
tool that can be used as basis for custom tools would be helpful.
|
||||
|
||||
In the absence of such a tool, the Yosys Open SYnthesis Suite (Yosys)
|
||||
was developed. This document covers the design and implementation of
|
||||
this tool. At the moment the main focus of Yosys lies on the high-level
|
||||
aspects of digital synthesis. The pre-existing FOSS logic-synthesis tool
|
||||
ABC is used by Yosys to perform advanced gate-level optimizations.
|
||||
|
||||
An evaluation of Yosys based on real-world designs is included. It is
|
||||
shown that Yosys can be used as-is to synthesize such designs. The
|
||||
results produced by Yosys in this tests where successfully verified
|
||||
using formal verification and are comparable in quality to the results
|
||||
produced by a commercial synthesis tool.
|
||||
|
||||
This document was originally published as bachelor thesis at the Vienna
|
||||
University of Technology :cite:p:`BACC`.
|
||||
|
||||
================================================================================
|
||||
Yosys manual
|
||||
Yosys Open SYnthesis Suite
|
||||
================================================================================
|
||||
|
||||
.. toctree::
|
||||
:caption: New docs
|
||||
:maxdepth: 3
|
||||
|
||||
introduction
|
||||
getting_started
|
||||
using_yosys
|
||||
yosys_internals
|
||||
.. test_suites
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Manual
|
||||
:numbered:
|
||||
|
||||
CHAPTER_Intro
|
||||
CHAPTER_Basics.rst
|
||||
CHAPTER_Approach.rst
|
||||
CHAPTER_Overview.rst
|
||||
CHAPTER_CellLib.rst
|
||||
CHAPTER_Prog.rst
|
||||
|
||||
CHAPTER_Verilog.rst
|
||||
CHAPTER_Optimize.rst
|
||||
CHAPTER_Techmap.rst
|
||||
CHAPTER_Memorymap.rst
|
||||
CHAPTER_Eval.rst
|
||||
|
||||
.. raw:: latex
|
||||
|
||||
\appendix
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:includehidden:
|
||||
:caption: Appendix
|
||||
|
||||
appendix/CHAPTER_Auxlibs.rst
|
||||
appendix/CHAPTER_Auxprogs.rst
|
||||
|
||||
appendix/CHAPTER_TextRtlil.rst
|
||||
appendix/APPNOTE_010_Verilog_to_BLIF.rst
|
||||
appendix/APPNOTE_011_Design_Investigation.rst
|
||||
appendix/APPNOTE_012_Verilog_to_BTOR.rst
|
||||
appendix/CHAPTER_StateOfTheArt.rst
|
||||
|
||||
bib
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 1
|
||||
:includehidden:
|
||||
|
||||
cmd_ref
|
||||
getting_started/index
|
||||
using_yosys/index
|
||||
yosys_internals/index
|
||||
test_suites
|
||||
|
||||
appendix
|
||||
|
|
|
@ -1,8 +1,99 @@
|
|||
What is Yosys
|
||||
=============
|
||||
|
||||
.. TODO: rewrite to not be a thesis abstract
|
||||
|
||||
:Abstract:
|
||||
Most of today's digital design is done in HDL code (mostly Verilog or
|
||||
VHDL) and with the help of HDL synthesis tools.
|
||||
|
||||
In special cases such as synthesis for coarse-grain cell libraries or
|
||||
when testing new synthesis algorithms it might be necessary to write a
|
||||
custom HDL synthesis tool or add new features to an existing one. In
|
||||
these cases the availability of a Free and Open Source (FOSS) synthesis
|
||||
tool that can be used as basis for custom tools would be helpful.
|
||||
|
||||
In the absence of such a tool, the Yosys Open SYnthesis Suite (Yosys)
|
||||
was developed. This document covers the design and implementation of
|
||||
this tool. At the moment the main focus of Yosys lies on the high-level
|
||||
aspects of digital synthesis. The pre-existing FOSS logic-synthesis tool
|
||||
ABC is used by Yosys to perform advanced gate-level optimizations.
|
||||
|
||||
An evaluation of Yosys based on real-world designs is included. It is
|
||||
shown that Yosys can be used as-is to synthesize such designs. The
|
||||
results produced by Yosys in this tests where successfully verified
|
||||
using formal verification and are comparable in quality to the results
|
||||
produced by a commercial synthesis tool.
|
||||
|
||||
This document was originally published as bachelor thesis at the Vienna
|
||||
University of Technology :cite:p:`BACC`.
|
||||
|
||||
Yosys is a tool for synthesising (behavioural) Verilog HDL code to target
|
||||
architecture netlists. Yosys aims at a wide range of application domains and
|
||||
thus must be flexible and easy to adapt to new tasks.
|
||||
|
||||
What you can do with Yosys
|
||||
--------------------------
|
||||
|
||||
The extended Yosys universe
|
||||
---------------------------
|
||||
|
||||
In no particular order:
|
||||
|
||||
- SBY for formal verification
|
||||
- EQY for equivalence checking
|
||||
- MCY for mutation coverage
|
||||
|
||||
History of Yosys
|
||||
----------------
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
A Hardware Description Language (HDL) is a computer language used to describe
|
||||
circuits. A HDL synthesis tool is a computer program that takes a formal
|
||||
description of a circuit written in an HDL as input and generates a netlist that
|
||||
implements the given circuit as output.
|
||||
|
||||
Currently the most widely used and supported HDLs for digital circuits are
|
||||
Verilog :cite:p:`Verilog2005,VerilogSynth` and :abbr:`VHDL (VHSIC HDL, where
|
||||
VHSIC is an acronym for Very-High-Speed Integrated Circuits)`
|
||||
:cite:p:`VHDL,VHDLSynth`. Both HDLs are used for test and verification purposes
|
||||
as well as logic synthesis, resulting in a set of synthesizable and a set of
|
||||
non-synthesizable language features. In this document we only look at the
|
||||
synthesizable subset of the language features.
|
||||
|
||||
In recent work on heterogeneous coarse-grain reconfigurable logic
|
||||
:cite:p:`intersynth` the need for a custom application-specific HDL synthesis
|
||||
tool emerged. It was soon realised that a synthesis tool that understood Verilog
|
||||
or VHDL would be preferred over a synthesis tool for a custom HDL. Given an
|
||||
existing Verilog or VHDL front end, the work for writing the necessary
|
||||
additional features and integrating them in an existing tool can be estimated to
|
||||
be about the same as writing a new tool with support for a minimalistic custom
|
||||
HDL.
|
||||
|
||||
The proposed custom HDL synthesis tool should be licensed under a Free and Open
|
||||
Source Software (FOSS) licence. So an existing FOSS Verilog or VHDL synthesis
|
||||
tool would have been needed as basis to build upon. The main advantages of
|
||||
choosing Verilog or VHDL is the ability to synthesize existing HDL code and to
|
||||
mitigate the requirement for circuit-designers to learn a new language. In order
|
||||
to take full advantage of any existing FOSS Verilog or VHDL tool, such a tool
|
||||
would have to provide a feature-complete implementation of the synthesizable HDL
|
||||
subset.
|
||||
|
||||
Basic RTL synthesis is a well understood field :cite:p:`LogicSynthesis`. Lexing,
|
||||
parsing and processing of computer languages :cite:p:`Dragonbook` is a
|
||||
thoroughly researched field. All the information required to write such tools
|
||||
has been openly available for a long time, and it is therefore likely that a
|
||||
FOSS HDL synthesis tool with a feature-complete Verilog or VHDL front end must
|
||||
exist which can be used as a basis for a custom RTL synthesis tool.
|
||||
|
||||
Due to the author's preference for Verilog over VHDL it was decided early on to
|
||||
go for Verilog instead of VHDL [#]_. So the existing FOSS Verilog synthesis
|
||||
tools were evaluated. The results of this evaluation are utterly devastating.
|
||||
Therefore a completely new Verilog synthesis tool was implemented and is
|
||||
recommended as basis for custom synthesis tools. This is the tool that is
|
||||
discussed in this document.
|
||||
|
||||
.. [#]
|
||||
A quick investigation into FOSS VHDL tools yielded similar grim results for
|
||||
FOSS VHDL synthesis tools.
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
sphinx-press-theme
|
||||
furo
|
||||
sphinxcontrib-bibtex
|
||||
|
|
|
@ -1,25 +0,0 @@
|
|||
Using Yosys (advanced)
|
||||
======================
|
||||
|
||||
More scripting
|
||||
--------------
|
||||
|
||||
Selections
|
||||
~~~~~~~~~~
|
||||
|
||||
Note on show/viz
|
||||
|
||||
Troubleshooting
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
Memory map patterns
|
||||
-------------------
|
||||
|
||||
Flows, command types, and order
|
||||
-------------------------------
|
||||
|
||||
Synthesis granularity
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Formal verification
|
||||
~~~~~~~~~~~~~~~~~~~
|
|
@ -0,0 +1,9 @@
|
|||
Using Yosys (advanced)
|
||||
======================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
more_scripting
|
||||
memory_mapping
|
||||
yosys_flows
|
|
@ -0,0 +1,8 @@
|
|||
More scripting
|
||||
--------------
|
||||
|
||||
.. toctree::
|
||||
|
||||
opt_passes
|
||||
selections
|
||||
troubleshooting
|
|
@ -1,7 +1,9 @@
|
|||
.. _chapter:opt:
|
||||
|
||||
Optimizations
|
||||
=============
|
||||
Optimization passes
|
||||
===================
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
Yosys employs a number of optimizations to generate better and cleaner results.
|
||||
This chapter outlines these optimizations.
|
||||
|
@ -34,7 +36,7 @@ The opt_expr pass
|
|||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
This pass performs const folding on the internal combinational cell types
|
||||
described in :numref:`Chap. %s <chapter:celllib>`. This means a cell with all
|
||||
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.
|
||||
|
||||
|
@ -67,7 +69,7 @@ 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`.
|
||||
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
|
||||
|
@ -189,7 +191,7 @@ using the ``\fsm_encoding`` attribute (unless ``\fsm_encoding`` is set to
|
|||
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
|
||||
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.
|
||||
|
||||
|
@ -254,7 +256,7 @@ It is then extended by adding all values that are calculated by cells that
|
|||
compare the state signal with a constant value.
|
||||
|
||||
In most cases this will cover all uses of the state register, thus rendering the
|
||||
state encoding arbitrary. If however a design uses e.g. a single bit of the
|
||||
state encoding arbitrary. If however a design uses e.g. a single bit of the
|
||||
state value to drive a control output directly, this bit of the state signal
|
||||
will be transformed to a control output of the same value.
|
||||
|
||||
|
@ -326,5 +328,5 @@ Yosys can perform multi-level combinational logic optimization on gate-level
|
|||
netlists using the external program ABC . The abc pass extracts the
|
||||
combinational gate-level parts of the design, passes it through ABC, and
|
||||
re-integrates the results. The abc pass can also be used to perform other
|
||||
operations using ABC, such as technology mapping (see :numref:`Sec %s
|
||||
<sec:techmap_extern>` for details).
|
||||
operations using ABC, such as technology mapping (see :ref:`sec:techmap_extern`
|
||||
for details).
|
|
@ -0,0 +1,6 @@
|
|||
Selections
|
||||
~~~~~~~~~~
|
||||
|
||||
See :doc:`/cmd/select`
|
||||
|
||||
Also :doc:`/cmd/show`
|
|
@ -0,0 +1,4 @@
|
|||
Troubleshooting
|
||||
~~~~~~~~~~~~~~~
|
||||
|
||||
See :doc:`/cmd/bugpoint`
|
|
@ -0,0 +1,8 @@
|
|||
Flows, command types, and order
|
||||
-------------------------------
|
||||
|
||||
Synthesis granularity
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Formal verification
|
||||
~~~~~~~~~~~~~~~~~~~
|
|
@ -1,23 +0,0 @@
|
|||
Yosys internals
|
||||
===============
|
||||
|
||||
Control and data flow
|
||||
---------------------
|
||||
|
||||
Frontends
|
||||
~~~~~~~~~
|
||||
|
||||
Backends
|
||||
~~~~~~~~
|
||||
|
||||
Passes
|
||||
~~~~~~
|
||||
|
||||
RTLIL
|
||||
-----
|
||||
|
||||
Techmap
|
||||
-------
|
||||
|
||||
Writing extensions
|
||||
------------------
|
|
@ -1,7 +1,9 @@
|
|||
.. _chapter:prog:
|
||||
|
||||
Programming Yosys extensions
|
||||
============================
|
||||
Writing extensions
|
||||
==================
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
This chapter contains some bits and pieces of information about
|
||||
programming yosys extensions. Also consult the section on programming in
|
||||
|
@ -15,11 +17,11 @@ The guidelines directory contains notes on various aspects of Yosys
|
|||
development. The files GettingStarted and CodingStyle may be of
|
||||
particular interest, and are reproduced here.
|
||||
|
||||
.. literalinclude:: temp/GettingStarted
|
||||
.. literalinclude:: ../temp/GettingStarted
|
||||
:language: none
|
||||
:caption: guidelines/GettingStarted
|
||||
|
||||
.. literalinclude:: temp/CodingStyle
|
||||
.. literalinclude:: ../temp/CodingStyle
|
||||
:language: none
|
||||
:caption: guidelines/CodingStyle
|
||||
|
||||
|
@ -30,17 +32,17 @@ The following is the complete code of the "stubsnets" example module. It
|
|||
is included in the Yosys source distribution as
|
||||
docs/source/CHAPTER_Prog/stubnets.cc.
|
||||
|
||||
.. literalinclude:: CHAPTER_Prog/stubnets.cc
|
||||
.. literalinclude:: ../CHAPTER_Prog/stubnets.cc
|
||||
:language: c++
|
||||
:linenos:
|
||||
:caption: docs/source/CHAPTER_Prog/stubnets.cc
|
||||
|
||||
.. literalinclude:: CHAPTER_Prog/Makefile
|
||||
.. literalinclude:: ../CHAPTER_Prog/Makefile
|
||||
:language: makefile
|
||||
:linenos:
|
||||
:caption: docs/source/CHAPTER_Prog/Makefile
|
||||
|
||||
.. literalinclude:: CHAPTER_Prog/test.v
|
||||
.. literalinclude:: ../CHAPTER_Prog/test.v
|
||||
:language: verilog
|
||||
:linenos:
|
||||
:caption: docs/source/CHAPTER_Prog/test.v
|
|
@ -0,0 +1,31 @@
|
|||
Control and data flow
|
||||
=====================
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
The data- and control-flow of a typical synthesis tool is very similar to the
|
||||
data- and control-flow of a typical compiler: different subsystems are called in
|
||||
a predetermined order, each consuming the data generated by the last subsystem
|
||||
and generating the data for the next subsystem (see :numref:`Fig. %s
|
||||
<fig:approach_flow>`).
|
||||
|
||||
.. figure:: ../../../images/approach_flow.*
|
||||
:class: width-helper
|
||||
:name: fig:approach_flow
|
||||
|
||||
General data- and control-flow of a synthesis tool
|
||||
|
||||
The first subsystem to be called is usually called a frontend. It does not
|
||||
process the data generated by another subsystem but instead reads the user
|
||||
input—in the case of a HDL synthesis tool, the behavioural HDL code.
|
||||
|
||||
The subsystems that consume data from previous subsystems and produce data for
|
||||
the next subsystems (usually in the same or a similar format) are called passes.
|
||||
|
||||
The last subsystem that is executed transforms the data generated by the last
|
||||
pass into a suitable output format and writes it to a disk file. This subsystem
|
||||
is usually called the backend.
|
||||
|
||||
In Yosys all frontends, passes and backends are directly available as commands
|
||||
in the synthesis script. Thus the user can easily create a custom synthesis flow
|
||||
just by calling passes in the right order in a synthesis script.
|
|
@ -0,0 +1,10 @@
|
|||
Internal flow
|
||||
=============
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
overview
|
||||
control_and_data
|
||||
verilog_frontend
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
Flow overview
|
||||
=============
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
:numref:`Figure %s <fig:Overview_flow>` shows the simplified data flow within
|
||||
Yosys. Rectangles in the figure represent program modules and ellipses internal
|
||||
data structures that are used to exchange design data between the program
|
||||
modules.
|
||||
|
||||
Design data is read in using one of the frontend modules. The high-level HDL
|
||||
frontends for Verilog and VHDL code generate an abstract syntax tree (AST) that
|
||||
is then passed to the AST frontend. Note that both HDL frontends use the same
|
||||
AST representation that is powerful enough to cover the Verilog HDL and VHDL
|
||||
language.
|
||||
|
||||
The AST Frontend then compiles the AST to Yosys's main internal data format, the
|
||||
RTL Intermediate Language (RTLIL). A more detailed description of this format is
|
||||
given in the next section.
|
||||
|
||||
There is also a text representation of the RTLIL data structure that can be
|
||||
parsed using the RTLIL Frontend.
|
||||
|
||||
The design data may then be transformed using a series of passes that all
|
||||
operate on the RTLIL representation of the design.
|
||||
|
||||
Finally the design in RTLIL representation is converted back to text by one of
|
||||
the backends, namely the Verilog Backend for generating Verilog netlists and the
|
||||
RTLIL Backend for writing the RTLIL data in the same format that is understood
|
||||
by the RTLIL Frontend.
|
||||
|
||||
With the exception of the AST Frontend, which is called by the high-level HDL
|
||||
frontends and can't be called directly by the user, all program modules are
|
||||
called by the user (usually using a synthesis script that contains text commands
|
||||
for Yosys).
|
||||
|
||||
By combining passes in different ways and/or adding additional passes to Yosys
|
||||
it is possible to adapt Yosys to a wide range of applications. For this to be
|
||||
possible it is key that (1) all passes operate on the same data structure
|
||||
(RTLIL) and (2) that this data structure is powerful enough to represent the
|
||||
design in different stages of the synthesis.
|
||||
|
||||
.. figure:: ../../../images/overview_flow.*
|
||||
:class: width-helper
|
||||
:name: fig:Overview_flow
|
||||
|
||||
Yosys simplified data flow (ellipses: data structures, rectangles:
|
||||
program modules)
|
|
@ -9,7 +9,7 @@ abstract syntax tree (AST) representation of the input. This AST representation
|
|||
is then passed to the AST frontend that converts it to RTLIL data, as
|
||||
illustrated in :numref:`Fig. %s <fig:Verilog_flow>`.
|
||||
|
||||
.. figure:: ../images/verilog_flow.*
|
||||
.. figure:: ../../../images/verilog_flow.*
|
||||
:class: width-helper
|
||||
:name: fig:Verilog_flow
|
||||
|
||||
|
@ -167,7 +167,7 @@ properties:
|
|||
- | Node content
|
||||
| Each node might have additional content data. A series of member
|
||||
variables exist to hold such data. For example the member
|
||||
``std::string str`` can hold a string value and is used e.g. in the
|
||||
``std::string str`` can hold a string value and is used e.g. in the
|
||||
AST_IDENTIFIER node type to store the identifier name.
|
||||
|
||||
- | Source code location
|
||||
|
@ -220,7 +220,7 @@ performs the following transformations on the AST data structure:
|
|||
|
||||
- Evaluate all ``generate``-statements and unroll all ``for``-loops.
|
||||
|
||||
- Perform const folding where it is necessary (e.g. in the value part
|
||||
- Perform const folding where it is necessary (e.g. in the value part
|
||||
of AST_PARAMETER, AST_LOCALPARAM, AST_PARASET and AST_RANGE nodes).
|
||||
|
||||
- Replace AST_PRIMITIVE nodes with appropriate AST_ASSIGN nodes.
|
||||
|
@ -388,7 +388,7 @@ the following way:
|
|||
the Verilog code has been moved to the beginning of the RTLIL process
|
||||
to line 13 of the RTLIL listing.)
|
||||
|
||||
I.e. the special cases deeper in the switch hierarchy override the
|
||||
I.e. the special cases deeper in the switch hierarchy override the
|
||||
defaults on the upper levels. The assignments in lines 12 and 22 of
|
||||
the RTLIL code serve as an example for this.
|
||||
|
||||
|
@ -397,7 +397,7 @@ the following way:
|
|||
preserved with respect to the original AST and Verilog code.
|
||||
|
||||
- The whole ``RTLIL::CaseRule``/``RTLIL::SwitchRule`` tree describes an
|
||||
asynchronous circuit. I.e. the decision tree formed by the switches
|
||||
asynchronous circuit. I.e. the decision tree formed by the switches
|
||||
can be seen independently for each assigned signal. Whenever one
|
||||
assigned signal changes, all signals that depend on the changed
|
||||
signals are to be updated. For example the assignments in lines 16
|
||||
|
@ -414,7 +414,7 @@ into the synchronization type (posedge) and signal (\\clock) for the
|
|||
d-type flip-flops and the ``RTLIL::CaseRule``/``RTLIL::SwitchRule`` tree
|
||||
to a decision tree using multiplexers.
|
||||
|
||||
In more complex examples (e.g. asynchronous resets) the part of the
|
||||
In more complex examples (e.g. asynchronous resets) the part of the
|
||||
``RTLIL::CaseRule``/``RTLIL::SwitchRule`` tree that describes the
|
||||
asynchronous reset must first be transformed to the correct
|
||||
``RTLIL::SyncRule`` objects. This is done by the proc_adff pass.
|
|
@ -1,12 +1,14 @@
|
|||
.. role:: verilog(code)
|
||||
:language: Verilog
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
.. _chapter:celllib:
|
||||
|
||||
Internal cell library
|
||||
=====================
|
||||
|
||||
Most of the passes in Yosys operate on netlists, i.e. they only care about the
|
||||
Most of the passes in Yosys operate on netlists, i.e. they only care about the
|
||||
RTLIL::Wire and RTLIL::Cell objects in an RTLIL::Module. This chapter discusses
|
||||
the cell types used by Yosys to represent a behavioural design internally.
|
||||
|
||||
|
@ -205,7 +207,7 @@ Behavioural code with cascaded if-then-else- and case-statements usually results
|
|||
in trees of multiplexer cells. Many passes (from various optimizations to FSM
|
||||
extraction) heavily depend on these multiplexer trees to understand dependencies
|
||||
between signals. Therefore optimizations should not break these multiplexer
|
||||
trees (e.g. by replacing a multiplexer between a calculated signal and a
|
||||
trees (e.g. by replacing a multiplexer between a calculated signal and a
|
||||
constant zero with an ``$and`` gate).
|
||||
|
||||
Registers
|
||||
|
@ -814,7 +816,7 @@ techlibs/common/simcells.v in the Yosys source tree.
|
|||
============== ============== =========
|
||||
|
||||
|
||||
Tables \ :numref:`%s <tab:CellLib_gates>`, :numref:`%s
|
||||
Tables \ :numref:`%s <tab:CellLib_gates>`, :numref:`%s
|
||||
<tab:CellLib_gates_dffe>`, :numref:`%s <tab:CellLib_gates_adff>`, :numref:`%s
|
||||
<tab:CellLib_gates_adffe>`, :numref:`%s <tab:CellLib_gates_dffsr>`, :numref:`%s
|
||||
<tab:CellLib_gates_dffsre>`, :numref:`%s <tab:CellLib_gates_adlatch>`,
|
|
@ -0,0 +1,11 @@
|
|||
Internal formats
|
||||
================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
overview
|
||||
rtlil
|
||||
rtlil_text
|
||||
cell_library
|
||||
|
|
@ -0,0 +1,53 @@
|
|||
Format overview
|
||||
===============
|
||||
|
||||
Yosys uses two different internal formats. The first is used to store an
|
||||
abstract syntax tree (AST) of a Verilog input file. This format is simply called
|
||||
AST and is generated by the Verilog Frontend. This data structure is consumed by
|
||||
a subsystem called AST Frontend [1]_. This AST Frontend then generates a design
|
||||
in Yosys' main internal format, the
|
||||
Register-Transfer-Level-Intermediate-Language (RTLIL) representation. It does
|
||||
that by first performing a number of simplifications within the AST
|
||||
representation and then generating RTLIL from the simplified AST data structure.
|
||||
|
||||
The RTLIL representation is used by all passes as input and outputs. This has
|
||||
the following advantages over using different representational formats between
|
||||
different passes:
|
||||
|
||||
- The passes can be rearranged in a different order and passes can be removed
|
||||
or inserted.
|
||||
|
||||
- Passes can simply pass-thru the parts of the design they don't change without
|
||||
the need to convert between formats. In fact Yosys passes output the same
|
||||
data structure they received as input and performs all changes in place.
|
||||
|
||||
- All passes use the same interface, thus reducing the effort required to
|
||||
understand a pass when reading the Yosys source code, e.g. when adding
|
||||
additional features.
|
||||
|
||||
The RTLIL representation is basically a netlist representation with the
|
||||
following additional features:
|
||||
|
||||
- An internal cell library with fixed-function cells to represent RTL datapath
|
||||
and register cells as well as logical gate-level cells (single-bit gates and
|
||||
registers).
|
||||
|
||||
- Support for multi-bit values that can use individual bits from wires as well
|
||||
as constant bits to represent coarse-grain netlists.
|
||||
|
||||
- Support for basic behavioural constructs (if-then-else structures and
|
||||
multi-case switches with a sensitivity list for updating the outputs).
|
||||
|
||||
- Support for multi-port memories.
|
||||
|
||||
The use of RTLIL also has the disadvantage of having a very powerful format
|
||||
between all passes, even when doing gate-level synthesis where the more advanced
|
||||
features are not needed. In order to reduce complexity for passes that operate
|
||||
on a low-level representation, these passes check the features used in the input
|
||||
RTLIL and fail to run when unsupported high-level constructs are used. In such
|
||||
cases a pass that transforms the higher-level constructs to lower-level
|
||||
constructs must be called from the synthesis script first.
|
||||
|
||||
.. [1]
|
||||
In Yosys the term pass is only used to refer to commands that operate on the
|
||||
RTLIL data structure.
|
|
@ -1,90 +1,12 @@
|
|||
.. _chapter:overview:
|
||||
|
||||
Implementation overview
|
||||
=======================
|
||||
|
||||
Yosys is an extensible open source hardware synthesis tool. It is aimed at
|
||||
designers who are looking for an easily accessible, universal, and
|
||||
vendor-independent synthesis tool, as well as scientists who do research in
|
||||
electronic design automation (EDA) and are looking for an open synthesis
|
||||
framework that can be used to test algorithms on complex real-world designs.
|
||||
|
||||
Yosys can synthesize a large subset of Verilog 2005 and has been tested with a
|
||||
wide range of real-world designs, including the `OpenRISC 1200 CPU`_, the
|
||||
`openMSP430 CPU`_, the `OpenCores I2C master`_, and the `k68 CPU`_.
|
||||
|
||||
.. _OpenRISC 1200 CPU: https://github.com/openrisc/or1200
|
||||
|
||||
.. _openMSP430 CPU: http://opencores.org/projects/openmsp430
|
||||
|
||||
.. _OpenCores I2C master: http://opencores.org/projects/i2c
|
||||
|
||||
.. _k68 CPU: http://opencores.org/projects/k68
|
||||
|
||||
As of this writing a Yosys VHDL frontend is in development.
|
||||
|
||||
Yosys is written in C++ (using some features from the new C++11 standard). This
|
||||
chapter describes some of the fundamental Yosys data structures. For the sake of
|
||||
simplicity the C++ type names used in the Yosys implementation are used in this
|
||||
chapter, even though the chapter only explains the conceptual idea behind it and
|
||||
can be used as reference to implement a similar system in any language.
|
||||
|
||||
Simplified data flow
|
||||
--------------------
|
||||
|
||||
:numref:`Figure %s <fig:Overview_flow>` shows the simplified data flow within
|
||||
Yosys. Rectangles in the figure represent program modules and ellipses internal
|
||||
data structures that are used to exchange design data between the program
|
||||
modules.
|
||||
|
||||
Design data is read in using one of the frontend modules. The high-level HDL
|
||||
frontends for Verilog and VHDL code generate an abstract syntax tree (AST) that
|
||||
is then passed to the AST frontend. Note that both HDL frontends use the same
|
||||
AST representation that is powerful enough to cover the Verilog HDL and VHDL
|
||||
language.
|
||||
|
||||
The AST Frontend then compiles the AST to Yosys's main internal data format, the
|
||||
RTL Intermediate Language (RTLIL). A more detailed description of this format is
|
||||
given in the next section.
|
||||
|
||||
There is also a text representation of the RTLIL data structure that can be
|
||||
parsed using the RTLIL Frontend.
|
||||
|
||||
The design data may then be transformed using a series of passes that all
|
||||
operate on the RTLIL representation of the design.
|
||||
|
||||
Finally the design in RTLIL representation is converted back to text by one of
|
||||
the backends, namely the Verilog Backend for generating Verilog netlists and the
|
||||
RTLIL Backend for writing the RTLIL data in the same format that is understood
|
||||
by the RTLIL Frontend.
|
||||
|
||||
With the exception of the AST Frontend, which is called by the high-level HDL
|
||||
frontends and can't be called directly by the user, all program modules are
|
||||
called by the user (usually using a synthesis script that contains text commands
|
||||
for Yosys).
|
||||
|
||||
By combining passes in different ways and/or adding additional passes to Yosys
|
||||
it is possible to adapt Yosys to a wide range of applications. For this to be
|
||||
possible it is key that (1) all passes operate on the same data structure
|
||||
(RTLIL) and (2) that this data structure is powerful enough to represent the
|
||||
design in different stages of the synthesis.
|
||||
|
||||
.. figure:: ../images/overview_flow.*
|
||||
:class: width-helper
|
||||
:name: fig:Overview_flow
|
||||
|
||||
Yosys simplified data flow (ellipses: data structures, rectangles:
|
||||
program modules)
|
||||
|
||||
The RTL Intermediate Language (RTLIL)
|
||||
-------------------------------------
|
||||
=====================================
|
||||
|
||||
All frontends, passes and backends in Yosys operate on a design in RTLIL
|
||||
representation. The only exception are the high-level frontends that use the AST
|
||||
representation as an intermediate step before generating RTLIL data.
|
||||
|
||||
In order to avoid reinventing names for the RTLIL classes, they are simply
|
||||
referred to by their full C++ name, i.e. including the RTLIL:: namespace prefix,
|
||||
referred to by their full C++ name, i.e. including the RTLIL:: namespace prefix,
|
||||
in this document.
|
||||
|
||||
:numref:`Figure %s <fig:Overview_RTLIL>` shows a simplified Entity-Relationship
|
||||
|
@ -101,14 +23,14 @@ reading an auxiliary Verilog file such as a cell library, it might create an
|
|||
additional RTLIL::Design object and call the Verilog frontend with this other
|
||||
object to parse the cell library.
|
||||
|
||||
.. figure:: ../images/overview_rtlil.*
|
||||
.. figure:: ../../../images/overview_rtlil.*
|
||||
:class: width-helper
|
||||
:name: fig:Overview_RTLIL
|
||||
|
||||
Simplified RTLIL Entity-Relationship Diagram
|
||||
|
||||
There is only one active RTLIL::Design object that is used by all frontends,
|
||||
passes and backends called by the user, e.g. using a synthesis script. The
|
||||
passes and backends called by the user, e.g. using a synthesis script. The
|
||||
RTLIL::Design then contains zero to many RTLIL::Module objects. This corresponds
|
||||
to modules in Verilog or entities in VHDL. Each module in turn contains objects
|
||||
from three different categories:
|
||||
|
@ -133,7 +55,7 @@ The following sections contain a more detailed description of the different
|
|||
parts of RTLIL and rationale behind some of the design decisions.
|
||||
|
||||
RTLIL identifiers
|
||||
~~~~~~~~~~~~~~~~~
|
||||
-----------------
|
||||
|
||||
All identifiers in RTLIL (such as module names, port names, signal names, cell
|
||||
types, etc.) follow the following naming convention: they must either start with
|
||||
|
@ -183,7 +105,7 @@ flattening). All names specified in the "hdlname" attribute are public and do
|
|||
not include the leading "\".
|
||||
|
||||
RTLIL::Design and RTLIL::Module
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
-------------------------------
|
||||
|
||||
The RTLIL::Design object is basically just a container for RTLIL::Module
|
||||
objects. In addition to a list of RTLIL::Module objects the RTLIL::Design also
|
||||
|
@ -220,7 +142,7 @@ hash string.)
|
|||
.. _sec:rtlil_cell_wire:
|
||||
|
||||
RTLIL::Cell and RTLIL::Wire
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
---------------------------
|
||||
|
||||
A module contains zero to many RTLIL::Cell and RTLIL::Wire objects. Objects of
|
||||
these types are used to model netlists. Usually the goal of all synthesis
|
||||
|
@ -265,7 +187,7 @@ each cell port. The RTLIL::SigSpec data type is described in the next section.
|
|||
.. _sec:rtlil_sigspec:
|
||||
|
||||
RTLIL::SigSpec
|
||||
~~~~~~~~~~~~~~
|
||||
--------------
|
||||
|
||||
A "signal" is everything that can be applied to a cell port. I.e.
|
||||
|
||||
|
@ -288,10 +210,10 @@ the type name RTLIL::SigSig was defined for such a pair.
|
|||
.. _sec:rtlil_process:
|
||||
|
||||
RTLIL::Process
|
||||
~~~~~~~~~~~~~~
|
||||
--------------
|
||||
|
||||
When a high-level HDL frontend processes behavioural code it splits it up into
|
||||
data path logic (e.g. the expression a + b is replaced by the output of an adder
|
||||
data path logic (e.g. the expression a + b is replaced by the output of an adder
|
||||
that takes a and b as inputs) and an RTLIL::Process that models the control
|
||||
logic of the behavioural code. Let's consider a simple example:
|
||||
|
||||
|
@ -412,7 +334,7 @@ RTLIL::Process:
|
|||
|
||||
This pass has transformed the outer RTLIL::SwitchRule into a modified
|
||||
RTLIL::SyncRule object for the \\reset signal. Further processing converts the
|
||||
RTLIL::Process into e.g. a d-type flip-flop with asynchronous reset and a
|
||||
RTLIL::Process into e.g. a d-type flip-flop with asynchronous reset and a
|
||||
multiplexer for the enable signal:
|
||||
|
||||
.. code:: RTLIL
|
||||
|
@ -450,7 +372,7 @@ synthesis tasks.
|
|||
.. _sec:rtlil_memory:
|
||||
|
||||
RTLIL::Memory
|
||||
~~~~~~~~~~~~~
|
||||
-------------
|
||||
|
||||
For every array (memory) in the HDL code an RTLIL::Memory object is created. A
|
||||
memory object has the following properties:
|
||||
|
@ -479,92 +401,7 @@ The memory pass performs this conversion and can (depending on the options
|
|||
passed to it) transform the memories directly to d-type flip-flops and address
|
||||
logic or yield multiport memory blocks (represented using $mem cells).
|
||||
|
||||
See :numref:`Sec. %s <sec:memcells>` for details about the memory cell types.
|
||||
|
||||
Command interface and synthesis scripts
|
||||
---------------------------------------
|
||||
|
||||
Yosys reads and processes commands from synthesis scripts, command line
|
||||
arguments and an interactive command prompt. Yosys commands consist of a command
|
||||
name and an optional whitespace separated list of arguments. Commands are
|
||||
terminated using the newline character or a semicolon (;). Empty lines and lines
|
||||
starting with the hash sign (#) are ignored. See :numref:`Sec. %s
|
||||
<sec:typusecase>` for an example synthesis script.
|
||||
|
||||
The command help can be used to access the command reference manual.
|
||||
|
||||
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
|
||||
selected objects in the current design while dump foobar will only print the
|
||||
module foobar and dump \* will print the entire design regardless of the current
|
||||
selection.
|
||||
|
||||
.. code:: yoscrypt
|
||||
|
||||
dump */t:$add %x:+[A] \*/w:\* %i
|
||||
|
||||
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.
|
||||
|
||||
Source tree and build system
|
||||
----------------------------
|
||||
|
||||
The Yosys source tree is organized into the following top-level
|
||||
directories:
|
||||
|
||||
- | backends/
|
||||
| This directory contains a subdirectory for each of the backend modules.
|
||||
|
||||
- | frontends/
|
||||
| This directory contains a subdirectory for each of the frontend modules.
|
||||
|
||||
- | kernel/
|
||||
| This directory contains all the core functionality of Yosys. This includes
|
||||
the functions and definitions for working with the RTLIL data structures
|
||||
(rtlil.h and rtlil.cc), the main() function (driver.cc), the internal
|
||||
framework for generating log messages (log.h and log.cc), the internal
|
||||
framework for registering and calling passes (register.h and register.cc),
|
||||
some core commands that are not really passes (select.cc, show.cc, …) and a
|
||||
couple of other small utility libraries.
|
||||
|
||||
- | passes/
|
||||
| This directory contains a subdirectory for each pass or group of passes.
|
||||
For example as of this writing the directory passes/opt/ contains the code
|
||||
for seven passes: opt, opt_expr, opt_muxtree, opt_reduce, opt_rmdff,
|
||||
opt_rmunused and opt_merge.
|
||||
|
||||
- | techlibs/
|
||||
| This directory contains simulation models and standard implementations for
|
||||
the cells from the internal cell library.
|
||||
|
||||
- | tests/
|
||||
| This directory contains a couple of test cases. Most of the smaller tests
|
||||
are executed automatically when make test is called. The larger tests must
|
||||
be executed manually. Most of the larger tests require downloading external
|
||||
HDL source code and/or external tools. The tests range from comparing
|
||||
simulation results of the synthesized design to the original sources to
|
||||
logic equivalence checking of entire CPU cores.
|
||||
|
||||
The top-level Makefile includes frontends/\*/Makefile.inc,
|
||||
passes/\*/Makefile.inc and backends/\*/Makefile.inc. So when extending Yosys it
|
||||
is enough to create a new directory in frontends/, passes/ or backends/ with
|
||||
your sources and a Makefile.inc. The Yosys kernel automatically detects all
|
||||
commands linked with Yosys. So it is not needed to add additional commands to a
|
||||
central list of commands.
|
||||
|
||||
Good starting points for reading example source code to learn how to write
|
||||
passes are passes/opt/opt_rmdff.cc and passes/opt/opt_merge.cc.
|
||||
|
||||
See the top-level README file for a quick Getting Started guide and build
|
||||
instructions. The Yosys build is based solely on Makefiles.
|
||||
|
||||
Users of the Qt Creator IDE can generate a QT Creator project file using make
|
||||
qtcreator. Users of the Eclipse IDE can use the "Makefile Project with Existing
|
||||
Code" project type in the Eclipse "New Project" dialog (only available after the
|
||||
CDT plugin has been installed) to create an Eclipse project in order to
|
||||
programming extensions to Yosys or just browse the Yosys code base.
|
||||
See :ref:`sec:memcells` for details about the memory cell types.
|
||||
|
||||
.. [1]
|
||||
The syntax 1'1 in the RTLIL code specifies a constant with a length of one
|
|
@ -1,7 +1,7 @@
|
|||
.. _chapter:textrtlil:
|
||||
|
||||
RTLIL text representation
|
||||
=========================
|
||||
-------------------------
|
||||
|
||||
This appendix documents the text representation of RTLIL in extended Backus-Naur
|
||||
form (EBNF).
|
||||
|
@ -17,10 +17,10 @@ Finally, note that all statements (rules ending in ``-stmt``) terminate in an
|
|||
end-of-line. Because of this, a statement cannot be broken into multiple lines.
|
||||
|
||||
Lexical elements
|
||||
----------------
|
||||
~~~~~~~~~~~~~~~~
|
||||
|
||||
Characters
|
||||
~~~~~~~~~~
|
||||
^^^^^^^^^^
|
||||
|
||||
An RTLIL file is a stream of bytes. Strictly speaking, a "character" in an RTLIL
|
||||
file is a single byte. The lexer treats multi-byte encoded characters as
|
||||
|
@ -37,7 +37,7 @@ An ``eol`` is one or more consecutive ASCII newlines (10) and carriage returns
|
|||
(13).
|
||||
|
||||
Identifiers
|
||||
~~~~~~~~~~~
|
||||
^^^^^^^^^^^
|
||||
|
||||
There are two types of identifiers in RTLIL:
|
||||
|
||||
|
@ -51,7 +51,7 @@ There are two types of identifiers in RTLIL:
|
|||
<autogen-id> ::= $ <nonws>+
|
||||
|
||||
Values
|
||||
~~~~~~
|
||||
^^^^^^
|
||||
|
||||
A *value* consists of a width in bits and a bit representation, most
|
||||
significant bit first. Bits may be any of:
|
||||
|
@ -76,7 +76,7 @@ error.
|
|||
<integer> ::= -? <decimal-digit>+
|
||||
|
||||
Strings
|
||||
~~~~~~~
|
||||
^^^^^^^
|
||||
|
||||
A string is a series of characters delimited by double-quote characters. Within
|
||||
a string, any character except ASCII NUL (0) may be used. In addition, certain
|
||||
|
@ -94,13 +94,13 @@ character. Thus:
|
|||
- ``\r``: An 'r' character
|
||||
|
||||
Comments
|
||||
~~~~~~~~
|
||||
^^^^^^^^
|
||||
|
||||
A comment starts with a ``#`` character and proceeds to the end of the line. All
|
||||
comments are ignored.
|
||||
|
||||
File
|
||||
----
|
||||
~~~~
|
||||
|
||||
A file consists of an optional autoindex statement followed by zero or more
|
||||
modules.
|
||||
|
@ -110,7 +110,7 @@ modules.
|
|||
<file> ::= <autoidx-stmt>? <module>*
|
||||
|
||||
Autoindex statements
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The autoindex statement sets the global autoindex value used by Yosys when it
|
||||
needs to generate a unique name, e.g. ``flattenN``. The N part is filled with
|
||||
|
@ -123,7 +123,7 @@ would have different properties than just running a pass on a warm design.
|
|||
<autoidx-stmt> ::= autoidx <integer> <eol>
|
||||
|
||||
Modules
|
||||
~~~~~~~
|
||||
^^^^^^^
|
||||
|
||||
Declares a module, with zero or more attributes, consisting of zero or more
|
||||
wires, memories, cells, processes, and connections.
|
||||
|
@ -142,7 +142,7 @@ wires, memories, cells, processes, and connections.
|
|||
<module-end-stmt> ::= end <eol>
|
||||
|
||||
Attribute statements
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Declares an attribute with the given identifier and value.
|
||||
|
||||
|
@ -151,7 +151,7 @@ Declares an attribute with the given identifier and value.
|
|||
<attr-stmt> ::= attribute <id> <constant> <eol>
|
||||
|
||||
Signal specifications
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A signal is anything that can be applied to a cell port, i.e. a constant value,
|
||||
all bits or a selection of bits from a wire, or concatenations of those.
|
||||
|
@ -161,8 +161,7 @@ all bits or a selection of bits from a wire, or concatenations of those.
|
|||
``32'11111111111111111111111111111111``, while a constant of :math:`1` is the
|
||||
same as ``32'1``.
|
||||
|
||||
See :numref:`Sec. %s <sec:rtlil_sigspec>` for an overview of signal
|
||||
specifications.
|
||||
See :ref:`sec:rtlil_sigspec` for an overview of signal specifications.
|
||||
|
||||
.. code:: BNF
|
||||
|
||||
|
@ -172,7 +171,7 @@ specifications.
|
|||
| { <sigspec>* }
|
||||
|
||||
Connections
|
||||
~~~~~~~~~~~
|
||||
^^^^^^^^^^^
|
||||
|
||||
Declares a connection between the given signals.
|
||||
|
||||
|
@ -181,12 +180,12 @@ Declares a connection between the given signals.
|
|||
<conn-stmt> ::= connect <sigspec> <sigspec> <eol>
|
||||
|
||||
Wires
|
||||
~~~~~
|
||||
^^^^^
|
||||
|
||||
Declares a wire, with zero or more attributes, with the given identifier and
|
||||
options in the enclosing module.
|
||||
|
||||
See :numref:`Sec. %s <sec:rtlil_cell_wire>` for an overview of wires.
|
||||
See :ref:`sec:rtlil_cell_wire` for an overview of wires.
|
||||
|
||||
.. code:: BNF
|
||||
|
||||
|
@ -202,13 +201,13 @@ See :numref:`Sec. %s <sec:rtlil_cell_wire>` for an overview of wires.
|
|||
| signed
|
||||
|
||||
Memories
|
||||
~~~~~~~~
|
||||
^^^^^^^^
|
||||
|
||||
Declares a memory, with zero or more attributes, with the given identifier and
|
||||
options in the enclosing module.
|
||||
|
||||
See :numref:`Sec. %s <sec:rtlil_memory>` for an overview of memory cells, and
|
||||
:numref:`Sec. %s <sec:memcells>` for details about memory cell types.
|
||||
See :ref:`sec:rtlil_memory` for an overview of memory cells, and
|
||||
:ref:`sec:memcells` for details about memory cell types.
|
||||
|
||||
.. code:: BNF
|
||||
|
||||
|
@ -219,13 +218,13 @@ See :numref:`Sec. %s <sec:rtlil_memory>` for an overview of memory cells, and
|
|||
| offset <integer>
|
||||
|
||||
Cells
|
||||
~~~~~
|
||||
^^^^^
|
||||
|
||||
Declares a cell, with zero or more attributes, with the given identifier and
|
||||
type in the enclosing module.
|
||||
|
||||
Cells perform functions on input signals. See :numref:`Chap. %s
|
||||
<chapter:celllib>` for a detailed list of cell types.
|
||||
Cells perform functions on input signals. See :ref:`chapter:celllib` for a
|
||||
detailed list of cell types.
|
||||
|
||||
.. code:: BNF
|
||||
|
||||
|
@ -239,13 +238,13 @@ Cells perform functions on input signals. See :numref:`Chap. %s
|
|||
|
||||
|
||||
Processes
|
||||
~~~~~~~~~
|
||||
^^^^^^^^^
|
||||
|
||||
Declares a process, with zero or more attributes, with the given identifier in
|
||||
the enclosing module. The body of a process consists of zero or more
|
||||
assignments, exactly one switch, and zero or more syncs.
|
||||
|
||||
See :numref:`Sec. %s <sec:rtlil_process>` for an overview of processes.
|
||||
See :ref:`sec:rtlil_process` for an overview of processes.
|
||||
|
||||
.. code:: BNF
|
||||
|
||||
|
@ -258,7 +257,7 @@ See :numref:`Sec. %s <sec:rtlil_process>` for an overview of processes.
|
|||
<proc-end-stmt> ::= end <eol>
|
||||
|
||||
Switches
|
||||
~~~~~~~~
|
||||
^^^^^^^^
|
||||
|
||||
Switches test a signal for equality against a list of cases. Each case specifies
|
||||
a comma-separated list of signals to check against. If there are no signals in
|
||||
|
@ -277,7 +276,7 @@ attributes.
|
|||
<switch-end-stmt> ::= end <eol>
|
||||
|
||||
Syncs
|
||||
~~~~~
|
||||
^^^^^
|
||||
|
||||
Syncs update signals with other signals when an event happens. Such an event may
|
||||
be:
|
|
@ -0,0 +1,41 @@
|
|||
.. _chapter:overview:
|
||||
|
||||
Yosys internals
|
||||
===============
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
Yosys is an extensible open source hardware synthesis tool. It is aimed at
|
||||
designers who are looking for an easily accessible, universal, and
|
||||
vendor-independent synthesis tool, as well as scientists who do research in
|
||||
electronic design automation (EDA) and are looking for an open synthesis
|
||||
framework that can be used to test algorithms on complex real-world designs.
|
||||
|
||||
Yosys can synthesize a large subset of Verilog 2005 and has been tested with a
|
||||
wide range of real-world designs, including the `OpenRISC 1200 CPU`_, the
|
||||
`openMSP430 CPU`_, the `OpenCores I2C master`_, and the `k68 CPU`_.
|
||||
|
||||
.. _OpenRISC 1200 CPU: https://github.com/openrisc/or1200
|
||||
|
||||
.. _openMSP430 CPU: http://opencores.org/projects/openmsp430
|
||||
|
||||
.. _OpenCores I2C master: http://opencores.org/projects/i2c
|
||||
|
||||
.. _k68 CPU: http://opencores.org/projects/k68
|
||||
|
||||
As of this writing a Yosys VHDL frontend is in development.
|
||||
|
||||
Yosys is written in C++ (using some features from the new C++11 standard). This
|
||||
chapter describes some of the fundamental Yosys data structures. For the sake of
|
||||
simplicity the C++ type names used in the Yosys implementation are used in this
|
||||
chapter, even though the chapter only explains the conceptual idea behind it and
|
||||
can be used as reference to implement a similar system in any language.
|
||||
|
||||
.. toctree::
|
||||
|
||||
flow/index
|
||||
formats/index
|
||||
techmap
|
||||
extensions
|
||||
|
||||
.. TODO: copypaste
|
|
@ -1,5 +1,7 @@
|
|||
.. _chapter:techmap:
|
||||
|
||||
.. TODO: copypaste
|
||||
|
||||
Technology mapping
|
||||
==================
|
||||
|
||||
|
@ -10,8 +12,8 @@ transformed into a functionally equivalent netlist utilizing the cell types
|
|||
available in the target architecture.
|
||||
|
||||
Technology mapping is often performed in two phases. In the first phase RTL
|
||||
cells are mapped to an internal library of single-bit cells (see :numref:`Sec.
|
||||
%s <sec:celllib_gates>`). In the second phase this netlist of internal gate
|
||||
cells are mapped to an internal library of single-bit cells (see
|
||||
:ref:`sec:celllib_gates`). In the second phase this netlist of internal gate
|
||||
types is transformed to a netlist of gates from the target technology library.
|
||||
|
||||
When the target architecture provides coarse-grain cells (such as block ram or
|
||||
|
@ -33,7 +35,7 @@ reader may find this map file as techlibs/common/techmap.v in the Yosys source
|
|||
tree.
|
||||
|
||||
Additional features have been added to techmap to allow for conditional mapping
|
||||
of cells (see :doc:`cmd/techmap`). This can for example be useful if the target
|
||||
of cells (see :doc:`/cmd/techmap`). This can for example be useful if the target
|
||||
architecture supports hardware multipliers for certain bit-widths but not for
|
||||
others.
|
||||
|
||||
|
@ -52,14 +54,14 @@ cell type but only combinations of cells.
|
|||
|
||||
For these cases Yosys provides the extract pass that can match a given set of
|
||||
modules against a design and identify the portions of the design that are
|
||||
identical (i.e. isomorphic subcircuits) to any of the given modules. These
|
||||
identical (i.e. isomorphic subcircuits) to any of the given modules. These
|
||||
matched subcircuits are then replaced by instances of the given modules.
|
||||
|
||||
The extract pass also finds basic variations of the given modules, such as
|
||||
swapped inputs on commutative cell types.
|
||||
|
||||
In addition to this the extract pass also has limited support for frequent
|
||||
subcircuit mining, i.e. the process of finding recurring subcircuits in the
|
||||
subcircuit mining, i.e. the process of finding recurring subcircuits in the
|
||||
design. This has a few applications, including the design of new coarse-grain
|
||||
architectures :cite:p:`intersynthFdlBookChapter`.
|
||||
|
||||
|
@ -77,7 +79,7 @@ On the gate-level the target architecture is usually described by a "Liberty
|
|||
file". The Liberty file format is an industry standard format that can be used
|
||||
to describe the behaviour and other properties of standard library cells .
|
||||
|
||||
Mapping a design utilizing the Yosys internal gate library (e.g. as a result of
|
||||
Mapping a design utilizing the Yosys internal gate library (e.g. as a result of
|
||||
mapping it to this representation using the techmap pass) is performed in two
|
||||
phases.
|
||||
|
Loading…
Reference in New Issue