Skip to content

Commit 6cf1ed6

Browse files
committed
1st pytest of generate statement is passed.
1 parent 27453ad commit 6cf1ed6

File tree

8 files changed

+428
-67
lines changed

8 files changed

+428
-67
lines changed

sample/test/generate/Makefile

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
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

sample/test/generate/led.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import sys
2+
import os
3+
from veriloggen import *
4+
5+
def mkLed():
6+
m = Module('blinkled')
7+
width = m.Parameter('WIDTH', 8)
8+
num_inst = m.Parameter('NUM_INST', 4)
9+
clk = m.Input('CLK')
10+
rst = m.Input('RST')
11+
led = m.OutputReg('LED', width)
12+
count = m.Reg('count', 32)
13+
14+
m.Always(Posedge(clk))(
15+
If(rst)(
16+
count(0)
17+
).Else(
18+
If(count == 1023)(
19+
count(0)
20+
).Else(
21+
count(count + 1)
22+
)
23+
))
24+
25+
# genvar i;
26+
i = m.Genvar('i')
27+
28+
# generate for(i=0; i<NUM_INST; i=i+1) begin: gen_for;
29+
gen_for = m.GenerateFor(i(0), i<num_inst, i(i+1), scope='gen_for')
30+
gen_count = gen_for.Reg('gen_count', 32)
31+
32+
# if(i==0) begin: gen_if_true // generate-if
33+
gen_if = gen_for.GenerateIf(i == 0, 'gen_if_true')
34+
gen_if.Always(Posedge(clk))(
35+
gen_count(count)
36+
)
37+
38+
# end else begin // gen_if_false else
39+
gen_if = gen_if.Else('gen_if_false')
40+
gen_if_count = gen_if.Reg('gen_if_count', 32)
41+
gen_if.Always(Posedge(clk))(
42+
gen_count(Scope(gen_for[i-1], gen_count)),
43+
gen_if_count(gen_count),
44+
)
45+
# ... end endgenerate
46+
47+
m.Always(Posedge(clk))(
48+
If(rst)(
49+
led(0)
50+
).Else(
51+
If(Scope(gen_for[num_inst-1], gen_if, gen_if_count) == 1024 - 1)(
52+
led(led + 1)
53+
)))
54+
55+
return m
56+
57+
if __name__ == '__main__':
58+
led = mkLed()
59+
verilog = led.to_verilog()
60+
print(verilog)

sample/test/generate/test_led.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import led
2+
3+
expected_verilog = """
4+
module blinkled #
5+
(
6+
parameter WIDTH = 8,
7+
parameter NUM_INST = 4
8+
)
9+
(
10+
input CLK,
11+
input RST,
12+
output reg [WIDTH-1:0] LED
13+
);
14+
15+
reg [32-1:0] count;
16+
17+
always @(posedge CLK) begin
18+
if(RST) begin
19+
count <= 0;
20+
end else begin
21+
if(count == 1023) begin
22+
count <= 0;
23+
end else begin
24+
count <= count + 1;
25+
end
26+
end
27+
end
28+
29+
genvar i;
30+
generate for(i=0; i<NUM_INST; i=i+1) begin: gen_for
31+
reg [32-1:0] gen_count;
32+
if(i == 0) begin: gen_if_true
33+
always @(posedge CLK) begin
34+
gen_count <= count;
35+
end
36+
end else begin: gen_if_false
37+
reg [32-1:0] gen_if_count;
38+
always @(posedge CLK) begin
39+
gen_count <= gen_for[i-1].gen_count;
40+
gen_if_count <= gen_count;
41+
end
42+
end
43+
end endgenerate
44+
45+
always @(posedge CLK) begin
46+
if(RST) begin
47+
LED <= 0;
48+
end else begin
49+
if(gen_for[NUM_INST-1].gen_if_false.gen_if_count == 1023) begin
50+
LED <= LED + 1;
51+
end
52+
end
53+
end
54+
endmodule
55+
"""
56+
57+
def test_led():
58+
led_module = led.mkLed()
59+
led_code = led_module.to_verilog()
60+
61+
from pyverilog.vparser.parser import VerilogParser
62+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
63+
parser = VerilogParser()
64+
expected_ast = parser.parse(expected_verilog)
65+
codegen = ASTCodeGenerator()
66+
expected_code = codegen.visit(expected_ast)
67+
68+
assert(led_code == expected_code)

sample/test/generate/veriloggen

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../veriloggen

veriloggen/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
1212

1313
from vtypes import *
14-
from module import Module, StubModule
14+
from module import Module, StubModule, Instance, GenerateFor, GenerateIf
1515
from function import Function, FunctionCall
1616
from task import Task, TaskCall
1717
from from_verilog import read_verilog_stubmodule, read_verilog_module

0 commit comments

Comments
 (0)