Skip to content

Commit c7d9ea9

Browse files
committed
RAM supports a ram_style pragma.
1 parent f846e18 commit c7d9ea9

File tree

5 files changed

+386
-5
lines changed

5 files changed

+386
-5
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: 267 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,267 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import veriloggen
4+
import thread_ram_style
5+
6+
expected_verilog = """
7+
module test;
8+
9+
reg CLK;
10+
reg RST;
11+
12+
blinkled
13+
uut
14+
(
15+
.CLK(CLK),
16+
.RST(RST)
17+
);
18+
19+
20+
initial begin
21+
$dumpfile("uut.vcd");
22+
$dumpvars(0, uut);
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+
#10000;
41+
$finish;
42+
end
43+
44+
45+
endmodule
46+
47+
48+
49+
module blinkled
50+
(
51+
input CLK,
52+
input RST
53+
);
54+
55+
reg [10-1:0] myram_0_addr;
56+
wire [32-1:0] myram_0_rdata;
57+
reg [32-1:0] myram_0_wdata;
58+
reg myram_0_wenable;
59+
60+
myram
61+
inst_myram
62+
(
63+
.CLK(CLK),
64+
.myram_0_addr(myram_0_addr),
65+
.myram_0_rdata(myram_0_rdata),
66+
.myram_0_wdata(myram_0_wdata),
67+
.myram_0_wenable(myram_0_wenable)
68+
);
69+
70+
reg [32-1:0] th_blink;
71+
localparam th_blink_init = 0;
72+
reg signed [32-1:0] _th_blink_times_0;
73+
reg signed [32-1:0] _th_blink_i_1;
74+
reg signed [32-1:0] _th_blink_wdata_2;
75+
reg _myram_cond_0_1;
76+
reg signed [32-1:0] _th_blink_sum_3;
77+
reg _tmp_0;
78+
reg _myram_cond_1_1;
79+
reg _myram_cond_2_1;
80+
reg _myram_cond_2_2;
81+
reg signed [32-1:0] _tmp_1;
82+
reg signed [32-1:0] _th_blink_rdata_4;
83+
84+
always @(posedge CLK) begin
85+
if(RST) begin
86+
myram_0_addr <= 0;
87+
myram_0_wdata <= 0;
88+
myram_0_wenable <= 0;
89+
_myram_cond_0_1 <= 0;
90+
_myram_cond_1_1 <= 0;
91+
_tmp_0 <= 0;
92+
_myram_cond_2_1 <= 0;
93+
_myram_cond_2_2 <= 0;
94+
end else begin
95+
if(_myram_cond_2_2) begin
96+
_tmp_0 <= 0;
97+
end
98+
if(_myram_cond_0_1) begin
99+
myram_0_wenable <= 0;
100+
end
101+
if(_myram_cond_1_1) begin
102+
_tmp_0 <= 1;
103+
end
104+
_myram_cond_2_2 <= _myram_cond_2_1;
105+
if(th_blink == 4) begin
106+
myram_0_addr <= _th_blink_i_1;
107+
myram_0_wdata <= _th_blink_wdata_2;
108+
myram_0_wenable <= 1;
109+
end
110+
_myram_cond_0_1 <= th_blink == 4;
111+
if(th_blink == 10) begin
112+
myram_0_addr <= _th_blink_i_1;
113+
end
114+
_myram_cond_1_1 <= th_blink == 10;
115+
_myram_cond_2_1 <= th_blink == 10;
116+
end
117+
end
118+
119+
localparam th_blink_1 = 1;
120+
localparam th_blink_2 = 2;
121+
localparam th_blink_3 = 3;
122+
localparam th_blink_4 = 4;
123+
localparam th_blink_5 = 5;
124+
localparam th_blink_6 = 6;
125+
localparam th_blink_7 = 7;
126+
localparam th_blink_8 = 8;
127+
localparam th_blink_9 = 9;
128+
localparam th_blink_10 = 10;
129+
localparam th_blink_11 = 11;
130+
localparam th_blink_12 = 12;
131+
localparam th_blink_13 = 13;
132+
localparam th_blink_14 = 14;
133+
localparam th_blink_15 = 15;
134+
localparam th_blink_16 = 16;
135+
136+
always @(posedge CLK) begin
137+
if(RST) begin
138+
th_blink <= th_blink_init;
139+
_th_blink_times_0 <= 0;
140+
_th_blink_i_1 <= 0;
141+
_th_blink_wdata_2 <= 0;
142+
_th_blink_sum_3 <= 0;
143+
_tmp_1 <= 0;
144+
_th_blink_rdata_4 <= 0;
145+
end else begin
146+
case(th_blink)
147+
th_blink_init: begin
148+
_th_blink_times_0 <= 10;
149+
th_blink <= th_blink_1;
150+
end
151+
th_blink_1: begin
152+
_th_blink_i_1 <= 0;
153+
th_blink <= th_blink_2;
154+
end
155+
th_blink_2: begin
156+
if(_th_blink_i_1 < _th_blink_times_0) begin
157+
th_blink <= th_blink_3;
158+
end else begin
159+
th_blink <= th_blink_7;
160+
end
161+
end
162+
th_blink_3: begin
163+
_th_blink_wdata_2 <= _th_blink_i_1;
164+
th_blink <= th_blink_4;
165+
end
166+
th_blink_4: begin
167+
th_blink <= th_blink_5;
168+
end
169+
th_blink_5: begin
170+
$display("wdata = %d", _th_blink_wdata_2);
171+
th_blink <= th_blink_6;
172+
end
173+
th_blink_6: begin
174+
_th_blink_i_1 <= _th_blink_i_1 + 1;
175+
th_blink <= th_blink_2;
176+
end
177+
th_blink_7: begin
178+
_th_blink_sum_3 <= 0;
179+
th_blink <= th_blink_8;
180+
end
181+
th_blink_8: begin
182+
_th_blink_i_1 <= 0;
183+
th_blink <= th_blink_9;
184+
end
185+
th_blink_9: begin
186+
if(_th_blink_i_1 < _th_blink_times_0) begin
187+
th_blink <= th_blink_10;
188+
end else begin
189+
th_blink <= th_blink_15;
190+
end
191+
end
192+
th_blink_10: begin
193+
if(_tmp_0) begin
194+
_tmp_1 <= myram_0_rdata;
195+
end
196+
if(_tmp_0) begin
197+
th_blink <= th_blink_11;
198+
end
199+
end
200+
th_blink_11: begin
201+
_th_blink_rdata_4 <= _tmp_1;
202+
th_blink <= th_blink_12;
203+
end
204+
th_blink_12: begin
205+
_th_blink_sum_3 <= _th_blink_sum_3 + _th_blink_rdata_4;
206+
th_blink <= th_blink_13;
207+
end
208+
th_blink_13: begin
209+
$display("rdata = %d", _th_blink_rdata_4);
210+
th_blink <= th_blink_14;
211+
end
212+
th_blink_14: begin
213+
_th_blink_i_1 <= _th_blink_i_1 + 1;
214+
th_blink <= th_blink_9;
215+
end
216+
th_blink_15: begin
217+
$display("sum = %d", _th_blink_sum_3);
218+
th_blink <= th_blink_16;
219+
end
220+
endcase
221+
end
222+
end
223+
224+
225+
endmodule
226+
227+
228+
229+
module myram
230+
(
231+
input CLK,
232+
input [10-1:0] myram_0_addr,
233+
output [32-1:0] myram_0_rdata,
234+
input [32-1:0] myram_0_wdata,
235+
input myram_0_wenable
236+
);
237+
238+
reg [10-1:0] myram_0_daddr;
239+
(* ram_style = "block" *)
240+
reg [32-1:0] mem [0:1024-1];
241+
242+
always @(posedge CLK) begin
243+
if(myram_0_wenable) begin
244+
mem[myram_0_addr] <= myram_0_wdata;
245+
end
246+
myram_0_daddr <= myram_0_addr;
247+
end
248+
249+
assign myram_0_rdata = mem[myram_0_daddr];
250+
251+
endmodule
252+
"""
253+
254+
255+
def test():
256+
veriloggen.reset()
257+
test_module = thread_ram_style.mkTest()
258+
code = test_module.to_verilog()
259+
260+
from pyverilog.vparser.parser import VerilogParser
261+
from pyverilog.ast_code_generator.codegen import ASTCodeGenerator
262+
parser = VerilogParser()
263+
expected_ast = parser.parse(expected_verilog)
264+
codegen = ASTCodeGenerator()
265+
expected_code = codegen.visit(expected_ast)
266+
267+
assert(expected_code == code)
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
import sys
4+
import os
5+
6+
# the next line can be removed after installation
7+
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.dirname(
8+
os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))))
9+
10+
from veriloggen import *
11+
import veriloggen.thread as vthread
12+
13+
14+
def mkLed():
15+
m = Module('blinkled')
16+
clk = m.Input('CLK')
17+
rst = m.Input('RST')
18+
19+
datawidth = 32
20+
addrwidth = 10
21+
myram = vthread.RAM(m, 'myram', clk, rst, datawidth, addrwidth,
22+
ram_style='(* ram_style = "block" *)')
23+
24+
def blink(times):
25+
for i in range(times):
26+
wdata = i
27+
myram.write(i, wdata)
28+
print('wdata = %d' % wdata)
29+
30+
sum = 0
31+
for i in range(times):
32+
rdata = myram.read(i)
33+
sum += rdata
34+
print('rdata = %d' % rdata)
35+
36+
print('sum = %d' % sum)
37+
38+
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
39+
fsm = th.start(10)
40+
41+
return m
42+
43+
44+
def mkTest():
45+
m = Module('test')
46+
47+
# target instance
48+
led = mkLed()
49+
50+
# copy paras and ports
51+
params = m.copy_params(led)
52+
ports = m.copy_sim_ports(led)
53+
54+
clk = ports['CLK']
55+
rst = ports['RST']
56+
57+
uut = m.Instance(led, 'uut',
58+
params=m.connect_params(led),
59+
ports=m.connect_ports(led))
60+
61+
simulation.setup_waveform(m, uut)
62+
simulation.setup_clock(m, clk, hperiod=5)
63+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
64+
65+
init.add(
66+
Delay(10000),
67+
Systask('finish'),
68+
)
69+
70+
return m
71+
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)

0 commit comments

Comments
 (0)