forked from M-Labs/artiq-zynq
pipeline GW: add buffer error
This commit is contained in:
parent
d3e0cc2819
commit
11f47debd1
|
@ -305,8 +305,10 @@ class RX_Debug_Buffer(Module,AutoCSR):
|
||||||
class CXP_Data_Packet_Decode(Module):
|
class CXP_Data_Packet_Decode(Module):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.packet_type = Signal(8)
|
self.packet_type = Signal(8)
|
||||||
|
|
||||||
self.decode_err = Signal()
|
self.decode_err = Signal()
|
||||||
self.test_err = Signal()
|
self.test_err = Signal()
|
||||||
|
self.buffer_err = Signal()
|
||||||
# # #
|
# # #
|
||||||
|
|
||||||
# DEBUG: remove debug
|
# DEBUG: remove debug
|
||||||
|
@ -417,6 +419,8 @@ class CXP_Data_Packet_Decode(Module):
|
||||||
self.write_ptr_sys = Signal.like(write_ptr)
|
self.write_ptr_sys = Signal.like(write_ptr)
|
||||||
self.specials += MultiReg(write_ptr, self.write_ptr_sys),
|
self.specials += MultiReg(write_ptr, self.write_ptr_sys),
|
||||||
|
|
||||||
|
self.read_ptr_rx = Signal.like(write_ptr)
|
||||||
|
|
||||||
self.comb += [
|
self.comb += [
|
||||||
mem_port.adr[:addr_nbits].eq(addr),
|
mem_port.adr[:addr_nbits].eq(addr),
|
||||||
mem_port.adr[addr_nbits:].eq(write_ptr),
|
mem_port.adr[addr_nbits:].eq(write_ptr),
|
||||||
|
@ -429,16 +433,32 @@ class CXP_Data_Packet_Decode(Module):
|
||||||
self.sink.ack.eq(1),
|
self.sink.ack.eq(1),
|
||||||
If(self.sink.stb,
|
If(self.sink.stb,
|
||||||
If(((self.sink.data == Replicate(KCode["pak_end"], 4)) & (self.sink.k == 0b1111)),
|
If(((self.sink.data == Replicate(KCode["pak_end"], 4)) & (self.sink.k == 0b1111)),
|
||||||
NextValue(write_ptr, write_ptr + 1),
|
NextState("MOVE_BUFFER_PTR"),
|
||||||
NextState("IDLE"),
|
|
||||||
).Else(
|
).Else(
|
||||||
mem_port.we.eq(1),
|
mem_port.we.eq(1),
|
||||||
mem_port.dat_w.eq(self.sink.data),
|
mem_port.dat_w.eq(self.sink.data),
|
||||||
NextValue(addr, addr + 1),
|
NextValue(addr, addr + 1),
|
||||||
|
|
||||||
|
If(addr == buffer_depth - 1,
|
||||||
|
# discard the packet
|
||||||
|
self.buffer_err.eq(1),
|
||||||
|
NextState("IDLE"),
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fsm.act("MOVE_BUFFER_PTR",
|
||||||
|
self.sink.ack.eq(0),
|
||||||
|
If(write_ptr + 1 == self.read_ptr_rx,
|
||||||
|
# if next one hasn't been read, overwrite the current buffer when new packet comes in
|
||||||
|
self.buffer_err.eq(1),
|
||||||
|
).Else(
|
||||||
|
NextValue(write_ptr, write_ptr + 1),
|
||||||
|
),
|
||||||
|
NextState("IDLE"),
|
||||||
|
)
|
||||||
|
|
||||||
class CXP_Trig_Ack_Checker(Module, AutoCSR):
|
class CXP_Trig_Ack_Checker(Module, AutoCSR):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.sink = stream.Endpoint(word_layout)
|
self.sink = stream.Endpoint(word_layout)
|
||||||
|
|
Loading…
Reference in New Issue