-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathtest_sram_wishbone.py
143 lines (122 loc) · 4.96 KB
/
test_sram_wishbone.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# amaranth: UnusedElaboratable=no
import unittest
from amaranth import *
from amaranth.back.pysim import *
from .. import sram
class WishboneBridgeTestCase(unittest.TestCase):
def test_wrong_sram_buses(self):
with self.assertRaisesRegex(
ValueError,
r"SRAM buses has to be an iterable of sram.Interface, not 'foo'",
):
sram.WishboneBridge("foo")
with self.assertRaisesRegex(
ValueError,
r"SRAM buses has to be an iterable of sram.Interface, not 'foo'",
):
sram.WishboneBridge(sram_buses="foo")
def test_wbbus_single(self):
iface = sram.Interface(addr_width=10, data_width=8)
bridge = sram.WishboneBridge(iface)
self.assertEqual(bridge.wb_bus.addr_width, 10)
self.assertEqual(bridge.wb_bus.data_width, 8)
self.assertEqual(bridge.wb_bus.granularity, 8)
self.assertFalse(hasattr(bridge.wb_bus, "stall"))
def test_wbbus_multi(self):
ifaces = [sram.Interface(addr_width=10, data_width=8) for _ in range(4)]
bridge = sram.WishboneBridge(ifaces)
self.assertEqual(bridge.wb_bus.addr_width, 10)
self.assertEqual(bridge.wb_bus.data_width, 32)
self.assertEqual(bridge.wb_bus.granularity, 8)
self.assertFalse(hasattr(bridge.wb_bus, "stall"))
def test_readwrite_single_nowait(self):
iface = sram.Interface(addr_width=10, data_width=8)
dut = sram.WishboneBridge(iface)
def sim_test():
yield dut.wb_bus.cyc.eq(1)
yield dut.wb_bus.stb.eq(0)
yield dut.wb_bus.sel.eq(0b1)
yield
self.assertFalse((yield iface.ce), 0)
yield dut.wb_bus.we.eq(1)
yield
# we is only asserted when in Wishbone cycle
self.assertEqual((yield iface.we), 0)
yield dut.wb_bus.adr.eq(1)
yield dut.wb_bus.dat_w.eq(0x55)
yield dut.wb_bus.stb.eq(1)
yield
self.assertEqual((yield iface.we), 1)
self.assertEqual((yield iface.a), 1)
self.assertEqual((yield iface.d_w), 0x55)
self.assertEqual((yield iface.ce), 1)
self.assertEqual((yield dut.wb_bus.ack), 1)
yield dut.wb_bus.stb.eq(0)
yield
self.assertEqual((yield dut.wb_bus.ack), 0)
self.assertEqual((yield iface.we), 0)
self.assertEqual((yield iface.ce), 0)
yield dut.wb_bus.we.eq(0)
yield dut.wb_bus.stb.eq(1)
yield iface.d_r.eq(0x55)
yield
self.assertEqual((yield dut.wb_bus.ack), 1)
self.assertEqual((yield dut.wb_bus.dat_r), 0x55)
sim = Simulator(dut)
sim.add_clock(1e-6)
sim.add_sync_process(sim_test)
with sim.write_vcd(vcd_file=open("test.vcd", "w")):
sim.run()
def test_readwrite_multi_wait1(self):
ifaces = [sram.Interface(addr_width=10, data_width=8) for _ in range(4)]
a = ifaces[0].a
ce = Cat(iface.ce for iface in ifaces)
we = Cat(iface.we for iface in ifaces)
d_w = Cat(iface.d_w for iface in ifaces)
d_r = Cat(iface.d_r for iface in ifaces)
dut = sram.WishboneBridge(ifaces, wait_states=Const(1, 1))
def sim_test():
yield dut.wb_bus.cyc.eq(1)
yield dut.wb_bus.stb.eq(0)
yield dut.wb_bus.sel.eq(0b1100)
yield
for iface in ifaces:
self.assertFalse((yield iface.ce), 0)
yield dut.wb_bus.we.eq(1)
yield
# we is only asserted when in Wishbone cycle
self.assertEqual((yield we), 0b0000)
yield dut.wb_bus.adr.eq(1)
yield dut.wb_bus.dat_w.eq(0xAA55AA55)
yield dut.wb_bus.stb.eq(1)
yield
self.assertEqual((yield we), 0b1100)
self.assertEqual((yield a), 1)
self.assertEqual((yield d_w), 0xAA55AA55)
self.assertEqual((yield ce), 0b1100)
self.assertEqual((yield dut.wb_bus.ack), 0)
yield
yield
yield
self.assertEqual((yield dut.wb_bus.ack), 1)
yield dut.wb_bus.stb.eq(0)
yield
self.assertEqual((yield dut.wb_bus.ack), 0)
self.assertEqual((yield we), 0b0000)
self.assertEqual((yield ce), 0b0000)
yield dut.wb_bus.we.eq(0)
yield dut.wb_bus.stb.eq(1)
yield d_r.eq(0xAA550000)
yield
self.assertEqual((yield dut.wb_bus.dat_r), 0xAA550000)
self.assertEqual((yield dut.wb_bus.ack), 0)
yield
yield
yield
self.assertEqual((yield dut.wb_bus.dat_r), 0xAA550000)
self.assertEqual((yield dut.wb_bus.ack), 1)
sim = Simulator(dut)
sim.add_clock(1e-6)
sim.add_sync_process(sim_test)
with sim.write_vcd(vcd_file=open("test.vcd", "w")):
sim.run()