3 from migen
.fhdl
.std
import *
4 from migen
.flow
.actor
import Sink
, Source
5 from migen
.genlib
.record
import *
7 from liteeth
.common
import *
9 def print_with_prefix(s
, prefix
=""):
10 if not isinstance(s
, str):
16 def seed_to_data(seed
, random
=True):
18 return (seed
* 0x31415979 + 1) & 0xffffffff
22 def split_bytes(v
, n
, endianness
="big"):
24 r_bytes
= v
.to_bytes(n
, byteorder
=endianness
)
29 def merge_bytes(b
, endianness
="big"):
30 return int.from_bytes(bytes(b
), endianness
)
32 def get_field_data(field
, datas
):
33 v
= merge_bytes(datas
[field
.byte
:field
.byte
+math
.ceil(field
.width
/8)])
34 return (v
>> field
.offset
) & (2**field
.width
-1)
38 for x
, y
in zip(p1
, p2
):
44 p1
= copy
.deepcopy(p1
)
45 p2
= copy
.deepcopy(p2
)
46 if isinstance(p1
, int):
47 return 0, 1, int(p1
!= p2
)
49 if len(p1
) >= len(p2
):
54 while((ref
[0] != res
[0]) and (len(res
)>1)):
57 length
= min(len(ref
), len(res
))
59 for i
in range(length
):
60 if ref
.pop(0) != res
.pop(0):
62 return shift
, length
, errors
65 return random
.randint(0, max_n
-1)
68 def __init__(self
, init
=[]):
74 class PacketStreamer(Module
):
75 def __init__(self
, description
, last_be
=None):
76 self
.source
= Source(description
)
77 self
.last_be
= last_be
80 self
.packet
= Packet()
81 self
.packet
.done
= True
83 def send(self
, packet
):
84 packet
= copy
.deepcopy(packet
)
85 self
.packets
.append(packet
)
86 while not packet
.done
:
89 def do_simulation(self
, selfp
):
90 if len(self
.packets
) and self
.packet
.done
:
91 self
.packet
= self
.packets
.pop(0)
92 if not self
.packet
.ongoing
and not self
.packet
.done
:
95 selfp
.source
.data
= self
.packet
.pop(0)
96 self
.packet
.ongoing
= True
97 elif selfp
.source
.stb
== 1 and selfp
.source
.ack
== 1:
99 if len(self
.packet
) == 1:
101 if self
.last_be
is not None:
102 selfp
.source
.last_be
= self
.last_be
105 if self
.last_be
is not None:
106 selfp
.source
.last_be
= 0
107 if len(self
.packet
) > 0:
109 selfp
.source
.data
= self
.packet
.pop(0)
111 self
.packet
.done
= True
114 class PacketLogger(Module
):
115 def __init__(self
, description
):
116 self
.sink
= Sink(description
)
118 self
.packet
= Packet()
121 self
.packet
.done
= False
122 while not self
.packet
.done
:
125 def do_simulation(self
, selfp
):
127 if selfp
.sink
.stb
== 1 and selfp
.sink
.sop
== 1:
128 self
.packet
= Packet()
129 self
.packet
.append(selfp
.sink
.data
)
131 self
.packet
.append(selfp
.sink
.data
)
132 if selfp
.sink
.stb
== 1 and selfp
.sink
.eop
== 1:
133 self
.packet
.done
= True
135 class AckRandomizer(Module
):
136 def __init__(self
, description
, level
=0):
139 self
.sink
= Sink(description
)
140 self
.source
= Source(description
)
146 Record
.connect(self
.sink
, self
.source
)
148 self
.source
.stb
.eq(0),
152 def do_simulation(self
, selfp
):