Skip to content

Commit 580120d

Browse files
committed
lib_simulation_basic is updated: countup interval is decreased.
1 parent 9098f27 commit 580120d

File tree

3 files changed

+119
-5
lines changed

3 files changed

+119
-5
lines changed

tests/lib_simulation_/basic/lib_simulation_basic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ def mkLed():
1818
If(rst)(
1919
count(0)
2020
).Else(
21-
If(count == 1023)(
21+
If(count == 16 - 1)(
2222
count(0)
2323
).Else(
2424
count(count + 1)
@@ -29,7 +29,7 @@ def mkLed():
2929
If(rst)(
3030
led(0)
3131
).Else(
32-
If(count == 1024 - 1)(
32+
If(count == 16 - 1)(
3333
led(led + 1)
3434
)
3535
))

tests/lib_simulation_/basic/test_lib_simulation_basic.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
if(RST) begin
6262
count <= 0;
6363
end else begin
64-
if(count == 1023) begin
64+
if(count == 15) begin
6565
count <= 0;
6666
end else begin
6767
count <= count + 1;
@@ -72,7 +72,7 @@
7272
if(RST) begin
7373
LED <= 0;
7474
end else begin
75-
if(count == 1023) begin
75+
if(count == 15) begin
7676
LED <= LED + 1;
7777
end
7878
end

veriloggen/lib/simulation.py

Lines changed: 115 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@
22
from __future__ import print_function
33
import os
44
import sys
5-
import collections
5+
import subprocess
6+
import tempfile
67

78
import veriloggen.vtypes as vtypes
9+
import veriloggen.module as module
810

911
def setup_waveform(m, *uuts):
1012
new_uuts = []
@@ -46,3 +48,115 @@ def next_clock(clk):
4648

4749
def finish():
4850
return Systask('finish')
51+
52+
#-------------------------------------------------------------------------------
53+
class Simulator(object):
54+
def __init__(self, *objs, **options):
55+
sim = 'iverilog' if 'sim' not in options else options['sim']
56+
wave = 'gtkwave' if 'wave' not in options else options['wave']
57+
files = None if 'files' not in options else options['files']
58+
self._type_check_sim(sim)
59+
self._type_check_wave(wave)
60+
self.objs = objs
61+
self.files = files
62+
self.sim = sim
63+
self.wave = wave
64+
65+
def _type_check_sim(self, sim):
66+
if sim == 'iverilog' or sim == 'icarus':
67+
return
68+
if sim == 'vcs':
69+
raise NotImplementedError("Not implemented: '%s'" % sim)
70+
raise ValueError("Not supported simulator: '%s'" % sim)
71+
72+
def _type_check_wave(self, wave):
73+
if wave == 'gtkwave':
74+
return
75+
raise ValueError("Not supported waveform viewer: '%s'" % wave)
76+
77+
def run(self, display=False, outputfile='a.out', include=None, define=None):
78+
if self.sim == 'iverilog' or self.sim == 'icarus':
79+
return self._run_iverilog(display, outputfile, include, define)
80+
raise NotImplementedError("Not implemented: '%s'" % self.sim)
81+
82+
def _run_iverilog(self, display=False, outputfile='a.out', include=None, define=None):
83+
cmd = []
84+
cmd.append('iverilog')
85+
if include:
86+
for inc in include:
87+
cmd.append('-I')
88+
cmd.append(inc)
89+
if define:
90+
for d in define:
91+
cmd.append('-D')
92+
if isinstance(d, (tuple, list)):
93+
if d[1] is None:
94+
cmd.append(d[0])
95+
else:
96+
cmd.append(''.join([ d[0], '=', str(d[1])]))
97+
else:
98+
cmd.append(d)
99+
100+
cmd.append('-o')
101+
cmd.append(outputfile)
102+
103+
# encoding: 'utf-8' ?
104+
encode = sys.getdefaultencoding()
105+
106+
code = self.to_code()
107+
tmp = tempfile.NamedTemporaryFile()
108+
tmp.write(code.encode(encode))
109+
tmp.read()
110+
filename = tmp.name
111+
112+
cmd.append(filename)
113+
114+
# synthesis
115+
p = subprocess.Popen(' '.join(cmd), shell=True, stdout=subprocess.PIPE)
116+
syn_rslt = []
117+
while True:
118+
stdout_data = p.stdout.readline()
119+
syn_rslt.append(stdout_data.decode(encode))
120+
if display: print(stdout_data, end='')
121+
if not stdout_data: break
122+
p.wait()
123+
p.stdout.close()
124+
syn_rslt = ''.join(syn_rslt)
125+
126+
# simulation
127+
p = subprocess.Popen('./' + outputfile, shell=True, stdout=subprocess.PIPE)
128+
sim_rslt = []
129+
while True:
130+
stdout_data = p.stdout.readline()
131+
sim_rslt.append(stdout_data.decode(encode))
132+
if display: print(stdout_data, end='')
133+
if not stdout_data: break
134+
p.wait()
135+
p.stdout.close()
136+
sim_rslt = ''.join(sim_rslt)
137+
138+
# close temporal source code file
139+
tmp.close()
140+
141+
return ''.join([syn_rslt, sim_rslt])
142+
143+
def to_code(self):
144+
code = []
145+
for obj in self.objs:
146+
if isinstance(obj, module.Module):
147+
code.append(obj.to_verilog())
148+
code.append('\n')
149+
if isinstance(obj, str):
150+
code.append(obj)
151+
code.append('\n')
152+
return ''.join(code)
153+
154+
def view_waveform(self, filename):
155+
return self._view_waveform_gtkwave(filename)
156+
157+
def _view_waveform_gtkwave(self, filename):
158+
cmd = []
159+
cmd.append('gtkwave')
160+
cmd.append('--giga')
161+
cmd.append(filename)
162+
subprocess.call(' '.join(cmd), shell=True)

0 commit comments

Comments
 (0)