2017-02-06 91 views
3

为什么在ModelSim/QuestaSim中下面的时钟生成语句不是100%的代码覆盖率?为什么这个并发语句少于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分支:else unaffected,然后我得到100%的覆盖率。

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

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

回答

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代码中的这些分支和实际分支。所以分支机构的工作范围很大,但有很多混乱。 (具有讽刺意味的是,使用g ++/gcov进行分析的C++中的异常似乎遭受相同的混乱问题)。

+0

感谢布赖恩,什么是需要在Linux上运行'lcov'和'genhtml'(Debian的测试?)它看起来像我可以很容易地覆盖统计融入我们的[的PoC -library](https://github.com/VLSI-EDA/PoC)。 – Paebbels

+2

据我记得,'apt-get install lcov' - genhtml是软件包的一部分。但看到其他Q/A的警告,看起来好像这两个模拟器在代码覆盖率上都不是完全平滑的。 –

1

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

我的TCL命令:

vcom -2008 +cover coverage1.vhdl 
vsim -novopt -coverage coverage1_tb 
run -all 
相关问题