为什么以下时钟生成语句不是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分支,它不包含波形。
答案 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
因此,这可能是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