Skip to content

Commit 97d0eb5

Browse files
committed
Merge branch 'feature_optimize_axim' into develop
2 parents 3623dfe + ef7d606 commit 97d0eb5

File tree

6 files changed

+531
-0
lines changed

6 files changed

+531
-0
lines changed
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
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_multibank_nested_ram_dma_block_non_poweroftwo
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_multibank_nested_ram_dma_block_non_poweroftwo.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')
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,218 @@
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(memory_datawidth=128):
16+
m = Module('blinkled')
17+
clk = m.Input('CLK')
18+
rst = m.Input('RST')
19+
20+
datawidth = 32
21+
addrwidth = 10
22+
numbanks = 3
23+
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, memory_datawidth)
24+
25+
pack_size = memory_datawidth // datawidth
26+
rams = [vthread.MultibankRAM(m, 'myram%d' % i, clk, rst, datawidth, addrwidth,
27+
numbanks=pack_size)
28+
for i in range(numbanks)]
29+
myram = vthread.to_multibank_ram(rams, keep_hierarchy=True)
30+
31+
all_ok = m.TmpReg(initval=0)
32+
33+
block_size = 8
34+
array_len = 128
35+
array_size = (array_len + array_len) * 4 * numbanks
36+
37+
laddr_offset = 32
38+
39+
def blink(size):
40+
all_ok.value = True
41+
42+
print('# start')
43+
# Test for 4KB boundary check
44+
offset = 1024 * 16 + (myaxi.boundary_size - 4)
45+
body(size, offset)
46+
print('# end')
47+
48+
if all_ok:
49+
print('# verify: PASSED')
50+
else:
51+
print('# verify: FAILED')
52+
53+
vthread.finish()
54+
55+
def body(size, offset):
56+
# write
57+
count = 0
58+
blk_offset = laddr_offset
59+
bias = 0
60+
done = False
61+
while count < size:
62+
for bank in range(numbanks):
63+
for i in range(block_size):
64+
wdata = bias + i + 512
65+
myram.write_bank(bank, blk_offset + i, wdata)
66+
count += 1
67+
if count >= size:
68+
done = True
69+
break
70+
if done:
71+
break
72+
bias += block_size
73+
blk_offset += block_size
74+
75+
laddr = laddr_offset
76+
gaddr = offset
77+
myaxi.dma_write_block(myram, laddr, gaddr, size, block_size)
78+
print('dma_write: [%d] -> [%d]' % (laddr, gaddr))
79+
80+
# write
81+
count = 0
82+
blk_offset = laddr_offset
83+
bias = 0
84+
done = False
85+
while count < size:
86+
for bank in range(numbanks):
87+
for i in range(block_size):
88+
wdata = bias + i + 1024
89+
myram.write_bank(bank, blk_offset + i, wdata)
90+
count += 1
91+
if count >= size:
92+
done = True
93+
break
94+
if done:
95+
break
96+
bias += block_size
97+
blk_offset += block_size
98+
99+
laddr = laddr_offset
100+
gaddr = array_size + offset
101+
myaxi.dma_write_block(myram, laddr, gaddr, size, block_size)
102+
print('dma_write: [%d] -> [%d]' % (laddr, gaddr))
103+
104+
# read
105+
laddr = laddr_offset
106+
gaddr = offset
107+
myaxi.dma_read_block(myram, laddr, gaddr, size, block_size)
108+
print('dma_read: [%d] <- [%d]' % (laddr, gaddr))
109+
110+
count = 0
111+
blk_offset = laddr_offset
112+
bias = 0
113+
done = False
114+
while count < size:
115+
for bank in range(numbanks):
116+
for i in range(block_size):
117+
rdata = myram.read_bank(bank, blk_offset + i)
118+
exp = bias + i + 512
119+
if vthread.verilog.NotEql(rdata, exp):
120+
print('rdata[%d:%d] = %d:%d' % (bank, i, rdata, exp))
121+
all_ok.value = False
122+
count += 1
123+
if count >= size:
124+
done = True
125+
break
126+
if done:
127+
break
128+
bias += block_size
129+
blk_offset += block_size
130+
131+
# read
132+
laddr = laddr_offset
133+
gaddr = array_size + offset
134+
myaxi.dma_read_block(myram, laddr, gaddr, size, block_size)
135+
print('dma_read: [%d] <- [%d]' % (laddr, gaddr))
136+
137+
count = 0
138+
blk_offset = laddr_offset
139+
bias = 0
140+
done = False
141+
while count < size:
142+
for bank in range(numbanks):
143+
for i in range(block_size):
144+
rdata = myram.read_bank(bank, blk_offset + i)
145+
exp = bias + i + 1024
146+
if vthread.verilog.NotEql(rdata, exp):
147+
print('rdata[%d:%d] = %d:%d' % (bank, i, rdata, exp))
148+
all_ok.value = False
149+
count += 1
150+
if count >= size:
151+
done = True
152+
break
153+
if done:
154+
break
155+
bias += block_size
156+
blk_offset += block_size
157+
158+
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
159+
fsm = th.start(array_len)
160+
161+
return m
162+
163+
164+
def mkTest(memimg_name=None, memory_datawidth=128):
165+
m = Module('test')
166+
167+
# target instance
168+
led = mkLed(memory_datawidth)
169+
170+
# copy paras and ports
171+
params = m.copy_params(led)
172+
ports = m.copy_sim_ports(led)
173+
174+
clk = ports['CLK']
175+
rst = ports['RST']
176+
177+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memory_datawidth)
178+
memory.connect(ports, 'myaxi')
179+
180+
uut = m.Instance(led, 'uut',
181+
params=m.connect_params(led),
182+
ports=m.connect_ports(led))
183+
184+
# simulation.setup_waveform(m, uut)
185+
simulation.setup_clock(m, clk, hperiod=5)
186+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
187+
188+
init.add(
189+
Delay(1000000),
190+
Systask('finish'),
191+
)
192+
193+
return m
194+
195+
196+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
197+
198+
if outputfile is None:
199+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
200+
201+
memimg_name = 'memimg_' + outputfile
202+
203+
test = mkTest(memimg_name=memimg_name)
204+
205+
if filename is not None:
206+
test.to_verilog(filename)
207+
208+
sim = simulation.Simulator(test, sim=simtype)
209+
rslt = sim.run(outputfile=outputfile)
210+
lines = rslt.splitlines()
211+
if simtype == 'verilator' and lines[-1].startswith('-'):
212+
rslt = '\n'.join(lines[:-1])
213+
return rslt
214+
215+
216+
if __name__ == '__main__':
217+
rslt = run(filename='tmp.v')
218+
print(rslt)
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
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_multibank_ram_dma_block_non_poweroftwo
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_multibank_ram_dma_block_non_poweroftwo.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')

0 commit comments

Comments
 (0)