link: simplify BFM
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 3 Dec 2014 08:17:51 +0000 (09:17 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 3 Dec 2014 08:17:51 +0000 (09:17 +0100)
lib/sata/link/test/bfm.py
lib/sata/link/test/link_tb.py

index 07711c7f86ff160ae01c3af5f38f3b7964616f86..fe4b4a21cfe85d9d7d954170d02617186880e7a2 100644 (file)
@@ -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)
index 0ded23df38554aeed1c0d8796a1030ec97b137d2..5a7d4aa9c3921f4589e9be899b630ebb1ba9720a 100644 (file)
@@ -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)