Skip to content

Commit 9e20a52

Browse files
committed
AccAdd is implemented. But the enable support has not been implemented yet.
1 parent 1a42538 commit 9e20a52

File tree

4 files changed

+804
-13
lines changed

4 files changed

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

0 commit comments

Comments
 (0)