Skip to content

Commit af1cf46

Browse files
committed
active low reset
1 parent 2853d54 commit af1cf46

File tree

4 files changed

+211
-1
lines changed

4 files changed

+211
-1
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: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from __future__ import absolute_import
2+
from __future__ import print_function
3+
4+
import os
5+
import veriloggen
6+
import thread_axi_dma_active_low_reset
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_axi_dma_active_low_reset.run(filename=None, simtype=simtype,
15+
outputfile=os.path.splitext(os.path.basename(__file__))[0] + '.out')
16+
17+
verify_rslt = rslt.splitlines()[-1]
18+
assert(verify_rslt == '# verify: PASSED')
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
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+
import veriloggen.types.axi as axi
13+
14+
15+
def mkLed():
16+
m = Module('blinkled')
17+
clk = m.Input('CLK')
18+
# active low reset
19+
rst_x = m.Input('RST_X')
20+
21+
# active low -> active high
22+
rst = m.Wire('RST')
23+
rst.assign(Not(rst_x))
24+
25+
datawidth = 32
26+
addrwidth = 10
27+
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth,
28+
num_cmd_delay=1, num_data_delay=1)
29+
myram = vthread.RAM(m, 'myram', clk, rst, datawidth, addrwidth,
30+
numports=2)
31+
32+
all_ok = m.TmpReg(initval=0)
33+
34+
def blink(size):
35+
all_ok.value = True
36+
37+
for i in range(4):
38+
print('# iter %d start' % i)
39+
# Test for 4KB boundary check
40+
offset = i * 1024 * 16 + (myaxi.boundary_size - 4)
41+
body(size, offset)
42+
print('# iter %d end' % i)
43+
44+
if all_ok:
45+
print('# verify: PASSED')
46+
else:
47+
print('# verify: FAILED')
48+
49+
vthread.finish()
50+
51+
def body(size, offset):
52+
# write
53+
for i in range(size):
54+
wdata = i + 100
55+
myram.write(i, wdata)
56+
57+
laddr = 0
58+
gaddr = offset
59+
myaxi.dma_write(myram, laddr, gaddr, size, port=0)
60+
print('dma_write: [%d] -> [%d]' % (laddr, gaddr))
61+
62+
# write
63+
for i in range(size):
64+
wdata = i + 1000
65+
myram.write(i, wdata)
66+
67+
laddr = 0
68+
gaddr = (size + size) * 4 + offset
69+
myaxi.dma_write(myram, laddr, gaddr, size, port=1)
70+
print('dma_write: [%d] -> [%d]' % (laddr, gaddr))
71+
72+
# read
73+
laddr = 0
74+
gaddr = offset
75+
myaxi.dma_read(myram, laddr, gaddr, size, port=1)
76+
print('dma_read: [%d] <- [%d]' % (laddr, gaddr))
77+
78+
for i in range(size):
79+
rdata = myram.read(i)
80+
if vthread.verilog.NotEql(rdata, i + 100):
81+
print('rdata[%d] = %d' % (i, rdata))
82+
all_ok.value = False
83+
84+
# read
85+
laddr = 0
86+
gaddr = (size + size) * 4 + offset
87+
myaxi.dma_read(myram, laddr, gaddr, size, port=0)
88+
print('dma_read: [%d] <- [%d]' % (laddr, gaddr))
89+
90+
for i in range(size):
91+
rdata = myram.read(i)
92+
if vthread.verilog.NotEql(rdata, i + 1000):
93+
print('rdata[%d] = %d' % (i, rdata))
94+
all_ok.value = False
95+
96+
th = vthread.Thread(m, 'th_blink', clk, rst, blink)
97+
fsm = th.start(16)
98+
99+
return m
100+
101+
102+
def mkTest(memimg_name=None):
103+
m = Module('test')
104+
105+
# target instance
106+
led = mkLed()
107+
108+
# copy paras and ports
109+
params = m.copy_params(led)
110+
ports = m.copy_sim_ports(led)
111+
112+
clk = ports['CLK']
113+
114+
# active low reset
115+
rst_x = ports['RST_X']
116+
117+
# active low -> active high
118+
rst = m.Wire('RST')
119+
rst.assign(Not(rst_x))
120+
121+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name)
122+
memory.connect(ports, 'myaxi')
123+
124+
uut = m.Instance(led, 'uut',
125+
params=m.connect_params(led),
126+
ports=m.connect_ports(led))
127+
128+
#simulation.setup_waveform(m, uut)
129+
simulation.setup_clock(m, clk, hperiod=5)
130+
init = simulation.setup_reset(m, rst_x, m.make_reset(), period=100, polarity='low')
131+
132+
init.add(
133+
Delay(1000000),
134+
Systask('finish'),
135+
)
136+
137+
return m
138+
139+
140+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
141+
142+
if outputfile is None:
143+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
144+
145+
memimg_name = 'memimg_' + outputfile
146+
147+
test = mkTest(memimg_name=memimg_name)
148+
149+
if filename is not None:
150+
test.to_verilog(filename)
151+
152+
sim = simulation.Simulator(test, sim=simtype)
153+
rslt = sim.run(outputfile=outputfile)
154+
lines = rslt.splitlines()
155+
if simtype == 'verilator' and lines[-1].startswith('-'):
156+
rslt = '\n'.join(lines[:-1])
157+
return rslt
158+
159+
160+
if __name__ == '__main__':
161+
rslt = run(filename='tmp.v')
162+
print(rslt)

veriloggen/simulation/simulation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ def setup_clock(m, clk, hperiod=5):
6868

6969
def setup_reset(m, reset, *statement, **kwargs):
7070
period = kwargs['period'] if 'period' in kwargs else 100
71-
positive = kwargs['positive'] if 'positive' in kwargs else True
71+
polarity = kwargs['polarity'] if 'polarity' in kwargs else 'high'
72+
positive = 'high' in polarity.lower()
7273

7374
ret = m.Initial(
7475
reset(not positive),

0 commit comments

Comments
 (0)