1 # nmigen: UnusedElaboratable=no
5 from nmigen
.back
.pysim
import *
7 from ..periph
.event
import *
10 def simulation_test(dut
, process
):
11 with
Simulator(dut
, vcd_file
=open("test.vcd", "w")) as sim
:
13 sim
.add_sync_process(process
)
17 class EventSourceTestCase(unittest
.TestCase
):
18 def test_simple(self
):
20 self
.assertEqual(ev
.name
, "ev")
21 self
.assertEqual(ev
.mode
, "level")
23 def test_name_wrong(self
):
24 with self
.assertRaisesRegex(TypeError,
25 r
"Name must be a string, not 2"):
28 def test_mode_wrong(self
):
29 with self
.assertRaisesRegex(ValueError,
30 r
"Invalid trigger mode 'foo'; must be one of level, rise, fall"):
31 ev
= EventSource(mode
="foo")
34 class InterruptSourceTestCase(unittest
.TestCase
):
35 def test_simple(self
):
38 dut
= InterruptSource((ev_0
, ev_1
))
39 self
.assertEqual(dut
.name
, "dut")
40 self
.assertEqual(dut
.status
.width
, 2)
41 self
.assertEqual(dut
.pending
.width
, 2)
42 self
.assertEqual(dut
.enable
.width
, 2)
44 def test_name_wrong(self
):
45 with self
.assertRaisesRegex(TypeError,
46 r
"Name must be a string, not 2"):
47 InterruptSource((), name
=2)
49 def test_event_wrong(self
):
50 with self
.assertRaisesRegex(TypeError,
51 r
"Event source must be an instance of EventSource, not 'foo'"):
52 dut
= InterruptSource(("foo",))
54 def test_events(self
):
55 ev_0
= EventSource(mode
="level")
56 ev_1
= EventSource(mode
="rise")
57 ev_2
= EventSource(mode
="fall")
58 dut
= InterruptSource((ev_0
, ev_1
, ev_2
))
65 self
.assertEqual((yield dut
.irq
), 0)
67 yield dut
.status
.r_stb
.eq(1)
69 yield dut
.status
.r_stb
.eq(0)
71 self
.assertEqual((yield dut
.status
.r_data
), 0b101)
74 yield dut
.enable
.w_stb
.eq(1)
75 yield dut
.enable
.w_data
.eq(0b111)
77 yield dut
.enable
.w_stb
.eq(0)
80 self
.assertEqual((yield dut
.irq
), 1)
82 yield dut
.pending
.w_stb
.eq(1)
83 yield dut
.pending
.w_data
.eq(0b001)
85 yield dut
.pending
.w_stb
.eq(0)
88 yield dut
.pending
.r_stb
.eq(1)
90 yield dut
.pending
.r_stb
.eq(0)
92 self
.assertEqual((yield dut
.pending
.r_data
), 0b001)
93 self
.assertEqual((yield dut
.irq
), 1)
97 yield dut
.pending
.w_stb
.eq(1)
98 yield dut
.pending
.w_data
.eq(0b001)
100 yield dut
.pending
.w_stb
.eq(0)
103 self
.assertEqual((yield dut
.irq
), 0)
106 yield dut
.pending
.r_stb
.eq(1)
108 yield dut
.pending
.r_stb
.eq(0)
110 self
.assertEqual((yield dut
.pending
.r_data
), 0b010)
111 self
.assertEqual((yield dut
.irq
), 1)
113 yield dut
.pending
.w_stb
.eq(1)
114 yield dut
.pending
.w_data
.eq(0b010)
116 yield dut
.pending
.w_stb
.eq(0)
119 self
.assertEqual((yield dut
.irq
), 0)
123 yield dut
.pending
.r_stb
.eq(1)
125 yield dut
.pending
.r_stb
.eq(0)
127 self
.assertEqual((yield dut
.pending
.r_data
), 0b100)
128 self
.assertEqual((yield dut
.irq
), 1)
130 yield dut
.pending
.w_stb
.eq(1)
131 yield dut
.pending
.w_data
.eq(0b100)
133 yield dut
.pending
.w_stb
.eq(0)
136 self
.assertEqual((yield dut
.irq
), 0)
138 simulation_test(dut
, process
)