Skip to content

Commit b716a8b

Browse files
committedNov 10, 2016
SplitMemory: register dat_r selection
1 parent 2b0d76a commit b716a8b

File tree

1 file changed

+21
-9
lines changed

1 file changed

+21
-9
lines changed
 

Diff for: ‎migen/fhdl/simplify.py

+21-9
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,13 @@ def transform_fragment(self, i, f):
137137
log2_int(old.depth, need_pow2=True)
138138
f.specials.add(old)
139139
except ValueError:
140-
new, glue = self._split_mem(old)
140+
new, comb, sync = self._split_mem(old)
141141
old_ports |= set(old.ports)
142142
f.specials.update(new)
143-
f.comb += glue
144-
143+
f.comb += comb
144+
for cd, sy in sync.items():
145+
s = f.sync.setdefault(cd, [])
146+
s += sy
145147
f.specials -= old_ports
146148

147149
def _split_mem(self, mem):
@@ -162,11 +164,14 @@ def _split_mem(self, mem):
162164
init=init, name=name))
163165
ports = []
164166
comb = []
167+
sync = {}
165168
for port in mem.ports:
166-
p, c = self._split_port(port, mems)
169+
p, c, s = self._split_port(port, mems)
167170
ports += p
168171
comb += c
169-
return mems + ports, comb
172+
sy = sync.setdefault(port.clock.cd, [])
173+
sy += s
174+
return mems + ports, comb, sync
170175

171176
def _split_port(self, port, mems):
172177
ports = [mem.get_port(write_capable=port.we is not None,
@@ -178,15 +183,22 @@ def _split_port(self, port, mems):
178183
for mem in mems]
179184

180185
sel = Signal(max=len(ports), reset=len(ports) - 1)
181-
comb = []
186+
sel_r = Signal.like(sel)
187+
eq = sel_r.eq(sel)
188+
if port.re is not None:
189+
eq = If(port.re, eq)
190+
comb, sync = [], []
191+
if port.async_read:
192+
comb += [eq]
193+
else:
194+
sync += [eq]
182195
comb += reversed([If(~port.adr[len(p.adr)], sel.eq(i))
183196
for i, p in enumerate(ports)])
184197
comb += [p.adr.eq(port.adr) for p in ports]
185-
comb.append(port.dat_r.eq(Array([p.dat_r for p in ports])[sel]))
198+
comb.append(port.dat_r.eq(Array([p.dat_r for p in ports])[sel_r]))
186199
if port.we is not None:
187200
comb.append(Array([p.we for p in ports])[sel].eq(port.we))
188201
comb += [p.dat_w.eq(port.dat_w) for p in ports]
189202
if port.re is not None:
190-
raise NotImplementedError("memory port with read-enable")
191203
comb += [p.re.eq(port.re) for p in ports]
192-
return ports, comb
204+
return ports, comb, sync

0 commit comments

Comments
 (0)
Please sign in to comment.