Add FCS insertion, removal, and verification to GmiiFrame and XgmiiFrame

This commit is contained in:
Alex Forencich
2020-11-26 00:53:02 -08:00
parent e533b4236b
commit 79a8ec57ea
5 changed files with 40 additions and 11 deletions

View File

@@ -23,6 +23,8 @@ THE SOFTWARE.
"""
import logging
import struct
import zlib
from collections import deque
import cocotb
@@ -48,9 +50,11 @@ class GmiiFrame(object):
self.error = error
@classmethod
def from_payload(cls, payload):
def from_payload(cls, payload, add_fcs=True):
data = bytearray(ETH_PREAMBLE)
data.extend(payload)
if add_fcs:
data.extend(struct.pack('<L', zlib.crc32(payload)))
return cls(data)
def get_preamble_len(self):
@@ -59,8 +63,17 @@ class GmiiFrame(object):
def get_preamble(self):
return self.data[0:self.get_preamble_len()]
def get_payload(self):
return self.data[self.get_preamble_len():]
def get_payload(self, strip_fcs=True):
if strip_fcs:
return self.data[self.get_preamble_len():-4]
else:
return self.data[self.get_preamble_len():]
def get_fcs(self):
return self.data[-4:]
def check_fcs(self):
return self.get_fcs() == struct.pack('<L', zlib.crc32(self.get_payload(strip_fcs=True)))
def normalize(self):
n = len(self.data)

View File

@@ -23,6 +23,8 @@ THE SOFTWARE.
"""
import logging
import struct
import zlib
from collections import deque
import cocotb
@@ -50,9 +52,11 @@ class XgmiiFrame(object):
self.ctrl = ctrl
@classmethod
def from_payload(cls, payload):
def from_payload(cls, payload, add_fcs=True):
data = bytearray(ETH_PREAMBLE)
data.extend(payload)
if add_fcs:
data.extend(struct.pack('<L', zlib.crc32(payload)))
return cls(data)
def get_preamble_len(self):
@@ -61,8 +65,17 @@ class XgmiiFrame(object):
def get_preamble(self):
return self.data[0:self.get_preamble_len()]
def get_payload(self):
return self.data[self.get_preamble_len():]
def get_payload(self, strip_fcs=True):
if strip_fcs:
return self.data[self.get_preamble_len():-4]
else:
return self.data[self.get_preamble_len():]
def get_fcs(self):
return self.data[-4:]
def check_fcs(self):
return self.get_fcs() == struct.pack('<L', zlib.crc32(self.get_payload(strip_fcs=True)))
def normalize(self):
n = len(self.data)