Skip to content

Commit f95000c

Browse files
committed
Merge branch 'feature_stream_reduce' into develop
2 parents a6c719d + 6682333 commit f95000c

File tree

7 files changed

+460
-0
lines changed

7 files changed

+460
-0
lines changed
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_reduce_arg_max
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_stream_reduce_arg_max.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: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
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+
26+
strm = vthread.Stream(m, 'mystream', clk, rst)
27+
a = strm.source('a')
28+
size = strm.constant('size')
29+
index, _max, argmax_valid = strm.ReduceArgMaxValid(a, size)
30+
strm.sink(index, 'index', when=argmax_valid, when_name='argmax_valid')
31+
32+
def comp_stream(size, offset):
33+
strm.set_source('a', ram_a, offset, size)
34+
strm.set_constant('size', size)
35+
strm.set_sink('index', ram_b, offset, 1)
36+
strm.run()
37+
strm.join()
38+
39+
def comp_sequential(size, offset):
40+
index = 0
41+
_max = 0
42+
for i in range(size):
43+
a = ram_a.read(i + offset)
44+
if a > _max:
45+
index = i
46+
_max = a
47+
ram_b.write(offset, index)
48+
49+
def check(size, offset_stream, offset_seq):
50+
all_ok = True
51+
for i in range(size):
52+
st = ram_b.read(i + offset_stream)
53+
sq = ram_b.read(i + offset_seq)
54+
if vthread.verilog.NotEql(st, sq):
55+
all_ok = False
56+
if all_ok:
57+
print('# verify: PASSED')
58+
else:
59+
print('# verify: FAILED')
60+
61+
def comp(size):
62+
offset = 0
63+
myaxi.dma_read(ram_a, offset, 0, size)
64+
ram_a.write(offset + 3, -100)
65+
ram_a.write(offset + 7, 200)
66+
comp_stream(size, offset)
67+
myaxi.dma_write(ram_b, offset, 1024, 1)
68+
69+
offset = size
70+
myaxi.dma_read(ram_a, offset, 0, size)
71+
ram_a.write(offset + 3, -100)
72+
ram_a.write(offset + 7, 200)
73+
comp_sequential(size, offset)
74+
myaxi.dma_write(ram_b, offset, 1024 * 2, 1)
75+
76+
check(1, 0, offset)
77+
78+
vthread.finish()
79+
80+
th = vthread.Thread(m, 'th_comp', clk, rst, comp)
81+
fsm = th.start(32)
82+
83+
return m
84+
85+
86+
def mkTest(memimg_name=None):
87+
m = Module('test')
88+
89+
# target instance
90+
led = mkLed()
91+
92+
# copy paras and ports
93+
params = m.copy_params(led)
94+
ports = m.copy_sim_ports(led)
95+
96+
clk = ports['CLK']
97+
rst = ports['RST']
98+
99+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name)
100+
memory.connect(ports, 'myaxi')
101+
102+
uut = m.Instance(led, 'uut',
103+
params=m.connect_params(led),
104+
ports=m.connect_ports(led))
105+
106+
#simulation.setup_waveform(m, uut)
107+
simulation.setup_clock(m, clk, hperiod=5)
108+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
109+
110+
init.add(
111+
Delay(1000000),
112+
Systask('finish'),
113+
)
114+
115+
return m
116+
117+
118+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
119+
120+
if outputfile is None:
121+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
122+
123+
memimg_name = 'memimg_' + outputfile
124+
125+
test = mkTest(memimg_name=memimg_name)
126+
127+
if filename is not None:
128+
test.to_verilog(filename)
129+
130+
sim = simulation.Simulator(test, sim=simtype)
131+
rslt = sim.run(outputfile=outputfile)
132+
lines = rslt.splitlines()
133+
if simtype == 'verilator' and lines[-1].startswith('-'):
134+
rslt = '\n'.join(lines[:-1])
135+
return rslt
136+
137+
138+
if __name__ == '__main__':
139+
rslt = run(filename='tmp.v')
140+
print(rslt)
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_reduce_max
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_stream_reduce_max.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: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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+
26+
strm = vthread.Stream(m, 'mystream', clk, rst)
27+
a = strm.source('a')
28+
size = strm.constant('size')
29+
sum, sum_valid = strm.ReduceMaxValid(a, size)
30+
strm.sink(sum, 'sum', when=sum_valid, when_name='sum_valid')
31+
32+
def comp_stream(size, offset):
33+
strm.set_source('a', ram_a, offset, size)
34+
strm.set_constant('size', size)
35+
strm.set_sink('sum', ram_b, offset, 1)
36+
strm.run()
37+
strm.join()
38+
39+
def comp_sequential(size, offset):
40+
max = 0
41+
for i in range(size):
42+
a = ram_a.read(i + offset)
43+
if a > max:
44+
max = a
45+
ram_b.write(offset, max)
46+
47+
def check(size, offset_stream, offset_seq):
48+
all_ok = True
49+
for i in range(size):
50+
st = ram_b.read(i + offset_stream)
51+
sq = ram_b.read(i + offset_seq)
52+
if vthread.verilog.NotEql(st, sq):
53+
all_ok = False
54+
if all_ok:
55+
print('# verify: PASSED')
56+
else:
57+
print('# verify: FAILED')
58+
59+
def comp(size):
60+
offset = 0
61+
myaxi.dma_read(ram_a, offset, 0, size)
62+
comp_stream(size, offset)
63+
myaxi.dma_write(ram_b, offset, 1024, 1)
64+
65+
offset = size
66+
myaxi.dma_read(ram_a, offset, 0, size)
67+
comp_sequential(size, offset)
68+
myaxi.dma_write(ram_b, offset, 1024 * 2, 1)
69+
70+
check(1, 0, offset)
71+
72+
vthread.finish()
73+
74+
th = vthread.Thread(m, 'th_comp', clk, rst, comp)
75+
fsm = th.start(32)
76+
77+
return m
78+
79+
80+
def mkTest(memimg_name=None):
81+
m = Module('test')
82+
83+
# target instance
84+
led = mkLed()
85+
86+
# copy paras and ports
87+
params = m.copy_params(led)
88+
ports = m.copy_sim_ports(led)
89+
90+
clk = ports['CLK']
91+
rst = ports['RST']
92+
93+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name)
94+
memory.connect(ports, 'myaxi')
95+
96+
uut = m.Instance(led, 'uut',
97+
params=m.connect_params(led),
98+
ports=m.connect_ports(led))
99+
100+
#simulation.setup_waveform(m, uut)
101+
simulation.setup_clock(m, clk, hperiod=5)
102+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
103+
104+
init.add(
105+
Delay(1000000),
106+
Systask('finish'),
107+
)
108+
109+
return m
110+
111+
112+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
113+
114+
if outputfile is None:
115+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
116+
117+
memimg_name = 'memimg_' + outputfile
118+
119+
test = mkTest(memimg_name=memimg_name)
120+
121+
if filename is not None:
122+
test.to_verilog(filename)
123+
124+
sim = simulation.Simulator(test, sim=simtype)
125+
rslt = sim.run(outputfile=outputfile)
126+
lines = rslt.splitlines()
127+
if simtype == 'verilator' and lines[-1].startswith('-'):
128+
rslt = '\n'.join(lines[:-1])
129+
return rslt
130+
131+
132+
if __name__ == '__main__':
133+
rslt = run(filename='tmp.v')
134+
print(rslt)

0 commit comments

Comments
 (0)