def __init__(self, identifier): self.sink = sink = stream.Endpoint( eth_etherbone_packet_user_description(32)) self.source = source = stream.Endpoint(user_description(32)) # # # self.submodules.packetizer = packetizer = EtherbonePacketPacketizer() self.comb += [ packetizer.sink.valid.eq(sink.valid), packetizer.sink.last.eq(sink.last), sink.ready.eq(packetizer.sink.ready), packetizer.sink.magic.eq(etherbone_magic), packetizer.sink.port_size.eq(32 // 8), packetizer.sink.addr_size.eq(32 // 8), packetizer.sink.pf.eq(sink.pf), packetizer.sink.pr.eq(sink.pr), packetizer.sink.nr.eq(sink.nr), packetizer.sink.version.eq(etherbone_version), packetizer.sink.data.eq(sink.data) ] self.submodules.fsm = fsm = FSM(reset_state="IDLE") fsm.act( "IDLE", packetizer.source.ready.eq(1), If(packetizer.source.valid, packetizer.source.ready.eq(0), NextState("SEND"))) fsm.act( "SEND", packetizer.source.connect(source), source.dst.eq(identifier), source.length.eq(sink.length + etherbone_packet_header.length), If(source.valid & source.last & source.ready, NextState("IDLE")))
def eth_etherbone_packet_user_description(dw): param_layout = etherbone_packet_header.get_layout() param_layout = _remove_from_layout(param_layout, "magic", "portsize", "addrsize", "version") param_layout += user_description(dw).param_layout payload_layout = [("data", dw), ("error", dw // 8)] return EndpointDescription(payload_layout, param_layout)
def __init__(self): self.sink = sink = stream.Endpoint(user_description(32)) self.source = source = stream.Endpoint( eth_etherbone_packet_user_description(32)) # # # self.submodules.depacketizer = depacketizer = EtherbonePacketDepacketizer( ) self.comb += sink.connect(depacketizer.sink) self.submodules.fsm = fsm = FSM(reset_state="IDLE") fsm.act( "IDLE", depacketizer.source.ready.eq(1), If(depacketizer.source.valid, depacketizer.source.ready.eq(0), NextState("CHECK"))) valid = Signal() self.sync += valid.eq(depacketizer.source.valid & (depacketizer.source.magic == etherbone_magic)) fsm.act("CHECK", If(valid, NextState("PRESENT")).Else(NextState("DROP"))) self.comb += [ source.last.eq(depacketizer.source.last), source.pf.eq(depacketizer.source.pf), source.pr.eq(depacketizer.source.pr), source.nr.eq(depacketizer.source.nr), source.data.eq(depacketizer.source.data), source.length.eq(sink.length - etherbone_packet_header.length) ] fsm.act( "PRESENT", source.valid.eq(depacketizer.source.valid), depacketizer.source.ready.eq(source.ready), If(source.valid & source.last & source.ready, NextState("IDLE"))) fsm.act( "DROP", depacketizer.source.ready.eq(1), If( depacketizer.source.valid & depacketizer.source.last & depacketizer.source.ready, NextState("IDLE")))
def __init__(self): Packetizer.__init__(self, eth_etherbone_packet_description(32), user_description(32), etherbone_packet_header)