Skip to content

Commit 216a432

Browse files
committed
New example is added: examples/dataflow_addpipe is multi-input adder pipeline with lib.dataflow.
1 parent e64bb19 commit 216a432

File tree

3 files changed

+1235
-0
lines changed

3 files changed

+1235
-0
lines changed

examples/dataflow_addpipe/Makefile

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
TARGET=*.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 *.out *.png *.dot tmp.v uut.vcd
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
import math
6+
7+
# the next line can be removed after installation
8+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
9+
10+
from veriloggen import *
11+
12+
def mkAdd(numports=8, mode=1):
13+
m = Module('blinkled')
14+
clk = m.Input('CLK')
15+
rst = m.Input('RST')
16+
17+
inputs = [ (m.Input('d'+str(i), 32), m.Input('v'+str(i)), m.Output('r'+str(i)))
18+
for i in range(numports) ]
19+
20+
dz = m.Output('dz', 32)
21+
vz = m.Output('vz')
22+
rz = m.Input('rz')
23+
24+
df = lib.Dataflow(m, 'df', clk, rst)
25+
26+
dfvars = [ df.input(*p) for p in inputs ]
27+
28+
if mode == 0:
29+
vars = dfvars
30+
for depth in range(int(math.log(numports,2))):
31+
tmp_vars = []
32+
for i in range(numports>>depth+1):
33+
tmp_vars.append( df(vars[i*2] + vars[i*2+1]) )
34+
vars = tmp_vars
35+
vars[0].output(dz, valid=vz, ready=rz)
36+
37+
else:
38+
ret = None
39+
for v in dfvars:
40+
if ret is None:
41+
ret = v
42+
continue
43+
ret = df(ret + v)
44+
ret.output(dz, valid=vz, ready=rz)
45+
46+
df.make_always()
47+
48+
try:
49+
df.draw_graph()
50+
except:
51+
print('Dataflow graph could not be generated.', file=sys.stderr)
52+
53+
return m
54+
55+
def mkTest(numports=8):
56+
m = Module('test')
57+
58+
# target instance
59+
madd = mkAdd(numports)
60+
61+
# copy paras and ports
62+
params = m.copy_params(madd)
63+
ports = m.copy_sim_ports(madd)
64+
65+
clk = ports['CLK']
66+
rst = ports['RST']
67+
68+
inputs = [ (ports['d'+str(i)], ports['v'+str(i)], ports['r'+str(i)])
69+
for i in range(numports) ]
70+
71+
dz = ports['dz']
72+
vz = ports['vz']
73+
rz = ports['rz']
74+
75+
uut = m.Instance(madd, 'uut',
76+
params=m.connect_params(madd),
77+
ports=m.connect_ports(madd))
78+
79+
reset_done = m.Reg('reset_done', initval=0)
80+
reset_stmt = []
81+
reset_stmt.append( reset_done(0) )
82+
83+
for p in inputs:
84+
reset_stmt.extend( [ p[0](0), p[1](0) ] )
85+
86+
lib.simulation.setup_waveform(m, uut)
87+
lib.simulation.setup_clock(m, clk, hperiod=5)
88+
init = lib.simulation.setup_reset(m, rst, reset_stmt, period=100)
89+
90+
nclk = lib.simulation.next_clock
91+
92+
init.add(
93+
Delay(1000),
94+
reset_done(1),
95+
nclk(clk),
96+
Delay(10000),
97+
Systask('finish'),
98+
)
99+
100+
for i,p in enumerate(inputs):
101+
count = m.TmpReg(32, initval=0)
102+
d = p[0]
103+
v = p[1]
104+
r = p[2]
105+
fsm = lib.FSM(m, 'fsm'+str(i), clk, rst)
106+
fsm.add(v(0))
107+
fsm.goto_next(cond=reset_done)
108+
fsm.add(v(1))
109+
fsm.add(d(d + i + 1), cond=r)
110+
fsm.add(count.inc(), cond=r)
111+
fsm.goto_next(cond=AndList(count==10, r))
112+
fsm.add(v(0))
113+
fsm.make_always()
114+
115+
zfsm = lib.FSM(m, 'zfsm', clk, rst)
116+
zfsm.add(rz(0))
117+
zfsm.goto_next(cond=reset_done)
118+
zfsm.goto_next()
119+
zinit= zfsm.current()
120+
zfsm.add(rz(1), cond=vz)
121+
zfsm.goto_next(cond=vz)
122+
for i in range(10):
123+
zfsm.add(rz(0))
124+
zfsm.goto_next()
125+
zfsm.goto(zinit)
126+
zfsm.make_always()
127+
128+
disp = []
129+
for p in inputs:
130+
d = p[0]
131+
v = p[1]
132+
r = p[2]
133+
134+
disp.append( If(AndList(v, r))( Systask('display', d.name + '=%d', d) ) )
135+
136+
m.Always(Posedge(clk))(
137+
If(reset_done)(
138+
disp,
139+
If(AndList(vz, rz))(
140+
Systask('display', dz.name + '=%d', dz)
141+
)))
142+
143+
return m
144+
145+
if __name__ == '__main__':
146+
test = mkTest()
147+
verilog = test.to_verilog('tmp.v')
148+
print(verilog)
149+
150+
sim = lib.simulation.Simulator(test)
151+
rslt = sim.run()
152+
print(rslt)
153+
154+
#sim.view_waveform()

0 commit comments

Comments
 (0)