1 #nmigen: UnusedElaboratable=no
4 from lambdasoc
.periph
import Peripheral
6 from gram
.test
.utils
import *
8 from gram
.common
import gramNativePort
9 from gram
.frontend
.wishbone
import gramWishbone
11 class FakeGramCrossbar
:
13 self
.port
= gramNativePort("both", 3, 128)
15 def get_native_port(self
):
20 self
.crossbar
= FakeGramCrossbar()
21 self
.size
= 2**3*128//8
23 class GramWishboneTestCase(FHDLTestCase
):
24 def read_request(self
, *, bus
, native_port
, adr
, sel
, reference_value
, timeout
=128, ackCallback
=None):
34 yield native_port
.cmd
.ready
.eq(1)
38 yield native_port
.rdata
.data
.eq(reference_value
)
39 yield native_port
.rdata
.valid
.eq(1)
42 while not (yield bus
.ack
):
45 self
.assertTrue(timeout
> 0)
47 if ackCallback
is not None:
48 yield from ackCallback(bus
, native_port
)
53 yield native_port
.rdata
.valid
.eq(0)
58 def write_request(self
, *, bus
, native_port
, adr
, sel
, value
, timeout
=128, ackCallback
=None):
59 # Send a write request
65 yield bus
.dat_w
.eq(value
)
69 yield native_port
.cmd
.ready
.eq(1)
73 yield native_port
.wdata
.ready
.eq(1)
75 while not (yield bus
.ack
):
78 self
.assertTrue(timeout
> 0)
80 if ackCallback
is not None:
81 yield from ackCallback(bus
, native_port
)
82 res
= yield native_port
.wdata
.data
86 yield native_port
.wdata
.ready
.eq(0)
91 def read_test(self
, *, data_width
, granularity
):
93 native_port
= core
.crossbar
.get_native_port()
94 dut
= gramWishbone(core
, data_width
=data_width
, granularity
=granularity
)
97 # Initialize native port
98 yield native_port
.cmd
.ready
.eq(0)
99 yield native_port
.wdata
.ready
.eq(0)
100 yield native_port
.rdata
.valid
.eq(0)
102 reference_value
= 0xBADDCAFE_FEEDFACE_BEEFCAFE_BAD0DAB0
104 data_granularity_radio
= data_width
//granularity
106 for i
in range(native_port
.data_width
//data_width
):
107 res
= yield from self
.read_request(bus
=dut
.bus
,
108 native_port
=native_port
,
110 sel
=2**data_granularity_radio
-1,
111 reference_value
=reference_value
)
112 self
.assertEqual(res
, (reference_value
>> (i
*data_width
)) & 2**data_width
-1)
114 runSimulation(dut
, process
, "test_frontend_wishbone.vcd")
117 def write_test(self
, *, data_width
, granularity
):
118 core
= FakeGramCore()
119 native_port
= core
.crossbar
.get_native_port()
120 dut
= gramWishbone(core
, data_width
=data_width
, granularity
=granularity
)
123 # Initialize native port
124 yield native_port
.cmd
.ready
.eq(0)
125 yield native_port
.wdata
.ready
.eq(0)
126 yield native_port
.rdata
.valid
.eq(0)
128 reference_value
= 0xBADDCAFE_FEEDFACE_BEEFCAFE_BAD0DAB0
130 data_granularity_radio
= data_width
//granularity
132 for i
in range(native_port
.data_width
//data_width
):
133 res
= yield from self
.write_request(bus
=dut
.bus
,
134 native_port
=native_port
,
136 sel
=2**data_granularity_radio
-1,
137 value
=(reference_value
>> (i
*data_width
)) & 2**data_width
-1)
138 self
.assertEqual((reference_value
>> (i
*data_width
)) & 2**data_width
-1, (res
>> (i
*data_width
)) & 2**data_width
-1)
140 runSimulation(dut
, process
, "test_frontend_wishbone.vcd")
143 core
= FakeGramCore()
144 dut
= gramWishbone(core
, data_width
=32, granularity
=8)
145 self
.assertEqual(dut
.bus
.data_width
, 32)
146 self
.assertEqual(dut
.bus
.granularity
, 8)
148 def test_read8_8(self
):
149 self
.read_test(data_width
=8, granularity
=8)
151 def test_read16_8(self
):
152 self
.read_test(data_width
=16, granularity
=8)
154 def test_read16_16(self
):
155 self
.read_test(data_width
=16, granularity
=16)
157 def test_read32_8(self
):
158 self
.read_test(data_width
=32, granularity
=8)
160 def test_read32_16(self
):
161 self
.read_test(data_width
=32, granularity
=16)
163 def test_read32_32(self
):
164 self
.read_test(data_width
=32, granularity
=32)
166 def test_read64_8(self
):
167 self
.read_test(data_width
=64, granularity
=8)
169 def test_read64_16(self
):
170 self
.read_test(data_width
=64, granularity
=16)
172 def test_read64_32(self
):
173 self
.read_test(data_width
=64, granularity
=32)
175 def test_read64_64(self
):
176 self
.read_test(data_width
=64, granularity
=64)
178 def test_write8_8(self
):
179 self
.write_test(data_width
=8, granularity
=8)
181 def test_write16_8(self
):
182 self
.write_test(data_width
=16, granularity
=8)
184 def test_write16_16(self
):
185 self
.write_test(data_width
=16, granularity
=16)
187 def test_write32_8(self
):
188 self
.write_test(data_width
=32, granularity
=8)
190 def test_write32_16(self
):
191 self
.write_test(data_width
=32, granularity
=16)
193 def test_write32_32(self
):
194 self
.write_test(data_width
=32, granularity
=32)
196 def test_write64_8(self
):
197 self
.write_test(data_width
=64, granularity
=8)
199 def test_write64_16(self
):
200 self
.write_test(data_width
=64, granularity
=16)
202 def test_write64_32(self
):
203 self
.write_test(data_width
=64, granularity
=32)
205 def test_write64_64(self
):
206 self
.write_test(data_width
=64, granularity
=64)
208 def test_sel_write(self
):
209 core
= FakeGramCore()
210 native_port
= core
.crossbar
.get_native_port()
211 dut
= gramWishbone(core
, data_width
=32, granularity
=8)
214 # Initialize native port
215 yield native_port
.cmd
.ready
.eq(0)
216 yield native_port
.wdata
.ready
.eq(0)
217 yield native_port
.rdata
.valid
.eq(0)
219 def sel1(bus
, native_port
):
220 self
.assertEqual((yield native_port
.wdata
.we
), 0b1)
221 def sel2(bus
, native_port
):
222 self
.assertEqual((yield native_port
.wdata
.we
), 0b10)
223 def sel3(bus
, native_port
):
224 self
.assertEqual((yield native_port
.wdata
.we
), 0b100)
225 def sel4(bus
, native_port
):
226 self
.assertEqual((yield native_port
.wdata
.we
), 0b1000)
227 def sel5(bus
, native_port
):
228 self
.assertEqual((yield native_port
.wdata
.we
), 0b10000)
229 def sel9(bus
, native_port
):
230 self
.assertEqual((yield native_port
.wdata
.we
), 0b100000000)
231 def sel13(bus
, native_port
):
232 self
.assertEqual((yield native_port
.wdata
.we
), 0b1000000000000)
233 def selfirstdword(bus
, native_port
):
234 self
.assertEqual((yield native_port
.wdata
.we
), 0xF)
235 def sellastdword(bus
, native_port
):
236 self
.assertEqual((yield native_port
.wdata
.we
), 0xF000)
238 yield from self
.write_request(bus
=dut
.bus
,
239 native_port
=native_port
,
246 yield from self
.write_request(bus
=dut
.bus
,
247 native_port
=native_port
,
254 yield from self
.write_request(bus
=dut
.bus
,
255 native_port
=native_port
,
262 yield from self
.write_request(bus
=dut
.bus
,
263 native_port
=native_port
,
270 yield from self
.write_request(bus
=dut
.bus
,
271 native_port
=native_port
,
278 yield from self
.write_request(bus
=dut
.bus
,
279 native_port
=native_port
,
286 yield from self
.write_request(bus
=dut
.bus
,
287 native_port
=native_port
,
294 yield from self
.write_request(bus
=dut
.bus
,
295 native_port
=native_port
,
300 ackCallback
=sellastdword
)
302 yield from self
.write_request(bus
=dut
.bus
,
303 native_port
=native_port
,
308 ackCallback
=selfirstdword
)
310 runSimulation(dut
, process
, "test_frontend_wishbone.vcd")
312 def test_sel_empty(self
):
313 core
= FakeGramCore()
314 native_port
= core
.crossbar
.get_native_port()
315 dut
= gramWishbone(core
, data_width
=32, granularity
=8)
318 # Initialize native port
319 yield native_port
.cmd
.ready
.eq(0)
320 yield native_port
.wdata
.ready
.eq(0)
321 yield native_port
.rdata
.valid
.eq(0)
323 def selfirstdword(bus
, native_port
):
324 self
.assertEqual((yield native_port
.wdata
.we
), 0xF)
326 yield from self
.write_request(bus
=dut
.bus
,
327 native_port
=native_port
,
332 ackCallback
=selfirstdword
)
334 runSimulation(dut
, process
, "test_frontend_wishbone.vcd")