Skip to content

Commit 69439ab

Browse files
committed
dataflow.Counter with enable
1 parent 8a5e8e9 commit 69439ab

File tree

4 files changed

+336
-3
lines changed

4 files changed

+336
-3
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: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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(
9+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))))
10+
11+
from veriloggen import *
12+
import veriloggen.dataflow as dataflow
13+
14+
15+
def mkMain(n=128, datawidth=32, numports=2):
16+
m = Module('main')
17+
18+
clk = m.Input('CLK')
19+
rst = m.Input('RST')
20+
21+
df = dataflow.DataflowManager(m, clk, rst)
22+
23+
a = df.Counter(1, initval=0, maxval=8)
24+
b = df.Counter(1, initval=0, enable=(a == 0))
25+
c = df.Counter(1, initval=0, enable=df.Or(a == 0, a == 4))
26+
27+
b.output('bdata', 'bvalid', 'bready')
28+
c.output('cdata', 'cvalid', 'cready')
29+
30+
ready = 1
31+
bdata, bvalid = b.read(ready)
32+
cdata, cvalid = c.read(ready)
33+
34+
seq = Seq(m, 'seq', clk, rst)
35+
seq.If(bvalid)(
36+
Systask('display', 'b=%d', bdata)
37+
)
38+
seq.If(cvalid)(
39+
Systask('display', 'c=%d', cdata)
40+
)
41+
42+
return m
43+
44+
45+
def mkTest():
46+
m = Module('test')
47+
48+
# target instance
49+
main = mkMain()
50+
51+
# copy paras and ports
52+
params = m.copy_params(main)
53+
ports = m.copy_sim_ports(main)
54+
55+
clk = ports['CLK']
56+
rst = ports['RST']
57+
58+
uut = m.Instance(main, 'uut',
59+
params=m.connect_params(main),
60+
ports=m.connect_ports(main))
61+
62+
simulation.setup_waveform(m, uut, m.get_vars())
63+
simulation.setup_clock(m, clk, hperiod=5)
64+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
65+
66+
init.add(
67+
Delay(1000 * 100),
68+
Systask('finish'),
69+
)
70+
71+
return m
72+
73+
if __name__ == '__main__':
74+
test = mkTest()
75+
verilog = test.to_verilog('tmp.v')
76+
print(verilog)
77+
78+
sim = simulation.Simulator(test)
79+
rslt = sim.run()
80+
print(rslt)
81+
82+
# sim.view_waveform()
Lines changed: 220 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import veriloggen
4+
import dataflow_counter_enable
5+
6+
expected_verilog = """
7+
module test;
8+
9+
reg CLK;
10+
reg RST;
11+
12+
main
13+
uut
14+
(
15+
.CLK(CLK),
16+
.RST(RST)
17+
);
18+
19+
20+
initial begin
21+
$dumpfile("uut.vcd");
22+
$dumpvars(0, uut, CLK, RST);
23+
end
24+
25+
26+
initial begin
27+
CLK = 0;
28+
forever begin
29+
#5 CLK = !CLK;
30+
end
31+
end
32+
33+
34+
initial begin
35+
RST = 0;
36+
#100;
37+
RST = 1;
38+
#100;
39+
RST = 0;
40+
#100000;
41+
$finish;
42+
end
43+
44+
45+
endmodule
46+
47+
48+
49+
module main
50+
(
51+
input CLK,
52+
input RST
53+
);
54+
55+
wire [32-1:0] bdata;
56+
wire bvalid;
57+
wire bready;
58+
assign bready = 1;
59+
wire [32-1:0] cdata;
60+
wire cvalid;
61+
wire cready;
62+
assign cready = 1;
63+
reg [32-1:0] _tmp_data_0;
64+
reg _tmp_valid_0;
65+
wire _tmp_ready_0;
66+
assign _tmp_ready_0 = (_tmp_ready_1 || !_tmp_valid_1) && _tmp_valid_0 && ((_tmp_ready_2 || !_tmp_valid_2) && _tmp_valid_0) && ((_tmp_ready_3 || !_tmp_valid_3) && _tmp_valid_0);
67+
reg [1-1:0] _tmp_data_1;
68+
reg _tmp_valid_1;
69+
wire _tmp_ready_1;
70+
assign _tmp_ready_1 = (_tmp_ready_4 || !_tmp_valid_4) && _tmp_valid_1;
71+
reg [1-1:0] _tmp_data_2;
72+
reg _tmp_valid_2;
73+
wire _tmp_ready_2;
74+
assign _tmp_ready_2 = (_tmp_ready_5 || !_tmp_valid_5) && (_tmp_valid_2 && _tmp_valid_3);
75+
reg [1-1:0] _tmp_data_3;
76+
reg _tmp_valid_3;
77+
wire _tmp_ready_3;
78+
assign _tmp_ready_3 = (_tmp_ready_5 || !_tmp_valid_5) && (_tmp_valid_2 && _tmp_valid_3);
79+
reg [32-1:0] _tmp_data_4;
80+
reg _tmp_valid_4;
81+
wire _tmp_ready_4;
82+
assign _tmp_ready_4 = (_tmp_ready_7 || !_tmp_valid_7) && _tmp_valid_4;
83+
reg [1-1:0] _tmp_data_5;
84+
reg _tmp_valid_5;
85+
wire _tmp_ready_5;
86+
assign _tmp_ready_5 = (_tmp_ready_6 || !_tmp_valid_6) && _tmp_valid_5;
87+
reg [32-1:0] _tmp_data_6;
88+
reg _tmp_valid_6;
89+
wire _tmp_ready_6;
90+
reg [32-1:0] _tmp_data_7;
91+
reg _tmp_valid_7;
92+
wire _tmp_ready_7;
93+
assign cdata = _tmp_data_6;
94+
assign cvalid = _tmp_valid_6;
95+
assign _tmp_ready_6 = cready;
96+
assign bdata = _tmp_data_7;
97+
assign bvalid = _tmp_valid_7;
98+
assign _tmp_ready_7 = bready;
99+
100+
always @(posedge CLK) begin
101+
if(RST) begin
102+
_tmp_data_0 <= 1'd0;
103+
_tmp_valid_0 <= 0;
104+
_tmp_data_1 <= 0;
105+
_tmp_valid_1 <= 0;
106+
_tmp_data_2 <= 0;
107+
_tmp_valid_2 <= 0;
108+
_tmp_data_3 <= 0;
109+
_tmp_valid_3 <= 0;
110+
_tmp_data_4 <= 1'd0;
111+
_tmp_valid_4 <= 0;
112+
_tmp_data_5 <= 0;
113+
_tmp_valid_5 <= 0;
114+
_tmp_data_6 <= 1'd0;
115+
_tmp_valid_6 <= 0;
116+
_tmp_data_7 <= 0;
117+
_tmp_valid_7 <= 0;
118+
end else begin
119+
if((_tmp_ready_0 || !_tmp_valid_0) && 1 && 1) begin
120+
_tmp_data_0 <= (_tmp_data_0 >= 7)? 0 : _tmp_data_0 + 2'd1;
121+
end
122+
if(_tmp_valid_0 && _tmp_ready_0) begin
123+
_tmp_valid_0 <= 0;
124+
end
125+
if((_tmp_ready_0 || !_tmp_valid_0) && 1) begin
126+
_tmp_valid_0 <= 1;
127+
end
128+
if((_tmp_ready_1 || !_tmp_valid_1) && _tmp_ready_0 && _tmp_valid_0) begin
129+
_tmp_data_1 <= _tmp_data_0 == 1'd0;
130+
end
131+
if(_tmp_valid_1 && _tmp_ready_1) begin
132+
_tmp_valid_1 <= 0;
133+
end
134+
if((_tmp_ready_1 || !_tmp_valid_1) && _tmp_ready_0) begin
135+
_tmp_valid_1 <= _tmp_valid_0;
136+
end
137+
if((_tmp_ready_2 || !_tmp_valid_2) && _tmp_ready_0 && _tmp_valid_0) begin
138+
_tmp_data_2 <= _tmp_data_0 == 1'd0;
139+
end
140+
if(_tmp_valid_2 && _tmp_ready_2) begin
141+
_tmp_valid_2 <= 0;
142+
end
143+
if((_tmp_ready_2 || !_tmp_valid_2) && _tmp_ready_0) begin
144+
_tmp_valid_2 <= _tmp_valid_0;
145+
end
146+
if((_tmp_ready_3 || !_tmp_valid_3) && _tmp_ready_0 && _tmp_valid_0) begin
147+
_tmp_data_3 <= _tmp_data_0 == 4'd4;
148+
end
149+
if(_tmp_valid_3 && _tmp_ready_3) begin
150+
_tmp_valid_3 <= 0;
151+
end
152+
if((_tmp_ready_3 || !_tmp_valid_3) && _tmp_ready_0) begin
153+
_tmp_valid_3 <= _tmp_valid_0;
154+
end
155+
if((_tmp_ready_4 || !_tmp_valid_4) && _tmp_ready_1 && _tmp_valid_1 && _tmp_data_1) begin
156+
_tmp_data_4 <= _tmp_data_4 + 2'd1;
157+
end
158+
if(_tmp_valid_4 && _tmp_ready_4) begin
159+
_tmp_valid_4 <= 0;
160+
end
161+
if((_tmp_ready_4 || !_tmp_valid_4) && _tmp_ready_1) begin
162+
_tmp_valid_4 <= _tmp_valid_1;
163+
end
164+
if((_tmp_ready_5 || !_tmp_valid_5) && (_tmp_ready_2 && _tmp_ready_3) && (_tmp_valid_2 && _tmp_valid_3)) begin
165+
_tmp_data_5 <= _tmp_data_2 | _tmp_data_3;
166+
end
167+
if(_tmp_valid_5 && _tmp_ready_5) begin
168+
_tmp_valid_5 <= 0;
169+
end
170+
if((_tmp_ready_5 || !_tmp_valid_5) && (_tmp_ready_2 && _tmp_ready_3)) begin
171+
_tmp_valid_5 <= _tmp_valid_2 && _tmp_valid_3;
172+
end
173+
if((_tmp_ready_6 || !_tmp_valid_6) && _tmp_ready_5 && _tmp_valid_5 && _tmp_data_5) begin
174+
_tmp_data_6 <= _tmp_data_6 + 2'd1;
175+
end
176+
if(_tmp_valid_6 && _tmp_ready_6) begin
177+
_tmp_valid_6 <= 0;
178+
end
179+
if((_tmp_ready_6 || !_tmp_valid_6) && _tmp_ready_5) begin
180+
_tmp_valid_6 <= _tmp_valid_5;
181+
end
182+
if((_tmp_ready_7 || !_tmp_valid_7) && _tmp_ready_4 && _tmp_valid_4) begin
183+
_tmp_data_7 <= _tmp_data_4;
184+
end
185+
if(_tmp_valid_7 && _tmp_ready_7) begin
186+
_tmp_valid_7 <= 0;
187+
end
188+
if((_tmp_ready_7 || !_tmp_valid_7) && _tmp_ready_4) begin
189+
_tmp_valid_7 <= _tmp_valid_4;
190+
end
191+
end
192+
end
193+
194+
195+
always @(posedge CLK) begin
196+
if(bvalid && 1) begin
197+
$display("b=%d", bdata);
198+
end
199+
if(cvalid && 1) begin
200+
$display("c=%d", cdata);
201+
end
202+
end
203+
204+
205+
endmodule
206+
"""
207+
208+
def test():
209+
veriloggen.reset()
210+
test_module = dataflow_counter_enable.mkTest()
211+
code = test_module.to_verilog()
212+
213+
from pyverilog.vparser.parser import VerilogParser
214+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
215+
parser = VerilogParser()
216+
expected_ast = parser.parse(expected_verilog)
217+
codegen = ASTCodeGenerator()
218+
expected_code = codegen.visit(expected_ast)
219+
220+
assert(expected_code == code)

veriloggen/dataflow/dtypes.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2467,7 +2467,7 @@ def _set_attributes(self):
24672467

24682468

24692469
#-------------------------------------------------------------------------
2470-
def Counter(step=None, maxval=None, initval=0, reset=None, width=32, signed=False):
2470+
def Counter(step=None, maxval=None, initval=0, enable=None, reset=None, width=32, signed=False):
24712471
if step is None:
24722472
step = 1
24732473

@@ -2483,7 +2483,8 @@ def Counter(step=None, maxval=None, initval=0, reset=None, width=32, signed=Fals
24832483

24842484
if maxval is None:
24852485
return Icustom(lambda a, b: a + b,
2486-
step, initval=initval, reset=reset, width=width, signed=signed,
2486+
step, initval=initval, enable=enable, reset=reset,
2487+
width=width, signed=signed,
24872488
label='Counter')
24882489

24892490
maxval = _to_constant(maxval)
@@ -2492,7 +2493,8 @@ def Counter(step=None, maxval=None, initval=0, reset=None, width=32, signed=Fals
24922493
raw_maxval = maxval.value
24932494

24942495
return Icustom(lambda a, b: vtypes.Mux(a >= raw_maxval - raw_step, raw_initval, a + b),
2495-
step, initval=initval, reset=reset, width=width, signed=signed,
2496+
step, initval=initval, enable=enable, reset=reset,
2497+
width=width, signed=signed,
24962498
label='Counter')
24972499

24982500

0 commit comments

Comments
 (0)