Skip to content

Commit 2ac8913

Browse files
committed
Merge branch 'rc-1.4.3'
2 parents 64173fc + 95e3559 commit 2ac8913

File tree

8 files changed

+298
-67
lines changed

8 files changed

+298
-67
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_stream_dump_mask
7+
8+
9+
def test(request):
10+
veriloggen.reset()
11+
12+
simtype = request.config.getoption('--sim')
13+
14+
rslt = thread_stream_dump_mask.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: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
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+
rst = m.Input('RST')
19+
20+
datawidth = 32
21+
addrwidth = 10
22+
myaxi = vthread.AXIM(m, 'myaxi', clk, rst, datawidth)
23+
ram_a = vthread.RAM(m, 'ram_a', clk, rst, datawidth, addrwidth)
24+
ram_b = vthread.RAM(m, 'ram_b', clk, rst, datawidth, addrwidth)
25+
ram_c = vthread.RAM(m, 'ram_c', clk, rst, datawidth, addrwidth)
26+
27+
strm = vthread.Stream(m, 'mystream', clk, rst,
28+
dump=True, dump_base=10, dump_mode='all')
29+
a = strm.source('a')
30+
b = strm.source('b')
31+
c = a + b
32+
strm.sink(c, 'c')
33+
34+
def comp_stream(size, offset):
35+
strm.set_source('a', ram_a, offset, size)
36+
strm.set_source('b', ram_b, offset, size)
37+
strm.set_sink('c', ram_c, offset, size)
38+
strm.run()
39+
strm.join()
40+
strm.disable_dump()
41+
42+
def comp_sequential(size, offset):
43+
sum = 0
44+
for i in range(size):
45+
a = ram_a.read(i + offset)
46+
b = ram_b.read(i + offset)
47+
sum = a + b
48+
ram_c.write(i + offset, sum)
49+
50+
def check(size, offset_stream, offset_seq):
51+
all_ok = True
52+
for i in range(size):
53+
st = ram_c.read(i + offset_stream)
54+
sq = ram_c.read(i + offset_seq)
55+
if vthread.verilog.NotEql(st, sq):
56+
all_ok = False
57+
if all_ok:
58+
print('# verify: PASSED')
59+
else:
60+
print('# verify: FAILED')
61+
62+
def comp(size):
63+
# stream
64+
offset = 0
65+
myaxi.dma_read(ram_a, offset, 0, size)
66+
myaxi.dma_read(ram_b, offset, 512, size)
67+
comp_stream(size, offset)
68+
comp_stream(size, offset) # dump disabled
69+
myaxi.dma_write(ram_c, offset, 1024, size)
70+
71+
# sequential
72+
offset = size
73+
myaxi.dma_read(ram_a, offset, 0, size)
74+
myaxi.dma_read(ram_b, offset, 512, size)
75+
comp_sequential(size, offset)
76+
myaxi.dma_write(ram_c, offset, 1024 * 2, size)
77+
78+
# verification
79+
check(size, 0, offset)
80+
81+
vthread.finish()
82+
83+
th = vthread.Thread(m, 'th_comp', clk, rst, comp)
84+
fsm = th.start(32)
85+
86+
return m
87+
88+
89+
def mkTest(memimg_name=None):
90+
m = Module('test')
91+
92+
# target instance
93+
led = mkLed()
94+
95+
# copy paras and ports
96+
params = m.copy_params(led)
97+
ports = m.copy_sim_ports(led)
98+
99+
clk = ports['CLK']
100+
rst = ports['RST']
101+
102+
memory = axi.AxiMemoryModel(m, 'memory', clk, rst, memimg_name=memimg_name)
103+
memory.connect(ports, 'myaxi')
104+
105+
uut = m.Instance(led, 'uut',
106+
params=m.connect_params(led),
107+
ports=m.connect_ports(led))
108+
109+
#simulation.setup_waveform(m, uut)
110+
simulation.setup_clock(m, clk, hperiod=5)
111+
init = simulation.setup_reset(m, rst, m.make_reset(), period=100)
112+
113+
init.add(
114+
Delay(1000000),
115+
Systask('finish'),
116+
)
117+
118+
return m
119+
120+
121+
def run(filename='tmp.v', simtype='iverilog', outputfile=None):
122+
123+
if outputfile is None:
124+
outputfile = os.path.splitext(os.path.basename(__file__))[0] + '.out'
125+
126+
memimg_name = 'memimg_' + outputfile
127+
128+
test = mkTest(memimg_name=memimg_name)
129+
130+
if filename is not None:
131+
test.to_verilog(filename)
132+
133+
sim = simulation.Simulator(test, sim=simtype)
134+
rslt = sim.run(outputfile=outputfile)
135+
lines = rslt.splitlines()
136+
if simtype == 'verilator' and lines[-1].startswith('-'):
137+
rslt = '\n'.join(lines[:-1])
138+
return rslt
139+
140+
141+
if __name__ == '__main__':
142+
rslt = run(filename='tmp.v')
143+
print(rslt)

veriloggen/fsm/fsm.py

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ def __init__(self, m, name, clk, rst, width=32, initname='init',
8383
if not nohook:
8484
self.m.add_hook(self.implement)
8585

86-
#-------------------------------------------------------------------------
86+
# -------------------------------------------------------------------------
8787
def goto(self, dst, cond=None, else_dst=None):
8888
if cond is None and 'cond' in self.next_kwargs:
8989
cond = self.next_kwargs['cond']
@@ -130,7 +130,7 @@ def goto_from(self, src, dst, cond=None, else_dst=None):
130130
def inc(self):
131131
self._set_index(None)
132132

133-
#-------------------------------------------------------------------------
133+
# -------------------------------------------------------------------------
134134
def add(self, *statement, **kwargs):
135135
""" add new assignments """
136136
kwargs.update(self.next_kwargs)
@@ -152,11 +152,15 @@ def add(self, *statement, **kwargs):
152152
self._clear_last_if_statement()
153153
return self._add_statement(statement, **kwargs)
154154

155-
#-------------------------------------------------------------------------
155+
# -------------------------------------------------------------------------
156+
def add_reset(self, v):
157+
return self.seq.add_reset(v)
158+
159+
# -------------------------------------------------------------------------
156160
def Prev(self, var, delay, initval=0, cond=None, prefix=None):
157161
return self.seq.Prev(var, delay, initval, cond, prefix)
158162

159-
#-------------------------------------------------------------------------
163+
# -------------------------------------------------------------------------
160164
def If(self, *cond):
161165
self._clear_elif_cond()
162166

@@ -267,7 +271,7 @@ def Clear(self):
267271
self._clear_elif_cond()
268272
return self
269273

270-
#-------------------------------------------------------------------------
274+
# -------------------------------------------------------------------------
271275
@property
272276
def current(self):
273277
return self.state_count
@@ -314,15 +318,15 @@ def then(self):
314318
def here(self):
315319
return self.state == self.current
316320

317-
#-------------------------------------------------------------------------
321+
# -------------------------------------------------------------------------
318322
def implement(self):
319323
if self.as_module:
320324
self.make_module()
321325
return
322326

323327
self.make_always()
324328

325-
#-------------------------------------------------------------------------
329+
# -------------------------------------------------------------------------
326330
def make_always(self, reset=(), body=(), case=True):
327331
if self.done:
328332
#raise ValueError('make_always() has been already called.')
@@ -340,7 +344,7 @@ def make_always(self, reset=(), body=(), case=True):
340344
part_body,
341345
))
342346

343-
#-------------------------------------------------------------------------
347+
# -------------------------------------------------------------------------
344348
def make_module(self, reset=(), body=(), case=True):
345349
if self.done:
346350
#raise ValueError('make_always() has been already called.')
@@ -530,7 +534,7 @@ def make_module(self, reset=(), body=(), case=True):
530534
sub = Submodule(self.m, m, 'inst_' + m.name, '_%s_' % self.name,
531535
arg_params=arg_params, arg_ports=arg_ports)
532536

533-
#-------------------------------------------------------------------------
537+
# -------------------------------------------------------------------------
534538
def make_case(self):
535539
indexes = set(self.body.keys())
536540
indexes.update(set(self.jump.keys()))
@@ -578,7 +582,7 @@ def make_if(self):
578582
for index in sorted(indexes, key=lambda x:x)])
579583
return ret
580584

581-
#-------------------------------------------------------------------------
585+
# -------------------------------------------------------------------------
582586
def make_reset(self, reset):
583587
ret = collections.OrderedDict()
584588

@@ -621,19 +625,19 @@ def make_reset(self, reset):
621625

622626
return list(ret.values())
623627

624-
#-------------------------------------------------------------------------
628+
# -------------------------------------------------------------------------
625629
def set_index(self, index):
626630
return self._set_index(index)
627631

628-
#-------------------------------------------------------------------------
632+
# -------------------------------------------------------------------------
629633
def _go(self, src, dst, cond=None, else_dst=None):
630634
self._add_jump(src, dst, cond, else_dst)
631635
return self
632636

633637
def _add_jump(self, src, dst, cond=None, else_dst=None):
634638
self.jump[src].append((dst, cond, else_dst))
635639

636-
#-------------------------------------------------------------------------
640+
# -------------------------------------------------------------------------
637641
def _add_statement(self, statement, index=None, keep=None, delay=None, cond=None,
638642
lazy_cond=False, eager_val=False, no_delay_cond=False):
639643

@@ -686,7 +690,7 @@ def _add_statement(self, statement, index=None, keep=None, delay=None, cond=None
686690

687691
return self
688692

689-
#-------------------------------------------------------------------------
693+
# -------------------------------------------------------------------------
690694
def _add_dst_var(self, statement):
691695
for s in statement:
692696
values = self.dst_visitor.visit(s)
@@ -695,7 +699,7 @@ def _add_dst_var(self, statement):
695699
if k not in self.dst_var:
696700
self.dst_var[k] = v
697701

698-
#-------------------------------------------------------------------------
702+
# -------------------------------------------------------------------------
699703
def _add_delayed_cond(self, statement, index, delay):
700704
name_prefix = '_'.join(
701705
['', self.name, 'cond', str(index), str(self.tmp_count)])
@@ -709,7 +713,7 @@ def _add_delayed_cond(self, statement, index, delay):
709713
prev = tmp
710714
return prev
711715

712-
#-------------------------------------------------------------------------
716+
# -------------------------------------------------------------------------
713717
def _add_delayed_subst(self, subst, index, delay):
714718
if not isinstance(subst, vtypes.Subst):
715719
return subst
@@ -734,7 +738,7 @@ def _add_delayed_subst(self, subst, index, delay):
734738
prev = tmp
735739
return left(prev)
736740

737-
#-------------------------------------------------------------------------
741+
# -------------------------------------------------------------------------
738742
def _clear_next_kwargs(self):
739743
self.next_kwargs = {}
740744

@@ -756,7 +760,7 @@ def _make_cond(self, condlist):
756760
ret = vtypes.Ands(ret, cond)
757761
return ret
758762

759-
#-------------------------------------------------------------------------
763+
# -------------------------------------------------------------------------
760764
def _set_index(self, index=None):
761765
if index is None:
762766
self.state_count += 1
@@ -784,7 +788,7 @@ def _get_mark_index(self, s):
784788
return index
785789
raise KeyError("No such mark in FSM marks: %s" % s.name)
786790

787-
#-------------------------------------------------------------------------
791+
# -------------------------------------------------------------------------
788792
def _add_mark(self, index):
789793
index = self._to_index(index)
790794
if index not in self.mark:
@@ -797,7 +801,7 @@ def _to_index(self, index):
797801
index = self._get_mark_index(index)
798802
return index
799803

800-
#-------------------------------------------------------------------------
804+
# -------------------------------------------------------------------------
801805
def _add_delayed_state(self, value):
802806
if not isinstance(value, int):
803807
raise TypeError("Delay amount must be int, not '%s'" %
@@ -851,7 +855,7 @@ def _to_state_assign(self, dst, cond=None, else_dst=None):
851855
value = value.Else(self.state(else_dst_mark))
852856
return value
853857

854-
#-------------------------------------------------------------------------
858+
# -------------------------------------------------------------------------
855859
def _cond_case(self, index):
856860
if index not in self.mark:
857861
self._set_mark(index)
@@ -895,7 +899,7 @@ def _get_if_statement(self, index):
895899
def _get_delayed_if_statement(self, index, delay):
896900
return vtypes.If(self._delayed_cond_if(index, delay))(*self.delayed_body[delay][index])
897901

898-
#-------------------------------------------------------------------------
902+
# -------------------------------------------------------------------------
899903
def __call__(self, *statement, **kwargs):
900904
return self.add(*statement, **kwargs)
901905

0 commit comments

Comments
 (0)