Skip to content

Commit af85b9e

Browse files
committed
new example: chatter_clear
1 parent 9d44cfc commit af85b9e

File tree

3 files changed

+349
-0
lines changed

3 files changed

+349
-0
lines changed

examples/chatter_clear/Makefile

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: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import os
4+
import sys
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.abspath(__file__)))))
8+
9+
from veriloggen import *
10+
11+
def mkChatterClear(length=1024):
12+
m = Module("chatter_clear")
13+
14+
_length = m.Parameter('length', length)
15+
16+
clk = m.Input('CLK')
17+
rst = m.Input('RST')
18+
19+
din = m.Input('din')
20+
dout = m.OutputReg('dout', initval=0)
21+
22+
seq = Seq(m, 'seq', clk, rst)
23+
24+
count = m.TmpReg(32)
25+
26+
seq.add( count(0), cond=din==dout )
27+
seq.add( count.inc(), cond=din!=dout )
28+
seq.add( count(0), cond=count==_length )
29+
seq.add( dout(din), cond=count==_length )
30+
31+
seq.make_always()
32+
33+
return m
34+
35+
def mkTest(length=1024):
36+
m = Module('test')
37+
38+
main = mkChatterClear(length)
39+
params = m.copy_params(main)
40+
ports = m.copy_sim_ports(main)
41+
42+
clk = ports['CLK']
43+
rst = ports['RST']
44+
din = ports['din']
45+
dout = ports['dout']
46+
47+
fsm = FSM(m, 'fsm', clk, rst)
48+
count = m.TmpReg(32, initval=0)
49+
50+
fsm.add( din(0) )
51+
fsm.add( count.inc() )
52+
fsm.add( count(0), cond=count==2000 )
53+
fsm.goto_next(count==2000)
54+
55+
fsm.add( din(1) )
56+
fsm.add( count.inc() )
57+
fsm.add( count(0), cond=count==10 )
58+
fsm.goto_next(count==10)
59+
60+
fsm.add( din(0) )
61+
fsm.add( count.inc() )
62+
fsm.add( count(0), cond=count==10 )
63+
fsm.goto_next(count==10)
64+
65+
fsm.add( din(1) )
66+
fsm.add( count.inc() )
67+
fsm.add( count(0), cond=count==2000 )
68+
fsm.goto_next(count==2000)
69+
70+
fsm.add( din(0) )
71+
fsm.add( count.inc() )
72+
fsm.add( count(0), cond=count==10 )
73+
fsm.goto_next(count==10)
74+
75+
fsm.add( din(1) )
76+
fsm.add( count.inc() )
77+
fsm.add( count(0), cond=count==10 )
78+
fsm.goto_next(count==10)
79+
80+
fsm.add( din(0) )
81+
fsm.add( count.inc() )
82+
fsm.add( count(0), cond=count==2000 )
83+
fsm.goto_next(count==2000)
84+
85+
fsm.make_always()
86+
87+
uut = m.Instance(main, 'uut',
88+
params=m.connect_params(main),
89+
ports=m.connect_ports(main))
90+
91+
simulation.setup_waveform(m, uut, m.get_vars())
92+
simulation.setup_clock(m, clk, hperiod=5)
93+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
94+
95+
nclk = simulation.next_clock
96+
97+
init.add(
98+
Delay(1000 * 100),
99+
Systask('finish'),
100+
)
101+
102+
return m
103+
104+
if __name__ == '__main__':
105+
#main = mkChatterClear()
106+
#verilog = main.to_verilog('tmp.v')
107+
#print(verilog)
108+
#exit()
109+
110+
test = mkTest()
111+
verilog = test.to_verilog('tmp.v')
112+
print(verilog)
113+
114+
# run simulator (Icarus Verilog)
115+
sim = simulation.Simulator(test)
116+
rslt = sim.run() # display=False
117+
#rslt = sim.run(display=True)
118+
print(rslt)
119+
120+
# launch waveform viewer (GTKwave)
121+
#sim.view_waveform() # background=False
122+
#sim.view_waveform(background=True)
Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import chatter_clear
4+
5+
expected_verilog = """
6+
module test #
7+
(
8+
parameter length = 1024
9+
);
10+
11+
reg CLK;
12+
reg RST;
13+
reg din;
14+
wire dout;
15+
reg [32-1:0] fsm;
16+
localparam fsm_init = 0;
17+
reg [32-1:0] _tmp_0;
18+
localparam fsm_1 = 1;
19+
localparam fsm_2 = 2;
20+
localparam fsm_3 = 3;
21+
localparam fsm_4 = 4;
22+
localparam fsm_5 = 5;
23+
localparam fsm_6 = 6;
24+
localparam fsm_7 = 7;
25+
26+
always @(posedge CLK) begin
27+
if(RST) begin
28+
fsm <= fsm_init;
29+
_tmp_0 <= 0;
30+
end else begin
31+
case(fsm)
32+
fsm_init: begin
33+
din <= 0;
34+
_tmp_0 <= _tmp_0 + 1;
35+
if(_tmp_0 == 2000) begin
36+
_tmp_0 <= 0;
37+
end
38+
if(_tmp_0 == 2000) begin
39+
fsm <= fsm_1;
40+
end
41+
end
42+
fsm_1: begin
43+
din <= 1;
44+
_tmp_0 <= _tmp_0 + 1;
45+
if(_tmp_0 == 10) begin
46+
_tmp_0 <= 0;
47+
end
48+
if(_tmp_0 == 10) begin
49+
fsm <= fsm_2;
50+
end
51+
end
52+
fsm_2: begin
53+
din <= 0;
54+
_tmp_0 <= _tmp_0 + 1;
55+
if(_tmp_0 == 10) begin
56+
_tmp_0 <= 0;
57+
end
58+
if(_tmp_0 == 10) begin
59+
fsm <= fsm_3;
60+
end
61+
end
62+
fsm_3: begin
63+
din <= 1;
64+
_tmp_0 <= _tmp_0 + 1;
65+
if(_tmp_0 == 2000) begin
66+
_tmp_0 <= 0;
67+
end
68+
if(_tmp_0 == 2000) begin
69+
fsm <= fsm_4;
70+
end
71+
end
72+
fsm_4: begin
73+
din <= 0;
74+
_tmp_0 <= _tmp_0 + 1;
75+
if(_tmp_0 == 10) begin
76+
_tmp_0 <= 0;
77+
end
78+
if(_tmp_0 == 10) begin
79+
fsm <= fsm_5;
80+
end
81+
end
82+
fsm_5: begin
83+
din <= 1;
84+
_tmp_0 <= _tmp_0 + 1;
85+
if(_tmp_0 == 10) begin
86+
_tmp_0 <= 0;
87+
end
88+
if(_tmp_0 == 10) begin
89+
fsm <= fsm_6;
90+
end
91+
end
92+
fsm_6: begin
93+
din <= 0;
94+
_tmp_0 <= _tmp_0 + 1;
95+
if(_tmp_0 == 2000) begin
96+
_tmp_0 <= 0;
97+
end
98+
if(_tmp_0 == 2000) begin
99+
fsm <= fsm_7;
100+
end
101+
end
102+
endcase
103+
end
104+
end
105+
106+
107+
chatter_clear
108+
#(
109+
.length(length)
110+
)
111+
uut
112+
(
113+
.CLK(CLK),
114+
.RST(RST),
115+
.din(din),
116+
.dout(dout)
117+
);
118+
119+
120+
initial begin
121+
$dumpfile("uut.vcd");
122+
$dumpvars(0, uut, CLK, RST, din, dout, fsm, _tmp_0);
123+
end
124+
125+
126+
initial begin
127+
CLK = 0;
128+
forever begin
129+
#5 CLK = !CLK;
130+
end
131+
end
132+
133+
134+
initial begin
135+
RST = 0;
136+
fsm = fsm_init;
137+
_tmp_0 = 0;
138+
#100;
139+
RST = 1;
140+
#100;
141+
RST = 0;
142+
#100000;
143+
$finish;
144+
end
145+
146+
147+
endmodule
148+
149+
150+
151+
module chatter_clear #
152+
(
153+
parameter length = 1024
154+
)
155+
(
156+
input CLK,
157+
input RST,
158+
input din,
159+
output reg dout
160+
);
161+
162+
reg [32-1:0] _tmp_0;
163+
164+
always @(posedge CLK) begin
165+
if(RST) begin
166+
dout <= 0;
167+
end else begin
168+
if(din == dout) begin
169+
_tmp_0 <= 0;
170+
end
171+
if(din != dout) begin
172+
_tmp_0 <= _tmp_0 + 1;
173+
end
174+
if(_tmp_0 == length) begin
175+
_tmp_0 <= 0;
176+
end
177+
if(_tmp_0 == length) begin
178+
dout <= din;
179+
end
180+
end
181+
end
182+
183+
184+
endmodule
185+
"""
186+
187+
def test():
188+
test_module = chatter_clear.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)

0 commit comments

Comments
 (0)