Skip to content

Commit 7bc0acc

Browse files
committed
Merge branch 'feature_axim_base_address' into develop
2 parents 109618a + 58ae6be commit 7bc0acc

File tree

4 files changed

+257
-8
lines changed

4 files changed

+257
-8
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_axi_dma_global_base_addr
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_axi_dma_global_base_addr.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: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
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+
use_global_base_addr=True,
24+
num_cmd_delay=1, num_data_delay=1)
25+
myram = vthread.RAM(m, 'myram', clk, rst, datawidth, addrwidth,
26+
numports=2)
27+
28+
all_ok = m.TmpReg(initval=0)
29+
30+
def blink(size):
31+
all_ok.value = True
32+
33+
myaxi.set_global_base_addr(4096 * 4)
34+
35+
for i in range(4):
36+
print('# iter %d start' % i)
37+
# Test for 4KB boundary check
38+
offset = i * 1024 * 16 + (myaxi.boundary_size - 4)
39+
body(size, offset)
40+
print('# iter %d end' % i)
41+
42+
if all_ok:
43+
print('# verify: PASSED')
44+
else:
45+
print('# verify: FAILED')
46+
47+
vthread.finish()
48+
49+
def body(size, offset):
50+
# write
51+
for i in range(size):
52+
wdata = i + 100
53+
myram.write(i, wdata)
54+
55+
laddr = 0
56+
gaddr = offset
57+
myaxi.dma_write(myram, laddr, gaddr, size, port=0)
58+
print('dma_write: [%d] -> [%d]' % (laddr, gaddr))
59+
60+
# write
61+
for i in range(size):
62+
wdata = i + 1000
63+
myram.write(i, wdata)
64+
65+
laddr = 0
66+
gaddr = (size + size) * 4 + offset
67+
myaxi.dma_write(myram, laddr, gaddr, size, port=1)
68+
print('dma_write: [%d] -> [%d]' % (laddr, gaddr))
69+
70+
# read
71+
laddr = 0
72+
gaddr = offset
73+
myaxi.dma_read(myram, laddr, gaddr, size, port=1)
74+
print('dma_read: [%d] <- [%d]' % (laddr, gaddr))
75+
76+
for i in range(size):
77+
rdata = myram.read(i)
78+
if vthread.verilog.NotEql(rdata, i + 100):
79+
print('rdata[%d] = %d' % (i, rdata))
80+
all_ok.value = False
81+
82+
# read
83+
laddr = 0
84+
gaddr = (size + size) * 4 + offset
85+
myaxi.dma_read(myram, laddr, gaddr, size, port=0)
86+
print('dma_read: [%d] <- [%d]' % (laddr, gaddr))
87+
88+
for i in range(size):
89+
rdata = myram.read(i)
90+
if vthread.verilog.NotEql(rdata, i + 1000):
91+
print('rdata[%d] = %d' % (i, rdata))
92+
all_ok.value = False
93+
94+
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
95+
fsm = th.start(16)
96+
97+
return m
98+
99+
100+
def mkTest(memimg_name=None):
101+
m = Module('test')
102+
103+
# target instance
104+
led = mkLed()
105+
106+
# copy paras and ports
107+
params = m.copy_params(led)
108+
ports = m.copy_sim_ports(led)
109+
110+
clk = ports['CLK']
111+
rst = ports['RST']
112+
113+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name)
114+
memory.connect(ports, 'myaxi')
115+
116+
uut = m.Instance(led, 'uut',
117+
params=m.connect_params(led),
118+
ports=m.connect_ports(led))
119+
120+
# simulation.setup_waveform(m, uut)
121+
simulation.setup_clock(m, clk, hperiod=5)
122+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
123+
124+
init.add(
125+
Delay(1000000),
126+
Systask('finish'),
127+
)
128+
129+
return m
130+
131+
132+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
133+
134+
if outputfile is None:
135+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
136+
137+
memimg_name = 'memimg_' + outputfile
138+
139+
test = mkTest(memimg_name=memimg_name)
140+
141+
if filename is not None:
142+
test.to_verilog(filename)
143+
144+
sim = simulation.Simulator(test, sim=simtype)
145+
rslt = sim.run(outputfile=outputfile)
146+
lines = rslt.splitlines()
147+
if simtype == 'verilator' and lines[-1].startswith('-'):
148+
rslt = '\n'.join(lines[:-1])
149+
return rslt
150+
151+
152+
if __name__ == '__main__':
153+
rslt = run(filename='tmp.v')
154+
print(rslt)

veriloggen/thread/axi.py

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,22 @@ class AXIM(AxiMaster, _MutexFunction):
2424
'dma_read', 'dma_read_async',
2525
'dma_write', 'dma_write_async',
2626
'dma_wait_read', 'dma_wait_write',
27-
'dma_wait') + _MutexFunction.__intrinsics__
27+
'dma_wait_read', 'dma_wait_write', 'dma_wait',
28+
'set_global_base_addr',) + _MutexFunction.__intrinsics__
2829

2930
burstlen = 256
3031

3132
def __init__(self, m, name, clk, rst,
3233
datawidth=32, addrwidth=32, lite=False, noio=False,
33-
enable_async=False,
34+
enable_async=False, use_global_base_addr=False,
3435
num_cmd_delay=0, num_data_delay=0,
3536
op_sel_width=8, fsm_as_module=False):
3637

3738
AxiMaster.__init__(self, m, name, clk, rst,
3839
datawidth, addrwidth, lite=lite, noio=noio)
3940

4041
self.enable_async = enable_async
42+
self.use_global_base_addr = use_global_base_addr
4143
self.num_cmd_delay = num_cmd_delay
4244
self.num_data_delay = num_data_delay
4345
self.op_sel_width = op_sel_width
@@ -102,6 +104,12 @@ def __init__(self, m, name, clk, rst,
102104
self.write_start(0)
103105
)
104106

107+
if self.use_global_base_addr:
108+
self.global_base_addr = self.m.Reg('_'.join(['', self.name, 'global_base_addr']),
109+
self.addrwidth, initval=0)
110+
else:
111+
self.global_base_addr = None
112+
105113
self.write_op_id_map = OrderedDict()
106114
self.write_op_id_count = 1
107115
self.write_reqs = OrderedDict()
@@ -219,6 +227,16 @@ def dma_wait(self, fsm):
219227

220228
fsm.If(self.read_idle, self.write_idle).goto_next()
221229

230+
def set_global_base_addr(self, fsm, addr):
231+
232+
if not self.use_global_base_addr:
233+
raise ValueError("global_base_addr is disabled.")
234+
235+
flag = self._set_flag(fsm)
236+
self.seq.If(flag)(
237+
self.global_base_addr(addr)
238+
)
239+
222240
# --------------------
223241
# read
224242
# --------------------
@@ -418,8 +436,13 @@ def _synthesize_read_fsm_same(self, ram, port, ram_method, ram_datawidth):
418436
ram_method(port, self.read_local_addr, w, self.read_size,
419437
stride=self.read_local_stride, cond=cond)
420438

439+
if not self.use_global_base_addr:
440+
gaddr = self.read_global_addr
441+
else:
442+
gaddr = self.read_global_addr + self.global_base_addr
443+
421444
fsm.If(self.read_start)(
422-
cur_global_addr(self.mask_addr(self.read_global_addr)),
445+
cur_global_addr(self.mask_addr(gaddr)),
423446
rest_size(self.read_size)
424447
)
425448
fsm.If(cond).goto_next()
@@ -551,8 +574,13 @@ def _synthesize_read_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
551574
ram_method(port, self.read_local_addr, w, self.read_size,
552575
stride=self.read_local_stride, cond=cond)
553576

577+
if not self.use_global_base_addr:
578+
gaddr = self.read_global_addr
579+
else:
580+
gaddr = self.read_global_addr + self.global_base_addr
581+
554582
fsm.If(self.read_start)(
555-
cur_global_addr(self.mask_addr(self.read_global_addr)),
583+
cur_global_addr(self.mask_addr(gaddr)),
556584
rest_size(dma_size)
557585
)
558586
fsm.If(cond).goto_next()
@@ -700,8 +728,13 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
700728
ram_method(port, self.read_local_addr, w, actual_read_size,
701729
stride=self.read_local_stride, cond=cond)
702730

731+
if not self.use_global_base_addr:
732+
gaddr = self.read_global_addr
733+
else:
734+
gaddr = self.read_global_addr + self.global_base_addr
735+
703736
fsm.If(self.read_start)(
704-
cur_global_addr(self.mask_addr(self.read_global_addr)),
737+
cur_global_addr(self.mask_addr(gaddr)),
705738
rest_size(dma_size)
706739
)
707740
fsm.If(cond).goto_next()
@@ -979,8 +1012,13 @@ def _synthesize_write_fsm_same(self, ram, port, ram_method, ram_datawidth):
9791012
data = self.df._Delay(data)
9801013
last = self.df._Delay(last)
9811014

1015+
if not self.use_global_base_addr:
1016+
gaddr = self.write_global_addr
1017+
else:
1018+
gaddr = self.write_global_addr + self.global_base_addr
1019+
9821020
fsm.If(self.write_start)(
983-
cur_global_addr(self.mask_addr(self.write_global_addr)),
1021+
cur_global_addr(self.mask_addr(gaddr)),
9841022
rest_size(self.write_size)
9851023
)
9861024
fsm.If(cond).goto_next()
@@ -1118,8 +1156,13 @@ def _synthesize_write_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
11181156
data = self.df._Delay(data)
11191157
last = self.df._Delay(last)
11201158

1159+
if not self.use_global_base_addr:
1160+
gaddr = self.write_global_addr
1161+
else:
1162+
gaddr = self.write_global_addr + self.global_base_addr
1163+
11211164
fsm.If(self.write_start)(
1122-
cur_global_addr(self.mask_addr(self.write_global_addr)),
1165+
cur_global_addr(self.mask_addr(gaddr)),
11231166
rest_size(dma_size)
11241167
)
11251168
fsm.If(cond).goto_next()
@@ -1298,8 +1341,13 @@ def _synthesize_write_fsm_wide(self, ram, port, ram_method, ram_datawidth):
12981341
data = self.df._Delay(data)
12991342
last = self.df._Delay(last)
13001343

1344+
if not self.use_global_base_addr:
1345+
gaddr = self.write_global_addr
1346+
else:
1347+
gaddr = self.write_global_addr + self.global_base_addr
1348+
13011349
fsm.If(self.write_start)(
1302-
cur_global_addr(self.mask_addr(self.write_global_addr)),
1350+
cur_global_addr(self.mask_addr(gaddr)),
13031351
rest_size(dma_size)
13041352
)
13051353
fsm.If(cond).goto_next()

0 commit comments

Comments
 (0)