3

为什么以下时钟生成语句在 ModelSim/QuestaSim 中没有 100% 的代码覆盖率?

clk <= not clk after 5 ns when not finished;

这是完整的例子:

library ieee;
use     ieee.std_logic_1164.all;

entity coverage1_tb is
end entity;

architecture tb of coverage1_tb is
  signal clk      : std_logic := '1';
  signal finished : boolean   := false;
begin  -- architecture tb
  clk <= not clk after 10 ns when not finished;
  --clk <= not clk after 10 ns when not finished else unaffected;

  process
  begin
    wait until rising_edge(clk);
    wait until rising_edge(clk);

    wait until rising_edge(clk);
    finished <= true;
    wait;
  end process;
end architecture;

如果我添加这个 else branch: else unaffected,那么我将获得 100% 的覆盖率。

并发信号分配被转换为具有顺序信号分配的进程 (LRM 11.6)。未受影响的分支被转换为空语句(LRM 11.6,注 2;LRM 10.5.2.1)。

我不确定为什么 ModelSim/QuestaSim 要求我编写一个明确的 else 分支,其中不包含任何波形。

4

2 回答 2

2

不是一个完整的答案,但我可以报告说,使用 gcc 后端构建的 ghdl 报告了此示例的 100% 覆盖率。

ghdl -a --std=08 -g -fprofile-arcs -ftest-coverage coverage1_tb.vhd
ghdl -e --std=08 -Wl,-lgcov -Wl,--coverage coverage1_tb
./coverage1_tb 
lcov --capture --directory . 
genhtml coverage.info --output-directory html

生成以下 HTML 报告 在此处输入图像描述

所以,这可能是Modelsim技术支持的问题。

通过 gcc/ghdl/gcov 进行的分支覆盖并不是那么令人满意:一些 VHDL 更高级的构造(如信号分配)在内部涉及分支,而 gcc 不区分这些分支和 VHDL 代码中的实际分支。所以分支覆盖有效,但有很多混乱。(具有讽刺意味的是,使用 g++/gcov 分析的 C++ 中的异常似乎也遇到了同样的混乱问题)。

于 2017-02-06T23:55:57.560 回答
1

您是指哪种代码覆盖率类型?简单的语句覆盖,还是分支或切换覆盖?对于所有这 3 种类型,我全面了解了时钟生成语句。也许这是您使用的旧 Modelsim/Questa 版本的问题?我使用 Modelsim DE 10.6(修订版 2016.12)。

我的 tcl 命令是:

vcom -2008 +cover coverage1.vhdl
vsim -novopt -coverage coverage1_tb
run -all
于 2017-02-07T11:16:01.947 回答