Skip to content

Commit c7e9c50

Browse files
committed
Merge branch 'feature_ringbuffer_disable_reset' into develop
2 parents 90caa2a + 93ee73e commit c7e9c50

File tree

4 files changed

+204
-13
lines changed

4 files changed

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

veriloggen/stream/stypes.py

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2908,15 +2908,15 @@ def _implement(self, m, seq, svalid=None, senable=None):
29082908
wdata.assign(self.right.sig_data)
29092909

29102910
waddr = m.Reg(self.name('waddr'), addrwidth, initval=0)
2911+
self.waddr = waddr
29112912

29122913
wcond = _and_vars(svalid, senable, enabledata)
29132914

29142915
next_waddr = vtypes.Mux(waddr == self.length - 1, 0, waddr + 1)
29152916
seq(waddr(next_waddr), cond=wcond)
29162917

2917-
reset_waddr = 0
29182918
reset_cond = _and_vars(svalid, senable, enabledata, resetdata)
2919-
seq(waddr(reset_waddr), cond=reset_cond)
2919+
seq(waddr(waddr), cond=reset_cond)
29202920

29212921
resetdata_x = vtypes.Not(resetdata) if resetdata is not None else 1
29222922
wenable = _and_vars(svalid, senable, enabledata, resetdata_x)
@@ -2966,17 +2966,8 @@ def _implement(self, m, seq, svalid=None, senable=None):
29662966

29672967
rdata = m.Wire(self.name('rdata'), datawidth, signed=signed)
29682968

2969-
raddr_base = m.Reg(self.name('raddr'), addrwidth, initval=0)
2970-
2971-
rcond = _and_vars(svalid, senable, enabledata)
2972-
2973-
next_raddr_base = vtypes.Mux(raddr_base == self.buf.length - 1,
2974-
0, raddr_base + 1)
2975-
seq(raddr_base(next_raddr_base), cond=rcond)
2976-
2977-
reset_raddr_base = 0
2978-
reset_cond = _and_vars(svalid, senable, enabledata, resetdata)
2979-
seq(raddr_base(reset_raddr_base), cond=reset_cond)
2969+
diff_latency = self.start_stage - self.buf.start_stage
2970+
raddr_base = seq.Prev(self.buf.waddr, diff_latency)
29802971

29812972
raddr = raddr_base + self.right.sig_data
29822973
raddr = vtypes.Mux(raddr >= self.buf.length,

0 commit comments

Comments
 (0)