etherbone: wishbone reads seems OK in simulation
authorFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 11 Feb 2015 20:51:25 +0000 (21:51 +0100)
committerFlorent Kermarrec <florent@enjoy-digital.fr>
Wed, 11 Feb 2015 20:51:25 +0000 (21:51 +0100)
liteeth/core/etherbone/record.py
liteeth/core/etherbone/wishbone.py
liteeth/test/etherbone_tb.py
liteeth/test/model/etherbone.py

index 6c3acb0e5800537e6aa33e67a538223fa1781b8f..15abe58d15ca5d9c51a36072d775a71364e9da6c 100644 (file)
@@ -124,8 +124,11 @@ class LiteEthEtherboneRecordSender(Module):
                        source.sop.eq(0),
                        source.eop.eq(wr_buffer.source.eop),
                        source.data.eq(wr_buffer.source.data),
-                       If(source.stb & source.eop & source.ack,
-                               NextState("IDLE")
+                       If(source.stb & source.ack,
+                               wr_buffer.source.ack.eq(1),
+                               If(source.eop,
+                                       NextState("IDLE")
+                               )
                        )
                )
 
@@ -143,10 +146,26 @@ class LiteEthEtherboneRecord(Module):
                        receiver.sink.data.eq(reverse_bytes(depacketizer.source.data)) # clarify this
                ]
 
+               last_ip_address = Signal(32) # XXX for test
+               last_src_port = Signal(16)   # XXX for test
+               last_dst_port = Signal(16)   # XXX for test
+
+               self.sync += [
+                       If(sink.stb & sink.sop & sink.ack,
+                               last_ip_address.eq(sink.ip_address),
+                               last_src_port.eq(sink.src_port),
+                               last_dst_port.eq(sink.dst_port)
+                       )
+               ]
+
                self.submodules.sender = sender =  LiteEthEtherboneRecordSender()
                self.submodules.packetizer = packetizer = LiteEthEtherboneRecordPacketizer()
                self.comb += [
                        Record.connect(sender.source, packetizer.sink),
                        packetizer.sink.data.eq(reverse_bytes(sender.source.data)), # clarify this
                        Record.connect(packetizer.source, source),
+                       source.length.eq(sender.source.wcount*4 + 4),
+                       source.ip_address.eq(last_ip_address),
+                       source.src_port.eq(last_src_port),
+                       source.dst_port.eq(last_dst_port)
                ]
index 50cd175dabfe74acd48cdd47c8fc251ad8dd2930..fd58094db8d7acfcef3e6d1aeb6a47d2bb38a4ba 100644 (file)
@@ -58,7 +58,8 @@ class LiteEthEtherboneWishboneMaster(Module):
                        wr_source.addr.eq(rd_sink.addr),
                        wr_source.count.eq(rd_sink.count),
                        wr_source.be.eq(rd_sink.be),
-                       wr_source.data.eq(data.q),
+                       #wr_source.data.eq(data.q),
+                       wr_source.data.eq(0x12345678), # XXX
                        If(wr_source.stb & wr_source.ack,
                                rd_sink.ack.eq(1),
                                If(wr_source.eop,
index 1987e29a8858f606754d910e7f8024a15bb29a47..5f32ae2dc69083cd0f3148647da4850a0a5b4b5e 100644 (file)
@@ -50,35 +50,70 @@ class TB(Module):
                for i in range(100):
                        yield
 
-               # test probe
-               #packet = etherbone.EtherbonePacket()
-               #packet.pf = 1
-               #self.etherbone_model.send(packet)
+               test_probe = False
+               test_writes = False
+               test_reads = True
 
-               # test writes
-               writes = etherbone.EtherboneWrites(base_addr=0x1000)
-               for i in range(16):
-                       writes.add(etherbone.EtherboneWrite(i))
-               record = etherbone.EtherboneRecord()
-               record.writes = writes
-               record.reads = None
-               record.bca = 0
-               record.rca = 0
-               record.rff = 0
-               record.cyc = 0
-               record.wca = 0
-               record.wff = 0
-               record.byte_enable = 0
-               record.wcount = 16
-               record.rcount = 0
-
-               packet = etherbone.EtherbonePacket()
-               packet.records = [record]
-               print(packet)
-
-               self.etherbone_model.send(packet)
+               # test probe
+               if test_probe:
+                       packet = etherbone.EtherbonePacket()
+                       packet.pf = 1
+                       self.etherbone_model.send(packet)
 
+                       for i in range(1024):
+                               yield
 
+               # test writes
+               if test_writes:
+                       writes = etherbone.EtherboneWrites(base_addr=0x1000)
+                       for i in range(16):
+                               writes.add(etherbone.EtherboneWrite(i))
+                       record = etherbone.EtherboneRecord()
+                       record.writes = writes
+                       record.reads = None
+                       record.bca = 0
+                       record.rca = 0
+                       record.rff = 0
+                       record.cyc = 0
+                       record.wca = 0
+                       record.wff = 0
+                       record.byte_enable = 0
+                       record.wcount = 16
+                       record.rcount = 0
+
+                       packet = etherbone.EtherbonePacket()
+                       packet.records = [record]
+                       print(packet)
+                       self.etherbone_model.send(packet)
+
+                       for i in range(1024):
+                               yield
+
+               # test reads
+               if test_reads:
+                       reads = etherbone.EtherboneReads(base_ret_addr=0x2000)
+                       for i in range(16):
+                               reads.add(etherbone.EtherboneRead(i))
+                       record = etherbone.EtherboneRecord()
+                       record.writes = None
+                       record.reads = reads
+                       record.bca = 0
+                       record.rca = 0
+                       record.rff = 0
+                       record.cyc = 0
+                       record.wca = 0
+                       record.wff = 0
+                       record.byte_enable = 0
+                       record.wcount = 0
+                       record.rcount = 16
+
+                       packet = etherbone.EtherbonePacket()
+                       packet.records = [record]
+                       print(packet)
+                       self.etherbone_model.send(packet)
+
+                       for i in range(1024):
+                               yield
 
 if __name__ == "__main__":
-       run_simulation(TB(), ncycles=1024, vcd_name="my.vcd", keep_files=True)
\ No newline at end of file
+       run_simulation(TB(), ncycles=4096, vcd_name="my.vcd", keep_files=True)
\ No newline at end of file
index b4b3626f4997b30b65fd637e60163bdfddc785e4..5b1c0b8eaeb9d0dc2e09642bd766ed7f6b57368c 100644 (file)
@@ -143,9 +143,11 @@ class EtherboneRecord(Packet):
                for k, v in sorted(etherbone_record_header.items()):
                        setattr(self, k, get_field_data(v, header))
                self.writes = self.get_writes()
-               self.writes.decode()
+               if self.writes is not None:
+                       self.writes.decode()
                self.reads = self.get_reads()
-               self.reads.decode()
+               if self.reads is not None:
+                       self.reads.decode()
                self.encoded = False
 
        def set_writes(self, writes):