Skip to content

Commit 30aef73

Browse files
committed
Merge branch 'feature_stream_generator' into develop
2 parents 6cae511 + 6197211 commit 30aef73

File tree

6 files changed

+203
-4
lines changed

6 files changed

+203
-4
lines changed

tests/extension/thread_/stream/thread_stream.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ def mkTest(memimg_name=None):
105105
params=m.connect_params(led),
106106
ports=m.connect_ports(led))
107107

108-
simulation.setup_waveform(m, uut)
108+
# simulation.setup_waveform(m, uut)
109109
simulation.setup_clock(m, clk, hperiod=5)
110110
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
111111

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
TARGET=$(shell ls *.py | grep -v test | grep -v parsetab.py)
2+
ARGS=
3+
4+
PYTHON=python3
5+
#PYTHON=python
6+
#OPT=-m pdb
7+
#OPT=-m cProfile -s time
8+
#OPT=-m cProfile -o profile.rslt
9+
10+
.PHONY: all
11+
all: test
12+
13+
.PHONY: run
14+
run:
15+
$(PYTHON) $(OPT) $(TARGET) $(ARGS)
16+
17+
.PHONY: test
18+
test:
19+
$(PYTHON) -m pytest -vv
20+
21+
.PHONY: check
22+
check:
23+
$(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v
24+
iverilog -tnull -Wall tmp.v
25+
rm -f tmp.v
26+
27+
.PHONY: clean
28+
clean:
29+
rm -rf *.pyc __pycache__ parsetab.py .cache *.out *.png *.dot tmp.v uut.vcd
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
4+
import os
5+
import veriloggen
6+
import thread_stream_infinite
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_stream_infinite.run(filename=None, simtype=simtype,
15+
outputfile=os.path.splitext(os.path.basename(__file__))[0] + '.out')
16+
17+
verify_rslt = rslt.splitlines()[-1]
18+
assert(verify_rslt == '# verify: PASSED')
Lines changed: 148 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,148 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
6+
# the next line can be removed after installation
7+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(
8+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))))
9+
10+
from veriloggen import *
11+
import veriloggen.thread as vthread
12+
import veriloggen.types.axi as axi
13+
14+
15+
def mkLed():
16+
m = Module('blinkled')
17+
clk = m.Input('CLK')
18+
rst = m.Input('RST')
19+
20+
datawidth = 32
21+
addrwidth = 10
22+
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth)
23+
ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth)
24+
ram_b = vthread.RAM(m, 'ram_b', clk, rst, datawidth, addrwidth)
25+
ram_c = vthread.RAM(m, 'ram_c', clk, rst, datawidth, addrwidth)
26+
27+
# When infinite is True, the stream does not stop even if all sources are halted.
28+
strm = vthread.Stream(m, 'mystream', clk, rst, infinite=True)
29+
addr = strm.Counter()
30+
size = strm.parameter('size')
31+
a = strm.read_RAM('a', addr)
32+
b = strm.read_RAM('b', addr)
33+
c = a + b
34+
strm.sink(c, 'c')
35+
# To terminate the exection, a termination condition should be specified.
36+
strm.terminate(addr >= size - 1)
37+
38+
def comp_stream(size, offset):
39+
strm.set_parameter('size', size)
40+
strm.set_read_RAM('a', ram_a)
41+
strm.set_read_RAM('b', ram_b)
42+
strm.set_sink('c', ram_c, offset, size)
43+
strm.run()
44+
strm.join()
45+
46+
def comp_sequential(size, offset):
47+
sum = 0
48+
for i in range(size):
49+
a = ram_a.read(i + offset)
50+
b = ram_b.read(i + offset)
51+
sum = a + b
52+
ram_c.write(i + offset, sum)
53+
54+
def check(size, offset_stream, offset_seq):
55+
all_ok = True
56+
for i in range(size):
57+
st = ram_c.read(i + offset_stream)
58+
sq = ram_c.read(i + offset_seq)
59+
if vthread.verilog.NotEql(st, sq):
60+
all_ok = False
61+
if all_ok:
62+
print('# verify: PASSED')
63+
else:
64+
print('# verify: FAILED')
65+
66+
def comp(size):
67+
# stream
68+
offset = 0
69+
myaxi.dma_read(ram_a, offset, 0, size)
70+
myaxi.dma_read(ram_b, offset, 512, size)
71+
comp_stream(size, offset)
72+
myaxi.dma_write(ram_c, offset, 1024, size)
73+
74+
# sequential
75+
offset = size
76+
myaxi.dma_read(ram_a, offset, 0, size)
77+
myaxi.dma_read(ram_b, offset, 512, size)
78+
comp_sequential(size, offset)
79+
myaxi.dma_write(ram_c, offset, 1024 * 2, size)
80+
81+
# verification
82+
myaxi.dma_read(ram_c, 0, 1024, size)
83+
myaxi.dma_read(ram_c, offset, 1024 * 2, size)
84+
check(size, 0, offset)
85+
86+
vthread.finish()
87+
88+
th = vthread.Thread(m, 'th_comp', clk, rst, comp)
89+
fsm = th.start(32)
90+
91+
return m
92+
93+
94+
def mkTest(memimg_name=None):
95+
m = Module('test')
96+
97+
# target instance
98+
led = mkLed()
99+
100+
# copy paras and ports
101+
params = m.copy_params(led)
102+
ports = m.copy_sim_ports(led)
103+
104+
clk = ports['CLK']
105+
rst = ports['RST']
106+
107+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name)
108+
memory.connect(ports, 'myaxi')
109+
110+
uut = m.Instance(led, 'uut',
111+
params=m.connect_params(led),
112+
ports=m.connect_ports(led))
113+
114+
# simulation.setup_waveform(m, uut)
115+
simulation.setup_clock(m, clk, hperiod=5)
116+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
117+
118+
init.add(
119+
Delay(1000000),
120+
Systask('finish'),
121+
)
122+
123+
return m
124+
125+
126+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
127+
128+
if outputfile is None:
129+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
130+
131+
memimg_name = 'memimg_' + outputfile
132+
133+
test = mkTest(memimg_name=memimg_name)
134+
135+
if filename is not None:
136+
test.to_verilog(filename)
137+
138+
sim = simulation.Simulator(test, sim=simtype)
139+
rslt = sim.run(outputfile=outputfile)
140+
lines = rslt.splitlines()
141+
if simtype == 'verilator' and lines[-1].startswith('-'):
142+
rslt = '\n'.join(lines[:-1])
143+
return rslt
144+
145+
146+
if __name__ == '__main__':
147+
rslt = run(filename='tmp.v')
148+
print(rslt)

tests/extension/thread_/stream_write_fifo/thread_stream_write_fifo.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,14 @@ def mkLed():
4343
b = strm.source('b')
4444
a = a * strm.Int(2)
4545
b = b * strm.Int(3)
46-
4746
c = a + b
4847
d = c
4948
strm.write_fifo('d', d)
50-
strm.sink(c, 'c')
5149

5250
def comp_stream(size, offset):
5351
strm.set_source_fifo('a', fifo_a, size)
5452
strm.set_source('b', ram_b, offset, size)
5553
strm.set_write_fifo('d', fifo_c)
56-
strm.set_sink_empty('c')
5754
strm.run()
5855
# strm.join()
5956

veriloggen/thread/stream.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class Stream(BaseStream):
7474
ram_delay = 0
7575

7676
def __init__(self, m, name, clk, rst,
77+
infinite=False,
7778
datawidth=32, addrwidth=32,
7879
max_pattern_length=4, max_multipattern_length=2,
7980
ram_sel_width=8, fsm_as_module=False,
@@ -97,6 +98,8 @@ def __init__(self, m, name, clk, rst,
9798
self.datawidth = datawidth
9899
self.addrwidth = addrwidth
99100

101+
self.infinite = infinite
102+
100103
self.max_pattern_length = max_pattern_length
101104
self.max_multipattern_length = max_multipattern_length
102105
self.ram_sel_width = ram_sel_width
@@ -1672,6 +1675,10 @@ def _synthesize_run(self):
16721675

16731676
end_cond = make_condition(done_cond, self.fsm.here)
16741677

1678+
# infinite execution (stream does stop even if all sources are halted.)
1679+
if self.infinite:
1680+
end_cond = vtypes.Int(0, width=1)
1681+
16751682
# terminate
16761683
term_cond = None
16771684
for term in self.terminates:

0 commit comments

Comments
 (0)