Skip to content

Commit dd61377

Browse files
committed
Merge branch 'feature_stream_extern' into develop
2 parents a893afe + b18c261 commit dd61377

20 files changed

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

0 commit comments

Comments
 (0)