21a406ab478ea19aeb8d11c2a5e2433810e44654
1 #nmigen: UnusedElaboratable=no
6 from nmigen
.back
.pysim
import *
8 from ._wishbone
import *
9 from ..periph
.timer
import TimerPeripheral
12 def simulation_test(dut
, process
):
13 with
Simulator(dut
, vcd_file
=open("test.vcd", "w")) as sim
:
15 sim
.add_sync_process(process
)
19 reload_addr
= 0x00 >> 2
22 ev_status_addr
= 0x10 >> 2
23 ev_pending_addr
= 0x14 >> 2
24 ev_enable_addr
= 0x18 >> 2
27 class TimerPeripheralTestCase(unittest
.TestCase
):
28 def test_invalid_width(self
):
29 with self
.assertRaisesRegex(ValueError,
30 r
"Counter width must be a non-negative integer, not 'foo'"):
31 dut
= TimerPeripheral(width
="foo")
33 def test_invalid_width_32(self
):
34 with self
.assertRaisesRegex(ValueError,
35 r
"Counter width cannot be greater than 32 \(was: 33\)"):
36 dut
= TimerPeripheral(width
=33)
38 def test_simple(self
):
39 dut
= TimerPeripheral(width
=4)
41 yield from wb_write(dut
.bus
, addr
=ctr_addr
, data
=15, sel
=0xf)
43 ctr
= yield from wb_read(dut
.bus
, addr
=ctr_addr
, sel
=0xf)
44 self
.assertEqual(ctr
, 15)
46 yield from wb_write(dut
.bus
, addr
=en_addr
, data
=1, sel
=0xf)
50 ctr
= yield from wb_read(dut
.bus
, addr
=ctr_addr
, sel
=0xf)
51 self
.assertEqual(ctr
, 0)
52 simulation_test(dut
, process
)
55 dut
= TimerPeripheral(width
=4)
57 yield from wb_write(dut
.bus
, addr
=ctr_addr
, data
=15, sel
=0xf)
59 yield from wb_write(dut
.bus
, addr
=ev_enable_addr
, data
=1, sel
=0xf)
61 yield from wb_write(dut
.bus
, addr
=en_addr
, data
=1, sel
=0xf)
66 self
.assertFalse(done
)
68 ctr
= yield from wb_read(dut
.bus
, addr
=ctr_addr
, sel
=0xf)
69 self
.assertEqual(ctr
, 0)
72 simulation_test(dut
, process
)
74 def test_reload(self
):
75 dut
= TimerPeripheral(width
=4)
77 yield from wb_write(dut
.bus
, addr
=reload_addr
, data
=15, sel
=0xf)
79 yield from wb_write(dut
.bus
, addr
=ctr_addr
, data
=15, sel
=0xf)
81 yield from wb_write(dut
.bus
, addr
=ev_enable_addr
, data
=1, sel
=0xf)
83 yield from wb_write(dut
.bus
, addr
=en_addr
, data
=1, sel
=0xf)
89 yield from wb_write(dut
.bus
, addr
=ev_pending_addr
, data
=1, sel
=0xf)
91 # not an accurate measure, since each call to wb_write() adds a few cycles,
92 # but we can at least check that reloading the timer works.
93 self
.assertEqual(irqs
, 2)
94 simulation_test(dut
, process
)