1 # nmigen: UnusedElaboratable=no
5 from ..asserts
import *
6 from ..sim
.pysim
import *
7 from ..lib
.scheduler
import *
10 class RoundRobinTestCase(unittest
.TestCase
):
12 dut
= RoundRobin(count
=32)
13 self
.assertEqual(dut
.count
, 32)
14 self
.assertEqual(len(dut
.requests
), 32)
15 self
.assertEqual(len(dut
.grant
), 5)
17 def test_wrong_count(self
):
18 with self
.assertRaisesRegex(ValueError, r
"Count must be a non-negative integer, not 'foo'"):
19 dut
= RoundRobin(count
="foo")
20 with self
.assertRaisesRegex(ValueError, r
"Count must be a non-negative integer, not -1"):
21 dut
= RoundRobin(count
=-1)
24 class RoundRobinSimulationTestCase(unittest
.TestCase
):
25 def test_count_one(self
):
26 dut
= RoundRobin(count
=1)
29 yield dut
.requests
.eq(0)
30 yield; yield Delay(1e-8)
31 self
.assertEqual((yield dut
.grant
), 0)
32 self
.assertFalse((yield dut
.valid
))
34 yield dut
.requests
.eq(1)
35 yield; yield Delay(1e-8)
36 self
.assertEqual((yield dut
.grant
), 0)
37 self
.assertTrue((yield dut
.valid
))
38 sim
.add_sync_process(process
)
40 with sim
.write_vcd("test.vcd"):
43 def test_transitions(self
):
44 dut
= RoundRobin(count
=3)
47 yield dut
.requests
.eq(0b111)
48 yield; yield Delay(1e-8)
49 self
.assertEqual((yield dut
.grant
), 1)
50 self
.assertTrue((yield dut
.valid
))
52 yield dut
.requests
.eq(0b110)
53 yield; yield Delay(1e-8)
54 self
.assertEqual((yield dut
.grant
), 2)
55 self
.assertTrue((yield dut
.valid
))
57 yield dut
.requests
.eq(0b010)
58 yield; yield Delay(1e-8)
59 self
.assertEqual((yield dut
.grant
), 1)
60 self
.assertTrue((yield dut
.valid
))
62 yield dut
.requests
.eq(0b011)
63 yield; yield Delay(1e-8)
64 self
.assertEqual((yield dut
.grant
), 0)
65 self
.assertTrue((yield dut
.valid
))
67 yield dut
.requests
.eq(0b001)
68 yield; yield Delay(1e-8)
69 self
.assertEqual((yield dut
.grant
), 0)
70 self
.assertTrue((yield dut
.valid
))
72 yield dut
.requests
.eq(0b101)
73 yield; yield Delay(1e-8)
74 self
.assertEqual((yield dut
.grant
), 2)
75 self
.assertTrue((yield dut
.valid
))
77 yield dut
.requests
.eq(0b100)
78 yield; yield Delay(1e-8)
79 self
.assertEqual((yield dut
.grant
), 2)
80 self
.assertTrue((yield dut
.valid
))
82 yield dut
.requests
.eq(0b000)
83 yield; yield Delay(1e-8)
84 self
.assertFalse((yield dut
.valid
))
86 yield dut
.requests
.eq(0b001)
87 yield; yield Delay(1e-8)
88 self
.assertEqual((yield dut
.grant
), 0)
89 self
.assertTrue((yield dut
.valid
))
90 sim
.add_sync_process(process
)
92 with sim
.write_vcd("test.vcd"):