link_tb: use LinkTXPacket and LinkRXPacket from bfm

This commit is contained in:
Florent Kermarrec 2014-12-05 18:00:02 +01:00
parent e900b9031c
commit b238c41b26
2 changed files with 17 additions and 22 deletions

View File

@ -79,9 +79,12 @@ class PHYLayer(Module):
return receiving + sending return receiving + sending
class LinkPacket(list): class LinkPacket(list):
def __init__(self): def __init__(self, init=[]):
self.ongoing = False self.ongoing = False
self.done = False
self.scrambled_datas = self.import_scrambler_datas() self.scrambled_datas = self.import_scrambler_datas()
for dword in init:
self.append(dword)
def import_scrambler_datas(self): def import_scrambler_datas(self):
with subprocess.Popen(["./scrambler"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) as process: with subprocess.Popen(["./scrambler"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) as process:

View File

@ -10,18 +10,12 @@ from lib.sata.link import SATALinkLayer
from lib.sata.test.bfm import * from lib.sata.test.bfm import *
from lib.sata.test.common import * from lib.sata.test.common import *
class LinkPacket():
def __init__(self, d=[]):
self.d = d
self.start = 1
self.done = 0
class LinkStreamer(Module): class LinkStreamer(Module):
def __init__(self, dw): def __init__(self, dw):
self.source = Source(link_layout(dw)) self.source = Source(link_layout(dw))
### ###
self.packets = [] self.packets = []
self.packet = LinkPacket() self.packet = LinkTXPacket()
self.packet.done = 1 self.packet.done = 1
def send(self, packet, blocking=True): def send(self, packet, blocking=True):
@ -33,17 +27,17 @@ class LinkStreamer(Module):
def do_simulation(self, selfp): def do_simulation(self, selfp):
if len(self.packets) and self.packet.done: if len(self.packets) and self.packet.done:
self.packet = self.packets.pop(0) self.packet = self.packets.pop(0)
if self.packet.start and not self.packet.done: if not self.packet.ongoing and not self.packet.done:
selfp.source.stb = 1 selfp.source.stb = 1
selfp.source.sop = 1 selfp.source.sop = 1
selfp.source.d = self.packet.d.pop(0) selfp.source.d = self.packet.pop(0)
self.packet.start = 0 self.packet.ongoing = True
elif selfp.source.stb == 1 and selfp.source.ack == 1: elif selfp.source.stb == 1 and selfp.source.ack == 1:
selfp.source.sop = 0 selfp.source.sop = 0
selfp.source.eop = (len(self.packet.d) == 1) selfp.source.eop = (len(self.packet) == 1)
if len(self.packet.d) > 0: if len(self.packet) > 0:
selfp.source.stb = 1 selfp.source.stb = 1
selfp.source.d = self.packet.d.pop(0) selfp.source.d = self.packet.pop(0)
else: else:
self.packet.done = 1 self.packet.done = 1
selfp.source.stb = 0 selfp.source.stb = 0
@ -52,7 +46,7 @@ class LinkLogger(Module):
def __init__(self, dw): def __init__(self, dw):
self.sink = Sink(link_layout(dw)) self.sink = Sink(link_layout(dw))
### ###
self.packet = LinkPacket() self.packet = LinkRXPacket()
def receive(self): def receive(self):
self.packet.done = 0 self.packet.done = 0
@ -60,16 +54,14 @@ class LinkLogger(Module):
yield yield
def do_simulation(self, selfp): def do_simulation(self, selfp):
self.packet.done = 0
selfp.sink.ack = 1 selfp.sink.ack = 1
if selfp.sink.stb == 1 and selfp.sink.sop == 1: if selfp.sink.stb == 1 and selfp.sink.sop == 1:
self.packet.start = 1 self.packet = LinkRXPacket()
self.packet.d = [selfp.sink.d] self.packet.append(selfp.sink.d)
elif selfp.sink.stb: elif selfp.sink.stb:
self.packet.start = 0 self.packet.append(selfp.sink.d)
self.packet.d.append(selfp.sink.d)
if (selfp.sink.stb ==1 and selfp.sink.eop ==1): if (selfp.sink.stb ==1 and selfp.sink.eop ==1):
self.packet.done = 1 self.packet.done = True
class TB(Module): class TB(Module):
def __init__(self): def __init__(self):
@ -90,7 +82,7 @@ class TB(Module):
for i in range(200): for i in range(200):
yield yield
for i in range(8): for i in range(8):
yield from self.streamer.send(LinkPacket([i for i in range(16)])) yield from self.streamer.send(LinkTXPacket([i for i in range(16)]))
if __name__ == "__main__": if __name__ == "__main__":
run_simulation(TB(), ncycles=512, vcd_name="my.vcd", keep_files=True) run_simulation(TB(), ncycles=512, vcd_name="my.vcd", keep_files=True)