OpenCores
URL https://opencores.org/ocsvn/neorv32/neorv32/trunk

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [soc_slink.adoc] - Blame information for rev 62

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 61 zero_gravi
<<<
2
:sectnums:
3
==== Stream Link Interface (SLINK)
4
 
5
[cols="<3,<3,<4"]
6
[frame="topbot",grid="none"]
7
|=======================
8
| Hardware source file(s): | neorv32_slink.vhd |
9
| Software driver file(s): | neorv32_slink.c |
10
|                          | neorv32_slink.h |
11
| Top entity port:         | `slink_tx_dat_o` | TX link data (8x32-bit)
12
|                          | `slink_tx_val_o` | TX link data valid (8-bit)
13
|                          | `slink_tx_rdy_i` | TX link allowed to send (8-bit)
14
|                          | `slink_rx_dat_i` | RX link data (8x32-bit)
15
|                          | `slink_rx_val_i` | RX link data valid (8-bit)
16
|                          | `slink_rx_rdy_o` | RX link ready to receive (8-bit)
17
| Configuration generics:  | _SLINK_NUM_TX_  | Number of TX links to implement (0..8)
18
|                          | _SLINK_NUM_RX_  | Number of RX links to implement (0..8)
19
|                          | _SLINK_TX_FIFO_ | FIFO depth (1..32k) of TX links, has to be a power of two
20
|                          | _SLINK_RX_FIFO_ | FIFO depth (1..32k) of RX links, has to be a power of two
21 62 zero_gravi
| CPU interrupts:          | fast IRQ channel 10 | SLINK RX IRQ (see <<_processor_interrupts>>)
22
|                          | fast IRQ channel 11 | SLINK TX IRQ (see <<_processor_interrupts>>)
23 61 zero_gravi
|=======================
24
 
25
The SLINK component provides up to 8 independent RX (receiving) and TX (sending) links for transmitting
26
stream data. The interface provides higher bandwidth (and less latency) than the external memory bus
27
interface, which makes it ideally suited to couple custom stream processing units (like CORDIC, FFTs or
28
cryptographic accelerators).
29
 
30
Each individual link provides an internal FIFO for data buffering. The FIFO depth is globally defined
31
for all TX links via the _SLINK_TX_FIFO_ generic and for all RX links via the _SLINK_RX_FIFO_ generic.
32
The FIFO depth has to be at least 1, which will implement a simple input/output register. The maximum
33
value is limited to 32768 entries. Note that the FIFO depth has to be a power of two (for optimal
34
logic mapping).
35
 
36
The actual number of implemented RX/TX links is configured by the _SLINK_NUM_RX_ and _SLINK_NUM_TX_
37
generics. The SLINK module will be synthesized only if at least one of these generics is greater than
38
zero. All unimplemented links are internally terminated and their according output signals are pulled
39
to low level.
40
 
41
[NOTE]
42
The SLINK interface does not provide any additional tag signals (for example to define a "stream destination
43
address" or to indicate the last data word of a "package"). Use a custom controller connected
44 62 zero_gravi
via the external memory bus interface or use some of the processor's GPIO ports to implement custom data
45
tag signals.
46 61 zero_gravi
 
47
**Theory of Operation**
48
 
49 62 zero_gravi
The SLINK provides eight data registers (_SLINK_CHx_) to access the links (read accesses will access the RX links, write
50
accesses will access the TX links), one control register (_SLINK_CT_) and one status register (_SLINK_STATUS_).
51
 
52
The SLINK is globally activated by setting the control register's enable bit _SLINK_CT_EN_.
53 61 zero_gravi
The actual data links are accessed by reading or writing the according link data registers _SLINK_CH0_
54
to _SLINK_CH7_. For example, writing the _SLINK_CH0_ will put the according data into the FIFO of TX link 0.
55
Accordingly, reading from _SLINK_CH0_ will return one data word from the FIFO of RX link 0.
56
 
57 62 zero_gravi
The configuration (done via the SLINK generics) can be checked by software by evaluating bit fields in the
58
control register. The _SLINK_CT_TX_FIFO_Sx_ and _SLINK_CT_RX_FIFO_Sx_ indicate the TX & RX FIFO sizes.
59
The _SLINK_CT_TX_NUMx_ and _SLINK_CT_RX_NUMx_ bits represent the absolute number of implemented TX and RX links.
60 61 zero_gravi
 
61 62 zero_gravi
The status register shows the FIFO status flags of each RX and TX link. The _SLINK_CT_RXx_AVAIL_ flags indicate
62
that there is _at least_ one data word in the according RX link's FIFO. The _SLINK_CT_TXx_FREE_ flags indicate
63
there is _at least_ one free entry in the according TX link's FIFO. The _SLINK_STATUS_RXx_HALF_ and
64
_SLINK_STATUS_RXx_HALF_ flags show if a certain FIFO's fill level has exceeded half of its capacity.
65 61 zero_gravi
 
66 62 zero_gravi
 
67 61 zero_gravi
**Blocking Link Access**
68
 
69
When directly accessing the link data registers (without checking the according FIFO status flags) the access
70 62 zero_gravi
is as _blocking_. That means the CPU access will stall until the accessed link responds. For
71
example, when reading RX link 0 (via _SLINK_CH0_ register) the CPU will stall, if there is not data
72
available in the according FIFO yet. The CPU access will complete as soon as RX link 0 receives new data.
73 61 zero_gravi
 
74 62 zero_gravi
Vice versa, writing data to TX link 0 (via _SLINK_CH0_ register) will stall the CPU access until there is
75 61 zero_gravi
at least one free entry in the link's FIFO.
76
 
77
[WARNING]
78
The NEORV32 processor ensures that _any_ CPU access to memory-mapped devices (including the SLINK module)
79
will **time out** after a certain number of cycles (see section <<_bus_interface>>).
80
Hence, blocking access to a stream link that does not complete within a certain amount of cycles will
81 62 zero_gravi
raise a _store bus access exception_ when writing a _full_ TX link or a _load bus access exception_ when reading
82
from an _empty_ RX link. Hence, this concept should only be used when evaluating the half-full FIFO condition
83
(for example via the SLINK interrupts) before actual accessing links.
84 61 zero_gravi
 
85
**Non-Blocking Link Access**
86
 
87 62 zero_gravi
For a non-blocking link access concept, the FIFO status flags in _SLINK_STATUS_ need to be checked _before_
88 61 zero_gravi
reading/writing the actual link data register. For example, a non-blocking write access to a TX link 0 has
89 62 zero_gravi
to check _SLINK_STATUS_TX0_FREE_ first. If the bit is set, the FIFO of TX link 0 can take another data word
90 61 zero_gravi
and the actual data can be written to _SLINK_CH0_. If the bit is cleared, the link's FIFO is full
91 62 zero_gravi
and the status flag can be polled until it there is free space in the available.
92 61 zero_gravi
 
93
This concept will not raise any exception as there is no "direct" access to the link data registers.
94 62 zero_gravi
However, non-blocking accesses require additional instructions to check the according status flags prior
95
to the actual link access, which will reduce performance for high-bandwidth data streams.
96 61 zero_gravi
 
97
**Interrupts**
98
 
99
The stream interface provides two interrupts that are _globally_ driven by the RX and TX link's
100 62 zero_gravi
FIFO fill level status. The behavior of these interrupts differs if the FIFO depth is exactly 1 (minimal)
101
or if it is greater than 1.
102
 
103
When _SLINK_*X_FIFO_ is 1 a TX interrupt will fire if **any** TX link _was full_ and _becomes empty_ again.
104 61 zero_gravi
Accordingly, if the FIFO of **any** RX link _was empty_ and a _new data word_ appears in it, the RX interrupt fires.
105
 
106 62 zero_gravi
When _SLINK_*X_FIFO_ is greater than 1 the TX interrupt will fire if _any_ TX link's FIFO _falls below_ half-full fill level.
107
Accordingly, the RX interrupt will fire if _any_ RX link's FIFO _exceeds_ half-full fill level.
108
 
109
The interrupt service handler has to evaluate the SLINK status register is order to detect which link(s) has caused the
110
interrupt. No further interrupt can fire until the CPU acknowledges the last interrupt by _reading the SLINK status register_.
111
However, further IRQ conditions are buffered and will trigger another interrupt after the current one has been acknowledged.
112
 
113 61 zero_gravi
Note that these interrupts can only fire if the SLINK module is actually enabled by setting the
114
_SLINK_CT_EN_ bit in the unit's control register.
115
 
116
**Stream Link Interface & Protocol**
117
 
118
The SLINK interface consists of three signals `dat`, `val` and `rdy` for each RX and TX link.
119
Each signal is an "array" with eight entires (one for each link). Note that an entry in `slink_*x_dat` is 32-bit
120
wide while entries in `slink_*x_val` and `slink_*x_rdy` are are just 1-bit wide.
121
 
122
The stream link protocol is based on a simple FIFO-like interface between a source (sender) and a sink (receiver).
123 62 zero_gravi
Each link provides two signals for implementing a simple FIFO-style handshake. The `slink_*x_val` signal is set by
124
the source if the according `slink_*x_dat` (also set by the source) contains valid data. The stream source has to
125
ensure that both signals remain stable until the according `slink_*x_rdy` signal is set by the stream sink to
126
indicate it can accept another data word.
127 61 zero_gravi
 
128 62 zero_gravi
In summary, a data word is transferred if both `slink_*x_val(i)` and `slink_*x_rdy(i)` are high.
129 61 zero_gravi
 
130
.Exemplary stream link transfer
131
image::stream_link_interface.png[width=560,align=center]
132
 
133
[TIP]
134 62 zero_gravi
The SLINK handshake protocol is compatible with the https://developer.arm.com/documentation/ihi0051/a/Introduction/About-the-AXI4-Stream-protocol[AXI4-Stream] base protocol.
135 61 zero_gravi
 
136
.SLINK register map
137
[cols="^4,<5,^2,^2,<14"]
138
[options="header",grid="all"]
139
|=======================
140
| Address | Name [C] | Bit(s) | R/W | Function
141 62 zero_gravi
.6+<| `0xfffffec0` .6+<| _SLINK_CT_ <| `31` _SLINK_CT_EN_ ^| r/w | SLINK global enable
142
                                    <| `30:16` _reserved_ ^| r/- <| reserved, read as zero
143
                                    <| `15:12` _SLINK_CT_TX_FIFO_S3_ : _SLINK_CT_TX_FIFO_S0_ ^| r/- <| TX links FIFO depth, log2 of_SLINK_TX_FIFO_ generic
144
                                    <| `11:8` _SLINK_CT_RX_FIFO_S3_ : _SLINK_CT_RX_FIFO_S0_  ^| r/- <| RX links FIFO depth, log2 of_SLINK_RX_FIFO_ generic
145
                                    <| `7:4` _SLINK_CT_TX_NUM3_ : _SLINK_CT_TX_NUM0_ ^| r/- <| Number of implemented TX links
146
                                    <| `3:0` _SLINK_CT_RX_NUM3_ : _SLINK_CT_RX_NUM0_ ^| r/- <| Number of implemented RX links
147
| `0xfffffec4` : `0xfffffeec` | _SLINK_CT_ |`31:0` | | _mirrored control register_
148
.4+<| `0xfffffed0` .4+<| _SLINK_STATUS_ <| `31:24` _SLINK_STATUS_TX7_HALF_ : _SLINK_STATUS_TX0_HALF_ ^| r/-  | TX link 7..0 FIFO fill level is > half-full
149
                                        <| `23:16` _SLINK_STATUS_RX7_HALF_ : _SLINK_STATUS_RX0_HALF_ ^| r/- <| RX link 7..0 FIFO fill level is >= half-full
150
                                        <| `15:8`  _SLINK_CT_TX7_FREE_  : _SLINK_CT_TX0_FREE_  ^| r/- <| At least one free TX FIFO entry available for link 7..0
151
                                        <| `7:0`   _SLINK_CT_RX7_AVAIL_ : _SLINK_CT_RX0_AVAIL_ ^| r/- <| At least one data word in RX FIFO available for link 7..0
152
| `0xfffffed4` : `0xfffffedc` | _SLINK_STATUS_ |`31:0` | | _mirrored status register_
153 61 zero_gravi
| `0xfffffee0` | _SLINK_CH0_ | `31:0` | r/w | Link 0 RX/TX data
154
| `0xfffffee4` | _SLINK_CH1_ | `31:0` | r/w | Link 1 RX/TX data
155
| `0xfffffee8` | _SLINK_CH2_ | `31:0` | r/w | Link 2 RX/TX data
156
| `0xfffffeec` | _SLINK_CH3_ | `31:0` | r/w | Link 3 RX/TX data
157
| `0xfffffef0` | _SLINK_CH4_ | `31:0` | r/w | Link 4 RX/TX data
158
| `0xfffffef4` | _SLINK_CH5_ | `31:0` | r/w | Link 5 RX/TX data
159
| `0xfffffef8` | _SLINK_CH6_ | `31:0` | r/w | Link 6 RX/TX data
160
| `0xfffffefc` | _SLINK_CH7_ | `31:0` | r/w | Link 7 RX/TX data
161
|=======================

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.