1 # This file is Copyright (c) 2020 Florent Kermarrec <florent@enjoy-digital.fr>
8 from litex
.soc
.interconnect
import wishbone
10 from litex
.soc
.cores
.emif
import EMIF
15 self
.cs_n
= Signal(reset
=1)
16 self
.we_n
= Signal(reset
=1)
17 self
.oe_n
= Signal(reset
=1)
18 self
.wait_n
= Signal(reset
=1)
20 self
.addr
= Signal(22)
21 self
.dqm_n
= Signal(2)
22 self
.data
= Record([("oe", 1), ("o", 16), ("i", 16)])
25 def emif_write(pads
, addr
, data
, release_cs
=True):
30 yield pads
.ba
.eq(1<<i
)
31 yield pads
.addr
.eq(addr
)
32 yield pads
.data
.i
.eq((data
>> 16*i
) & 0xffff)
39 yield pads
.cs_n
.eq(release_cs
)
43 def emif_read(pads
, addr
, release_cs
=True, release_oe
=True):
48 yield pads
.oe_n
.eq(release_oe
)
49 yield pads
.ba
.eq(1<<i
)
50 yield pads
.addr
.eq(addr
)
56 data |
= (yield pads
.data
.o
) << 16
57 yield pads
.oe_n
.eq(release_oe
)
59 yield pads
.cs_n
.eq(release_cs
)
64 class TestEMIF(unittest
.TestCase
):
68 # Test writes/reads with cs release between accesses
69 yield from emif_write(pads
, 0, 0xdeadbeef, True)
70 yield from emif_write(pads
, 1, 0x12345678, True)
71 yield from emif_write(pads
, 2, 0x5aa55aa5, True)
72 self
.assertEqual((yield from emif_read(pads
, 0, True)), 0xdeadbeef)
73 self
.assertEqual((yield from emif_read(pads
, 1, True)), 0x12345678)
74 self
.assertEqual((yield from emif_read(pads
, 2, True)), 0x5aa55aa5)
76 # Test writes/reads without cs release between accesses
77 yield from emif_write(pads
, 0, 0xdeadbeef, False)
78 yield from emif_write(pads
, 1, 0x12345678, False)
79 yield from emif_write(pads
, 2, 0x5aa55aa5, False)
80 self
.assertEqual((yield from emif_read(pads
, 0, False)), 0xdeadbeef)
81 self
.assertEqual((yield from emif_read(pads
, 1, False)), 0x12345678)
82 self
.assertEqual((yield from emif_read(pads
, 2, False)), 0x5aa55aa5)
85 def __init__(self
, pads
):
87 self
.submodules
+= emif
88 mem
= wishbone
.SRAM(16, bus
=emif
.bus
)
89 self
.submodules
+= mem
91 run_simulation(dut
, [generator(dut
)])