1 # nmigen: UnusedElaboratable=no
5 from nmigen
.back
.pysim
import *
8 from ..csr
.wishbone
import *
11 class MockRegister(Elaboratable
):
12 def __init__(self
, width
):
13 self
.element
= csr
.Element(width
, "rw")
14 self
.r_count
= Signal(8)
15 self
.w_count
= Signal(8)
16 self
.data
= Signal(width
)
18 def elaborate(self
, platform
):
21 with m
.If(self
.element
.r_stb
):
22 m
.d
.sync
+= self
.r_count
.eq(self
.r_count
+ 1)
23 m
.d
.comb
+= self
.element
.r_data
.eq(self
.data
)
25 with m
.If(self
.element
.w_stb
):
26 m
.d
.sync
+= self
.w_count
.eq(self
.w_count
+ 1)
27 m
.d
.sync
+= self
.data
.eq(self
.element
.w_data
)
32 class WishboneCSRBridgeTestCase(unittest
.TestCase
):
33 def test_wrong_csr_bus(self
):
34 with self
.assertRaisesRegex(ValueError,
35 r
"CSR bus must be an instance of CSRInterface, not 'foo'"):
36 WishboneCSRBridge(csr_bus
="foo")
38 def test_wrong_csr_bus_data_width(self
):
39 with self
.assertRaisesRegex(ValueError,
40 r
"CSR bus data width must be one of 8, 16, 32, 64, not 7"):
41 WishboneCSRBridge(csr_bus
=csr
.Interface(addr_width
=10, data_width
=7))
43 def test_narrow(self
):
44 mux
= csr
.Multiplexer(addr_width
=10, data_width
=8)
45 reg_1
= MockRegister(8)
46 mux
.add(reg_1
.element
)
47 reg_2
= MockRegister(16)
48 mux
.add(reg_2
.element
)
49 dut
= WishboneCSRBridge(mux
.bus
)
52 yield dut
.wb_bus
.cyc
.eq(1)
53 yield dut
.wb_bus
.sel
.eq(0b1)
55 yield dut
.wb_bus
.we
.eq(1)
57 yield dut
.wb_bus
.adr
.eq(0)
58 yield dut
.wb_bus
.stb
.eq(1)
59 yield dut
.wb_bus
.dat_w
.eq(0x55)
62 yield dut
.wb_bus
.stb
.eq(0)
64 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
65 self
.assertEqual((yield reg_1
.r_count
), 0)
66 self
.assertEqual((yield reg_1
.w_count
), 1)
67 self
.assertEqual((yield reg_1
.data
), 0x55)
69 yield dut
.wb_bus
.adr
.eq(1)
70 yield dut
.wb_bus
.stb
.eq(1)
71 yield dut
.wb_bus
.dat_w
.eq(0xaa)
74 yield dut
.wb_bus
.stb
.eq(0)
76 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
77 self
.assertEqual((yield reg_2
.r_count
), 0)
78 self
.assertEqual((yield reg_2
.w_count
), 0)
79 self
.assertEqual((yield reg_2
.data
), 0)
81 yield dut
.wb_bus
.adr
.eq(2)
82 yield dut
.wb_bus
.stb
.eq(1)
83 yield dut
.wb_bus
.dat_w
.eq(0xbb)
86 yield dut
.wb_bus
.stb
.eq(0)
88 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
89 self
.assertEqual((yield reg_2
.r_count
), 0)
90 self
.assertEqual((yield reg_2
.w_count
), 1)
91 self
.assertEqual((yield reg_2
.data
), 0xbbaa)
93 yield dut
.wb_bus
.we
.eq(0)
95 yield dut
.wb_bus
.adr
.eq(0)
96 yield dut
.wb_bus
.stb
.eq(1)
99 yield dut
.wb_bus
.stb
.eq(0)
101 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
102 self
.assertEqual((yield dut
.wb_bus
.dat_r
), 0x55)
103 self
.assertEqual((yield reg_1
.r_count
), 1)
104 self
.assertEqual((yield reg_1
.w_count
), 1)
106 yield dut
.wb_bus
.adr
.eq(1)
107 yield dut
.wb_bus
.stb
.eq(1)
110 yield dut
.wb_bus
.stb
.eq(0)
112 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
113 self
.assertEqual((yield dut
.wb_bus
.dat_r
), 0xaa)
114 self
.assertEqual((yield reg_2
.r_count
), 1)
115 self
.assertEqual((yield reg_2
.w_count
), 1)
117 yield reg_2
.data
.eq(0x33333)
119 yield dut
.wb_bus
.adr
.eq(2)
120 yield dut
.wb_bus
.stb
.eq(1)
123 yield dut
.wb_bus
.stb
.eq(0)
125 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
126 self
.assertEqual((yield dut
.wb_bus
.dat_r
), 0xbb)
127 self
.assertEqual((yield reg_2
.r_count
), 1)
128 self
.assertEqual((yield reg_2
.w_count
), 1)
131 m
.submodules
+= mux
, reg_1
, reg_2
, dut
132 with
Simulator(m
, vcd_file
=open("test.vcd", "w")) as sim
:
134 sim
.add_sync_process(sim_test())
138 mux
= csr
.Multiplexer(addr_width
=10, data_width
=8)
139 reg
= MockRegister(32)
141 dut
= WishboneCSRBridge(mux
.bus
, data_width
=32)
144 yield dut
.wb_bus
.cyc
.eq(1)
145 yield dut
.wb_bus
.adr
.eq(0)
147 yield dut
.wb_bus
.we
.eq(1)
149 yield dut
.wb_bus
.dat_w
.eq(0x44332211)
150 yield dut
.wb_bus
.sel
.eq(0b1111)
151 yield dut
.wb_bus
.stb
.eq(1)
157 yield dut
.wb_bus
.stb
.eq(0)
159 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
160 self
.assertEqual((yield reg
.r_count
), 0)
161 self
.assertEqual((yield reg
.w_count
), 1)
162 self
.assertEqual((yield reg
.data
), 0x44332211)
165 yield dut
.wb_bus
.dat_w
.eq(0xaabbccdd)
166 yield dut
.wb_bus
.sel
.eq(0b0110)
167 yield dut
.wb_bus
.stb
.eq(1)
173 yield dut
.wb_bus
.stb
.eq(0)
175 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
176 self
.assertEqual((yield reg
.r_count
), 0)
177 self
.assertEqual((yield reg
.w_count
), 1)
178 self
.assertEqual((yield reg
.data
), 0x44332211)
180 yield dut
.wb_bus
.we
.eq(0)
182 yield dut
.wb_bus
.sel
.eq(0b1111)
183 yield dut
.wb_bus
.stb
.eq(1)
189 yield dut
.wb_bus
.stb
.eq(0)
191 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
192 self
.assertEqual((yield dut
.wb_bus
.dat_r
), 0x44332211)
193 self
.assertEqual((yield reg
.r_count
), 1)
194 self
.assertEqual((yield reg
.w_count
), 1)
196 yield reg
.data
.eq(0xaaaaaaaa)
199 yield dut
.wb_bus
.sel
.eq(0b0110)
200 yield dut
.wb_bus
.stb
.eq(1)
206 yield dut
.wb_bus
.stb
.eq(0)
208 self
.assertEqual((yield dut
.wb_bus
.ack
), 1)
209 self
.assertEqual((yield dut
.wb_bus
.dat_r
), 0x00332200)
210 self
.assertEqual((yield reg
.r_count
), 1)
211 self
.assertEqual((yield reg
.w_count
), 1)
214 m
.submodules
+= mux
, reg
, dut
215 with
Simulator(m
, vcd_file
=open("test.vcd", "w")) as sim
:
217 sim
.add_sync_process(sim_test())