2016-08-09 93 views
1

Diese page (von Arnim Läuger in 2005) erklärt, dass eine Werkzeugkette {GHDL + gcov} VHDL-Code abdecken kann.GHDL + Code-Abdeckung mit gcov (Ubuntu 16.04 LTS)

Frage: Funktioniert es noch heute mit den neuesten Versionen von GCC, GCOV und GHDL?

Der folgende Befehl fehlschlägt

$ ghdl -a -Wc,-ftest-coverage -Wc,-fprofile-arcs tb_example.vhd 
ghdl: unknown option '-Wc,-ftest-coverage' for command '-a' 

Mein Setup wie folgt lautet:

$ gcc -v 
Using built-in specs. 
COLLECT_GCC=gcc 
COLLECT_LTO_WRAPPER=/usr/gnat/bin/../libexec/gcc/x86_64-pc-linux-gnu/4.9.4/lto-wrapper 
Target: x86_64-pc-linux-gnu 
Configured with: ../src/configure --enable-languages=ada,c,c++ --enable-dual-exceptions --enable-_cxa_atexit --enable-threads=posix --with-bugurl=URL:mailto:[email protected] --disable-nls --without-libiconv-prefix --disable-libstdcxx-pch --disable-libada --enable-checking=release --disable-multilib --with-mpfr=/boron.a/gnatmail/sandbox/gpl-2016/x86_64-linux/mpfr_stable/install --with-gmp=/boron.a/gnatmail/sandbox/gpl-2016/x86_64-linux/gmp_stable/install --with-mpc=/boron.a/gnatmail/sandbox/gpl-2016/x86_64-linux/mpc_stable/install --with-build-time-tools=/boron.a/gnatmail/sandbox/gpl-2016/x86_64-linux/gcc/build/buildtools/bin --prefix=/boron.a/gnatmail/sandbox/gpl-2016/x86_64-linux/gcc/pkg --build=x86_64-pc-linux-gnu 
Thread model: posix 
gcc version 4.9.4 20160426 (for GNAT GPL 2016 20160515) (GCC) 

$ gcov -v 
gcov (GCC) 4.9.4 20160426 (for GNAT GPL 2016 20160515) 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or 
FITNESS FOR A PARTICULAR PURPOSE. 

$ ghdl -v 
GHDL 0.34dev (20151126) [Dunoon edition] 
Compiled with GNAT Version: GPL 2016 (20160515-49) 
mcode code generator 
Written by Tristan Gingold. 

Copyright (C) 2003 - 2015 Tristan Gingold. 
GHDL is free software, covered by the GNU General Public License. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

$ cat /proc/version 
Linux version 4.4.0-34-generic ([email protected]) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1)) #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016 

I GHDL mit dem Gebäude mit MCODE Backend mitinstalliert. Könnte es die Wurzel des Bösen sein?

Vielen Dank für Ihre Hilfe!

Antwort

2

Ja, die aktuelle ghdl unterstützt die Codeabdeckung.

Stellen Sie sicher, dass Sie eine aktuelle ghdl-Version haben, aber während ghdl 3 Code-Generierungs-Backends unterstützt (LLVM, gcc und seinen eigenen JIT-Compiler, mcode), unterstützt derzeit nur das gcc-Backend Code-Coverage (über gcov). Insbesondere funktioniert die von Ihnen erstellte Mcode-Version nicht.

Es sollte geeignete Pakete für Ubuntu geben - wenn ich nicht habe, habe ich Bauanleitungen irgendwo für das Bauen von Quelle auf Debian Jessie, die für Ubuntu auch dienen sollte. (Ich werde sie ausgraben, wenn es sein muss).

ghdl --version 
GHDL 0.34dev (20151126) [Dunoon edition] 
Compiled with GNAT Version: 4.9.3 
GCC back-end code generator 
Written by Tristan Gingold. 

Check ...

Nun gibt es einige Kompilierung Flags, die Sie liefern müssen ...

ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage myfile.vhd 
ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage my_TB.vhd 

und Ausarbeitung (-Wl, voran Linker-Optionen) ...

ghdl -e --std=08 -Wl,-lgcov -Wl,--coverage my_tb 
./my_tb 

und Sie sollten eine Reihe von .gcno,.gcda Dateien haben, die mitnachbearbeitet werden sollen(oder lcov und genhtml, für schönere Berichte)

Funktioniert auch unter Vunit und mit der OSVVM-Bibliothek.

Zweigabdeckung funktioniert nicht so gut, teilweise weil VHDL Signalzuweisungssemantik in eine Menge von falschen Verzweigungen in der generierten ausführbaren Datei übersetzt.

Unter VUnit verwende ich ihre experimentelle Option "Code Coverage" nicht. Stattdessen setze ich die relevanten Flags, führen Sie die vu.main() -Funktion, abfangen und lcov als Nachbearbeitungsschritt aufrufen. Ein unvollständiges Beispiel run.py Skript ist wie folgt:

lib.add_compile_option("ghdl.flags", ["-fprofile-arcs"]) 
vu.set_sim_option("ghdl.flags", ["-Wl,-lgcov"]) 
try: 
    vu.main() 
except SystemExit as exc: 
    all_ok = exc.code == 0 

if all_ok: 
    subprocess.call(["lcov", "--capture", "--directory", ".", "--output-file", "code_coverage.info"]) 
    subprocess.call(["genhtml", "code_coverage.info", "--output-directory", "code_html"]) 
+0

Danke für Ihre detaillierte Antwort. Sehr hilfreich. Ich werde es versuchen und dann werde ich hier ein Feedback geben. –

+0

Ich habe mit GCC als Backend umgebaut und es funktioniert jetzt großartig. Vielen Dank. Das Sahnehäubchen ist, dass VUnit die Coverage-Ergebnisse direkt in das XML-Format mit einbezieht. Ist es möglich, Coverage in VUnit XML aufzunehmen? (Für jetzt habe ich die .gcda +.gcno erzeugt durch den VUnit-Lauf, aber ich muss am Ende gcov bymyself ausführen und die Ergebnisse sind nicht in der xml) –

+0

Die experimentelle VUnit-Unterstützung für Coverage ist nur für ModelSim, obwohl Arbeit initiiert wurde, um auch andere Simulatoren zu unterstützen. – lasplund