Skip to content

Commit aa7d051

Browse files
Spit xbar into two levels
Attempt to reduce the depth of xbar logic on critical timing paths to/from the HyperRAM/SRAM by moving most peripherals from the main cross-bar to a new "peri" (peripheral) sub-crossbar. Keeps addresses the same, but some few devices have increased access latency due to being moved to xbar_peri or to improve QoR. Blocks with increased access latency: timer, system_info, & hw_rev.
1 parent 7fa87a9 commit aa7d051

16 files changed

+824
-571
lines changed

.gitattributes

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,14 @@
22
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
33
# SPDX-License-Identifier: Apache-2.0
44
data/xbar_main_generated.hjson linguist-generated=true
5+
data/xbar_peri_generated.hjson linguist-generated=true
56
doc/ip/pinmux.md linguist-generated=true
67
rtl/bus/sonata_xbar_main.sv linguist-generated=true
78
rtl/bus/tl_main_pkg.sv linguist-generated=true
9+
rtl/bus/tl_peri_pkg.sv linguist-generated=true
810
rtl/bus/tl_ifetch_pkg.sv linguist-generated=true
911
rtl/bus/xbar_main.sv linguist-generated=true
12+
rtl/bus/xbar_peri.sv linguist-generated=true
1013
rtl/bus/xbar_ifetch.sv linguist-generated=true
1114
rtl/system/pinmux.sv linguist-generated=true
1215
rtl/system/sonata_pkg.sv linguist-generated=true

data/top_config.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ instances = 1
1818
ios = [{ name = "ios", type = "output", length = 6 }]
1919
memory_start = 0x80001000
2020
memory_size = 0x00001000
21-
xbar = { pipeline = "true", req_fifo_pass = "false", rsp_fifo_pass = "false" }
2221

2322
[[blocks]]
2423
name = "uart"
@@ -29,7 +28,6 @@ ios = [
2928
]
3029
memory_start = 0x80100000
3130
memory_size = 0x00001000
32-
xbar = { pipeline = "true", req_fifo_pass = "false", rsp_fifo_pass = "false" }
3331

3432
[[blocks]]
3533
name = "i2c"

data/xbar_main.hjson

Lines changed: 9 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -61,90 +61,25 @@
6161
size_byte: "0x00004000",
6262
}],
6363
},
64-
{ name: "gpio", // General purpose input and output
64+
{ name: "peri",
6565
type: "device",
6666
clock: "clk_sys_i",
6767
reset: "rst_sys_ni",
68-
req_fifo_pass: false,
69-
rsp_fifo_pass: false,
7068
xbar: false,
7169
addr_range: [{
7270
base_addr: "0x80000000",
73-
size_byte: "0x00001000",
74-
}],
75-
pipeline: true,
76-
},
77-
{ name: "pinmux", // Pin multiplexer
78-
type: "device",
79-
clock: "clk_sys_i",
80-
reset: "rst_sys_ni",
81-
req_fifo_pass: false,
82-
rsp_fifo_pass: false,
83-
xbar: false,
84-
addr_range: [{
85-
base_addr: "0x80005000",
86-
size_byte: "0x00001000",
87-
}],
88-
pipeline: true,
89-
},
90-
{ name: "rgbled_ctrl", // RGB LED Controller
91-
type: "device",
92-
clock: "clk_sys_i",
93-
reset: "rst_sys_ni",
94-
req_fifo_pass: false,
95-
rsp_fifo_pass: false,
96-
xbar: false,
97-
addr_range: [{
98-
base_addr: "0x80009000",
99-
size_byte: "0x00001000",
71+
size_byte: "0x00200000",
10072
}],
10173
pipeline: true,
102-
},
103-
{ name: "hw_rev", // Hardware revoker control register
104-
type: "device",
105-
clock: "clk_sys_i",
106-
reset: "rst_sys_ni",
107-
xbar: false,
108-
addr_range: [{
109-
base_addr: "0x8000A000",
110-
size_byte: "0x00001000",
111-
}],
112-
},
113-
{ name: "xadc", // XADC
114-
type: "device",
115-
clock: "clk_sys_i",
116-
reset: "rst_sys_ni",
11774
req_fifo_pass: false,
11875
rsp_fifo_pass: false,
119-
xbar: false,
120-
addr_range: [{
121-
base_addr: "0x8000B000",
122-
size_byte: "0x00001000",
123-
}],
124-
pipeline: true,
125-
},
126-
{ name: "system_info", // System information
127-
type: "device",
128-
clock: "clk_sys_i",
129-
reset: "rst_sys_ni",
130-
xbar: false,
131-
addr_range: [{
132-
base_addr: "0x8000C000",
133-
size_byte: "0x00001000",
134-
}],
135-
},
136-
{ name: "timer", // Interrupt timer
137-
type: "device",
138-
clock: "clk_sys_i",
139-
reset: "rst_sys_ni",
140-
xbar: false,
141-
addr_range: [{
142-
base_addr: "0x80040000",
143-
size_byte: "0x00010000",
144-
}],
14576
},
77+
// I^2C devices included here instead of in peri only because
78+
// address range sizes must be a power of two.
79+
// We can easily tolerate an extra cycle of access latency to them,
80+
// so add pipelining to allow them to be placed further away physically.
14681
% for block in config.blocks:
147-
% if not block.name == "gpio":
82+
% if block.name in ["i2c", "spi"]:
14883
% for i in range(block.instances):
14984
{ name: "${f"{block.name}{i}"}",
15085
type: "device",
@@ -176,31 +111,22 @@
176111
type: "device",
177112
clock: "clk_sys_i",
178113
reset: "rst_sys_ni",
179-
req_fifo_pass: false,
180-
rsp_fifo_pass: false,
181114
xbar: false,
182115
addr_range: [{
183116
// This block is overaligned to 0x0800_0000 bytes since OpenTitan RV_PLIC block expects it.
184117
base_addr: "0x88000000",
185118
size_byte: "0x04000000",
186119
}],
187-
pipeline: true,
188120
},
189121
],
190122
connections: {
191123
ibex_lsu: [
192124
"sram",
193125
"hyperram",
194126
"rev_tag",
195-
"gpio",
196-
"pinmux",
197-
"system_info",
198-
"rgbled_ctrl",
199-
"hw_rev",
200-
"xadc",
201-
"timer",
127+
"peri",
202128
% for block in config.blocks:
203-
% if not block.name == "gpio":
129+
% if block.name in ["i2c", "spi"]:
204130
% for i in range(block.instances):
205131
"${f"{block.name}{i}"}",
206132
% endfor

data/xbar_main_generated.hjson

Lines changed: 7 additions & 165 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)