GHDL + 使用 gcov 的代码覆盖率(Ubuntu 16.04 LTS)
GHDL + Code coverage using gcov (Ubuntu 16.04 LTS)
这个 page(来自 Arnim Läuger,2005 年)解释了工具链 {GHDL + gcov} 可以执行 VHDL 代码覆盖。
问题:它今天是否仍然适用于最新版本的 GCC、GCOV 和 GHDL?
以下命令失败
$ ghdl -a -Wc,-ftest-coverage -Wc,-fprofile-arcs tb_example.vhd
ghdl: unknown option '-Wc,-ftest-coverage' for command '-a'
我的设置如下:
$ 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:report@adacore.com --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 (buildd@lgw01-20) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) ) #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016
我使用 Building with mcode backend 程序安装了 GHDL。难道是万恶之源?
感谢帮助!
是的,当前的 ghdl 确实支持代码覆盖率。
确保你有最新的 ghdl 版本,但请注意,虽然 ghdl 支持 3 种代码生成后端(LLVM、gcc 和它自己的 JIT 编译器、mcode),但目前只有 gcc 后端支持代码覆盖(通过 gcov)。具体来说,您构建的 mcode 版本将无法运行。
应该有适合 Ubuntu 的软件包 - 失败了,我在某处有构建说明,用于在 Debian Jessie 上从源代码构建,它也应该为 Ubuntu 服务。 (如果需要我会把它们挖出来)。
ghdl --version
GHDL 0.34dev (20151126) [Dunoon edition]
Compiled with GNAT Version: 4.9.3
GCC back-end code generator
Written by Tristan Gingold.
检查...
现在您需要提供一些编译时标志...
ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage myfile.vhd
ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage my_TB.vhd
并进行详细说明(-Wl,
在链接器选项之前)...
ghdl -e --std=08 -Wl,-lgcov -Wl,--coverage my_tb
./my_tb
并且您应该有一组 .gcno,.gcda
文件要使用 gcov
(或 lcov
和 genhtml
进行 post 处理以获得更漂亮的报告)
也适用于 Vunit 和 OSVVM 库。
分支覆盖效果不佳,部分原因是 VHDL 的信号分配语义转化为生成的可执行文件中的大量虚假分支。
在 VUnit 下,我不使用他们的 "code coverage" 实验性选项。
相反,我设置了相关标志,运行 vu.main() 函数,捕获它的 return,并将 lcov 作为 post 处理步骤调用。一个不完整的例子run.py脚本如下:
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"])
这个 page(来自 Arnim Läuger,2005 年)解释了工具链 {GHDL + gcov} 可以执行 VHDL 代码覆盖。
问题:它今天是否仍然适用于最新版本的 GCC、GCOV 和 GHDL?
以下命令失败
$ ghdl -a -Wc,-ftest-coverage -Wc,-fprofile-arcs tb_example.vhd
ghdl: unknown option '-Wc,-ftest-coverage' for command '-a'
我的设置如下:
$ 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:report@adacore.com --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 (buildd@lgw01-20) (gcc version 5.3.1 20160413 (Ubuntu 5.3.1-14ubuntu2.1) ) #53-Ubuntu SMP Wed Jul 27 16:06:39 UTC 2016
我使用 Building with mcode backend 程序安装了 GHDL。难道是万恶之源?
感谢帮助!
是的,当前的 ghdl 确实支持代码覆盖率。
确保你有最新的 ghdl 版本,但请注意,虽然 ghdl 支持 3 种代码生成后端(LLVM、gcc 和它自己的 JIT 编译器、mcode),但目前只有 gcc 后端支持代码覆盖(通过 gcov)。具体来说,您构建的 mcode 版本将无法运行。
应该有适合 Ubuntu 的软件包 - 失败了,我在某处有构建说明,用于在 Debian Jessie 上从源代码构建,它也应该为 Ubuntu 服务。 (如果需要我会把它们挖出来)。
ghdl --version
GHDL 0.34dev (20151126) [Dunoon edition]
Compiled with GNAT Version: 4.9.3
GCC back-end code generator
Written by Tristan Gingold.
检查...
现在您需要提供一些编译时标志...
ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage myfile.vhd
ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage my_TB.vhd
并进行详细说明(-Wl,
在链接器选项之前)...
ghdl -e --std=08 -Wl,-lgcov -Wl,--coverage my_tb
./my_tb
并且您应该有一组 .gcno,.gcda
文件要使用 gcov
(或 lcov
和 genhtml
进行 post 处理以获得更漂亮的报告)
也适用于 Vunit 和 OSVVM 库。
分支覆盖效果不佳,部分原因是 VHDL 的信号分配语义转化为生成的可执行文件中的大量虚假分支。
在 VUnit 下,我不使用他们的 "code coverage" 实验性选项。 相反,我设置了相关标志,运行 vu.main() 函数,捕获它的 return,并将 lcov 作为 post 处理步骤调用。一个不完整的例子run.py脚本如下:
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"])