1
0
mirror of https://github.com/myhdl/myhdl.git synced 2025-01-24 21:52:56 +08:00
Christopher Felton 1513a24e18 Updated 0.9 documentation.
Updated the MyHDL manual to include the 0.9 what's new in the
index and additional verbage in the conversion section on
interfaces.  This commit is also being used as a test vehicle
for the new development flow using git.
2015-02-22 18:52:09 -06:00

97 lines
3.0 KiB
ReStructuredText

.. currentmodule:: myhdl
.. _new09:
***********************
What's new in MyHDL 0.9
***********************
Interfaces
===========
Rationale
---------
Complex designs often have many signals (ports) that are passed to
different levels of hierarchy. Typically, many of the signals can
logically be grouped together. Grouping the signals into an
*interface* simplifies the code, improves efficiency, and reduces
errors.
An *interface* is a collection of signals (:class:`Signal`) embedded
in an class/object as attributes. This provides a natural method
to group related signals and provides intuitive access through
attributes. Multiple level of objects and attibutes provides a
hierarchy of signal structure if desired.
The following is an example of an *interface* definition::
class Complex:
def __init__(self, min=-2, max=2):
self.real = Signal(intbv(0, min=min, max=max))
self.imag = Signal(intbv(0, min=min, max=max))
Previous versions supported *interfaces* for modeling and for
conversion if the attributes were locally referenced in a MyHDL
module outside of the `MyHDL generator`_. If the attributes were
directly referenced in the `MyHDL generator`_ the code would not be
convertible.
This features adds the ability to convert attributes that are
:class:`Signal` and referenced in the `MyHDL generator`_. This is
an evolution of a useful construct.
The following
is an example using the above ``Complex`` interface definition::
a,b = Complex(-8,8), Complex(-8,8)
c = Complex(-128,128)
def complex_multiply(clock, reset, a, b, c):
@always_seq(clock.posedge, reset=reset)
def cmult():
c.real.next = (a.real*b.real) - (a.imag*b.imag)
c.imag.next = (a.real*b.imag) + (a.imag*b.real)
return cmult
Solution
--------
The proposed solution is to create unique names for attributes which
are type :class:`Signal` and used by a `MyHDL generator`_. The
converter will create a unique name by using the name of the parent
and the name of the attribute along with the name of the MyHDL module
instance (if required for uniqueness). The converter will essentially
replace the "." with an "_" for each *interface* element.
Even though the target HDLs do not support *interfaces*, MyHDL is
able to add high-level features that compile during conversion to the
target HDL (Verilog and VHDL).
Conversion
----------
.. add details of the conversion, what policies are used to name
.. extend the Signals. Any useful information about the approach
.. or structure in the converter used.
Limitations
-----------
The current implementation only converts ``Signal`` attributes and
constants (read-only ints). Other Python structures will not be
analyzed (e.g. dict) and attributes used as variables will not be
converted.
See also
--------
For additional information see the original proposal `mep-107`_.
.. _mep-107: http://http://myhdl.org/doku.php/meps:mep-107
.. _MyHDL generator: http://docs.myhdl.org/en/latest/manual/reference.html#myhdl-generators-and-trigger-objects