16
16
17
17
class StreamSimSender :
18
18
def __init__ (self , sink , data , speed = 0.5 , initial_delay = 0 ,
19
- verbose = False , decimal = False , strname = "" ):
19
+ verbose = False , callback = None , decimal = False , strname = "" ,
20
+ randomize = True ):
20
21
self .sink = sink
21
22
self .data = data
22
23
self .speed = speed
23
24
self .initial_delay = initial_delay
24
25
self .verbose = verbose
26
+ self .callback = callback
25
27
self .decimal = decimal
26
28
self .strname = strname
29
+ self .randomize = randomize
27
30
28
31
if isinstance (self .data , list ):
29
32
self .data = {"data" : self .data }
@@ -36,6 +39,10 @@ def __init__(self, sink, data, speed=0.5, initial_delay=0,
36
39
def sync_process (self ):
37
40
sink = self .sink
38
41
42
+ assert (self .speed <= 1 )
43
+ interval = int (1 / self .speed )
44
+ yieldcnt = 0
45
+
39
46
for i in range (self .initial_delay ):
40
47
yield
41
48
@@ -44,17 +51,28 @@ def sync_process(self):
44
51
for k , v in self .data .items ():
45
52
yield getattr (sink , k ).eq (v [i ])
46
53
54
+ if self .randomize :
55
+ trigger = (random .random () < self .speed )
56
+ else :
57
+ trigger = (((yieldcnt + 1 ) % interval ) == 0 )
58
+
47
59
if (not (yield sink .valid ) \
48
60
or ((yield sink .valid ) and (yield sink .ready ))) \
49
- and ( random . random () < self . speed ) :
61
+ and trigger :
50
62
yield sink .valid .eq (1 )
51
63
52
64
yield
65
+ yieldcnt += 1
53
66
54
67
if (yield sink .valid ) and (yield sink .ready ):
55
68
if self .verbose :
56
69
for k , v in self .data .items ():
57
70
print (self .strname , "\t " , k , hex (v [i ]) if not self .decimal else v [i ])
71
+ if self .callback :
72
+ current = {}
73
+ for k , v in self .data .items ():
74
+ current [k ] = v [i ]
75
+ self .callback (current )
58
76
59
77
i += 1
60
78
yield sink .valid .eq (0 )
0 commit comments