|
| 1 | +CSR fields |
| 2 | +---------- |
| 3 | + |
| 4 | +.. py:module:: amaranth_soc.csr.action |
| 5 | +
|
| 6 | +The :mod:`amaranth_soc.csr.action` module provides built-in :class:`~amaranth_soc.csr.reg.FieldAction` implementations intended for common use cases, which are split in three categories: :ref:`basic fields <csr-action-basic>` for numerical values, :ref:`flag fields <csr-action-flag>` for arrays of bits, and :ref:`reserved fields <csr-action-reserved>` to serve as placeholders for compatibility. |
| 7 | + |
| 8 | +.. _csr-action-basic: |
| 9 | + |
| 10 | +Basic fields |
| 11 | +============ |
| 12 | + |
| 13 | +Such fields are either exclusively writable by a CSR bus initiator (e.g. :class:`W`, :class:`RW`) or the peripheral itself (e.g. :class:`R`). This effectively removes the possibility of a write conflict between a CSR bus initiator and the peripheral. |
| 14 | + |
| 15 | +.. autoclass:: R() |
| 16 | +.. autoclass:: W() |
| 17 | +.. autoclass:: RW() |
| 18 | + |
| 19 | +.. _csr-action-flag: |
| 20 | + |
| 21 | +Flag fields |
| 22 | +=========== |
| 23 | + |
| 24 | +Flag fields may be concurrently written by a CSR bus initiator and the peripheral. Each bit of a flag field may be set or cleared independently of others. |
| 25 | + |
| 26 | +Suggested use cases |
| 27 | ++++++++++++++++++++ |
| 28 | + |
| 29 | +- :class:`RW1C` flags may be used when a peripheral needs to notify the CPU of a given condition, such as an error or a pending interrupt. To acknowledge the notification, the CPU would then write 1 to the flag bit. |
| 30 | + |
| 31 | +- :class:`RW1S` flags may be used for self-clearing bits, such as the enable bit of a one-shot timer. When the timer reaches its maximum value, it would automatically disable itself by clearing its enable bit. |
| 32 | + |
| 33 | +- A pair of :class:`RW1C` and :class:`RW1S` flags may be used to target the same range of bits (e.g. that drives an array of GPIO pins). This allows a CSR bus initiator to set and clear bits in one write transaction (which is guaranteed to be atomic). If a single :class:`RW` field was used instead, a read-modify-write transaction would be needed, and would require locking to insure its atomicity in a multi-tasked environment. |
| 34 | + |
| 35 | +.. autoclass:: RW1C() |
| 36 | +.. autoclass:: RW1S() |
| 37 | + |
| 38 | +.. _csr-action-reserved: |
| 39 | + |
| 40 | +Reserved fields |
| 41 | +=============== |
| 42 | + |
| 43 | +Reserved fields may be defined to provide placeholders for past, future or undocumented functions of a peripheral. |
| 44 | + |
| 45 | +Suggested use cases |
| 46 | ++++++++++++++++++++ |
| 47 | + |
| 48 | +Reserved for future use (as value) |
| 49 | +.................................. |
| 50 | + |
| 51 | +A :class:`ResRAWL` field can be used as a placeholder to ensure forward compatibility of software binaries with future SoC revisions, where it may be replaced with a :ref:`basic field <csr-action-basic>`. |
| 52 | + |
| 53 | +The value returned by reads (and written back) must have defined semantics (e.g. a no-op) that can be relied upon in future SoC revisions. When writing to this field, software drivers targeting the current SoC revision must set up an atomic read-modify-write transaction. |
| 54 | + |
| 55 | +Reserved for future use (as flag) |
| 56 | +................................. |
| 57 | + |
| 58 | +If a field is expected to be implemented as a :ref:`flag <csr-action-flag>` in a future SoC revision, it can be defined as a :class:`ResRAW0` field in the current revision to ensure forward compatibility of software binaries. |
| 59 | + |
| 60 | +Software drivers targeting the current SoC revision should ignore the value returned by reads. Writing a value of 0 must be a no-op if the field is implemented in a future SoC revision. |
| 61 | + |
| 62 | +Defined but deprecated |
| 63 | +...................... |
| 64 | + |
| 65 | +If a field was deprecated in a previous SoC revision, it can be replaced with a :class:`ResR0WA` field to ensure backward compatibility of software binaries. |
| 66 | + |
| 67 | +The value of 0 returned by reads (and written back) must retain the semantics defined in the SoC revision where this field was deprecated. |
| 68 | + |
| 69 | +Defined but unimplemented |
| 70 | +......................... |
| 71 | + |
| 72 | +If a field is only implemented in some variants of a peripheral, it can be replaced by a :class:`ResR0W0` field in the others. |
| 73 | + |
| 74 | +.. autoclass:: ResRAW0() |
| 75 | +.. autoclass:: ResRAWL() |
| 76 | +.. autoclass:: ResR0WA() |
| 77 | +.. autoclass:: ResR0W0() |
0 commit comments