Skip to content

Commit 7502afc

Browse files
committed
1.8.7-rc
1 parent c8fa862 commit 7502afc

File tree

5 files changed

+313
-1
lines changed

5 files changed

+313
-1
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_multiport_memorymodel_split_read_write
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_multiport_memorymodel_split_read_write.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,220 @@
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+
23+
# With async DMA, set enable_async = True
24+
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth, enable_async=True)
25+
# If RAM is simultaneously accesseed with DMA, numports must be 2 or more.
26+
myram = vthread.RAM(m, 'myram', clk, rst, datawidth, addrwidth, numports=2)
27+
28+
saxi = vthread.AXISLiteRegister(m, 'saxi', clk, rst, datawidth)
29+
30+
all_ok = m.TmpReg(initval=0)
31+
32+
def blink(size):
33+
# wait start
34+
saxi.wait_flag(0, value=1, resetvalue=0)
35+
# reset done
36+
saxi.write(1, 0)
37+
38+
all_ok.value = True
39+
40+
for i in range(4):
41+
print('# iter %d start' % i)
42+
# Test for 4KB boundary check
43+
offset = i * 1024 * 16 + (myaxi.boundary_size - 4)
44+
body(size, offset)
45+
print('# iter %d end' % i)
46+
47+
if all_ok:
48+
print('# verify (local): PASSED')
49+
else:
50+
print('# verify (local): FAILED')
51+
52+
# result
53+
saxi.write(2, all_ok)
54+
55+
# done
56+
saxi.write_flag(1, 1, resetvalue=0)
57+
58+
def body(size, offset):
59+
# write
60+
for i in range(size):
61+
wdata = i + 100
62+
myram.write(i, wdata)
63+
64+
w_laddr = 0
65+
w_gaddr = offset
66+
# If RAM is simultaneously accesseed with DMA, different port must be
67+
# used.
68+
myaxi.dma_write_async(myram, w_laddr, w_gaddr, size, port=1)
69+
print('dma_write_async: [%d] -> [%d]' % (w_laddr, w_gaddr))
70+
71+
# write
72+
for i in range(size):
73+
wdata = i + 1000
74+
myram.write(i + size, wdata)
75+
76+
myaxi.dma_wait_write()
77+
print('dma_wait_write : [%d] -> [%d]' % (w_laddr, w_gaddr))
78+
79+
w_laddr = size
80+
w_gaddr = (size + size) * 4 + offset
81+
myaxi.dma_write_async(myram, w_laddr, w_gaddr, size, port=1)
82+
print('dma_write_async: [%d] -> [%d]' % (w_laddr, w_gaddr))
83+
84+
# read
85+
r_laddr = 0
86+
r_gaddr = offset
87+
myaxi.dma_read_async(myram, r_laddr, r_gaddr, size, port=0)
88+
print('dma_read_async : [%d] <- [%d]' % (r_laddr, r_gaddr))
89+
90+
for sleep in range(size):
91+
pass
92+
93+
myaxi.dma_wait_write()
94+
print('dma_wait_write : [%d] -> [%d]' % (w_laddr, w_gaddr))
95+
96+
myaxi.dma_wait_read()
97+
print('dma_wait_read : [%d] <- [%d]' % (r_laddr, r_gaddr))
98+
99+
for i in range(size):
100+
rdata = myram.read(i)
101+
if vthread.verilog.NotEql(rdata, i + 100):
102+
print('rdata[%d] = %d' % (i, rdata))
103+
all_ok.value = False
104+
105+
# read
106+
r_laddr = 0
107+
r_gaddr = (size + size) * 4 + offset
108+
myaxi.dma_read(myram, r_laddr, r_gaddr, size, port=0)
109+
print('dma_read : [%d] <- [%d]' % (r_laddr, r_gaddr))
110+
111+
for sleep in range(size):
112+
pass
113+
114+
for i in range(size):
115+
rdata = myram.read(i)
116+
if vthread.verilog.NotEql(rdata, i + 1000):
117+
print('rdata[%d] = %d' % (i, rdata))
118+
all_ok.value = False
119+
120+
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
121+
fsm = th.start(32)
122+
123+
return m
124+
125+
126+
def mkTest(memimg_name=None):
127+
m = Module('test')
128+
129+
# target instance
130+
led = mkLed()
131+
132+
# copy paras and ports
133+
params = m.copy_params(led)
134+
ports = m.copy_sim_ports(led)
135+
136+
clk = ports['CLK']
137+
rst = ports['RST']
138+
139+
memory = axi.AxiMultiportMemoryModel(m, 'memory', clk, rst, numports=2,
140+
memimg_name=memimg_name)
141+
142+
r_ports, w_ports = axi.split_read_write(m, ports, 'myaxi')
143+
144+
memory.connect(0, r_ports, 'r_myaxi')
145+
memory.connect(1, w_ports, 'w_myaxi')
146+
147+
# AXI-Slave controller
148+
_saxi = vthread.AXIMLite(m, '_saxi', clk, rst, noio=True)
149+
_saxi.connect(ports, 'saxi')
150+
151+
def ctrl():
152+
for i in range(100):
153+
pass
154+
155+
for i in range(16):
156+
# byte addressing
157+
v = memory.read(i * 4)
158+
print('read: mem[%d] -> %x' % (i, v))
159+
v = v + 1024
160+
# byte addressing
161+
memory.write(i * 4, v)
162+
print('write: mem[%d] <- %x' % (i, v))
163+
164+
awaddr = 0
165+
_saxi.write(awaddr, 1)
166+
167+
araddr = 4
168+
v = _saxi.read(araddr)
169+
while v == 0:
170+
v = _saxi.read(araddr)
171+
172+
araddr = 8
173+
v = _saxi.read(araddr)
174+
if v:
175+
print('# verify: PASSED')
176+
else:
177+
print('# verify: FAILED')
178+
179+
th = vthread.Thread(m, 'th_ctrl', clk, rst, ctrl)
180+
fsm = th.start()
181+
182+
uut = m.Instance(led, 'uut',
183+
params=m.connect_params(led),
184+
ports=m.connect_ports(led))
185+
186+
# simulation.setup_waveform(m, uut)
187+
simulation.setup_clock(m, clk, hperiod=5)
188+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
189+
190+
init.add(
191+
Delay(1000000),
192+
Systask('finish'),
193+
)
194+
195+
return m
196+
197+
198+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
199+
200+
if outputfile is None:
201+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
202+
203+
memimg_name = 'memimg_' + outputfile
204+
205+
test = mkTest(memimg_name=memimg_name)
206+
207+
if filename is not None:
208+
test.to_verilog(filename)
209+
210+
sim = simulation.Simulator(test, sim=simtype)
211+
rslt = sim.run(outputfile=outputfile)
212+
lines = rslt.splitlines()
213+
if simtype == 'verilator' and lines[-1].startswith('-'):
214+
rslt = '\n'.join(lines[:-1])
215+
return rslt
216+
217+
218+
if __name__ == '__main__':
219+
rslt = run(filename='tmp.v')
220+
print(rslt)

veriloggen/VERSION

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.8.6
1+
1.8.7

veriloggen/types/axi.py

+45
Original file line numberDiff line numberDiff line change
@@ -3831,3 +3831,48 @@ def align(src, num_align_words):
38313831
offset += res
38323832

38333833
return ret
3834+
3835+
3836+
def split_read_write(m, ports, prefix,
3837+
read_prefix='r_', write_prefix='w_'):
3838+
3839+
# Read (AR, R)
3840+
r_ports = {}
3841+
for name, port in ports.items():
3842+
r_name = read_prefix + port.name
3843+
3844+
if name.startswith(prefix + '_ar') or name.startswith(prefix + '_r'):
3845+
if isinstance(port, vtypes.Reg):
3846+
r_port = m.RegLike(port, name=r_name)
3847+
port.connect(r_port)
3848+
else:
3849+
r_port = m.WireLike(port, name=r_name)
3850+
r_port.connect(port)
3851+
else:
3852+
r_port = m.WireLike(port, name=r_name)
3853+
if isinstance(port, vtypes.Wire):
3854+
r_port.assign(0)
3855+
3856+
r_ports[r_name] = r_port
3857+
3858+
# Write (AW, W, B)
3859+
w_ports = {}
3860+
for name, port in ports.items():
3861+
w_name = write_prefix + port.name
3862+
3863+
if (name.startswith(prefix + '_aw') or
3864+
name.startswith(prefix + '_w') or name.startswith(prefix + '_b')):
3865+
if isinstance(port, vtypes.Reg):
3866+
w_port = m.RegLike(port, name=w_name)
3867+
port.connect(w_port)
3868+
else:
3869+
w_port = m.WireLike(port, name=w_name)
3870+
w_port.connect(port)
3871+
else:
3872+
w_port = m.WireLike(port, name=w_name)
3873+
if isinstance(port, vtypes.Wire):
3874+
w_port.assign(0)
3875+
3876+
w_ports[w_name] = w_port
3877+
3878+
return r_ports, w_ports

0 commit comments

Comments
 (0)