Skip to content

Commit b75fb7f

Browse files
author
Sebastien Bourdeauducq
committedMar 8, 2013
csr/SRAM: support for writes with memory widths larger than bus words
1 parent 6fa3005 commit b75fb7f

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed
 

‎migen/bus/csr.py

+19-4
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _compute_page_bits(nwords):
5454
return 0
5555

5656
class SRAM:
57-
def __init__(self, mem_or_size, address, bus=None):
57+
def __init__(self, mem_or_size, address, read_only=None, bus=None):
5858
if isinstance(mem_or_size, Memory):
5959
self.mem = mem_or_size
6060
else:
@@ -71,6 +71,12 @@ def __init__(self, mem_or_size, address, bus=None):
7171
self._page = RegisterField(self.mem.name_override + "_page", page_bits)
7272
else:
7373
self._page = None
74+
if read_only is None:
75+
if hasattr(self.mem, "bus_read_only"):
76+
read_only = self.mem.bus_read_only
77+
else:
78+
read_only = False
79+
self.read_only = read_only
7480
if bus is None:
7581
bus = Interface()
7682
self.bus = bus
@@ -82,7 +88,8 @@ def get_registers(self):
8288
return [self._page]
8389

8490
def get_fragment(self):
85-
port = self.mem.get_port(write_capable=not self.word_bits)
91+
port = self.mem.get_port(write_capable=not self.read_only,
92+
we_granularity=data_width if not self.read_only and self.word_bits else 0)
8693

8794
sel = Signal()
8895
sel_r = Signal()
@@ -99,14 +106,22 @@ def get_fragment(self):
99106
chooser(word_expanded, word_index, self.bus.dat_r, n=self.csrw_per_memw, reverse=True)
100107
)
101108
]
109+
if not self.read_only:
110+
comb += [
111+
If(sel & self.bus.we, port.we.eq((1 << self.word_bits) >> self.bus.adr[:self.word_bits])),
112+
port.dat_w.eq(Replicate(self.bus.dat_w, self.csrw_per_memw))
113+
]
102114
else:
103115
comb += [
104-
port.we.eq(sel & self.bus.we),
105-
port.dat_w.eq(self.bus.dat_w),
106116
If(sel_r,
107117
self.bus.dat_r.eq(port.dat_r)
108118
)
109119
]
120+
if not self.read_only:
121+
comb += [
122+
port.we.eq(sel & self.bus.we),
123+
port.dat_w.eq(self.bus.dat_w)
124+
]
110125

111126
if self._page is None:
112127
comb.append(port.adr.eq(self.bus.adr[self.word_bits:len(port.adr)]))

0 commit comments

Comments
 (0)
Please sign in to comment.