Vhdl 为什么FSM不能达到100%的代码覆盖率?

Vhdl 为什么FSM不能达到100%的代码覆盖率?,vhdl,code-coverage,modelsim,questasim,Vhdl,Code Coverage,Modelsim,Questasim,我在VHDL中有以下简单的FSM描述: library ieee; use ieee.std_logic_1164.all; entity coverage1 is port ( clk : in std_logic; rst : in std_logic; req : in std_logic; ack : out std_logic ); end entity coverage1; architecture rtl of coverage1

我在VHDL中有以下简单的FSM描述:

library ieee;
use ieee.std_logic_1164.all;

entity coverage1 is
  port (
    clk : in  std_logic;
    rst : in  std_logic;
    req : in  std_logic;
    ack : out std_logic
  );
end entity coverage1;

architecture rtl of coverage1 is
  type STATES is (IDLE, RUNNING, FINISH);
  signal fsm_cs : STATES := IDLE;
  signal fsm_ns : STATES;
begin

  process (fsm_cs, req) is
  begin
    fsm_ns <= fsm_cs;
    ack    <= '0';

    case fsm_cs is
      when IDLE =>
        if req = '1' then
          fsm_ns <= RUNNING;
        end if;

      when RUNNING =>
        fsm_ns <= FINISH;

      when FINISH =>
        ack <= '1';
        fsm_ns <= IDLE;

      when others =>
              null;
    end case;
  end process;

  process (clk) is
  begin
    if rising_edge(clk) then
      if rst = '1' then
        fsm_cs <= IDLE;
      else
        fsm_cs <= fsm_ns;
      end if;
    end if;
  end process;
end architecture;
为什么状态图显示假边,为什么我不能使用默认分配?


我可以接受项目1,但项目2是个问题。如果我以这种风格编写FSM,我将复制大量不需要的代码,大多数合成器将无法识别FSM模式!因此,我将丢失FSM优化和检查合成。

一些观察结果,再次使用ghdl

注释掉
rdy
端口,ghdl再次报告100%覆盖率

具有讽刺意味的是,“others”子句中的
null
得到了20次点击。。。这是可疑的。因为它是流程中最后一条活动线,我相信任何唤醒流程但不起任何作用的事件都会记录在这里

A
null结束案例
之后添加的code>收集了这20个点击,确认了这一点-但是
其他
案例仍然没有记录为覆盖孔(尽管没有点击)。我的假设是,因为
null
不生成代码,所以它没有被跟踪。添加无害但可跟踪的操作
fsm\n
  • 当其他显示为未覆盖时,如预期所示。您可以使用以下方法排除它:

    -- coverage off
    when others => null;
    -- coverage on
    
    我在每一个案例陈述中都这样做,而其他案例则不能 击中

  • 即使没有else分支机构,我也能获得100%的州覆盖率。处于空闲状态的
    if
    条件具有100%的分支覆盖率,即使没有else分支
    (活动:4,正确点击:1,全部错误:3)
    。对于100%FSM覆盖范围,您应该通过重置信号排除隐式更改,或者您必须在每个FSM状态下进行重置。编译时,可以使用
    -nofsmresettrans
    swith排除重置状态更改
  • 我使用Modelsim DE 10.5c和10.6以及Questa 10.6得到了相同的行为


    顺便说一句:如果FSM的某些部分位于依赖于泛型的generate块中,我就无法获得FSM覆盖,因此我不得不对generate内容进行注释,只在其中一个重置过程中保留。我认为这是Modelsim/Questa的一个限制,它不能识别生成块中的FSM,但我不能。该帮助还提示使用泛型的FSM不会被重新组织。这里可能就是这种情况。

    如果删除
    其他
    案例会怎么样?那么奎斯塔西姆就不能要求保险了。或者你的意思是,即使所有案例都被明确处理,如果没有其他案例,它也会抱怨吗?我可以删除其他案例,但如果在这样一个简单的例子中任务失败,在更复杂的场景中会发生什么?10.9案例陈述告诉我们其他人的选择在这里是合法的。根据类型状态确定选择在代码执行分析工具的域之外,而不在case语句的VHDL分析的域之外。tmeissner的--coverage off/on似乎是一个有效的解决方案。正如Brian所暗示的,您在测试台上缺少了rdy端口的实际声明。
    
    if req = '1' then
      fsm_ns <= RUNNING;
    else
      fsm_ns <= IDLE;
    end if;
    
    -- coverage off
    when others => null;
    -- coverage on