Skip to content

Memory Types

Memory Types.

Classes:

Name Description
MemIoType

Memory IO-Type.

Functions:

Name Description
calc_slicewidths

Calculate slicewidths.

Attributes:

Name Type Description
SliceWidths TypeAlias

Word Slice Widths.

Addressing TypeAlias

Address Mode.

SliceWidths module-attribute

SliceWidths = tuple[int | Expr, ...]

Word Slice Widths.

Addressing module-attribute

Addressing = Literal['byte', 'data']

Address Mode.

MemIoType

Bases: AStructType

Memory IO-Type.

Attributes:

Name Type Description
datawidth int | Expr

Data Width in Bits

addrwidth int | Expr

Address Width in Bits

writable bool

Read-Only or Read/Writable Memory

slicewidths SliceWidths | None

Word Slices for Modification, Sum MUST be identical to datawidth

err bool

Report Access Error

addressing Addressing

Addressing Mode

ROM Example:

>>> from ucdp_glbl.mem import MemIoType
>>> iotype = MemIoType(datawidth=32, addrwidth=8, writable=False)
>>> iotype
MemIoType(datawidth=32, addrwidth=8, writable=False)
>>> for item in iotype.values(): print(item)
StructItem('ena', EnaType(), doc=Doc(title='Memory Access Enable'))
StructItem('addr', UintType(8), doc=Doc(title='Memory Address'))
StructItem('rdata', UintType(32), orientation=BWD, doc=Doc(title='Memory Read Data'))

RAM Example:

>>> from ucdp_glbl.mem import MemIoType
>>> iotype = MemIoType(datawidth=32, addrwidth=8, writable=True)
>>> iotype
MemIoType(datawidth=32, addrwidth=8, writable=True)
>>> for item in iotype.values(): print(item)
StructItem('ena', EnaType(), doc=Doc(title='Memory Access Enable'))
StructItem('addr', UintType(8), doc=Doc(title='Memory Address'))
StructItem('wena', EnaType(), doc=Doc(title='Memory Write Enable'))
StructItem('wdata', UintType(32), doc=Doc(title='Memory Write Data'))
StructItem('rdata', UintType(32), orientation=BWD, doc=Doc(title='Memory Read Data'))

RAM Example with Byte Access and error:

>>> from ucdp_glbl.mem import MemIoType
>>> iotype = MemIoType.with_slicewidth(datawidth=32, addrwidth=8, writable=True, slicewidth=8, err=True)
>>> iotype
MemIoType(datawidth=32, addrwidth=8, writable=True, slicewidths=(8, 8, 8, 8), err=True)
>>> for item in iotype.values(): print(item)
StructItem('ena', EnaType(), doc=Doc(title='Memory Access Enable'))
StructItem('addr', UintType(8), doc=Doc(title='Memory Address'))
StructItem('wena', EnaType(), doc=Doc(title='Memory Write Enable'))
StructItem('wdata', UintType(32), doc=Doc(title='Memory Write Data'))
StructItem('rdata', UintType(32), orientation=BWD, doc=Doc(title='Memory Read Data'))
StructItem('sel', UintType(4), doc=Doc(title='Slice Selects'))
StructItem('err', BitType(), orientation=BWD, doc=Doc(title='Memory Access Failed.'))

Non-Slicable:

>>> MemIoType.with_slicewidth(datawidth=31, addrwidth=8, writable=True, slicewidth=8)
Traceback (most recent call last):
...
ValueError: Cannot split 31 bits into slices of 8 bits

Methods:

Name Description
with_slicewidth

Create MemIoType based on given slicewidth instead of individual slicewidths.

with_slicewidth staticmethod

with_slicewidth(
    datawidth,
    addrwidth,
    writable,
    slicewidth=None,
    err=False,
)

Create MemIoType based on given slicewidth instead of individual slicewidths.

calc_slicewidths

calc_slicewidths(datawidth, slicewidth=None)

Calculate slicewidths.

>>> calc_slicewidths(32) is None
True
>>> calc_slicewidths(32, slicewidth=8)
(8, 8, 8, 8)
>>> calc_slicewidths(32, slicewidth=5)
Traceback (most recent call last):
  ...
ValueError: Cannot split 32 bits into slices of 5 bits