Skip to content

Commit a994295

Browse files
committed
New example: dataflow_example
1 parent 826bebe commit a994295

File tree

3 files changed

+575
-0
lines changed

3 files changed

+575
-0
lines changed

examples/dataflow_example/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 tmp.v uut.vcd
Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
import sys
2+
import os
3+
4+
# the next line can be removed after installation
5+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
6+
7+
from veriloggen import *
8+
9+
def mkMultAdd():
10+
m = Module('multadd')
11+
clk = m.Input('CLK')
12+
rst = m.Input('RST')
13+
14+
# data in X
15+
x = m.Input('x', 32)
16+
vx = m.Input('vx')
17+
rx = m.Output('rx')
18+
19+
# data in Y
20+
y = m.Input('y', 32)
21+
vy = m.Input('vy')
22+
ry = m.Output('ry')
23+
24+
# constant
25+
c = m.Input('c', 32)
26+
27+
# data out Z
28+
z = m.Output('z', 32)
29+
vz = m.Output('vz')
30+
rz = m.Input('rz')
31+
32+
# dataflow manager
33+
df = lib.Dataflow(m, 'df', clk, rst)
34+
35+
# input -> dataflow variable
36+
px = df.input(x, valid=vx, ready=rx)
37+
py = df.input(y, valid=vy, ready=ry)
38+
39+
# dataflow definitions
40+
pxc = df(px * c)
41+
pz = df(pxc + py)
42+
43+
# dataflow variable -> output
44+
pz.output(z, valid=vz, ready=rz)
45+
46+
# generate always statement
47+
df.make_always()
48+
49+
return m
50+
51+
def mkTest():
52+
m = Module('test')
53+
54+
# target instance
55+
madd = mkMultAdd()
56+
57+
# copy paras and ports
58+
params = m.copy_params(madd)
59+
ports = m.copy_sim_ports(madd)
60+
61+
clk = ports['CLK']
62+
rst = ports['RST']
63+
64+
x = ports['x']
65+
vx = ports['vx']
66+
rx = ports['rx']
67+
y = ports['y']
68+
vy = ports['vy']
69+
ry = ports['ry']
70+
c = ports['c']
71+
z = ports['z']
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+
81+
reset_stmt = []
82+
reset_stmt.append( reset_done(0) )
83+
reset_stmt.append( x(0) )
84+
reset_stmt.append( y(0) )
85+
reset_stmt.append( c(8) )
86+
reset_stmt.append( vx(0) )
87+
reset_stmt.append( vy(0) )
88+
89+
lib.simulation.setup_waveform(m, uut)
90+
lib.simulation.setup_clock(m, clk, hperiod=5)
91+
init = lib.simulation.setup_reset(m, rst, reset_stmt, period=100)
92+
93+
nclk = lib.simulation.next_clock
94+
95+
init.add(
96+
Delay(1000),
97+
reset_done(1),
98+
nclk(clk),
99+
Delay(10000),
100+
Systask('finish'),
101+
)
102+
103+
x_count = m.TmpReg(32, initval=0)
104+
y_count = m.TmpReg(32, initval=0)
105+
z_count = m.TmpReg(32, initval=0)
106+
107+
xfsm = lib.FSM(m, 'xfsm', clk, rst)
108+
xfsm.add(vx(0))
109+
xfsm.goto_next(cond=reset_done)
110+
xfsm.add(vx(1))
111+
xfsm.add(x.inc(), cond=rx)
112+
xfsm.add(x_count.inc(), cond=rx)
113+
xfsm.goto_next(cond=AndList(x_count==10, rx))
114+
xfsm.add(vx(0))
115+
xfsm.make_always()
116+
117+
118+
yfsm = lib.FSM(m, 'yfsm', clk, rst)
119+
yfsm.add(vy(0))
120+
yfsm.goto_next(cond=reset_done)
121+
yfsm.add(vy(1))
122+
yfsm.add(y.add(2), cond=ry)
123+
yfsm.add(y_count.inc(), cond=ry)
124+
yfsm.goto_next(cond=AndList(y_count==10, ry))
125+
yfsm.add(vy(0))
126+
yfsm.make_always()
127+
128+
129+
zfsm = lib.FSM(m, 'zfsm', clk, rst)
130+
zfsm.add(rz(0))
131+
zfsm.goto_next(cond=reset_done)
132+
zfsm.goto_next()
133+
zinit= zfsm.current()
134+
zfsm.add(rz(1), cond=vz)
135+
zfsm.goto_next(cond=vz)
136+
for i in range(10):
137+
zfsm.add(rz(0))
138+
zfsm.goto_next()
139+
zfsm.goto(zinit)
140+
zfsm.make_always()
141+
142+
143+
m.Always(Posedge(clk))(
144+
If(reset_done)(
145+
If(AndList(vx, rx))(
146+
Systask('display', 'x=%d', x)
147+
),
148+
If(AndList(vy, ry))(
149+
Systask('display', 'y=%d', y)
150+
),
151+
If(AndList(vz, rz))(
152+
Systask('display', 'z=%d', z)
153+
)
154+
)
155+
)
156+
157+
return m
158+
159+
if __name__ == '__main__':
160+
test = mkTest()
161+
verilog = test.to_verilog('tmp.v')
162+
print(verilog)
163+
164+
sim = lib.simulation.Simulator(test)
165+
rslt = sim.run()
166+
print(rslt)
167+
168+
#sim.view_waveform()

0 commit comments

Comments
 (0)