|
4 | 4 |
|
5 | 5 | from misoc.cores import lm32, mor1kx, tmpu, identifier, timer, uart
|
6 | 6 | from misoc.interconnect import wishbone, csr_bus, wishbone2csr
|
| 7 | +from misoc.integration.wb_slaves import WishboneSlaveManager |
7 | 8 |
|
8 | 9 |
|
9 | 10 | __all__ = ["SoCCore", "soc_core_args", "soc_core_argdict"]
|
10 | 11 |
|
11 | 12 |
|
12 |
| -def split(bit, addresses): |
13 |
| - s0 = [] |
14 |
| - s1 = [] |
15 |
| - mask = 1 << bit |
16 |
| - for address in addresses: |
17 |
| - if address & mask: |
18 |
| - s1.append(address) |
19 |
| - else: |
20 |
| - s0.append(address) |
21 |
| - return s0, s1 |
22 |
| - |
23 |
| - |
24 |
| -# returns a dict of address -> (bits to test for 0, bits to test for 1) |
25 |
| -def make_decoder(word_size, addresses): |
26 |
| - if len(addresses) == 1: |
27 |
| - return {addresses[0]: ([], [])} |
28 |
| - else: |
29 |
| - for i in reversed(range(word_size)): |
30 |
| - s0, s1 = split(i, addresses) |
31 |
| - if s0 and s1: |
32 |
| - break |
33 |
| - assert s0 and s1 |
34 |
| - d0 = make_decoder(i, s0) |
35 |
| - d1 = make_decoder(i, s1) |
36 |
| - r = {} |
37 |
| - for address, (bits0, bits1) in d0.items(): |
38 |
| - r[address] = (bits0 + [i], bits1) |
39 |
| - for address, (bits0, bits1) in d1.items(): |
40 |
| - r[address] = (bits0, bits1 + [i]) |
41 |
| - return r |
42 |
| - |
43 |
| - |
44 |
| -def make_sel_fun(bits): |
45 |
| - bits0, bits1 = bits |
46 |
| - def sel_fun(x): |
47 |
| - r = 1 |
48 |
| - for bit0 in bits0: |
49 |
| - r = r & ~x[bit0] |
50 |
| - for bit1 in bits1: |
51 |
| - r = r & x[bit1] |
52 |
| - return r |
53 |
| - return sel_fun |
54 |
| - |
55 |
| - |
56 | 13 | class SoCCore(Module):
|
57 | 14 | mem_map = {
|
58 | 15 | "rom": 0x00000000,
|
@@ -95,7 +52,7 @@ def __init__(self, platform, clk_freq,
|
95 | 52 | self._constants = [] # list of (name, value)
|
96 | 53 |
|
97 | 54 | self._wb_masters = []
|
98 |
| - self._wb_slaves = [] # list of (origin, length, interface) |
| 55 | + self._wb_slaves = WishboneSlaveManager(self.shadow_base) |
99 | 56 |
|
100 | 57 | self.config = dict()
|
101 | 58 |
|
@@ -161,18 +118,7 @@ def add_wb_master(self, wbm):
|
161 | 118 | def add_wb_slave(self, origin, length, interface):
|
162 | 119 | if self.finalized:
|
163 | 120 | raise FinalizeError
|
164 |
| - if origin < 0 or length <= 0 or origin + length > self.shadow_base: |
165 |
| - raise ValueError("Invalid range for origin/length of Wishbone region") |
166 |
| - if origin & 3 or length & 3: |
167 |
| - raise ValueError("Misaligned Wishbone address") |
168 |
| - def in_this_region(addr): |
169 |
| - return addr >= origin and addr < origin + length |
170 |
| - for o, l, _ in self._wb_slaves: |
171 |
| - if in_this_region(o) or in_this_region(o+l-1): |
172 |
| - raise ValueError("Wishbone conflict with region at 0x{:08x} of length 0x{:x}" |
173 |
| - .format(o, l)) |
174 |
| - |
175 |
| - self._wb_slaves.append((origin, length, interface)) |
| 121 | + self._wb_slaves.add(origin, length, interface) |
176 | 122 |
|
177 | 123 | # This function simply registers the memory region for firmware purposes
|
178 | 124 | # (linker script, generated headers)
|
@@ -229,12 +175,8 @@ def do_finalize(self):
|
229 | 175 | raise FinalizeError("CPU needs a {} to be registered with register_mem()".format(mem))
|
230 | 176 |
|
231 | 177 | # Wishbone
|
232 |
| - decoder = make_decoder(30, [origin >> 2 for origin, _, _ in self._wb_slaves]) |
233 |
| - wb_slaves = [] |
234 |
| - for origin, _, interface in self._wb_slaves: |
235 |
| - wb_slaves.append((make_sel_fun(decoder[origin >> 2]), interface)) |
236 | 178 | self.submodules.wishbonecon = wishbone.InterconnectShared(self._wb_masters,
|
237 |
| - wb_slaves, register=True) |
| 179 | + self._wb_slaves.get_interconnect_slaves(), register=True) |
238 | 180 |
|
239 | 181 | # CSR
|
240 | 182 | self.submodules.csrbankarray = csr_bus.CSRBankArray(self,
|
|
0 commit comments