Skip to content

Commit 7b73ca0

Browse files
Germain Haugouhaugoug
Germain Haugou
authored andcommitted
tests: Added support for gvsoc
1 parent 140bc85 commit 7b73ca0

File tree

10 files changed

+197
-26
lines changed

10 files changed

+197
-26
lines changed

target/common/common.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ SED_SRCS := sed -e ${MATCH_END} -e ${MATCH_BGN} -e ${MATCH_DEF}
5050

5151
COMMON_BENDER_FLAGS += -t rtl
5252

53+
GVSOC_BUILDDIR ?= work-gvsoc
54+
5355
VSIM_BENDER += $(COMMON_BENDER_FLAGS) -t test -t simulation -t vsim
5456
VSIM_SOURCES = $(shell ${BENDER} script flist-plus ${VSIM_BENDER} | ${SED_SRCS})
5557
VSIM_BUILDDIR ?= work-vsim

target/common/gvsoc.mk

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Copyright 2024 ETH Zurich and University of Bologna.
2+
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
3+
# SPDX-License-Identifier: Apache-2.0
4+
5+
$(BIN_DIR)/$(TARGET).gvsoc:
6+
@echo "#!/bin/bash" > $@
7+
@echo 'binary=$$(realpath $$1)' >> $@
8+
@echo 'echo $$binary > .rtlbinary' >> $@
9+
@echo 'path="$$(dirname "$$(dirname "$$(readlink -f "$${BASH_SOURCE[0]}")")")"' >> $@
10+
@echo 'if [ -z "$$GVSOC_TARGET" ]; then' >> $@
11+
@echo ' GVSOC_TARGET=snitch' >> $@
12+
@echo 'fi' >> $@
13+
@echo 'gvsoc --target=$${GVSOC_TARGET} --binary $$binary \
14+
--control-script=$${path}/../../util/sim/gvsoc_control.py $$2 run' >> $@
15+
@chmod +x $@
16+
17+
.PHONY: clean-gvsoc
18+
clean-gvsoc:
19+
rm -rf $(BIN_DIR)/$(TARGET).gvsoc $(GVSOC_BUILDDIR)
20+
21+
clean: clean-gvsoc

target/snitch_cluster/Makefile

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,12 @@ $(BIN_DIR)/$(TARGET).vcs: ${VCS_SOURCES} ${TB_SRCS} $(TB_CC_SOURCES) $(RTL_CC_SO
215215
-assert disable_cover -override_timescale=1ns/1ps -full64 tb_bin $(TB_CC_SOURCES) $(RTL_CC_SOURCES) \
216216
-CFLAGS "$(TB_CC_FLAGS)" -LDFLAGS "-L${FESVR}/lib" -lfesvr
217217

218+
#########
219+
# GVSOC #
220+
#########
221+
222+
include $(ROOT)/target/common/gvsoc.mk
223+
218224
########
219225
# Util #
220226
########

target/snitch_cluster/sw/run.yaml

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,60 +6,66 @@ runs:
66
- elf: tests/build/alias.elf
77
simulators: [vsim, vcs, verilator] # banshee does not model alias regions
88
- elf: tests/build/atomics.elf
9-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x4
9+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x4
1010
- elf: tests/build/barrier.elf
1111
- elf: tests/build/data_mover.elf
12+
simulators: [vsim, vcs, verilator, banshee]
1213
- elf: tests/build/dma_empty_transfer.elf
1314
- elf: tests/build/dma_simple.elf
1415
- elf: tests/build/event_unit.elf
16+
simulators: [vsim, vcs, verilator, banshee]
1517
- elf: tests/build/fence_i.elf
1618
- elf: tests/build/fp8_comparison_scalar.elf
17-
simulators: [vsim, vcs, verilator] # banshee fails with segfault
19+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with segfault
1820
- elf: tests/build/fp8_comparison_vector.elf
19-
simulators: [vsim, vcs, verilator] # banshee fails with segfault
21+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with segfault
2022
- elf: tests/build/fp8_computation_scalar.elf
21-
simulators: [vsim, vcs, verilator] # banshee fails with JIT issue
23+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with JIT issue
2224
- elf: tests/build/fp8_computation_vector.elf
23-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x6
25+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x6
2426
- elf: tests/build/fp8alt_comparison_scalar.elf
25-
simulators: [vsim, vcs, verilator] # banshee fails with segfault
27+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with segfault
2628
- elf: tests/build/fp8alt_comparison_vector.elf
27-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x10
29+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x10
2830
- elf: tests/build/fp8alt_computation_scalar.elf
29-
simulators: [vsim, vcs, verilator] # banshee fails with JIT issue
31+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with JIT issue
3032
- elf: tests/build/fp8alt_computation_vector.elf
31-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x12
33+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x12
3234
- elf: tests/build/fp16_comparison_scalar.elf
33-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x10
35+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x10
3436
- elf: tests/build/fp16_comparison_vector.elf
35-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x10
37+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x10
3638
- elf: tests/build/fp16_computation_scalar.elf
37-
simulators: [vsim, vcs, verilator] # banshee fails with JIT issue
39+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with JIT issue
3840
- elf: tests/build/fp16_computation_vector.elf
39-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x6
41+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x6
4042
- elf: tests/build/fp16alt_comparison_scalar.elf
41-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x10
43+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x10
4244
- elf: tests/build/fp16alt_comparison_vector.elf
43-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x10
45+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x10
4446
- elf: tests/build/fp16alt_computation_scalar.elf
45-
simulators: [vsim, vcs, verilator] # banshee fails with JIT issue
47+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with JIT issue
4648
- elf: tests/build/fp16alt_computation_vector.elf
47-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x16
49+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x16
4850
- elf: tests/build/fp32_comparison_scalar.elf
4951
- elf: tests/build/fp32_comparison_vector.elf
5052
- elf: tests/build/fp32_computation_scalar.elf
51-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x2
53+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x2
5254
- elf: tests/build/fp32_computation_vector.elf
53-
simulators: [vsim, vcs, verilator] # banshee fails with exit code 0x2
55+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with exit code 0x2
5456
- elf: tests/build/fp32_conversions_scalar.elf
55-
simulators: [vsim, vcs, verilator] # banshee fails with illegal instruction
57+
simulators: [vsim, vcs, verilator, gvsoc] # banshee fails with illegal instruction
5658
# - elf: tests/build/fp64_conversions_scalar.elf
5759
# simulators: [vsim, vcs, verilator]
5860
- elf: tests/build/interrupt_local.elf
61+
simulators: [vsim, vcs, verilator, banshee]
5962
- elf: tests/build/multi_cluster.elf
6063
- elf: tests/build/openmp_parallel.elf
64+
simulators: [vsim, vcs, verilator, banshee]
6165
- elf: tests/build/openmp_for_static_schedule.elf
66+
simulators: [vsim, vcs, verilator, banshee]
6267
- elf: tests/build/openmp_double_buffering.elf
68+
simulators: [vsim, vcs, verilator, banshee]
6369
- elf: tests/build/perf_cnt.elf
6470
simulators: [vsim, vcs, verilator] # banshee does not have HW performance counters
6571
- elf: tests/build/printf_simple.elf
@@ -72,6 +78,7 @@ runs:
7278
- elf: tests/build/non_null_exitcode.elf
7379
retcode: 56
7480
- elf: tests/build/caq.elf
81+
simulators: [vsim, vcs, verilator, banshee] # GVSOC does not model caq
7582
- elf: tests/build/caq_frep.elf
7683
simulators: [vsim, vcs, verilator] # banshee does not model FREP timing
7784
- elf: apps/blas/axpy/build/axpy.elf
@@ -93,11 +100,13 @@ runs:
93100
- elf: apps/dnn/fused_concat_linear/build/fused_concat_linear.elf
94101
cmd: [../../../sw/dnn/fused_concat_linear/scripts/verify.py, "${sim_bin}", "${elf}"]
95102
- elf: apps/dnn/transpose/build/transpose.elf
103+
simulators: [vsim, vcs, verilator, banshee]
96104
cmd: [../../../sw/dnn/transpose/scripts/verify.py, "${sim_bin}", "${elf}"]
97105
- elf: apps/montecarlo/pi_estimation/build/pi_estimation.elf
98106
- elf: apps/atax/build/atax.elf
99107
cmd: [../../../sw/apps/atax/scripts/verify.py, "${sim_bin}", "${elf}"]
100108
- elf: apps/covariance/build/covariance.elf
109+
simulators: [vsim, vcs, verilator, banshee]
101110
cmd: [../../../sw/apps/covariance/scripts/verify.py, "${sim_bin}", "${elf}"]
102111
- elf: apps/doitgen/build/doitgen.elf
103112
cmd: [../../../sw/apps/doitgen/scripts/verify.py, "${sim_bin}", "${elf}"]

target/snitch_cluster/util/run.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,16 @@
1515

1616
sys.path.append(str(Path(__file__).parent / '../../../util/sim'))
1717
import sim_utils # noqa: E402
18-
from Simulator import QuestaSimulator, VCSSimulator, VerilatorSimulator, \
18+
from Simulator import QuestaSimulator, VCSSimulator, VerilatorSimulator, GvsocSimulator, \
1919
BansheeSimulator # noqa: E402
2020

2121

2222
SIMULATORS = {
2323
'vsim': QuestaSimulator(Path(__file__).parent.resolve() / '../bin/snitch_cluster.vsim'),
2424
'vcs': VCSSimulator(Path(__file__).parent.resolve() / '../bin/snitch_cluster.vcs'),
2525
'verilator': VerilatorSimulator(Path(__file__).parent.resolve() / '../bin/snitch_cluster.vlt'),
26-
'banshee': BansheeSimulator(Path(__file__).parent.resolve() / '../src/banshee.yaml')
26+
'banshee': BansheeSimulator(Path(__file__).parent.resolve() / '../src/banshee.yaml'),
27+
'gvsoc': GvsocSimulator(Path(__file__).parent.resolve() / '../bin/snitch_cluster.gvsoc')
2728
}
2829

2930

util/sim/Simulation.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,37 @@ def get_cpu_time(self):
267267
return hours*3600 + minutes*60 + seconds
268268

269269

270+
class GvsocSimulation(Simulation):
271+
"""A functional simulation running on GVSOC."""
272+
273+
def __init__(self, sim_bin=None, cmd=None, **kwargs):
274+
super().__init__(**kwargs)
275+
276+
if cmd is None:
277+
self.cmd = ['gvsoc', '--target', os.environ.get('GVSOC_TARGET'), '--binary',
278+
str(self.elf), 'run']
279+
else:
280+
self.dynamic_args = {
281+
'sim_bin': str(sim_bin),
282+
'elf': str(self.elf),
283+
'run_dir': str(self.run_dir)
284+
}
285+
self.cmd = [Template(arg).render(**self.dynamic_args) for arg in cmd]
286+
self.cmd.append('--simulator=gvsoc')
287+
288+
def successful(self):
289+
"""Return whether the simulation was successful."""
290+
# On GVSOC, OpenOCD semi-hosting is used which can just report 0 or 1
291+
actual_retcode = self.get_retcode()
292+
if actual_retcode is not None:
293+
if self.expected_retcode != 0:
294+
return int(actual_retcode) != 0
295+
else:
296+
return int(actual_retcode) == 0
297+
else:
298+
return False
299+
300+
270301
class VCSSimulation(QuestaVCSSimulation):
271302
"""An RTL simulation running on VCS."""
272303

util/sim/Simulator.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
#
55
# Luca Colagrande <colluca@iis.ee.ethz.ch>
66

7-
from Simulation import QuestaSimulation, VCSSimulation, VerilatorSimulation, BansheeSimulation
7+
from Simulation import QuestaSimulation, VCSSimulation, VerilatorSimulation, BansheeSimulation, \
8+
GvsocSimulation
89

910

1011
class Simulator(object):
@@ -97,6 +98,36 @@ def get_simulation(self, test):
9798
)
9899

99100

101+
class GvsocSimulator(Simulator):
102+
"""Gvsoc simulator
103+
104+
A simulator, identified by the name
105+
`gvsoc`, tailored to the creation of
106+
[Gvsoc simulations][Simulation.GvsocSimulation].
107+
"""
108+
109+
def __init__(self, binary):
110+
"""Constructor for the GvsocSimulator class.
111+
112+
Arguments:
113+
binary: The Gvsoc simulation binary.
114+
kwargs: Arguments passed to the base class constructor.
115+
"""
116+
super().__init__(name='gvsoc', simulation_cls=GvsocSimulation)
117+
self.binary = binary
118+
119+
def get_simulation(self, test):
120+
if 'cmd' in test:
121+
cmd = test['cmd']
122+
else:
123+
cmd = None
124+
return super().get_simulation(
125+
test,
126+
sim_bin=self.binary,
127+
cmd=cmd
128+
)
129+
130+
100131
class VCSSimulator(RTLSimulator):
101132
"""VCS simulator
102133

util/sim/SnitchSim.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@
2525

2626
class SnitchSim:
2727

28-
def __init__(self, sim_bin: str, snitch_bin: str, log: str = None):
28+
def __init__(self, sim_bin: str, snitch_bin: str, simulator: str = None, log: str = None):
2929
self.sim_bin = sim_bin
3030
self.snitch_bin = snitch_bin
3131
self.sim = None
3232
self.tmpdir = None
33+
self.simulator = simulator
3334
self.log = open(log, 'w+') if log else log
3435

3536
def start(self):
@@ -40,7 +41,11 @@ def start(self):
4041
rx_fd = os.path.join(self.tmpdir.name, 'rx')
4142
os.mkfifo(rx_fd)
4243
# Start simulator process
43-
ipc_arg = f'--ipc,{tx_fd},{rx_fd}'
44+
if self.simulator == 'gvsoc':
45+
ipc_arg = f'--ipc {tx_fd},{rx_fd}'
46+
else:
47+
ipc_arg = f'--ipc,{tx_fd},{rx_fd}'
48+
4449
self.sim = subprocess.Popen([self.sim_bin, self.snitch_bin, ipc_arg], stdout=self.log)
4550
# Open FIFOs
4651
self.tx = open(tx_fd, 'wb', buffering=0) # Unbuffered

util/sim/gvsoc_control.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env python3
2+
# Copyright 2024 ETH Zurich and University of Bologna.
3+
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
4+
# SPDX-License-Identifier: Apache-2.0
5+
#
6+
# Author: Germain Haugou <haugoug@iis.ee.ethz.ch>
7+
8+
import gvsoc.gvsoc_control
9+
import struct
10+
11+
12+
def parse_args(parser, args):
13+
parser.add_argument('--ipc', type=str, help="IPC socket files")
14+
15+
16+
def handle_commands(gv, tx_fd, rx_fd):
17+
18+
axi = gvsoc.gvsoc_control.Router(gv, path='**/chip/soc/narrow_axi')
19+
20+
gv.run()
21+
22+
while True:
23+
data = rx_fd.read(8)
24+
if not data:
25+
return
26+
27+
command = struct.unpack('=Q', data)[0]
28+
29+
if command == 2:
30+
data = rx_fd.read(16)
31+
addr, mask32, exp32 = struct.unpack('=QLL', data)
32+
33+
retval = gv.join()
34+
data = struct.pack('=L', retval)
35+
tx_fd.write(data)
36+
37+
elif command == 0:
38+
data = rx_fd.read(16)
39+
addr, length = struct.unpack('=QQ', data)
40+
data = axi.mem_read(addr, length)
41+
tx_fd.write(data)
42+
43+
elif command == 1:
44+
data = rx_fd.read(16)
45+
addr, length = struct.unpack('=QQ', data)
46+
data = rx_fd.read(length)
47+
axi.mem_write(addr, data)
48+
data = struct.pack('=L', 0)
49+
tx_fd.write(data)
50+
pass
51+
52+
53+
def target_control(args, gv=None):
54+
rx, tx = args.ipc.split(',')
55+
56+
rx_fd = open(rx, 'rb', buffering=0)
57+
tx_fd = open(tx, 'wb', buffering=0)
58+
59+
handle_commands(gv, tx_fd, rx_fd)
60+
61+
return 0

util/sim/verif_utils.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ def parser(self):
9797
parser.add_argument(
9898
'--log',
9999
help='Redirect simulation output to this log file')
100+
parser.add_argument(
101+
'--simulator',
102+
help='Specifies simulator')
100103
parser.add_argument(
101104
'--dump-results',
102105
action='store_true',
@@ -144,7 +147,8 @@ def simulate(self):
144147
elf = Elf(self.args.snitch_bin)
145148

146149
# Start simulation
147-
sim = SnitchSim(self.args.sim_bin, self.args.snitch_bin, log=self.args.log)
150+
sim = SnitchSim(self.args.sim_bin, self.args.snitch_bin, simulator=self.args.simulator,
151+
log=self.args.log)
148152
sim.start()
149153

150154
# Wait for kernel execution to be over

0 commit comments

Comments
 (0)