Skip to content

Commit c941667

Browse files
wanda-phiwhitequark
authored andcommitted
hdl.mem: fix transparent read handling for simple write ports.
Fixes #922.
1 parent 0c3ada6 commit c941667

File tree

2 files changed

+48
-2
lines changed

2 files changed

+48
-2
lines changed

amaranth/hdl/mem.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,8 @@ def elaborate(self, platform):
187187
parts.append(Mux(cond, write_port.data[bits], data[bits]))
188188
data = Cat(parts)
189189
else:
190-
data = Mux(write_port.en, write_port.data, data)
190+
cond = write_port.en & (port.addr == write_port.addr)
191+
data = Mux(cond, write_port.data, data)
191192
f.add_statements(
192193
Switch(port.en, {
193194
1: port.data.eq(data)

tests/test_sim.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -815,7 +815,52 @@ def process():
815815
sim.add_clock(1e-6)
816816
sim.add_sync_process(process)
817817

818-
def test_memory_transparency(self):
818+
def test_memory_transparency_simple(self):
819+
m = Module()
820+
init = [0x11, 0x22, 0x33, 0x44]
821+
m.submodules.memory = memory = Memory(width=8, depth=4, init=init)
822+
rdport = memory.read_port()
823+
wrport = memory.write_port(granularity=8)
824+
with self.assertSimulation(m) as sim:
825+
def process():
826+
yield rdport.addr.eq(0)
827+
yield
828+
yield Settle()
829+
self.assertEqual((yield rdport.data), 0x11)
830+
yield rdport.addr.eq(1)
831+
yield
832+
yield Settle()
833+
self.assertEqual((yield rdport.data), 0x22)
834+
yield wrport.addr.eq(0)
835+
yield wrport.data.eq(0x44444444)
836+
yield wrport.en.eq(1)
837+
yield
838+
yield Settle()
839+
self.assertEqual((yield rdport.data), 0x22)
840+
yield wrport.addr.eq(1)
841+
yield wrport.data.eq(0x55)
842+
yield wrport.en.eq(1)
843+
yield
844+
yield Settle()
845+
self.assertEqual((yield rdport.data), 0x55)
846+
yield wrport.addr.eq(1)
847+
yield wrport.data.eq(0x66)
848+
yield wrport.en.eq(1)
849+
yield rdport.en.eq(0)
850+
yield
851+
yield Settle()
852+
self.assertEqual((yield rdport.data), 0x55)
853+
yield wrport.addr.eq(2)
854+
yield wrport.data.eq(0x77)
855+
yield wrport.en.eq(1)
856+
yield rdport.en.eq(1)
857+
yield
858+
yield Settle()
859+
self.assertEqual((yield rdport.data), 0x66)
860+
sim.add_clock(1e-6)
861+
sim.add_sync_process(process)
862+
863+
def test_memory_transparency_multibit(self):
819864
m = Module()
820865
init = [0x11111111, 0x22222222, 0x33333333, 0x44444444]
821866
m.submodules.memory = memory = Memory(width=32, depth=4, init=init)

0 commit comments

Comments
 (0)