Skip to content

Commit 1c24a59

Browse files
committedOct 10, 2014
rtio: error recovery
1 parent b749c8e commit 1c24a59

File tree

4 files changed

+49
-28
lines changed

4 files changed

+49
-28
lines changed
 

‎soc/artiqlib/rtio/core.py

+29-20
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88

99

1010
class _RTIOBankO(Module):
11-
def __init__(self, rbus, counter_width, fine_ts_width,
12-
fifo_depth, counter_init):
11+
def __init__(self, rbus, counter, fine_ts_width, fifo_depth):
12+
counter_width = flen(counter)
1313
self.sel = Signal(max=len(rbus))
1414
self.timestamp = Signal(counter_width+fine_ts_width)
1515
self.value = Signal(2)
@@ -18,16 +18,13 @@ def __init__(self, rbus, counter_width, fine_ts_width,
1818
self.replace = Signal()
1919
self.underflow = Signal()
2020
self.level = Signal(bits_for(fifo_depth))
21-
self.counter = Signal(counter_width, reset=counter_init)
2221

2322
# # #
2423

25-
self.sync += self.counter.eq(self.counter + 1)
26-
2724
# detect underflows
2825
self.sync += \
2926
If((self.we & self.writable) | self.replace,
30-
If(self.timestamp[fine_ts_width:] < self.counter + 2,
27+
If(self.timestamp[fine_ts_width:] < counter + 2,
3128
self.underflow.eq(1))
3229
)
3330

@@ -50,7 +47,7 @@ def __init__(self, rbus, counter_width, fine_ts_width,
5047
# FIFO read
5148
self.comb += [
5249
chif.o_stb.eq(fifo.readable &
53-
(fifo.dout.timestamp[fine_ts_width:] == self.counter)),
50+
(fifo.dout.timestamp[fine_ts_width:] == counter)),
5451
chif.o_value.eq(fifo.dout.value),
5552
fifo.re.eq(chif.o_stb)
5653
]
@@ -66,7 +63,8 @@ def __init__(self, rbus, counter_width, fine_ts_width,
6663

6764

6865
class _RTIOBankI(Module):
69-
def __init__(self, rbus, counter_width, fine_ts_width, fifo_depth):
66+
def __init__(self, rbus, counter, fine_ts_width, fifo_depth):
67+
counter_width = flen(counter)
7068
self.sel = Signal(max=len(rbus))
7169
self.timestamp = Signal(counter_width+fine_ts_width)
7270
self.value = Signal()
@@ -75,10 +73,7 @@ def __init__(self, rbus, counter_width, fine_ts_width, fifo_depth):
7573
self.overflow = Signal()
7674
self.pileup = Signal()
7775

78-
###
79-
80-
counter = Signal(counter_width)
81-
self.sync += counter.eq(counter + 1)
76+
# # #
8277

8378
timestamps = []
8479
values = []
@@ -143,17 +138,30 @@ class RTIO(Module, AutoCSR):
143138
def __init__(self, phy, clk_freq, counter_width=32, ofifo_depth=64, ififo_depth=64):
144139
fine_ts_width = get_fine_ts_width(phy.rbus)
145140

141+
# Counters
142+
reset_counter = Signal()
143+
o_counter = Signal(counter_width, reset=phy.loopback_latency)
144+
i_counter = Signal(counter_width)
145+
self.sync += \
146+
If(reset_counter,
147+
o_counter.eq(o_counter.reset),
148+
i_counter.eq(i_counter.reset)
149+
).Else(
150+
o_counter.eq(o_counter + 1),
151+
i_counter.eq(i_counter + 1)
152+
)
153+
146154
# Submodules
147155
self.submodules.bank_o = InsertReset(_RTIOBankO(
148156
phy.rbus,
149-
counter_width, fine_ts_width, ofifo_depth,
150-
phy.loopback_latency))
157+
o_counter, fine_ts_width, ofifo_depth))
151158
self.submodules.bank_i = InsertReset(_RTIOBankI(
152159
phy.rbus,
153-
counter_width, fine_ts_width, ofifo_depth))
160+
i_counter, fine_ts_width, ofifo_depth))
154161

155162
# CSRs
156-
self._r_reset = CSRStorage(reset=1)
163+
self._r_reset_logic = CSRStorage(reset=1)
164+
self._r_reset_counter = CSRStorage(reset=1)
157165
self._r_chan_sel = CSRStorage(flen(self.bank_o.sel))
158166

159167
self._r_oe = CSR()
@@ -194,7 +202,7 @@ def __init__(self, phy, clk_freq, counter_width=32, ofifo_depth=64, ififo_depth=
194202

195203
# Output/Gate
196204
self.comb += [
197-
self.bank_o.reset.eq(self._r_reset.storage),
205+
self.bank_o.reset.eq(self._r_reset_logic.storage),
198206
self.bank_o.sel.eq(self._r_chan_sel.storage),
199207
self.bank_o.timestamp.eq(self._r_o_timestamp.storage),
200208
self.bank_o.value.eq(self._r_o_value.storage),
@@ -207,7 +215,7 @@ def __init__(self, phy, clk_freq, counter_width=32, ofifo_depth=64, ififo_depth=
207215

208216
# Input
209217
self.comb += [
210-
self.bank_i.reset.eq(self._r_reset.storage),
218+
self.bank_i.reset.eq(self._r_reset_logic.storage),
211219
self.bank_i.sel.eq(self._r_chan_sel.storage),
212220
self._r_i_timestamp.status.eq(self.bank_i.timestamp),
213221
self._r_i_value.status.eq(self.bank_i.value),
@@ -217,11 +225,12 @@ def __init__(self, phy, clk_freq, counter_width=32, ofifo_depth=64, ififo_depth=
217225
Cat(self.bank_i.overflow, self.bank_i.pileup))
218226
]
219227

220-
# Counter
228+
# Counter access
229+
self.comb += reset_counter.eq(self._r_reset_counter.storage)
221230
self.sync += \
222231
If(self._r_counter_update.re,
223232
self._r_counter.status.eq(Cat(Replicate(0, fine_ts_width),
224-
self.bank_o.counter))
233+
o_counter))
225234
)
226235

227236
# Frequency

‎soc/runtime/dds.c

+7-4
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ static void fud(long long int fud_time)
3131
long long int fud_end_time;
3232
static long long int previous_fud_end_time;
3333

34-
r = rtio_reset_read();
34+
r = rtio_reset_counter_read();
3535
if(r)
3636
previous_fud_end_time = 0;
37-
rtio_reset_write(0);
37+
rtio_reset_counter_write(0);
3838

3939
rtio_chan_sel_write(RTIO_FUD_CHANNEL);
4040
if(fud_time < 0) {
@@ -52,12 +52,15 @@ static void fud(long long int fud_time)
5252
rtio_o_timestamp_write(fud_end_time);
5353
rtio_o_value_write(0);
5454
rtio_o_we_write(1);
55-
if(rtio_o_error_read())
55+
if(rtio_o_error_read()) {
56+
rtio_reset_logic_write(1);
57+
rtio_reset_logic_write(0);
5658
exception_raise(EID_RTIO_UNDERFLOW);
59+
}
5760

5861
if(r) {
5962
fud_sync();
60-
rtio_reset_write(1);
63+
rtio_reset_counter_write(1);
6164
}
6265
}
6366

‎soc/runtime/main.c

+1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ int main(void)
110110
uart_init();
111111

112112
puts("ARTIQ runtime built "__DATE__" "__TIME__"\n");
113+
rtio_init();
113114
dds_init();
114115
blink_led();
115116
corecom_serve(load_object, run_kernel);

‎soc/runtime/rtio.c

+12-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55

66
void rtio_init(void)
77
{
8-
rtio_reset_write(1);
8+
rtio_reset_counter_write(1);
9+
rtio_reset_logic_write(1);
10+
rtio_reset_logic_write(0);
911
}
1012

1113
void rtio_oe(int channel, int oe)
@@ -16,14 +18,17 @@ void rtio_oe(int channel, int oe)
1618

1719
void rtio_set(long long int timestamp, int channel, int value)
1820
{
19-
rtio_reset_write(0);
21+
rtio_reset_counter_write(0);
2022
rtio_chan_sel_write(channel);
2123
rtio_o_timestamp_write(timestamp);
2224
rtio_o_value_write(value);
2325
while(!rtio_o_writable_read());
2426
rtio_o_we_write(1);
25-
if(rtio_o_error_read())
27+
if(rtio_o_error_read()) {
28+
rtio_reset_logic_write(1);
29+
rtio_reset_logic_write(0);
2630
exception_raise(EID_RTIO_UNDERFLOW);
31+
}
2732
}
2833

2934
void rtio_replace(long long int timestamp, int channel, int value)
@@ -32,8 +37,11 @@ void rtio_replace(long long int timestamp, int channel, int value)
3237
rtio_o_timestamp_write(timestamp);
3338
rtio_o_value_write(value);
3439
rtio_o_replace_write(1);
35-
if(rtio_o_error_read())
40+
if(rtio_o_error_read()) {
41+
rtio_reset_logic_write(1);
42+
rtio_reset_logic_write(0);
3643
exception_raise(EID_RTIO_UNDERFLOW);
44+
}
3745
}
3846

3947
void rtio_sync(int channel)

0 commit comments

Comments
 (0)
Please sign in to comment.