test: mac_core_tb OK

This commit is contained in:
Florent Kermarrec 2015-01-28 20:44:41 +01:00
parent 33edf11ec9
commit fb00202427
4 changed files with 58 additions and 15 deletions

View File

@ -88,6 +88,7 @@ class PacketStreamer(Module):
selfp.source.last_be = self.last_be selfp.source.last_be = self.last_be
else: else:
selfp.source.eop = 0 selfp.source.eop = 0
if self.last_be is not None:
selfp.source.last_be = 0 selfp.source.last_be = 0
if len(self.packet) > 0: if len(self.packet) > 0:
selfp.source.stb = 1 selfp.source.stb = 1

View File

@ -11,14 +11,14 @@ from liteeth.test.model import phy, mac
class TB(Module): class TB(Module):
def __init__(self): def __init__(self):
self.submodules.hostphy = phy.PHY(8, debug=True) self.submodules.hostphy = phy.PHY(8, debug=False)
self.submodules.hostmac = mac.MAC(self.hostphy, debug=True, random_level=0) self.submodules.hostmac = mac.MAC(self.hostphy, debug=False, loopback=True)
self.submodules.ethmac = LiteEthMAC(phy=self.hostphy, dw=32, interface="core", with_hw_preamble_crc=True) self.submodules.ethmac = LiteEthMAC(phy=self.hostphy, dw=32, interface="core", with_hw_preamble_crc=True)
self.submodules.streamer = PacketStreamer(eth_mac_description(32), last_be=1) self.submodules.streamer = PacketStreamer(eth_mac_description(32), last_be=1)
self.submodules.streamer_randomizer = AckRandomizer(eth_mac_description(32), level=0) self.submodules.streamer_randomizer = AckRandomizer(eth_mac_description(32), level=50)
self.submodules.logger_randomizer = AckRandomizer(eth_mac_description(32), level=0) self.submodules.logger_randomizer = AckRandomizer(eth_mac_description(32), level=50)
self.submodules.logger = PacketLogger(eth_mac_description(32)) self.submodules.logger = PacketLogger(eth_mac_description(32))
# use sys_clk for each clock_domain # use sys_clk for each clock_domain
@ -47,8 +47,12 @@ class TB(Module):
for i in range(8): for i in range(8):
streamer_packet = Packet([i for i in range(64)]) streamer_packet = Packet([i for i in range(64)])
print(streamer_packet)
yield from self.streamer.send(streamer_packet) yield from self.streamer.send(streamer_packet)
yield from self.logger.receive()
# check results
s, l, e = check(streamer_packet, self.logger.packet)
print("shift "+ str(s) + " / length " + str(l) + " / errors " + str(e))
if __name__ == "__main__": if __name__ == "__main__":
run_simulation(TB(), ncycles=1000, vcd_name="my.vcd", keep_files=True) run_simulation(TB(), ncycles=4000, vcd_name="my.vcd", keep_files=True)

View File

@ -4,6 +4,11 @@ from liteeth.common import *
from liteeth.mac.common import * from liteeth.mac.common import *
from liteeth.test.common import * from liteeth.test.common import *
def print_mac(s):
print_with_prefix(s, "[MAC]")
preamble = [0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xD5]
def crc32(l): def crc32(l):
crc = [] crc = []
crc_bytes = binascii.crc32(bytes(l)).to_bytes(4, byteorder="little") crc_bytes = binascii.crc32(bytes(l)).to_bytes(4, byteorder="little")
@ -21,7 +26,7 @@ class MACPacket(list):
class MACRXPacket(MACPacket): class MACRXPacket(MACPacket):
def check_remove_preamble(self): def check_remove_preamble(self):
if comp(self[0:8], [0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xD5]): if comp(self[0:8], preamble):
for i in range(8): for i in range(8):
self.pop(0) self.pop(0)
return False return False
@ -38,16 +43,18 @@ class MACRXPacket(MACPacket):
class MACTXPacket(MACPacket): class MACTXPacket(MACPacket):
def insert_crc(self): def insert_crc(self):
return self for d in crc32(self):
self.append(d)
def insert_preamble(self): def insert_preamble(self):
return self for d in reversed(preamble):
self.insert(0, d)
class MAC(Module): class MAC(Module):
def __init__(self, phy, debug=False, random_level=0): def __init__(self, phy, debug=False, loopback=False):
self.phy = phy self.phy = phy
self.debug = debug self.debug = debug
self.random_level = random_level self.loopback = loopback
self.tx_packets = [] self.tx_packets = []
self.tx_packet = MACTXPacket() self.tx_packet = MACTXPacket()
self.rx_packet = MACRXPacket() self.rx_packet = MACRXPacket()
@ -59,6 +66,12 @@ class MAC(Module):
def send(self, datas): def send(self, datas):
tx_packet = MACTXPacket(datas) tx_packet = MACTXPacket(datas)
if self.debug:
r = ">>>>>>>>\n"
r += "length " + str(len(tx_packet)) + "\n"
for d in tx_packet:
r += "%02x" %d
print_mac(r)
tx_packet.insert_crc() tx_packet.insert_crc()
tx_packet.insert_preamble() tx_packet.insert_preamble()
self.tx_packets.append(tx_packet) self.tx_packets.append(tx_packet)
@ -67,8 +80,18 @@ class MAC(Module):
rx_packet = MACRXPacket(datas) rx_packet = MACRXPacket(datas)
preamble_error = rx_packet.check_remove_preamble() preamble_error = rx_packet.check_remove_preamble()
crc_error = rx_packet.check_remove_crc() crc_error = rx_packet.check_remove_crc()
if self.debug:
r = "<<<<<<<<\n"
r += "preamble_error " + str(preamble_error) + "\n"
r += "crc_error " + str(crc_error) + "\n"
r += "length " + str(len(rx_packet)) + "\n"
for d in rx_packet:
r += "%02x" %d
print_mac(r)
if (not preamble_error) and (not crc_error): if (not preamble_error) and (not crc_error):
if self.ip_callback is not None: if self.loopback:
self.send(rx_packet)
elif self.ip_callback is not None:
self.ip_callback(rx_packet) self.ip_callback(rx_packet)
def gen_simulation(self, selfp): def gen_simulation(self, selfp):

View File

@ -2,6 +2,9 @@ from liteeth.common import *
from liteeth.mac.common import * from liteeth.mac.common import *
from liteeth.test.common import * from liteeth.test.common import *
def print_phy(s):
print_with_prefix(s, "[PHY]")
# PHY model # PHY model
class PHYSource(PacketStreamer): class PHYSource(PacketStreamer):
def __init__(self, dw): def __init__(self, dw):
@ -12,7 +15,7 @@ class PHYSink(PacketLogger):
PacketLogger.__init__(self, eth_phy_description(dw)) PacketLogger.__init__(self, eth_phy_description(dw))
class PHY(Module): class PHY(Module):
def __init__(self, dw, debug): def __init__(self, dw, debug=False):
self.dw = dw self.dw = dw
self.debug = debug self.debug = debug
@ -29,8 +32,20 @@ class PHY(Module):
def send(self, datas): def send(self, datas):
packet = Packet(datas) packet = Packet(datas)
yield from self.phy_source.send(packet, blocking) if self.debug:
r = ">>>>>>>>\n"
r += "length " + str(len(datas)) + "\n"
for d in datas:
r += "%02x" %d
print_phy(r)
yield from self.phy_source.send(packet)
def receive(self): def receive(self):
yield from self.phy_sink.receive() yield from self.phy_sink.receive()
if self.debug:
r = "<<<<<<<<\n"
r += "length " + str(len(self.phy_sink.packet)) + "\n"
for d in self.phy_sink.packet:
r += "%02x" %d
print_phy(r)
self.packet = self.phy_sink.packet self.packet = self.phy_sink.packet