Skip to content

Commit 9e7372b

Browse files
committed
stream_narrow with 4-bit
1 parent 6f0fa83 commit 9e7372b

File tree

3 files changed

+200
-0
lines changed

3 files changed

+200
-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_narrow
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_stream_narrow.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: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
import math
6+
import numpy as np
7+
8+
# the next line can be removed after installation
9+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(
10+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))))
11+
12+
from veriloggen import *
13+
import veriloggen.thread as vthread
14+
import veriloggen.types.axi as axi
15+
16+
17+
def mkLed(axi_datawidth=32, datawidth=4, addrwidth=10):
18+
m = Module('blinkled')
19+
clk = m.Input('CLK')
20+
rst = m.Input('RST')
21+
22+
numbanks = int(math.ceil(axi_datawidth / datawidth))
23+
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, axi_datawidth)
24+
ram_a = vthread.MultibankRAM(m, 'ram_a', clk, rst, datawidth, addrwidth,
25+
numbanks=numbanks)
26+
ram_b = vthread.MultibankRAM(m, 'ram_b', clk, rst, datawidth, addrwidth,
27+
numbanks=numbanks)
28+
ram_c = vthread.MultibankRAM(m, 'ram_c', clk, rst, datawidth, addrwidth,
29+
numbanks=numbanks)
30+
31+
strm = vthread.Stream(m, 'mystream', clk, rst, datawidth=datawidth)
32+
a = strm.source('a')
33+
b = strm.source('b')
34+
c = a + b
35+
strm.sink(c, 'c')
36+
37+
def comp_stream(size, offset):
38+
strm.set_source('a', ram_a, offset, size)
39+
strm.set_source('b', ram_b, offset, size)
40+
strm.set_sink('c', ram_c, offset, size)
41+
strm.run()
42+
strm.join()
43+
44+
def comp_sequential(size, offset):
45+
sum = 0
46+
for i in range(size):
47+
a = ram_a.read(i + offset)
48+
b = ram_b.read(i + offset)
49+
sum = a + b
50+
ram_c.write(i + offset, sum)
51+
52+
def check(size, offset_stream, offset_seq):
53+
all_ok = True
54+
for i in range(size):
55+
st = ram_c.read(i + offset_stream)
56+
sq = ram_c.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+
# stream
66+
offset = 0
67+
myaxi.dma_read(ram_a, offset, 0, size)
68+
myaxi.dma_read(ram_b, offset, 512, size)
69+
comp_stream(size, offset)
70+
myaxi.dma_write(ram_c, offset, 1024, size)
71+
72+
# sequential
73+
offset = size
74+
myaxi.dma_read(ram_a, offset, 0, size)
75+
myaxi.dma_read(ram_b, offset, 512, size)
76+
comp_sequential(size, offset)
77+
myaxi.dma_write(ram_c, offset, 1024 * 2, size)
78+
79+
# verification
80+
check(size, 0, offset)
81+
82+
vthread.finish()
83+
84+
th = vthread.Thread(m, 'th_comp', clk, rst, comp)
85+
fsm = th.start(32)
86+
87+
return m
88+
89+
90+
def mkTest(memimg_name=None, axi_datawidth=32, datawidth=4, addrwidth=10):
91+
m = Module('test')
92+
93+
# target instance
94+
led = mkLed(axi_datawidth, datawidth, addrwidth)
95+
96+
# copy paras and ports
97+
params = m.copy_params(led)
98+
ports = m.copy_sim_ports(led)
99+
100+
clk = ports['CLK']
101+
rst = ports['RST']
102+
103+
memimg_datawidth = 32
104+
length = 1024 * 1024 // (memimg_datawidth // 8)
105+
mem = np.zeros([length], dtype=np.int64)
106+
data = np.arange(length, dtype=np.int64) % [2 ** (datawidth - 1)] + [1]
107+
addr = 0
108+
axi.set_memory(mem, data, memimg_datawidth, datawidth, addr, None)
109+
110+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst,
111+
memimg=mem, memimg_name=memimg_name,
112+
memimg_datawidth=memimg_datawidth)
113+
memory.connect(ports, 'myaxi')
114+
115+
uut = m.Instance(led, 'uut',
116+
params=m.connect_params(led),
117+
ports=m.connect_ports(led))
118+
119+
# simulation.setup_waveform(m, uut)
120+
simulation.setup_clock(m, clk, hperiod=5)
121+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
122+
123+
init.add(
124+
Delay(1000000),
125+
Systask('finish'),
126+
)
127+
128+
return m
129+
130+
131+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
132+
133+
if outputfile is None:
134+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
135+
136+
memimg_name = 'memimg_' + outputfile
137+
138+
test = mkTest(memimg_name=memimg_name)
139+
140+
if filename is not None:
141+
test.to_verilog(filename)
142+
143+
sim = simulation.Simulator(test, sim=simtype)
144+
rslt = sim.run(outputfile=outputfile)
145+
lines = rslt.splitlines()
146+
if simtype == 'verilator' and lines[-1].startswith('-'):
147+
rslt = '\n'.join(lines[:-1])
148+
return rslt
149+
150+
151+
if __name__ == '__main__':
152+
rslt = run(filename='tmp.v')
153+
print(rslt)

0 commit comments

Comments
 (0)