Skip to content

Commit eecb96f

Browse files
committed
slave_lite
1 parent 5954b53 commit eecb96f

File tree

4 files changed

+545
-2
lines changed

4 files changed

+545
-2
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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
30+
rm -rf ipgen_*_v1_00_a
Lines changed: 362 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,362 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import veriloggen
4+
import types_ipcore_slave_lite
5+
6+
expected_verilog = """
7+
module test;
8+
9+
reg CLK;
10+
reg RST;
11+
wire [32-1:0] LED;
12+
reg [32-1:0] myaxi_awaddr;
13+
reg myaxi_awvalid;
14+
wire myaxi_awready;
15+
reg [32-1:0] myaxi_wdata;
16+
reg [4-1:0] myaxi_wstrb;
17+
reg myaxi_wvalid;
18+
wire myaxi_wready;
19+
reg [32-1:0] myaxi_araddr;
20+
reg myaxi_arvalid;
21+
wire myaxi_arready;
22+
wire [32-1:0] myaxi_rdata;
23+
wire myaxi_rvalid;
24+
reg myaxi_rready;
25+
reg [32-1:0] _axi_awaddr;
26+
reg _axi_awvalid;
27+
wire _axi_awready;
28+
reg [32-1:0] _axi_wdata;
29+
reg [4-1:0] _axi_wstrb;
30+
reg _axi_wvalid;
31+
wire _axi_wready;
32+
reg [32-1:0] _axi_araddr;
33+
reg _axi_arvalid;
34+
wire _axi_arready;
35+
wire [32-1:0] _axi_rdata;
36+
wire _axi_rvalid;
37+
wire _axi_rready;
38+
wire [32-1:0] _tmp_0;
39+
assign _tmp_0 = _axi_awaddr;
40+
41+
always @(*) begin
42+
myaxi_awaddr = _tmp_0;
43+
end
44+
45+
wire _tmp_1;
46+
assign _tmp_1 = _axi_awvalid;
47+
48+
always @(*) begin
49+
myaxi_awvalid = _tmp_1;
50+
end
51+
52+
assign _axi_awready = myaxi_awready;
53+
wire [32-1:0] _tmp_2;
54+
assign _tmp_2 = _axi_wdata;
55+
56+
always @(*) begin
57+
myaxi_wdata = _tmp_2;
58+
end
59+
60+
wire [4-1:0] _tmp_3;
61+
assign _tmp_3 = _axi_wstrb;
62+
63+
always @(*) begin
64+
myaxi_wstrb = _tmp_3;
65+
end
66+
67+
wire _tmp_4;
68+
assign _tmp_4 = _axi_wvalid;
69+
70+
always @(*) begin
71+
myaxi_wvalid = _tmp_4;
72+
end
73+
74+
assign _axi_wready = myaxi_wready;
75+
wire [32-1:0] _tmp_5;
76+
assign _tmp_5 = _axi_araddr;
77+
78+
always @(*) begin
79+
myaxi_araddr = _tmp_5;
80+
end
81+
82+
wire _tmp_6;
83+
assign _tmp_6 = _axi_arvalid;
84+
85+
always @(*) begin
86+
myaxi_arvalid = _tmp_6;
87+
end
88+
89+
assign _axi_arready = myaxi_arready;
90+
assign _axi_rdata = myaxi_rdata;
91+
assign _axi_rvalid = myaxi_rvalid;
92+
wire _tmp_7;
93+
assign _tmp_7 = _axi_rready;
94+
95+
always @(*) begin
96+
myaxi_rready = _tmp_7;
97+
end
98+
99+
reg [32-1:0] fsm;
100+
localparam fsm_init = 0;
101+
reg [32-1:0] sum;
102+
reg __axi_cond_0_1;
103+
assign _axi_rready = (fsm == 1) || (fsm == 3);
104+
reg __axi_cond_1_1;
105+
106+
main
107+
uut
108+
(
109+
.CLK(CLK),
110+
.RST(RST),
111+
.LED(LED),
112+
.myaxi_awaddr(myaxi_awaddr),
113+
.myaxi_awvalid(myaxi_awvalid),
114+
.myaxi_awready(myaxi_awready),
115+
.myaxi_wdata(myaxi_wdata),
116+
.myaxi_wstrb(myaxi_wstrb),
117+
.myaxi_wvalid(myaxi_wvalid),
118+
.myaxi_wready(myaxi_wready),
119+
.myaxi_araddr(myaxi_araddr),
120+
.myaxi_arvalid(myaxi_arvalid),
121+
.myaxi_arready(myaxi_arready),
122+
.myaxi_rdata(myaxi_rdata),
123+
.myaxi_rvalid(myaxi_rvalid),
124+
.myaxi_rready(myaxi_rready)
125+
);
126+
127+
128+
initial begin
129+
$dumpfile("uut.vcd");
130+
$dumpvars(0, uut, CLK, RST, LED, myaxi_awaddr, myaxi_awvalid, myaxi_awready, myaxi_wdata, myaxi_wstrb, myaxi_wvalid, myaxi_wready, myaxi_araddr, myaxi_arvalid, myaxi_arready, myaxi_rdata, myaxi_rvalid, myaxi_rready, _axi_awaddr, _axi_awvalid, _axi_awready, _axi_wdata, _axi_wstrb, _axi_wvalid, _axi_wready, _axi_araddr, _axi_arvalid, _axi_arready, _axi_rdata, _axi_rvalid, _axi_rready, _tmp_0, _tmp_1, _tmp_2, _tmp_3, _tmp_4, _tmp_5, _tmp_6, _tmp_7, fsm, sum, __axi_cond_0_1, __axi_cond_1_1);
131+
end
132+
133+
134+
initial begin
135+
CLK = 0;
136+
forever begin
137+
#5 CLK = !CLK;
138+
end
139+
end
140+
141+
142+
initial begin
143+
RST = 0;
144+
_axi_awaddr = 0;
145+
_axi_awvalid = 0;
146+
_axi_wdata = 0;
147+
_axi_wstrb = 0;
148+
_axi_wvalid = 0;
149+
_axi_araddr = 0;
150+
_axi_arvalid = 0;
151+
fsm = fsm_init;
152+
sum = 0;
153+
__axi_cond_0_1 = 0;
154+
__axi_cond_1_1 = 0;
155+
#100;
156+
RST = 1;
157+
#100;
158+
RST = 0;
159+
#100000;
160+
$finish;
161+
end
162+
163+
164+
always @(posedge CLK) begin
165+
if(RST) begin
166+
_axi_awaddr <= 0;
167+
_axi_awvalid <= 0;
168+
_axi_wdata <= 0;
169+
_axi_wstrb <= 0;
170+
_axi_wvalid <= 0;
171+
_axi_araddr <= 0;
172+
_axi_arvalid <= 0;
173+
__axi_cond_0_1 <= 0;
174+
__axi_cond_1_1 <= 0;
175+
end else begin
176+
if(__axi_cond_0_1) begin
177+
_axi_arvalid <= 0;
178+
end
179+
if(__axi_cond_1_1) begin
180+
_axi_arvalid <= 0;
181+
end
182+
_axi_awaddr <= 0;
183+
_axi_awvalid <= 0;
184+
_axi_wdata <= 0;
185+
_axi_wstrb <= 0;
186+
_axi_wvalid <= 0;
187+
if((fsm == 0) && (_axi_arready || !_axi_arvalid)) begin
188+
_axi_araddr <= 1024;
189+
_axi_arvalid <= 1;
190+
end
191+
__axi_cond_0_1 <= 1;
192+
if(_axi_arvalid && !_axi_arready) begin
193+
_axi_arvalid <= _axi_arvalid;
194+
end
195+
if((fsm == 2) && (_axi_arready || !_axi_arvalid)) begin
196+
_axi_araddr <= 2048;
197+
_axi_arvalid <= 1;
198+
end
199+
__axi_cond_1_1 <= 1;
200+
if(_axi_arvalid && !_axi_arready) begin
201+
_axi_arvalid <= _axi_arvalid;
202+
end
203+
end
204+
end
205+
206+
localparam fsm_1 = 1;
207+
localparam fsm_2 = 2;
208+
localparam fsm_3 = 3;
209+
localparam fsm_4 = 4;
210+
localparam fsm_5 = 5;
211+
212+
always @(posedge CLK) begin
213+
if(RST) begin
214+
fsm <= fsm_init;
215+
sum <= 0;
216+
end else begin
217+
case(fsm)
218+
fsm_init: begin
219+
if(_axi_arready || !_axi_arvalid) begin
220+
fsm <= fsm_1;
221+
end
222+
end
223+
fsm_1: begin
224+
if(_axi_rready && _axi_rvalid) begin
225+
sum <= sum + _axi_rdata;
226+
end
227+
if(_axi_rready && _axi_rvalid) begin
228+
fsm <= fsm_2;
229+
end
230+
end
231+
fsm_2: begin
232+
if(_axi_arready || !_axi_arvalid) begin
233+
fsm <= fsm_3;
234+
end
235+
end
236+
fsm_3: begin
237+
if(_axi_rready && _axi_rvalid) begin
238+
sum <= sum + _axi_rdata;
239+
end
240+
if(_axi_rready && _axi_rvalid) begin
241+
fsm <= fsm_4;
242+
end
243+
end
244+
fsm_4: begin
245+
$display("sum=%d expected_sum=%d", sum, 768);
246+
fsm <= fsm_5;
247+
end
248+
endcase
249+
end
250+
end
251+
252+
253+
endmodule
254+
255+
256+
257+
module main
258+
(
259+
input CLK,
260+
input RST,
261+
output [32-1:0] LED,
262+
input [32-1:0] myaxi_awaddr,
263+
input myaxi_awvalid,
264+
output myaxi_awready,
265+
input [32-1:0] myaxi_wdata,
266+
input [4-1:0] myaxi_wstrb,
267+
input myaxi_wvalid,
268+
output myaxi_wready,
269+
input [32-1:0] myaxi_araddr,
270+
input myaxi_arvalid,
271+
output myaxi_arready,
272+
output reg [32-1:0] myaxi_rdata,
273+
output reg myaxi_rvalid,
274+
input myaxi_rready
275+
);
276+
277+
assign myaxi_awready = 0;
278+
assign myaxi_wready = 0;
279+
reg [32-1:0] fsm;
280+
localparam fsm_init = 0;
281+
reg [32-1:0] _tmp_0;
282+
reg _tmp_1;
283+
assign myaxi_arready = (fsm == 0) && !_tmp_1;
284+
reg [32-1:0] rdata;
285+
reg _myaxi_cond_0_1;
286+
287+
always @(posedge CLK) begin
288+
if(RST) begin
289+
_tmp_0 <= 0;
290+
_tmp_1 <= 0;
291+
myaxi_rdata <= 0;
292+
myaxi_rvalid <= 0;
293+
_myaxi_cond_0_1 <= 0;
294+
end else begin
295+
if(_myaxi_cond_0_1) begin
296+
myaxi_rvalid <= 0;
297+
end
298+
if(myaxi_arready && myaxi_arvalid) begin
299+
_tmp_0 <= myaxi_araddr;
300+
end
301+
_tmp_1 <= myaxi_arready && myaxi_arvalid;
302+
if((fsm == 1) && (myaxi_rready || !myaxi_rvalid)) begin
303+
myaxi_rdata <= rdata;
304+
myaxi_rvalid <= 1;
305+
end
306+
_myaxi_cond_0_1 <= 1;
307+
if(myaxi_rvalid && !myaxi_rready) begin
308+
myaxi_rvalid <= myaxi_rvalid;
309+
end
310+
end
311+
end
312+
313+
localparam fsm_1 = 1;
314+
localparam fsm_2 = 2;
315+
316+
always @(posedge CLK) begin
317+
if(RST) begin
318+
fsm <= fsm_init;
319+
rdata <= 0;
320+
end else begin
321+
case(fsm)
322+
fsm_init: begin
323+
if(_tmp_1) begin
324+
rdata <= _tmp_0 >> 2;
325+
end
326+
if(_tmp_1) begin
327+
fsm <= fsm_1;
328+
end
329+
end
330+
fsm_1: begin
331+
if(myaxi_rready || !myaxi_rvalid) begin
332+
rdata <= rdata + 1;
333+
end
334+
if(myaxi_rready || !myaxi_rvalid) begin
335+
fsm <= fsm_2;
336+
end
337+
end
338+
fsm_2: begin
339+
fsm <= fsm_init;
340+
end
341+
endcase
342+
end
343+
end
344+
345+
346+
endmodule
347+
"""
348+
349+
350+
def test():
351+
veriloggen.reset()
352+
test_module = types_ipcore_slave_lite.mkTest()
353+
code = test_module.to_verilog()
354+
355+
from pyverilog.vparser.parser import VerilogParser
356+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
357+
parser = VerilogParser()
358+
expected_ast = parser.parse(expected_verilog)
359+
codegen = ASTCodeGenerator()
360+
expected_code = codegen.visit(expected_ast)
361+
362+
assert(expected_code == code)

0 commit comments

Comments
 (0)