Skip to content

Commit e9f73e4

Browse files
antonblanchardwhitequark
authored andcommitted
csr.wishbone: Only ack for 1 cycle
Currently we ack for 2 cycles, even if in the second cycle stb and cyc are not asserted. This could cause issues on a shared wishbone with asynchronous cycle termination, because that ack would be interpreted as completing the next transaction. To avoid this just ack for 1 cycle only.
1 parent ecfad4d commit e9f73e4

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

nmigen_soc/csr/wishbone.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,8 @@ def segment(index):
8585
m.d.sync += wb_bus.dat_r[segment(index)].eq(csr_bus.r_data)
8686
m.d.sync += wb_bus.ack.eq(1)
8787

88-
with m.Else():
89-
m.d.sync += wb_bus.ack.eq(0)
90-
9188
with m.If(wb_bus.ack):
9289
m.d.sync += cycle.eq(0)
90+
m.d.sync += wb_bus.ack.eq(0)
9391

9492
return m

nmigen_soc/test/test_csr_wishbone.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ def sim_test():
6363
self.assertEqual((yield dut.wb_bus.ack), 1)
6464
yield dut.wb_bus.stb.eq(0)
6565
yield
66+
self.assertEqual((yield dut.wb_bus.ack), 0)
6667
self.assertEqual((yield reg_1.r_count), 0)
6768
self.assertEqual((yield reg_1.w_count), 1)
6869
self.assertEqual((yield reg_1.data), 0x55)
@@ -76,6 +77,7 @@ def sim_test():
7677
yield dut.wb_bus.stb.eq(0)
7778
self.assertEqual((yield dut.wb_bus.ack), 1)
7879
yield
80+
self.assertEqual((yield dut.wb_bus.ack), 0)
7981
self.assertEqual((yield reg_2.r_count), 0)
8082
self.assertEqual((yield reg_2.w_count), 0)
8183
self.assertEqual((yield reg_2.data), 0)
@@ -89,6 +91,7 @@ def sim_test():
8991
self.assertEqual((yield dut.wb_bus.ack), 1)
9092
yield dut.wb_bus.stb.eq(0)
9193
yield
94+
self.assertEqual((yield dut.wb_bus.ack), 0)
9295
self.assertEqual((yield reg_2.r_count), 0)
9396
self.assertEqual((yield reg_2.w_count), 1)
9497
self.assertEqual((yield reg_2.data), 0xbbaa)
@@ -104,6 +107,7 @@ def sim_test():
104107
self.assertEqual((yield dut.wb_bus.dat_r), 0x55)
105108
yield dut.wb_bus.stb.eq(0)
106109
yield
110+
self.assertEqual((yield dut.wb_bus.ack), 0)
107111
self.assertEqual((yield reg_1.r_count), 1)
108112
self.assertEqual((yield reg_1.w_count), 1)
109113

@@ -116,6 +120,7 @@ def sim_test():
116120
self.assertEqual((yield dut.wb_bus.dat_r), 0xaa)
117121
yield dut.wb_bus.stb.eq(0)
118122
yield
123+
self.assertEqual((yield dut.wb_bus.ack), 0)
119124
self.assertEqual((yield reg_2.r_count), 1)
120125
self.assertEqual((yield reg_2.w_count), 1)
121126

@@ -130,6 +135,7 @@ def sim_test():
130135
self.assertEqual((yield dut.wb_bus.dat_r), 0xbb)
131136
yield dut.wb_bus.stb.eq(0)
132137
yield
138+
self.assertEqual((yield dut.wb_bus.ack), 0)
133139
self.assertEqual((yield reg_2.r_count), 1)
134140
self.assertEqual((yield reg_2.w_count), 1)
135141

@@ -165,6 +171,7 @@ def sim_test():
165171
self.assertEqual((yield dut.wb_bus.ack), 1)
166172
yield dut.wb_bus.stb.eq(0)
167173
yield
174+
self.assertEqual((yield dut.wb_bus.ack), 0)
168175
self.assertEqual((yield reg.r_count), 0)
169176
self.assertEqual((yield reg.w_count), 1)
170177
self.assertEqual((yield reg.data), 0x44332211)
@@ -182,6 +189,7 @@ def sim_test():
182189
self.assertEqual((yield dut.wb_bus.ack), 1)
183190
yield dut.wb_bus.stb.eq(0)
184191
yield
192+
self.assertEqual((yield dut.wb_bus.ack), 0)
185193
self.assertEqual((yield reg.r_count), 0)
186194
self.assertEqual((yield reg.w_count), 1)
187195
self.assertEqual((yield reg.data), 0x44332211)
@@ -200,6 +208,7 @@ def sim_test():
200208
self.assertEqual((yield dut.wb_bus.dat_r), 0x44332211)
201209
yield dut.wb_bus.stb.eq(0)
202210
yield
211+
self.assertEqual((yield dut.wb_bus.ack), 0)
203212
self.assertEqual((yield reg.r_count), 1)
204213
self.assertEqual((yield reg.w_count), 1)
205214

@@ -218,6 +227,7 @@ def sim_test():
218227
self.assertEqual((yield dut.wb_bus.dat_r), 0x00332200)
219228
yield dut.wb_bus.stb.eq(0)
220229
yield
230+
self.assertEqual((yield dut.wb_bus.ack), 0)
221231
self.assertEqual((yield reg.r_count), 1)
222232
self.assertEqual((yield reg.w_count), 1)
223233

0 commit comments

Comments
 (0)