为什么这个并发语句的代码覆盖率低于100%?

时间:2017-02-06 23:04:09

标签: vhdl code-coverage modelsim questasim

为什么以下时钟生成语句不是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 unaffected,那么我获得100%的覆盖率。

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

我不确定为什么ModelSim / QuestaSim要求我写一个显式的else分支,它不包含波形。

2 个答案:

答案 0 :(得分: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报告 enter image description here

因此,这可能是Modelsim技术支持的问题。

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

答案 1 :(得分:1)

您的意思是哪种代码覆盖类型?简单的声明覆盖,或分支或切换覆盖?对于所有这三种类型,我完全覆盖了时钟生成语句。也许这是您使用的旧版Modelsim / Questa版本的问题?我使用Modelsim DE 10.6(Revision 2016.12)。

我的tcl命令是:

vcom -2008 +cover coverage1.vhdl
vsim -novopt -coverage coverage1_tb
run -all