Skip to content

Commit 8a5e8e9

Browse files
committed
dataflow.Ireg is a pass-register with enable/reset port. All dataflow accumulators support the enable port to control its write.
1 parent 9dbfaed commit 8a5e8e9

File tree

10 files changed

+1406
-18
lines changed

10 files changed

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

0 commit comments

Comments
 (0)