Skip to content

Commit f1d92f4

Browse files
committed
Merge branch 'rc-1.8.6'
2 parents f776b4c + fbbcd4a commit f1d92f4

File tree

4 files changed

+258
-18
lines changed

4 files changed

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

veriloggen/types/axi.py

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2898,23 +2898,24 @@ def __init__(self, m, name, clk, rst, datawidth=32, addrwidth=32,
28982898
self.rdata.ruser.assign(rdata_user_mode)
28992899

29002900
self.fsm = FSM(self.m, '_'.join(['', self.name, 'fsm']), clk, rst)
2901+
self.seq = self.fsm.seq
29012902

29022903
# write response
29032904
if self.wresp.bid is not None:
2904-
self.fsm.seq.If(self.waddr.awvalid, self.waddr.awready,
2905+
self.seq.If(self.waddr.awvalid, self.waddr.awready,
29052906
vtypes.Not(self.wresp.bvalid))(
29062907
self.wresp.bid(self.waddr.awid if self.waddr.awid is not None else 0)
29072908
)
29082909

29092910
if self.rdata.rid is not None:
2910-
self.fsm.seq.If(self.raddr.arvalid, self.raddr.arready)(
2911+
self.seq.If(self.raddr.arvalid, self.raddr.arready)(
29112912
self.rdata.rid(self.raddr.arid if self.raddr.arid is not None else 0)
29122913
)
29132914

2914-
self.fsm.seq.If(self.wresp.bvalid, self.wresp.bready)(
2915+
self.seq.If(self.wresp.bvalid, self.wresp.bready)(
29152916
self.wresp.bvalid(0)
29162917
)
2917-
self.fsm.seq.If(self.wdata.wvalid, self.wdata.wready, self.wdata.wlast)(
2918+
self.seq.If(self.wdata.wvalid, self.wdata.wready, self.wdata.wlast)(
29182919
self.wresp.bvalid(1)
29192920
)
29202921

@@ -2997,21 +2998,21 @@ def _make_fsm(self, write_delay=10, read_delay=10, sleep=4, sub_sleep=4):
29972998
sub_sleep_count = self.m.Reg(
29982999
'_'.join(['', 'sub_sleep_count']), self.addrwidth + 1, initval=0)
29993000

3000-
self.fsm.seq.If(sleep_count == sleep - 1)(
3001+
self.seq.If(sleep_count == sleep - 1)(
30013002
sub_sleep_count.inc()
30023003
)
3003-
self.fsm.seq.If(sleep_count == sleep - 1,
3004+
self.seq.If(sleep_count == sleep - 1,
30043005
sub_sleep_count == sub_sleep - 1)(
30053006
sub_sleep_count(0)
30063007
)
30073008
cond = sub_sleep_count == sub_sleep - 1
30083009
else:
30093010
cond = None
30103011

3011-
self.fsm.seq.If(sleep_count < sleep - 1)(
3012+
self.seq.If(sleep_count < sleep - 1)(
30123013
sleep_count.inc()
30133014
)
3014-
self.fsm.seq.If(cond, sleep_count == sleep - 1)(
3015+
self.seq.If(cond, sleep_count == sleep - 1)(
30153016
sleep_count(0)
30163017
)
30173018

@@ -3155,7 +3156,7 @@ def write(self, fsm, addr, wdata):
31553156
wdata_wire.assign(wdata)
31563157

31573158
for i in range(num_bytes):
3158-
self.fsm.seq.If(cond)(
3159+
self.seq.If(cond)(
31593160
self.mem[addr + i](wdata_wire[i * 8:i * 8 + 8])
31603161
)
31613162

@@ -3211,7 +3212,7 @@ def write_word(self, fsm, word_index, byte_offset, wdata, bits=8):
32113212
raw_data_wire.assign(raw_data)
32123213

32133214
for i in range(num_bytes):
3214-
self.fsm.seq.If(cond)(
3215+
self.seq.If(cond)(
32153216
self.mem[addr + i](raw_data_wire[i * 8:i * 8 + 8])
32163217
)
32173218

@@ -3351,8 +3352,6 @@ def __init__(self, m, name, clk, rst, datawidth=32, addrwidth=32, numports=2,
33513352
self._make_fsms(write_delay, read_delay, sleep, sub_sleep)
33523353

33533354
def _make_fsms(self, write_delay=10, read_delay=10, sleep=4, sub_sleep=4):
3354-
write_mode = 0
3355-
read_mode = 0
33563355

33573356
for i, (fsm, waddr, wdata, wresp, raddr, rdata) in enumerate(
33583357
zip(self.fsms, self.waddrs, self.wdatas, self.wresps, self.raddrs, self.rdatas)):
@@ -3392,12 +3391,8 @@ def _make_fsms(self, write_delay=10, read_delay=10, sleep=4, sub_sleep=4):
33923391
sleep_count(0)
33933392
)
33943393

3395-
offset = 100 * i
3396-
while offset <= read_mode + read_delay + 10:
3397-
offset += 100
3398-
3399-
write_mode = offset + 100
3400-
read_mode = offset + 200
3394+
write_mode = 100
3395+
read_mode = 200
34013396
while read_mode <= write_mode + write_delay + 10:
34023397
read_mode += 100
34033398

0 commit comments

Comments
 (0)