Skip to content

Commit eb70ee9

Browse files
committed
lib_parallel is added: parallel substituion manager
1 parent 55fa85e commit eb70ee9

File tree

20 files changed

+1466
-2
lines changed

20 files changed

+1466
-2
lines changed

sample/tests/lib_parallel/Makefile

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
.PHONY: clean
2+
clean:
3+
find . -maxdepth 1 -type d |grep "./" | xargs -I {} make clean -C {}
4+
5+
.PHONY: test
6+
test:
7+
find . -maxdepth 1 -type d |grep "./" | xargs -I {} make test -C {}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
TARGET=led.py
2+
TEST=test_led.py
3+
ARGS=
4+
5+
PYTHON=python3
6+
#PYTHON=python
7+
#OPT=-m pdb
8+
#OPT=-m cProfile -s time
9+
#OPT=-m cProfile -o profile.rslt
10+
11+
.PHONY: all
12+
all: test
13+
14+
.PHONY: run
15+
run:
16+
$(PYTHON) $(OPT) $(TARGET) $(ARGS)
17+
18+
.PHONY: test
19+
test:
20+
$(PYTHON) -m pytest -vv $(TEST)
21+
22+
.PHONY: check
23+
check:
24+
$(PYTHON) $(OPT) $(TARGET) $(ARGS) > tmp.v
25+
iverilog -tnull -Wall tmp.v
26+
rm -f tmp.v
27+
28+
.PHONY: clean
29+
clean:
30+
rm -rf *.pyc __pycache__ parsetab.py *.out tmp.v uut.vcd
31+
32+
.PHONY: sim
33+
sim:
34+
iverilog -Wall tmp.v
35+
./a.out
36+
37+
.PHONY: view
38+
view:
39+
gtkwave --giga uut.vcd &
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import sys
2+
import os
3+
import math
4+
5+
from veriloggen import *
6+
7+
try:
8+
log2 = math.log2
9+
except:
10+
def log2(v):
11+
return math.log(v, 2)
12+
13+
def mkLed(numports=4):
14+
if log2(numports) % 1.0 != 0.0:
15+
raise ValueError('numports must be power of 2')
16+
17+
m = Module('blinkled')
18+
clk = m.Input('CLK')
19+
rst = m.Input('RST')
20+
21+
idata = [ m.Input('idata' + str(i), 32) for i in range(numports) ]
22+
ivalid = [ m.Input('ivalid' + str(i)) for i in range(numports) ]
23+
odata = m.OutputReg('odata', 32, initval=0)
24+
ovalid = m.OutputReg('ovalid', initval=0)
25+
26+
par = lib.Parallel(m, 'par')
27+
pdata = idata
28+
pvalid = ivalid
29+
ndata = []
30+
nvalid = []
31+
32+
for s in range( int(log2(numports)) ):
33+
for i in range( numports >> (s+1) ):
34+
td = m.TmpReg(32, initval=0)
35+
tv = m.TmpReg(initval=0)
36+
ndata.append(td)
37+
nvalid.append(tv)
38+
cond = AndList(pvalid[i*2], pvalid[i*2+1])
39+
par.add( tv(cond) )
40+
par.add( td(pdata[i*2] + pdata[i*2+1]), cond=cond )
41+
pdata = ndata
42+
pvalid = nvalid
43+
44+
par.add( odata(pdata[-1]) )
45+
par.add( ovalid(pvalid[-1]) )
46+
47+
par.make_always(clk, rst)
48+
49+
return m
50+
51+
def mkTest():
52+
m = Module('test')
53+
54+
# target instance
55+
led = mkLed()
56+
57+
# copy paras and ports
58+
params = m.copy_params(led)
59+
ports = m.copy_sim_ports(led)
60+
61+
clk = ports['CLK']
62+
rst = ports['RST']
63+
idata = [ p for k, p in sorted(ports.items(), key=lambda x:x[0]) if k.startswith('idata') ]
64+
ivalid = [ p for k, p in sorted(ports.items(), key=lambda x:x[0]) if k.startswith('ivalid') ]
65+
66+
uut = m.Instance(led, 'uut',
67+
params=m.connect_params(led),
68+
ports=m.connect_ports(led))
69+
70+
reset_stmt = []
71+
for d in idata:
72+
reset_stmt.append( d(0) )
73+
for v in ivalid:
74+
reset_stmt.append( v(0) )
75+
76+
lib.simulation.setup_waveform(m, uut)
77+
lib.simulation.setup_clock(m, clk, hperiod=5)
78+
init = lib.simulation.setup_reset(m, rst, reset_stmt, period=100)
79+
80+
nclk = lib.simulation.next_clock
81+
82+
init.add(
83+
Delay(1000),
84+
nclk(clk),
85+
86+
[ d(0) for d in idata ],
87+
[ v(0) for v in ivalid ],
88+
nclk(clk),
89+
90+
[ d(i+1) for i, d in enumerate(idata) ],
91+
[ v(1) for v in ivalid ],
92+
nclk(clk),
93+
94+
[ d(1) for d in idata ],
95+
[ v(0) for v in ivalid ],
96+
nclk(clk),
97+
98+
[ d(i+10) for i, d in enumerate(idata) ],
99+
[ v(1) for v in ivalid ],
100+
nclk(clk),
101+
102+
[ v(0) for v in ivalid ],
103+
[ nclk(clk) for _ in range(10) ],
104+
105+
Systask('finish'),
106+
)
107+
108+
return m
109+
110+
if __name__ == '__main__':
111+
test = mkTest()
112+
verilog = test.to_verilog('tmp.v')
113+
print(verilog)
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
import led
2+
3+
expected_verilog = """
4+
module test;
5+
reg CLK;
6+
reg RST;
7+
reg [32-1:0] idata0;
8+
reg [32-1:0] idata1;
9+
reg [32-1:0] idata2;
10+
reg [32-1:0] idata3;
11+
reg ivalid0;
12+
reg ivalid1;
13+
reg ivalid2;
14+
reg ivalid3;
15+
wire [32-1:0] odata;
16+
wire ovalid;
17+
18+
blinkled
19+
uut
20+
(
21+
.CLK(CLK),
22+
.RST(RST),
23+
.idata0(idata0),
24+
.idata1(idata1),
25+
.idata2(idata2),
26+
.idata3(idata3),
27+
.ivalid0(ivalid0),
28+
.ivalid1(ivalid1),
29+
.ivalid2(ivalid2),
30+
.ivalid3(ivalid3),
31+
.odata(odata),
32+
.ovalid(ovalid)
33+
);
34+
35+
initial begin
36+
$dumpfile("uut.vcd");
37+
$dumpvars(0, uut);
38+
end
39+
40+
initial begin
41+
CLK = 0;
42+
forever begin
43+
#5 CLK = (!CLK);
44+
end
45+
end
46+
47+
initial begin
48+
RST = 0;
49+
idata0 = 0;
50+
idata1 = 0;
51+
idata2 = 0;
52+
idata3 = 0;
53+
ivalid0 = 0;
54+
ivalid1 = 0;
55+
ivalid2 = 0;
56+
ivalid3 = 0;
57+
#100;
58+
RST = 1;
59+
#100;
60+
RST = 0;
61+
#1000;
62+
@(posedge CLK);
63+
#1;
64+
idata0 = 0;
65+
idata1 = 0;
66+
idata2 = 0;
67+
idata3 = 0;
68+
ivalid0 = 0;
69+
ivalid1 = 0;
70+
ivalid2 = 0;
71+
ivalid3 = 0;
72+
@(posedge CLK);
73+
#1;
74+
idata0 = 1;
75+
idata1 = 2;
76+
idata2 = 3;
77+
idata3 = 4;
78+
ivalid0 = 1;
79+
ivalid1 = 1;
80+
ivalid2 = 1;
81+
ivalid3 = 1;
82+
@(posedge CLK);
83+
#1;
84+
idata0 = 1;
85+
idata1 = 1;
86+
idata2 = 1;
87+
idata3 = 1;
88+
ivalid0 = 0;
89+
ivalid1 = 0;
90+
ivalid2 = 0;
91+
ivalid3 = 0;
92+
@(posedge CLK);
93+
#1;
94+
idata0 = 10;
95+
idata1 = 11;
96+
idata2 = 12;
97+
idata3 = 13;
98+
ivalid0 = 1;
99+
ivalid1 = 1;
100+
ivalid2 = 1;
101+
ivalid3 = 1;
102+
@(posedge CLK);
103+
#1;
104+
ivalid0 = 0;
105+
ivalid1 = 0;
106+
ivalid2 = 0;
107+
ivalid3 = 0;
108+
@(posedge CLK);
109+
#1;
110+
@(posedge CLK);
111+
#1;
112+
@(posedge CLK);
113+
#1;
114+
@(posedge CLK);
115+
#1;
116+
@(posedge CLK);
117+
#1;
118+
@(posedge CLK);
119+
#1;
120+
@(posedge CLK);
121+
#1;
122+
@(posedge CLK);
123+
#1;
124+
@(posedge CLK);
125+
#1;
126+
@(posedge CLK);
127+
#1;
128+
$finish;
129+
end
130+
131+
endmodule
132+
133+
module blinkled
134+
(
135+
input CLK,
136+
input RST,
137+
input [32-1:0] idata0,
138+
input [32-1:0] idata1,
139+
input [32-1:0] idata2,
140+
input [32-1:0] idata3,
141+
input ivalid0,
142+
input ivalid1,
143+
input ivalid2,
144+
input ivalid3,
145+
output reg [32-1:0] odata,
146+
output reg ovalid
147+
);
148+
149+
reg [32-1:0] _tmp_0;
150+
reg _tmp_1;
151+
reg [32-1:0] _tmp_2;
152+
reg _tmp_3;
153+
reg [32-1:0] _tmp_4;
154+
reg _tmp_5;
155+
156+
always @(posedge CLK) begin
157+
if(RST) begin
158+
odata <= 0;
159+
ovalid <= 0;
160+
_tmp_0 <= 0;
161+
_tmp_1 <= 0;
162+
_tmp_2 <= 0;
163+
_tmp_3 <= 0;
164+
_tmp_4 <= 0;
165+
_tmp_5 <= 0;
166+
end else begin
167+
_tmp_1 <= ivalid0 && ivalid1;
168+
if(ivalid0 && ivalid1) begin
169+
_tmp_0 <= idata0 + idata1;
170+
end
171+
_tmp_3 <= ivalid2 && ivalid3;
172+
if(ivalid2 && ivalid3) begin
173+
_tmp_2 <= idata2 + idata3;
174+
end
175+
_tmp_5 <= _tmp_1 && _tmp_3;
176+
if(_tmp_1 && _tmp_3) begin
177+
_tmp_4 <= _tmp_0 + _tmp_2;
178+
end
179+
odata <= _tmp_4;
180+
ovalid <= _tmp_5;
181+
end
182+
end
183+
184+
endmodule
185+
"""
186+
187+
def test_led():
188+
test_module = led.mkTest()
189+
code = test_module.to_verilog()
190+
191+
from pyverilog.vparser.parser import VerilogParser
192+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
193+
parser = VerilogParser()
194+
expected_ast = parser.parse(expected_verilog)
195+
codegen = ASTCodeGenerator()
196+
expected_code = codegen.visit(expected_ast)
197+
198+
assert(expected_code == code)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../veriloggen

0 commit comments

Comments
 (0)