Skip to content

Commit 14b6288

Browse files
committed
region accumulators are implemented.
1 parent 15d3f58 commit 14b6288

File tree

16 files changed

+2924
-23
lines changed

16 files changed

+2924
-23
lines changed

tests/extension/dataflow_/iadd_enable/test_dataflow_iadd_enable.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,9 @@
419419
_tmp_valid_0 <= xvalid && enablevalid && resetvalid;
420420
end
421421
if((_tmp_ready_0 || !_tmp_valid_0) && (xready && enableready && resetready) && (xvalid && enablevalid && resetvalid) && resetdata) begin
422+
_tmp_data_0 <= 1'd0;
423+
end
424+
if((_tmp_ready_0 || !_tmp_valid_0) && (xready && enableready && resetready) && (xvalid && enablevalid && resetvalid) && enabledata && resetdata) begin
422425
_tmp_data_0 <= 1'd0 + xdata;
423426
end
424427
end

tests/extension/dataflow_/ireg/test_dataflow_ireg.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,9 @@
419419
if((_tmp_ready_0 || !_tmp_valid_0) && (xready && enableready && resetready) && (xvalid && enablevalid && resetvalid) && resetdata) begin
420420
_tmp_data_0 <= 1'd0;
421421
end
422+
if((_tmp_ready_0 || !_tmp_valid_0) && (xready && enableready && resetready) && (xvalid && enablevalid && resetvalid) && enabledata && resetdata) begin
423+
_tmp_data_0 <= 1'd0;
424+
end
422425
end
423426
end
424427

tests/extension/dataflow_/accadd/dataflow_accadd.py renamed to tests/extension/dataflow_/regionadd/dataflow_regionadd.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ def mkMain():
1616
#enable = dataflow.Variable('enabledata', valid='enablevalid', ready='enableready', width=1)
1717

1818
# dataflow definition
19-
#z, v = dataflow.AccAdd(x, 4, initval=0, enable=enable, reset=reset)
20-
z, v = dataflow.AccAdd(x, 4, initval=0)
19+
#z, v = dataflow.RegionAdd(x, 4, initval=0, enable=enable, reset=reset)
20+
z, v = dataflow.RegionAdd(x, 4, initval=0)
2121

2222
# set output attribute
2323
z.output('zdata', valid='zvalid', ready='zready')

tests/extension/dataflow_/accadd/test_dataflow_accadd.py renamed to tests/extension/dataflow_/regionadd/test_dataflow_regionadd.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import absolute_import
22
from __future__ import print_function
33
import veriloggen
4-
import dataflow_accadd
4+
import dataflow_regionadd
55

66
expected_verilog = """
77
module test;
@@ -466,7 +466,7 @@
466466

467467
def test():
468468
veriloggen.reset()
469-
test_module = dataflow_accadd.mkTest()
469+
test_module = dataflow_regionadd.mkTest()
470470
code = test_module.to_verilog()
471471

472472
from pyverilog.vparser.parser import VerilogParser
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: 219 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,219 @@
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(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))))
8+
9+
from veriloggen import *
10+
import veriloggen.dataflow as dataflow
11+
12+
def mkMain():
13+
# input variiable
14+
x = dataflow.Variable('xdata', valid='xvalid', ready='xready')
15+
reset = dataflow.Variable('resetdata', valid='resetvalid', ready='resetready', width=1)
16+
enable = dataflow.Variable('enabledata', valid='enablevalid', ready='enableready', width=1)
17+
18+
# dataflow definition
19+
z, v = dataflow.RegionAdd(x, 4, initval=0, enable=enable, reset=reset)
20+
21+
# set output attribute
22+
z.output('zdata', valid='zvalid', ready='zready')
23+
v.output('vdata', valid='vvalid', ready='vready')
24+
25+
df = dataflow.Dataflow(z, v)
26+
m = df.to_module('main')
27+
#df.draw_graph()
28+
29+
return m
30+
31+
def mkTest(numports=8):
32+
m = Module('test')
33+
34+
# target instance
35+
main = mkMain()
36+
37+
params = m.copy_params(main)
38+
ports = m.copy_sim_ports(main)
39+
40+
clk = ports['CLK']
41+
rst = ports['RST']
42+
43+
xdata = ports['xdata']
44+
xvalid = ports['xvalid']
45+
xready = ports['xready']
46+
47+
resetdata = ports['resetdata']
48+
resetvalid = ports['resetvalid']
49+
resetready = ports['resetready']
50+
51+
enabledata = ports['enabledata']
52+
enablevalid = ports['enablevalid']
53+
enableready = ports['enableready']
54+
55+
zdata = ports['zdata']
56+
zvalid = ports['zvalid']
57+
zready = ports['zready']
58+
59+
vdata = ports['vdata']
60+
vvalid = ports['vvalid']
61+
vready = ports['vready']
62+
63+
uut = m.Instance(main, 'uut',
64+
params=m.connect_params(main),
65+
ports=m.connect_ports(main))
66+
67+
reset_done = m.Reg('reset_done', initval=0)
68+
reset_stmt = []
69+
reset_stmt.append( reset_done(0) )
70+
reset_stmt.append( xdata(0) )
71+
reset_stmt.append( xvalid(0) )
72+
reset_stmt.append( enabledata(0) )
73+
reset_stmt.append( enablevalid(0) )
74+
reset_stmt.append( resetdata(0) )
75+
reset_stmt.append( resetvalid(0) )
76+
reset_stmt.append( zready(0) )
77+
78+
simulation.setup_waveform(m, uut)
79+
simulation.setup_clock(m, clk, hperiod=5)
80+
init = simulation.setup_reset(m, rst, reset_stmt, period=100)
81+
82+
nclk = simulation.next_clock
83+
84+
init.add(
85+
Delay(1000),
86+
reset_done(1),
87+
nclk(clk),
88+
Delay(10000),
89+
Systask('finish'),
90+
)
91+
92+
93+
def send(name, data, valid, ready, step=1, waitnum=10, send_size=20):
94+
fsm = FSM(m, name + 'fsm', clk, rst)
95+
count = m.TmpReg(32, initval=0)
96+
97+
fsm.add(valid(0))
98+
fsm.goto_next(cond=reset_done)
99+
for _ in range(waitnum):
100+
fsm.goto_next()
101+
102+
fsm.add(valid(1))
103+
fsm.goto_next()
104+
105+
fsm.add(data(data + step), cond=ready)
106+
fsm.add(count.inc(), cond=ready)
107+
fsm.add(valid(0), cond=AndList(count==5, ready))
108+
fsm.goto_next(cond=AndList(count==5, ready))
109+
110+
for _ in range(waitnum):
111+
fsm.goto_next()
112+
fsm.add(valid(1))
113+
114+
fsm.add(data(data + step), cond=ready)
115+
fsm.add(count.inc(), cond=ready)
116+
fsm.add(valid(0), cond=AndList(count==send_size, ready))
117+
fsm.goto_next(cond=AndList(count==send_size, ready))
118+
119+
fsm.make_always()
120+
121+
122+
def receive(name, data, valid, ready, waitnum=10):
123+
fsm = FSM(m, name + 'fsm', clk, rst)
124+
125+
fsm.add(ready(0))
126+
fsm.goto_next(cond=reset_done)
127+
fsm.goto_next()
128+
129+
yinit = fsm.current
130+
fsm.add(ready(1), cond=valid)
131+
fsm.goto_next(cond=valid)
132+
for i in range(waitnum):
133+
fsm.add(ready(0))
134+
fsm.goto_next()
135+
136+
fsm.goto(yinit)
137+
138+
fsm.make_always()
139+
140+
141+
send('x', xdata, xvalid, xready, waitnum=10, send_size=100)
142+
receive('z', zdata, zvalid, zready, waitnum=5)
143+
receive('v', vdata, vvalid, vready, waitnum=5)
144+
145+
146+
# enable port
147+
enable_fsm = FSM(m, 'enable', clk, rst)
148+
enable_count = m.Reg('enable_count', 32, initval=0)
149+
150+
enable_fsm.goto_next(cond=reset_done)
151+
152+
enable_fsm_init = enable_fsm.current
153+
154+
enable_fsm.add( enablevalid(1) ) # always High
155+
156+
enable_fsm.add( enable_count.inc(), cond=AndList(enablevalid, enableready) )
157+
enable_fsm.add( enabledata(1), cond=AndList(enablevalid, enableready, enable_count==2) )
158+
enable_fsm.goto_next( cond=AndList(enablevalid, enableready, enable_count==2) )
159+
160+
enable_fsm.add( enabledata(0), cond=AndList(enablevalid, enableready) )
161+
enable_fsm.add( enable_count(0) )
162+
enable_fsm.goto(enable_fsm_init, cond=AndList(enablevalid, enableready) )
163+
164+
enable_fsm.make_always()
165+
166+
167+
# reset port
168+
reset_fsm = FSM(m, 'reset', clk, rst)
169+
reset_count = m.Reg('reset_count', 32, initval=0)
170+
171+
reset_fsm.goto_next(cond=reset_done)
172+
173+
reset_fsm_init = reset_fsm.current
174+
175+
reset_fsm.add( resetvalid(1) ) # always High
176+
177+
reset_fsm.add( reset_count.inc(), cond=AndList(resetvalid, resetready) )
178+
#reset_fsm.add( resetdata(1), cond=AndList(resetvalid, resetready, reset_count==2) )
179+
reset_fsm.add( resetdata(0), cond=AndList(resetvalid, resetready, reset_count==2) )
180+
reset_fsm.goto_next( cond=AndList(resetvalid, resetready, reset_count==2) )
181+
182+
reset_fsm.add( resetdata(0), cond=AndList(resetvalid, resetready) )
183+
reset_fsm.add( reset_count(0) )
184+
reset_fsm.goto(reset_fsm_init, cond=AndList(resetvalid, resetready) )
185+
186+
reset_fsm.make_always()
187+
188+
189+
m.Always(Posedge(clk))(
190+
If(reset_done)(
191+
If(AndList(xvalid, xready))(
192+
Systask('display', 'xdata=%d', xdata)
193+
),
194+
If(AndList(zvalid, zready))(
195+
Systask('display', 'zdata=%d', zdata)
196+
),
197+
If(AndList(vvalid, vready))(
198+
Systask('display', 'vdata=%d', vdata)
199+
)
200+
)
201+
)
202+
203+
return m
204+
205+
206+
if __name__ == '__main__':
207+
test = mkTest()
208+
verilog = test.to_verilog('tmp.v')
209+
print(verilog)
210+
211+
# run simulator (Icarus Verilog)
212+
sim = simulation.Simulator(test)
213+
rslt = sim.run() # display=False
214+
#rslt = sim.run(display=True)
215+
print(rslt)
216+
217+
# launch waveform viewer (GTKwave)
218+
#sim.view_waveform() # background=False
219+
#sim.view_waveform(background=True)

0 commit comments

Comments
 (0)