Skip to content

Commit 81b8a66

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. Blocks with decreased access latency: plic.
1 parent 702abb9 commit 81b8a66

17 files changed

Lines changed: 863 additions & 594 deletions

.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/README.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: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,15 @@ ios = [
1111
]
1212
memory_start = 0x80000040
1313
memory_size = 0x00000040
14+
which_xbar = "peri"
1415

1516
[[blocks]]
1617
name = "pwm"
1718
instances = 1
1819
ios = [{ name = "out", type = "output", length = 7 }]
1920
memory_start = 0x80001000
2021
memory_size = 0x00001000
21-
xbar = { pipeline = "true", req_fifo_pass = "false", rsp_fifo_pass = "false" }
22+
which_xbar = "peri"
2223

2324
[[blocks]]
2425
name = "uart"
@@ -29,7 +30,7 @@ ios = [
2930
]
3031
memory_start = 0x80100000
3132
memory_size = 0x00001000
32-
xbar = { pipeline = "true", req_fifo_pass = "false", rsp_fifo_pass = "false" }
33+
which_xbar = "peri"
3334

3435
[[blocks]]
3536
name = "i2c"
@@ -41,6 +42,7 @@ ios = [
4142
memory_start = 0x80200000
4243
memory_size = 0x00001000
4344
xbar = { pipeline = "true", req_fifo_pass = "false", rsp_fifo_pass = "false" }
45+
which_xbar = "main"
4446

4547
[[blocks]]
4648
name = "spi"
@@ -53,6 +55,7 @@ ios = [
5355
]
5456
memory_start = 0x80302000
5557
memory_size = 0x00001000
58+
which_xbar = "main"
5659

5760
# UARTS
5861
[[pins]]

data/xbar_main.hjson

Lines changed: 13 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -61,87 +61,18 @@
6161
size_byte: "0x00000800",
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
},
14677
{ name: "spi_lcd",
14778
type: "device",
@@ -163,8 +94,12 @@
16394
size_byte: "0x00001000",
16495
}],
16596
},
97+
// I^2C devices included here instead of in peri only because
98+
// address range sizes must be a power of two.
99+
// We can easily tolerate an extra cycle of access latency to them,
100+
// so add pipelining to allow them to be placed further away physically.
166101
% for block in config.blocks:
167-
% if not block.name == "gpio":
102+
% if block.which_xbar == "main":
168103
% for i in range(block.instances):
169104
{ name: "${f"{block.name}{i}"}",
170105
type: "device",
@@ -196,6 +131,8 @@
196131
type: "device",
197132
clock: "clk_sys_i",
198133
reset: "rst_sys_ni",
134+
req_fifo_pass: false,
135+
rsp_fifo_pass: false,
199136
xbar: false,
200137
pipeline: true,
201138
addr_range: [{
@@ -207,46 +144,37 @@
207144
type: "device",
208145
clock: "clk_sys_i",
209146
reset: "rst_sys_ni",
210-
req_fifo_pass: false,
211-
rsp_fifo_pass: false,
212147
xbar: false,
213148
addr_range: [{
214149
// This block is overaligned to 0x0800_0000 bytes since OpenTitan RV_PLIC block expects it.
215150
base_addr: "0x88000000",
216151
size_byte: "0x04000000",
217152
}],
218-
pipeline: true,
219153
},
220154
],
221155
connections: {
222156
ibex_lsu: [
223157
"sram",
224158
"hyperram",
225159
"rev_tag",
226-
"dbg_dev",
227-
"gpio",
228-
"pinmux",
229-
"system_info",
230-
"rgbled_ctrl",
231-
"hw_rev",
232-
"xadc",
233-
"timer",
160+
"peri",
234161
"spi_lcd",
235162
"spi_ethmac",
236163
% for block in config.blocks:
237-
% if not block.name == "gpio":
164+
% if block.which_xbar == "main":
238165
% for i in range(block.instances):
239166
"${f"{block.name}{i}"}",
240167
% endfor
241168
% endif
242169
% endfor
243170
"usbdev",
171+
"dbg_dev",
244172
"rv_plic",
245173
],
246174
dbg_host: [
247175
"sram",
248176
"hyperram",
249-
"system_info",
177+
"peri", // for system_info
250178
],
251179
},
252180
}

0 commit comments

Comments
 (0)