AXI-based Interconnect
Overview
The AXI-based interconnect is a module that performs bus arbitration between the CPU and each peripheral. It uses an AXI4-Lite based protocol. It realizes address decoding and routing through memory-mapped I/O.
The differences from AXI4-Lite are the following two points:
wvalid/awvalid and wready/awready are unified (handshake of w channel and aw channel is not independent)
dram and bootrom have 128-bit data width (not 32-bit width)
Key Functions
Protocol: AXI4-Lite compliant
Master: L2 Cache (via CPU/MMU)
Slaves: bootrom, CLINT, PLIC, UART, DRAM
Arbitration: Single master, multiple slaves
Address Decode: Automatic routing based on memory map
Memory Map
Sends and receives data with appropriate modules based on addresses.
Address Range |
Device/Region |
|---|---|
0x0001_0000 - 0x0001_1FFF |
bootrom |
0x0200_0000 - 0x020B_FFFF |
CLINT |
0x0C00_0000 - 0x0CFF_FFFF |
PLIC |
0x1000_0000 - 0x1000_00FF |
UART |
0x8000_0000 - 0x87FF_FFFF |
DRAM (Nexys4DDR) |
0x8000_0000 - 0x8FFF_FFFF |
DRAM (ArtyA7) |
Architecture
%%{init: {'flowchart': {'curve': 'stepAfter'}}}%%
flowchart TD
L2[L2 Cache] --> AXI["AXI Based Interconnect (Address Decode)"]
AXI --- Bus[" "]
style Bus width:0px,height:0px,fill:none,stroke:none
Bus --> bootrom
Bus --> CLINT
Bus --> PLIC
Bus --> UART
Bus --> DRAM[DRAM Controller]
Protocol
Uses AXI4-Lite based protocol.
Signal Name |
Direction |
Bit Width |
Description |
|---|---|---|---|
|
output |
1 |
Write address valid |
|
input |
1 |
Write address ready |
|
output |
32 - MMIO_WIDTH |
Write address |
|
output |
32 or 128 |
Write data |
|
output |
4 or 16 |
Write strobe |
|
input |
1 |
Write response valid |
|
output |
1 |
Write response ready |
|
input |
2 |
Write response status |
|
output |
1 |
Read address valid |
|
input |
1 |
Read address ready |
|
output |
32 - MMIO_WIDTH |
Read address |
|
input |
1 |
Read data valid |
|
output |
1 |
Read data ready |
|
input |
32 or 128 |
Read data |
|
input |
2 |
Read response status |
State Machine
State Name |
Description |
|---|---|
|
Idle state, wait for write request |
|
Writing to CLINT, wait for response |
|
Writing to PLIC, wait for response |
|
Writing to UART, wait for response |
|
Writing to DRAM, wait for response |
|
Return response, send response to CPU |