From: Florent Kermarrec Date: Wed, 3 Dec 2014 08:17:51 +0000 (+0100) Subject: link: simplify BFM X-Git-Tag: 24jan2021_ls180~2572^2~157 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cab5b7b8f805eb3c485f70b67ec3fcd96931acad;p=litex.git link: simplify BFM --- diff --git a/lib/sata/link/test/bfm.py b/lib/sata/link/test/bfm.py index 07711c7f..fe4b4a21 100644 --- a/lib/sata/link/test/bfm.py +++ b/lib/sata/link/test/bfm.py @@ -15,27 +15,18 @@ class BFMSource(Module): def __init__(self, dw): self.source = Source(phy_layout(dw)) ### - self.dwords = [] self.dword = BFMDword() - self.dword.done = 1 - def send(self, dword, blocking=True): - self.dwords.append(dword) - if blocking: - while dword.done == 0: - yield + def send(self, dword): + self.dword = dword def do_simulation(self, selfp): - if len(self.dwords) and self.dword.done: - self.dword = self.dwords.pop(0) selfp.source.stb = 1 selfp.source.charisk = 0b0000 for k, v in primitives.items(): if v == self.dword.dat: selfp.source.charisk = 0b0001 selfp.source.data = self.dword.dat - if selfp.source.stb == 1 and selfp.source.ack == 1: - self.dword.done = 1 class BFMSink(Module): def __init__(self, dw): @@ -67,18 +58,36 @@ class BFMPHY(Module): self.dword = 0 - def send(self, dword, blocking=True): + def send(self, dword): packet = BFMDword(dword) - yield from self.bfm_source.send(dword, blocking) + self.bfm_source.send(packet) def receive(self): yield from self.bfm_sink.receive() self.rx_dword = self.bfm_sink.dword.dat + def __repr__(self): + # receive + receiving = "%08x " %self.rx_dword + for k, v in primitives.items(): + if self.rx_dword == v: + receiving += k + receiving += " "*(16-len(receiving)) + + # send + sending = "%08x " %self.bfm_source.dword.dat + for k, v in primitives.items(): + if self.bfm_source.dword.dat == v: + sending += k + sending += " "*(16-len(sending)) + + return receiving + sending + + class BFM(Module): - def __init__(self, dw, debug=False, level=0): + def __init__(self, dw, debug=False, hold_random_level=0): self.debug = debug - self.level = level + self.hold_random_level = hold_random_level ### @@ -88,6 +97,8 @@ class BFM(Module): self.rx_packet_ongoing = False self.rx_packet = [] + self.run = True + def get_scrambler_ref(self): with subprocess.Popen(["./scrambler"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) as process: process.stdin.write("0x10000".encode("ASCII")) @@ -124,33 +135,16 @@ class BFM(Module): print("----") def dword_callback(self, dword): - rx = "%08x " %dword - for k, v in primitives.items(): - if dword == v: - rx += k - rx += " "*(16-len(rx)) - print(rx, end="") - - tx = "%08x " %self.phy.bfm_source.dword.dat - for k, v in primitives.items(): - if self.phy.bfm_source.dword.dat == v: - tx += k - tx += " "*(16-len(tx)) - print(tx, end="") - - print("") - - # X_RDY / WTRM response if dword == primitives["X_RDY"]: - self.phy.bfm_source.dwords.append(BFMDword(primitives["R_RDY"])) + self.phy.send(primitives["R_RDY"]) elif dword == primitives["WTRM"]: - self.phy.bfm_source.dwords.append(BFMDword(primitives["R_OK"])) + self.phy.send(primitives["R_OK"]) # HOLD response elif dword == primitives["HOLD"]: - self.phy.bfm_source.dwords.append(BFMDword(primitives["HOLDA"])) + self.phy.send(primitives["HOLDA"]) # packet capture elif dword == primitives["EOF"]: @@ -160,10 +154,10 @@ class BFM(Module): elif self.rx_packet_ongoing: if dword != primitives["HOLD"]: n = randn(100) - if n < self.level: - self.phy.bfm_source.dwords.append(BFMDword(primitives["HOLD"])) + if n < self.hold_random_level: + self.phy.send(primitives["HOLD"]) else: - self.phy.bfm_source.dwords.append(BFMDword(primitives["R_RDY"])) + self.phy.send(primitives["R_RDY"]) if dword != primitives["HOLDA"]: self.rx_packet.append(dword) @@ -172,7 +166,9 @@ class BFM(Module): self.rx_packet = [] def gen_simulation(self, selfp): - self.phy.bfm_source.dwords.append(BFMDword(primitives["SYNC"])) + self.phy.send(primitives["SYNC"]) while True: yield from self.phy.receive() + if self.debug: + print(self.phy) self.dword_callback(self.phy.rx_dword) diff --git a/lib/sata/link/test/link_tb.py b/lib/sata/link/test/link_tb.py index 0ded23df..5a7d4aa9 100644 --- a/lib/sata/link/test/link_tb.py +++ b/lib/sata/link/test/link_tb.py @@ -73,7 +73,7 @@ class LinkLogger(Module): class TB(Module): def __init__(self): - self.submodules.bfm = BFM(32, debug=True, level=50) + self.submodules.bfm = BFM(32, debug=True, hold_random_level=50) self.submodules.link_layer = SATALinkLayer(self.bfm.phy) self.submodules.streamer = LinkStreamer(32)