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

Subversion Repositories neorv32

[/] [neorv32/] [trunk/] [docs/] [datasheet/] [soc_wishbone.adoc] - Blame information for rev 69

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

Line No. Rev Author Line
1 60 zero_gravi
<<<
2
:sectnums:
3
==== Processor-External Memory Interface (WISHBONE) (AXI4-Lite)
4
 
5
[cols="<3,<3,<4"]
6
[frame="topbot",grid="none"]
7
|=======================
8 61 zero_gravi
| Hardware source file(s): | neorv32_wishbone.vhd |
9 60 zero_gravi
| Software driver file(s): | none             | _implicitly used_
10
| Top entity port:         | `wb_tag_o`  | request tag output (3-bit)
11
|                          | `wb_adr_o`  | address output (32-bit)
12
|                          | `wb_dat_i`  | data input (32-bit)
13
|                          | `wb_dat_o`  | data output (32-bit)
14
|                          | `wb_we_o`   | write enable (1-bit)
15
|                          | `wb_sel_o`  | byte enable (4-bit)
16
|                          | `wb_stb_o`  | strobe (1-bit)
17
|                          | `wb_cyc_o`  | valid cycle (1-bit)
18
|                          | `wb_lock_o` | exclusive access request (1-bit)
19
|                          | `wb_ack_i`  | acknowledge (1-bit)
20
|                          | `wb_err_i`  | bus error (1-bit)
21
|                          | `fence_o`   | an executed `fence` instruction
22
|                          | `fencei_o`  | an executed `fence.i` instruction
23 62 zero_gravi
| Configuration generics:  | _MEM_EXT_EN_         | enable external memory interface when _true_
24
|                          | _MEM_EXT_TIMEOUT_    | number of clock cycles after which an unacknowledged external bus access will auto-terminate (0 = disabled)
25
|                          | _MEM_EXT_PIPE_MODE_  | when _false_ (default): classic/standard Wishbone protocol; when _true_: pipelined Wishbone protocol
26
|                          | _MEM_EXT_BIG_ENDIAN_ | byte-order (Endianness) of external memory interface; true=BIG, false=little (default)
27
|                          | _MEM_EXT_ASYNC_RX_   | use registered RX path when _false_ (default); use async/direct RX path when _true_
28
| CPU interrupts:          | none |
29 60 zero_gravi
|=======================
30
 
31
 
32 69 zero_gravi
The external memory interface provides a Wishbone b4-compatible on-chip bus interface. The bus interface is
33
implemented when the _MEM_EXT_EN_ generic is _true_. This interface can be used to attach external memories,
34
custom hardware accelerators, additional IO devices or all other kinds of IP blocks.
35
 
36
The external interface is _not_ mapped to a _specific_ address space region. Instead, all CPU memory accesses that
37
do not target a processor-internal module are delegated to the external memory interface. In summary, a CPU load/store
38
access is delegated to the external bus interface if...
39
 
40
. it does not target the internal instruction memory IMEM (if implemented at all)
41
. **and** it does not target the internal data memory DMEM (if implemented at all)
42
. **and** it does not target the internal bootloader ROM or any of the IO devices - regardless if one or more of these components are
43
actually implemented or not.
44
 
45 60 zero_gravi
[TIP]
46 69 zero_gravi
See section <<_address_space>> for more information.
47 60 zero_gravi
 
48 69 zero_gravi
 
49 60 zero_gravi
**Wishbone Bus Protocol**
50
 
51 69 zero_gravi
The external memory interface either uses the **standard** ("classic") Wishbone transaction protocol (default) or
52
**pipelined** Wishbone transaction protocol. The transaction protocol is configured via the _MEM_EXT_PIPE_MODE_ generic:
53 60 zero_gravi
 
54 69 zero_gravi
When _MEM_EXT_PIPE_MODE_ is _false_, all bus control signals including _STB_ are active and remain stable until the
55 62 zero_gravi
transfer is acknowledged/terminated. If _MEM_EXT_PIPE_MODE_ is _true_, all bus control except _STB_ are active
56 69 zero_gravi
and remain until the transfer is acknowledged/terminated. In this case, _STB_ is asserted only during the very
57 60 zero_gravi
first bus clock cycle.
58
 
59
.Exemplary Wishbone bus accesses using "classic" and "pipelined" protocol
60
[cols="^2,^2"]
61
[grid="none"]
62
|=======================
63
a| image::wishbone_classic_read.png[700,300]
64
a| image::wishbone_pipelined_write.png[700,300]
65
| **Classic** Wishbone read access | **Pipelined** Wishbone write access
66
|=======================
67
 
68
 
69 69 zero_gravi
[TIP]
70 60 zero_gravi
A detailed description of the implemented Wishbone bus protocol and the according interface signals
71 65 zero_gravi
can be found in the data sheet "Wishbone B4 - WISHBONE System-on-Chip (SoC) Interconnection
72 60 zero_gravi
Architecture for Portable IP Cores". A copy of this document can be found in the docs folder of this
73
project.
74
 
75
 
76 69 zero_gravi
**Bus Access**
77 60 zero_gravi
 
78 69 zero_gravi
The NEORV32 Wishbone gateway does not support burst transfer yet, so there is always just one transfer in progress.
79
Hence, the Wishbone `STALL` signal is not implemented. An accessed Wishbone device does not have to respond immediately to a bus
80
request by sending an ACK. instead, there is a _time window_ where the device has to acknowledge the transfer. This time window
81
id configured by the _MEM_EXT_TIMEOUT_ top generic that defines the maximum time (in clock cycles) a bus access can be pending
82
before it is automatically terminated. If _MEM_EXT_TIMEOUT_ is set to zero, the timeout disabled an a bus access can take an
83
arbitrary number of cycles to complete.
84 61 zero_gravi
 
85 69 zero_gravi
When _MEM_EXT_TIMEOUT_ is greater than zero, the Wishbone gateway starts an internal countdown whenever the CPU
86 60 zero_gravi
accesses a memory address via the external memory interface. If the accessed memory / device does not acknowledge (via `wb_ack_i`)
87
or terminate (via `wb_err_i`) the transfer within _MEM_EXT_TIMEOUT_ clock cycles, the bus access is automatically canceled
88 69 zero_gravi
setting `wb_cyc_o` low again and a CPU load/store/instruction fetch bus access fault exception is raised.
89 60 zero_gravi
 
90 69 zero_gravi
[IMPORTANT]
91
Setting _MEM_EXT_TIMEOUT_ to zero will permanently stall the CPU if the targeted Wishbone device never responds. Hence,
92
_MEM_EXT_TIMEOUT_ should be always set to a value greater than zero. +
93
 +
94
This feature can be used as **safety guard** if the external memory system does not check for "address space holes". That means
95
that accessing addresses, which do not belong to a certain memory or device, do not permanently stall the processor due to an
96
unacknowledged/unterminated bus access. If the external memory system can guarantee to access **any** bus access
97
(even it targets an unimplemented address) the timeout feature should be disabled (_MEM_EXT_TIMEOUT_ = 0).
98 60 zero_gravi
 
99 69 zero_gravi
 
100 60 zero_gravi
**Wishbone Tag**
101
 
102
The 3-bit wishbone `wb_tag_o` signal provides additional information regarding the access type. This signal
103
is compatible to the AXI4 _AxPROT_ signal.
104
 
105
* `wb_tag_o(0)` 1: privileged access (CPU is in machine mode); 0: unprivileged access
106
* `wb_tag_o(1)` always zero (indicating "secure access")
107
* `wb_tag_o(2)` 1: instruction fetch access, 0: data access
108
 
109 69 zero_gravi
 
110 60 zero_gravi
**Exclusive / Atomic Bus Access**
111
 
112
If the atomic memory access CPU extension (via _CPU_EXTENSION_RISCV_A_) is enabled, the CPU can
113
request an atomic/exclusive bus access via the external memory interface.
114
 
115
The load-reservate instruction (`lr.w`) will set the `wb_lock_o` signal telling the bus interconnect to establish a
116
reservation for the current accessed address (start of an exclusive access). This signal will stay asserted until
117
another memory access instruction is executed (for example a `sc.w`).
118
 
119
The memory system has to make sure that no other entity can access the reservated address until `wb_lock_o`
120
is released again. If this attempt fails, the memory system has to assert `wb_err_i` in order to indicate that the
121
reservation was broken.
122
 
123
[TIP]
124
See section <<_bus_interface>> for the CPU bus interface protocol.
125
 
126 69 zero_gravi
 
127 60 zero_gravi
**Endianness**
128
 
129
The NEORV32 CPU and the Processor setup are *little-endian* architectures. To allow direct connection
130
to a big-endian memory system the external bus interface provides an _Endianness configuration_. The
131 62 zero_gravi
Endianness (of the external memory interface) can be configured via the _MEM_EXT_BIG_ENDIAN_ generic.
132
By default, the external memory interface uses little-endian byte-order (like the rest of the processor / CPU).
133 60 zero_gravi
 
134
Application software can check the Endianness configuration of the external bus interface via the
135 64 zero_gravi
SYSINFO module (see section <<_system_configuration_information_memory_sysinfo>> for more information).
136 60 zero_gravi
 
137 69 zero_gravi
 
138
**Gateway Latency**
139
 
140
By default, the Wishbone gateway introduces two additional latency cycles: processor-outgoing ("TX") and
141
processor-incoming ("RX") signals are fully registered. Thus, any access from the CPU to a processor-external devices
142
via Wishbone requires 2 additional clock cycles (at least; depending on device's latency).
143
 
144
If the attached Wishbone network / peripheral already provides output registers or if the Wishbone network is not relevant
145
for timing closure, the default buffering of incoming ("RX") data within the gateway can be disabled by implementing an
146
"asynchronous" RX path. The configuration is done via the _MEM_EXT_ASYNC_RX_ generic.
147
 
148
 
149 60 zero_gravi
**AXI4-Lite Connectivity**
150
 
151 63 zero_gravi
The AXI4-Lite wrapper (`rtl/system_integration/neorv32_SystemTop_axi4lite.vhd`) provides a Wishbone-to-
152 60 zero_gravi
AXI4-Lite bridge, compatible with Xilinx Vivado (IP packager and block design editor). All entity signals of
153
this wrapper are of type _std_logic_ or _std_logic_vector_, respectively.
154
 
155
The AXI Interface has been verified using Xilinx Vivado IP Packager and Block Designer. The AXI
156
interface port signals are automatically detected when packaging the core.
157
 
158
.Example AXI SoC using Xilinx Vivado
159
image::neorv32_axi_soc.png[]
160
 
161
[WARNING]
162 69 zero_gravi
Using the auto-termination timeout feature (_MEM_EXT_TIMEOUT_ greater than zero) is **not AXI4 compliant** as
163
the AXI protocol does not support canceling of bus transactions. Therefore, the NEORV32 top wrapper with AXI4-Lite interface
164
(`rtl/system_integration/neorv32_SystemTop_axi4lite`) configures _MEM_EXT_TIMEOUT_ = 0 by default.

powered by: WebSVN 2.1.0

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