Skip to content

Commit 7436f6d

Browse files
committed
stream_axi_stream_aync is using non-blocking read/write to AXI-Stream
1 parent 11bfd12 commit 7436f6d

File tree

4 files changed

+146
-7
lines changed

4 files changed

+146
-7
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_axi_stream_async
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_stream_axi_stream_async.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: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
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+
axi_a = vthread.AXIStreamIn(m, 'axi_a', clk, rst, datawidth, with_last=True,
24+
enable_async=True)
25+
axi_b = vthread.AXIStreamIn(m, 'axi_b', clk, rst, datawidth, with_last=True,
26+
enable_async=True)
27+
axi_c = vthread.AXIStreamOut(m, 'axi_c', clk, rst, datawidth, with_last=True,
28+
enable_async=True)
29+
30+
saxi = vthread.AXISLiteRegister(m, 'saxi', clk, rst, datawidth)
31+
32+
ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth, numports=2)
33+
ram_b = vthread.RAM(m, 'ram_b', clk, rst, datawidth, addrwidth, numports=2)
34+
ram_c = vthread.RAM(m, 'ram_c', clk, rst, datawidth, addrwidth, numports=2)
35+
36+
strm = vthread.Stream(m, 'mystream', clk, rst)
37+
a = strm.source('a')
38+
b = strm.source('b')
39+
c = a + b
40+
strm.sink(c, 'c')
41+
42+
def comp_stream(size, offset):
43+
strm.set_source('a', ram_a, offset, size)
44+
strm.set_source('b', ram_b, offset, size)
45+
strm.set_sink('c', ram_c, offset, size)
46+
strm.run()
47+
strm.join()
48+
49+
def comp():
50+
while True:
51+
saxi.wait_flag(0, value=1, resetvalue=0)
52+
saxi.write(1, 1) # set busy
53+
size = saxi.read(2)
54+
offset = 0
55+
56+
axi_a.read_stream_async(ram_a, offset, size, port=1) # non-blocking read
57+
axi_b.read_stream_async(ram_b, offset, size, port=1) # non-blocking read
58+
axi_a.wait_read_stream() # wait
59+
axi_b.wait_read_stream() # wait
60+
comp_stream(size, offset)
61+
axi_c.write_stream(ram_c, offset, size, port=1) # non-blocking write
62+
axi_c.wait_write_stream() # wait
63+
64+
saxi.write(1, 0) # unset busy
65+
66+
vthread.finish()
67+
68+
th = vthread.Thread(m, 'th_comp', clk, rst, comp)
69+
fsm = th.start()
70+
71+
return m
72+
73+
74+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
75+
76+
test = mkLed()
77+
78+
if filename is not None:
79+
test.to_verilog(filename)
80+
81+
return '# verify: PASSED'
82+
83+
84+
if __name__ == '__main__':
85+
rslt = run(filename='tmp.v')
86+
print(rslt)

veriloggen/thread/axi.py

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2330,7 +2330,7 @@ def _synthesize_read_fsm_same(self, ram, port, ram_method, ram_datawidth):
23302330
rest_size.dec()
23312331
)
23322332

2333-
fsm.If(valid, rest_size <= 1).goto_next()
2333+
fsm.If(valid, vtypes.Ors(rest_size <= 1, last)).goto_next()
23342334

23352335
for _ in range(self.num_data_delay):
23362336
fsm.goto_next()
@@ -2393,7 +2393,7 @@ def _synthesize_read_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
23932393
wvalid(0),
23942394
pack_count.inc()
23952395
)
2396-
fsm.If(valid_cond, pack_count == pack_size - 1)(
2396+
fsm.If(valid_cond, vtypes.Ors(pack_count == pack_size - 1, last))(
23972397
wdata(vtypes.Cat(data, wdata[self.datawidth:ram_datawidth])),
23982398
wvalid(1),
23992399
pack_count(0)
@@ -2437,7 +2437,7 @@ def _synthesize_read_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
24372437
int(math.ceil(math.log(pack_size, 2))), initval=0)
24382438
self.read_narrow_pack_counts[pack_size] = pack_count
24392439

2440-
data, valid, last = self.read_data(cond=fsm)
2440+
data, last, _id, user, dest, valid = self.read_data(cond=fsm)
24412441
self.read_narrow_data_wires[pack_size] = data
24422442
self.read_narrow_valid_wires[pack_size] = valid
24432443

@@ -2451,7 +2451,7 @@ def _synthesize_read_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
24512451
wvalid(0),
24522452
pack_count.inc()
24532453
)
2454-
fsm.If(valid_cond, pack_count == pack_size - 1)(
2454+
fsm.If(valid_cond, vtypes.Ors(pack_count == pack_size - 1, last))(
24552455
wdata(vtypes.Cat(data, wdata[self.datawidth:ram_datawidth])),
24562456
wvalid(1),
24572457
pack_count(0)
@@ -2460,7 +2460,7 @@ def _synthesize_read_fsm_narrow(self, ram, port, ram_method, ram_datawidth):
24602460
rest_size.dec()
24612461
)
24622462

2463-
fsm.If(valid, rest_size <= 1).goto_next()
2463+
fsm.If(valid, vtypes.Ors(rest_size <= 1, last)).goto_next()
24642464

24652465
for _ in range(self.num_data_delay):
24662466
fsm.goto_next()
@@ -2572,19 +2572,25 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
25722572
self.read_wide_pack_counts[pack_size] = pack_count
25732573

25742574
cond = vtypes.Ands(fsm.here, pack_count == 0)
2575-
data, valid, last = self.read_data(cond=cond)
2575+
data, last, _id, user, dest, valid = self.read_data(cond=fsm)
25762576
self.read_wide_data_wires[pack_size] = data
25772577
self.read_wide_valid_wires[pack_size] = valid
25782578

25792579
valid_cond = vtypes.Ands(valid, self.read_op_sel == op_id)
25802580
stay_cond = self.read_op_sel == op_id
25812581

2582+
wlast = self.m.Reg('_'.join(['', self.name,
2583+
'read_wide', str(pack_size),
2584+
'wlast']),
2585+
initval=0)
2586+
25822587
fsm.Delay(1)(
25832588
wvalid(0)
25842589
)
25852590
fsm.If(pack_count == 0, valid_cond)(
25862591
wdata(data),
25872592
wvalid(1),
2593+
wlast(last),
25882594
pack_count.inc()
25892595
)
25902596
fsm.If(pack_count > 0, stay_cond)(
@@ -2601,7 +2607,7 @@ def _synthesize_read_fsm_wide(self, ram, port, ram_method, ram_datawidth):
26012607
)
26022608

26032609
fsm.If(pack_count == pack_size - 1,
2604-
rest_size == 0).goto_next()
2610+
vtypes.Ors(rest_size == 0, wlast)).goto_next()
26052611

26062612
for _ in range(self.num_data_delay):
26072613
fsm.goto_next()

0 commit comments

Comments
 (0)