0

我有以下 VHDL 代码:

pure function sInitSyncSupport( sState: TYPE_STATE; sCssi: TYPE_CSS_TO_SSM ) return TYPE_STATE is
    variable sStateOut:           TYPE_STATE;
begin
    sStateOut                     := sState;

    sStateOut.bAccWndOpen         := false;
    sStateOut.iCorrValue          := 0;
    sStateOut.nClockCorrected     := 3*sCssi.nSwAcceptanceWindowHalf + 1;
    sStateOut.nMsCountMax         := 0;

    return sStateOut;
end function sInitSyncSupport;

pure function sStartSync( sState: TYPE_STATE; sCssi: TYPE_CSS_TO_SSM; sFp2i: TYPE_FP2_TO_SSM; eState: TYPE_SSM_FSM ) return TYPE_STATE is
    variable sStateOut:           TYPE_STATE;
begin
    sStateOut                     := sState;

    sStateOut.nClock              := sCssi.nSwAcceptanceWindowHalf + sFp2i.nError + 1;
    sStateOut.nIntegrationCycle   := sFp2i.sPcf.nIntegrationCycle;
    sStateOut.uvMembershipComp    := sFp2i.sPcf.uvMembership;
    sStateOut.eState              := eState;

    sStateOut.bAccWndOpen         := true;
    sStateOut.nMsCountMax         := sState.nMsCount;

    return sStateOut;
end function sStartSync;

sync: process (bReset, uClk)
    variable s1:                   TYPE_STATE;
    variable s2:                   TYPE_STATE;
begin
    s1 := sInitSyncSupport( s, sCssi );
    s2 := sStartSync( s, sCssi, sFp2i, SW_SYNC );
end process sync;

s1 := 行与纯函数 sInitSyncSupport 中的所有语句一样被覆盖。

在 ModelSim_10.1c 生成的代码覆盖率报告中,s2 := ... 行被覆盖了数十次,但纯函数 sStartSync 中的所有语句似乎都未被覆盖。

有人知道为什么会这样吗?谢谢你。

更新:

这是一个更完整的代码:

library IEEE;
  use IEEE.std_logic_1164.all;

library work;
   ...

entity SSM is
  port (
    bReset:                       in boolean;
    uClk:                         in std_ulogic;
    ...
    sFp2i:                        in TYPE_FP2_TO_SSM;
    sCssi:                        in TYPE_CSS_TO_SSM;
    ...
  );
end SSM;

library work;
   ...

architecture RTL of SSM is

  type TYPE_STATE is record
    auvAsyncMembershipComp:       TYPE_ASYNC_MS_COUNT_ARRAY;
    bAccWndOpen:                  boolean;
    bAccWndToClose:               boolean;
    bAppliedCorrection:           boolean;
    bFsmError:                    boolean;
    ...
  end record;

  constant CONST_TYPE_STATE_RESET: TYPE_STATE := (
    auvAsyncMembershipComp        => CONST_TYPE_ASYNC_MS_COUNT_ARRAY_RESET,
    bAccWndOpen                   => false,
    bAccWndToClose                => false,
    bAppliedCorrection            => false,
    bFsmError                     => false,
    ...
  );

  signal r:                       TYPE_STATE
  -- pragma synthesis_off
                                             := CONST_TYPE_STATE_RESET
  -- pragma synthesis_on
  ;

  ---------------------------------------------------------------------------
  -- Function: sInitSyncSupport
  ---------------------------------------------------------------------------
  -- Purpose:
  --   This function initializes the support registers for time difference
  --   capturing 
  ---------------------------------------------------------------------------
  pure function sInitSyncSupport( sState: TYPE_STATE; sCssi: TYPE_CSS_TO_SSM ) return TYPE_STATE is
  ---------------------------------------------------------------------------
    variable sStateOut:           TYPE_STATE;
  begin
    sStateOut                     := sState; -- !!! all lines are covered
    sStateOut.bAccWndOpen         := false;
    sStateOut.iCorrValue          := 0;
    sStateOut.nClockCorrected     := 3*sCssi.nSwAcceptanceWindowHalf + 1;
    sStateOut.nMsCountMax         := 0;
    return sStateOut;
  end function sInitSyncSupport;

  ---------------------------------------------------------------------------
  -- Function: sStartSync
  ---------------------------------------------------------------------------
  -- Purpose:
  --   This function initializes the clock synchronization registers 
  ---------------------------------------------------------------------------
  pure function sStartSync( sState: TYPE_STATE; sCssi: TYPE_CSS_TO_SSM; sFp2i: TYPE_FP2_TO_SSM; eState: TYPE_SSM_FSM ) return TYPE_STATE is
  ---------------------------------------------------------------------------
    variable sStateOut:           TYPE_STATE;
  begin
    sStateOut                     := sState; -- !!! NONE of the lines are covered
    sStateOut.nClock              := sCssi.nSwAcceptanceWindowHalf + sFp2i.nError + 1;
    sStateOut.nIntegrationCycle   := sFp2i.sPcf.nIntegrationCycle;
    sStateOut.uvMembershipComp    := sFp2i.sPcf.uvMembership;
    sStateOut.eState              := eState;
    sStateOut.bAccWndOpen         := true;
    sStateOut.nMsCountMax         := sState.nMsCount;
    return sStateOut;
  end function sStartSync;

begin

  sync: process (bReset, uClk)
    variable s:                   TYPE_STATE;
    variable v:                   TYPE_VAR;
  begin
    if (bReset) then
      r                           <= CONST_TYPE_STATE_RESET;
    elsif ((uClk = '1') and uClk'event) then
      s                           := r;

      v                           := CONST_TYPE_VAR_RESET;
      v.bMembershipExceedsMax     := (r.bNextMembershipExceedsMax and (r.nClock >= sFp2i.nError));
      v.bInScheduleFrame          := (r.bNextInScheduleFrame and (r.nClock >= sFp2i.nError));
      v.bOutOfScheduleFrame       := (r.bNextOutOfScheduleFrame or (r.bNextInScheduleFrame and not v.bInScheduleFrame));

      s.nTimer      := nDecNoWrap( r.nTimer, 1 );
      s.bTimerEvent := (r.nTimer = 1);
      s             := sInitSyncSupport( s, sCssi );           -- !!! covered
      s             := sStartSync( s, sCssi, sFp2i, SW_SYNC ); -- !!! covered, but content of sStartSync not covered

      r                           <= s;
    end if;
  end process sync;

  sCsso                           <= r.sCsso;
  sSdo                            <= r.sSdo;
  sScho                           <= r.sScho;
  sPfgo                           <= r.sPfgo;
  bFsmErro                        <= r.bFsmError;

end RTL;

我标记了!!! 敏感线。非常感谢。

4

0 回答 0