data_width : int
Width of the data signals ("port size" in Wishbone terminology).
One of 8, 16, 32, 64.
- granularity : int
+ granularity : int or None
Granularity of select signals ("port granularity" in Wishbone terminology).
- One of 8, 16, 32, 64.
+ One of 8, 16, 32, 64. Optional and defaults to None, meaning it is equal
+ to the address width.
features : iter(str)
Selects the optional signals that will be a part of this interface.
alignment : int
- Resource and window alignment. See :class:`MemoryMap`.
+ Resource and window alignment. Optional. See :class:`MemoryMap`.
name : str
Name of the underlying record.
Address width. See :class:`Interface`.
data_width : int
Data width. See :class:`Interface`.
- granularity : int
- Granularity. See :class:`Interface`
+ granularity : int or None
+ Granularity. Optional. See :class:`Interface`
features : iter(str)
Optional signal set. See :class:`Interface`.
alignment : int
- Window alignment. See :class:`Interface`.
+ Window alignment. Optional. See :class:`Interface`.
Attributes
----------
Address width of the shared bus. See :class:`Interface`.
data_width : int
Data width of the shared bus. See :class:`Interface`.
- granularity : int
- Granularity of the shared bus. See :class:`Interface`.
+ granularity : int or None
+ Granularity of the shared bus. Optional. See :class:`Interface`.
features : iter(str)
Optional signal set for the shared bus. See :class:`Interface`.
- scheduler : str or None
- Method for bus arbitration. Defaults to "rr" (Round Robin, see
+ scheduler : str
+ Method for bus arbitration. Optional and defaults to "rr" (Round Robin, see
:class:`scheduler.RoundRobin`).
Attributes
Parameters
----------
- shared_bus : :class:`Interface`
- Shared bus for the interconnect module between the arbiter and decoder.
- itors : list of :class:`Interface`
+ addr_width : int
+ Address width of the shared bus. See :class:`Interface`.
+ data_width : int
+ Data width of the shared bus. See :class:`Interface`.
+ itors : list of (:class:`Interface` OR :class:`Record`)
List of MASTERs on the arbiter to request access to the shared bus.
- targets : list of :class:`Interface`
+ If the item is a :class:`Record`, its fields must be named using the
+ convention of :class:`Interface`.
+ targets : list of (:class:`Interface` OR tuple of (:class:`Interface`, int))
List of SLAVEs on the decoder whose accesses are to be targeted by the shared bus.
+ If the item is a tuple of (intf, addr), the :class:`Interface`-type intf is added
+ at the (address width + granularity bits)-wide address of the int-type addr.
+ granularity : int or None
+ Granularity of the shared bus. Optional. See :class:`Interface`.
+ features : iter(str)
+ Optional signal set for the shared bus. See :class:`Interface`.
+ scheduler : str
+ Method for bus arbitration for the arbiter. Optional and defaults to "rr" (Round Robin, see
+ :class:`scheduler.RoundRobin`).
+ alignment : int
+ Window alignment for the decoder. Optional. See :class:`Interface`.
Attributes
----------
- addr_width : int
- Address width of the shared bus. See :class:`Interface`.
- data_width : int
- Data width of the shared bus. See :class:`Interface`.
- granularity : int
- Granularity of the shared bus. See :class:`Interface`
+ arbiter : :class:`Arbiter`
+ The arbiter that connects the list of MASTERs to a shared bus.
+ decoder : :class:`Decoder`
+ The decoder that connects the shared bus to the list of SLAVEs.
"""
- def __init__(self, *, addr_width, data_width, itors, targets,
- scheduler="rr", **kwargs):
+ def __init__(self, *, addr_width, data_width, itors, targets, **kwargs):
self.addr_width = addr_width
self.data_width = data_width
class SRAM(Elaboratable):
+ """SRAM module carrying a volatile memory block (implemented with :class:`Memory`)
+ that can be read and write (or only read if the SRAM is read-only) through a Wishbone bus.
+
+ If no Wishbone bus is specified during initialisation, this creates one whose address width
+ is just enough to fit the whole memory (i.e. equals to the log2(memory depth) rounded up), and
+ whose data width is equal to the memory width.
+
+ Parameters
+ ----------
+ memory : :class:`Memory`
+ The memory to be accessed via the Wishbone bus.
+ read_only : bool
+ Whether or not the memory is read-only. Defaults to False.
+ bus : :class:`Interface` or None
+ The Wishbone bus interface providing access to the read/write ports of the memory.
+ Optional and defaults to None, which lets this module to instantiate one as described
+ above, having the granularity, features and alignment as specified by their
+ corresponding parameters.
+ granularity : int or None
+ If the Wishbone bus is not sepcified, this is the granularity of the Wishbone bus.
+ Optional. See :class:`Interface`.
+ features : iter(str)
+ If the Wishbone bus is not sepcified, this is the optional signal set for the Wishbone bus.
+ See :class:`Interface`.
+
+ Attributes
+ ----------
+ memory : :class:`Memory`
+ The memory to be accessed via the Wishbone bus.
+ bus : :class:`Interface`
+ The Wishbone bus interface providing access to the read/write ports of the memory.
"""
- """
- def __init__(self, memory, read_only=False, bus=None,
+ def __init__(self, memory, read_only=False, bus=None,
granularity=None, features=frozenset()):
if not isinstance(memory, Memory):
raise TypeError("Memory {!r} is not a Memory"
.format(memory))
self.memory = memory
self.read_only = read_only
- # Define total address space:
+ # Define total address space:
# - Base: equals memory.depth
# - Has an additional ReadPort: add rdport.depth
# - Has an additional WirtePort: add wrport.depth
if self.memory.width > len(self.bus.dat_r):
raise NotImplementedError
-
+
# read
m.submodules.rdport = rdport = self.memory.read_port()
m.d.comb += [
wrport.data.eq(self.bus.dat_w)
]
for i in range(4):
- m.d.comb += wrport.en[i].eq(self.bus.cyc & self.bus.stb & self.bus.we & self.bus.sel[i])
+ m.d.comb += wrport.en[i].eq(self.bus.cyc & self.bus.stb &
+ self.bus.we & self.bus.sel[i])
# generate ack
m.d.sync += self.bus.ack.eq(0)