mirror of https://github.com/YosysHQ/yosys.git
48 lines
2.4 KiB
ReStructuredText
48 lines
2.4 KiB
ReStructuredText
.. role:: verilog(code)
|
|
:language: Verilog
|
|
|
|
Multiplexers
|
|
------------
|
|
|
|
Multiplexers are generated by the Verilog HDL frontend for ``?:``-expressions.
|
|
Multiplexers are also generated by the proc pass to map the decision trees from
|
|
RTLIL::Process objects to logic.
|
|
|
|
The simplest multiplexer cell type is `$mux`. Cells of this type have a
|
|
``WITDH`` parameter and data inputs ``A`` and ``B`` and a data output ``Y``, all
|
|
of the specified width. This cell also has a single bit control input ``S``. If
|
|
``S`` is 0 the value from the input ``A`` is sent to the output, if it is 1 the
|
|
value from the ``B`` input is sent to the output. So the `$mux` cell implements
|
|
the function :verilog:`Y = S ? B : A`.
|
|
|
|
The `$pmux` cell is used to multiplex between many inputs using a one-hot select
|
|
signal. Cells of this type have a ``WIDTH`` and a ``S_WIDTH`` parameter and
|
|
inputs ``A``, ``B``, and ``S`` and an output ``Y``. The ``S`` input is
|
|
``S_WIDTH`` bits wide. The ``A`` input and the output are both ``WIDTH`` bits
|
|
wide and the ``B`` input is ``WIDTH*S_WIDTH`` bits wide. When all bits of ``S``
|
|
are zero, the value from ``A`` input is sent to the output. If the :math:`n`\
|
|
'th bit from ``S`` is set, the value :math:`n`\ 'th ``WIDTH`` bits wide slice of
|
|
the ``B`` input is sent to the output. When more than one bit from ``S`` is set
|
|
the output is undefined. Cells of this type are used to model "parallel cases"
|
|
(defined by using the ``parallel_case`` attribute or detected by an
|
|
optimization).
|
|
|
|
The `$tribuf` cell is used to implement tristate logic. Cells of this type have
|
|
a ``WIDTH`` parameter and inputs ``A`` and ``EN`` and an output ``Y``. The ``A``
|
|
input and ``Y`` output are ``WIDTH`` bits wide, and the ``EN`` input is one bit
|
|
wide. When ``EN`` is 0, the output is not driven. When ``EN`` is 1, the value
|
|
from ``A`` input is sent to the ``Y`` output. Therefore, the `$tribuf` cell
|
|
implements the function :verilog:`Y = EN ? A : 'bz`.
|
|
|
|
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
|
|
constant zero with an `$and` gate).
|
|
|
|
.. autocellgroup:: mux
|
|
:members:
|
|
:source:
|
|
:linenos:
|