⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vital_timing_body.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 4 页
字号:
        END IF;         -- Evaluate propagation delay paths        PropDelay := VitalSelectPathDelay (OutTemp, GlitchData.LastValue,                                           OutSignalName, Paths, DefaultDelay);        GlitchData.LastValue := OutTemp;         -- Schedule the output transactions - including glitch handling        VitalGlitch (OutSignal, GlitchData, OutSignalName, OutTemp,                     PropDelay, Mode, XOn, MsgOn, MsgSeverity );     END VitalPathDelay01;    PROCEDURE VitalPathDelay01Z (        SIGNAL   OutSignal     : OUT   std_logic;        VARIABLE GlitchData    : INOUT VitalGlitchDataType;        CONSTANT OutSignalName : IN    string;        CONSTANT OutTemp       : IN    std_logic;        CONSTANT Paths         : IN    VitalPathArray01ZType;        CONSTANT DefaultDelay  : IN    VitalDelayType01Z   := VitalZeroDelay01Z;        CONSTANT Mode          : IN    VitalGlitchKindType := OnEvent;        CONSTANT XOn           : IN    BOOLEAN             := TRUE;        CONSTANT MsgOn         : IN    BOOLEAN             := TRUE;        CONSTANT MsgSeverity   : IN    SEVERITY_LEVEL      := WARNING;        CONSTANT OutputMap     : IN    VitalOutputMapType                                         := VitalDefaultOutputMap    ) IS         VARIABLE PropDelay : TIME;    BEGIN        -- Check if the new value to be scheduled is different than the        -- previously scheduled value        IF (GlitchData.SchedTime <= NOW) AND           (GlitchData.SchedValue = OutputMap(OutTemp) )             THEN RETURN;        END IF;         -- Evaluate propagation delay paths        PropDelay := VitalSelectPathDelay (OutTemp, GlitchData.LastValue,                                           OutSignalName, Paths, DefaultDelay);        GlitchData.LastValue := OutTemp;         -- Schedule the output transactions - including glitch handling        VitalGlitch (OutSignal, GlitchData, OutSignalName, OutputMap(OutTemp),                     PropDelay, Mode, XOn, MsgOn, MsgSeverity );     END VitalPathDelay01Z;    ----------------------------------------------------------------------------    PROCEDURE VitalWireDelay (            SIGNAL   OutSig  : OUT   std_ulogic;            SIGNAL   InSig   : IN    std_ulogic;            CONSTANT twire   : IN    VitalDelayType    ) IS    BEGIN        OutSig <= TRANSPORT InSig AFTER twire;    END VitalWireDelay;        PROCEDURE VitalWireDelay (            SIGNAL   OutSig  : OUT   std_ulogic;            SIGNAL   InSig   : IN    std_ulogic;            CONSTANT twire   : IN    VitalDelayType01    ) IS       VARIABLE Delay   : TIME;    BEGIN        Delay := VitalCalcDelay( InSig, InSig'LAST_VALUE, twire );        OutSig <= TRANSPORT InSig AFTER Delay;    END VitalWireDelay;        PROCEDURE VitalWireDelay (            SIGNAL   OutSig  : OUT   std_ulogic;            SIGNAL   InSig   : IN    std_ulogic;            CONSTANT twire   : IN    VitalDelayType01Z    ) IS       VARIABLE Delay   : TIME;    BEGIN        Delay := VitalCalcDelay( InSig, InSig'LAST_VALUE, twire );        OutSig <= TRANSPORT InSig AFTER Delay;    END VitalWireDelay;        ----------------------------------------------------------------------------    PROCEDURE VitalSignalDelay (            SIGNAL   OutSig     : OUT   std_ulogic;            SIGNAL   InSig      : IN    std_ulogic;            CONSTANT dly        : IN   TIME    ) IS    BEGIN        OutSig <= TRANSPORT InSig AFTER dly;    END;    ---------------------------------------------------------------------------    ---------------------------------------------------------------------------    -- Setup and Hold Time Check Routine     ---------------------------------------------------------------------------    ---------------------------------------------------------------------------    PROCEDURE ReportViolation (            CONSTANT TestSignalName : IN STRING := "";            CONSTANT RefSignalName  : IN STRING := "";            CONSTANT HeaderMsg      : IN STRING := " ";            CONSTANT CheckInfo      : IN CheckInfoType;            CONSTANT MsgSeverity    : IN SEVERITY_LEVEL := WARNING    ) IS        VARIABLE Message : LINE;    BEGIN        IF NOT CheckInfo.Violation THEN RETURN; END IF;        Write ( Message, HeaderMsg );        Case CheckInfo.CheckKind IS          WHEN    SetupCheck => Write ( Message, STRING'(" SETUP ")      );          WHEN     HoldCheck => Write ( Message, STRING'(" HOLD ")       );          WHEN RecoveryCheck => Write ( Message, STRING'(" RECOVERY ")   );          WHEN  RemovalCheck => Write ( Message, STRING'(" REMOVAL ")    );          WHEN PulseWidCheck => Write ( Message, STRING'(" PULSE WIDTH "));          WHEN   PeriodCheck => Write ( Message, STRING'(" PERIOD ")     );        END CASE;        Write ( Message, HiLoStr(CheckInfo.State) );        Write ( Message, STRING'(" VIOLATION ON ") );        Write ( Message, TestSignalName );        IF (RefSignalName'LENGTH > 0) THEN            Write ( Message, STRING'(" WITH RESPECT TO ") );            Write ( Message, RefSignalName );        END IF;        Write ( Message, ';' & LF );        Write ( Message, STRING'("  Expected := ")  );        Write ( Message, CheckInfo.ExpTime);        Write ( Message, STRING'("; Observed := ")  );        Write ( Message, CheckInfo.ObsTime);        Write ( Message, STRING'("; At : ")         );        Write ( Message, CheckInfo.DetTime);        ASSERT FALSE REPORT Message.ALL SEVERITY MsgSeverity;        DEALLOCATE (Message);    END ReportViolation;    ---------------------------------------------------------------------------    -- Procedure  : InternalTimingCheck    ---------------------------------------------------------------------------    PROCEDURE InternalTimingCheck (            CONSTANT TestSignal    : IN     std_ulogic;            CONSTANT RefSignal     : IN     std_ulogic;            CONSTANT TestDelay     : IN     TIME := 0 ns;            CONSTANT RefDelay      : IN     TIME := 0 ns;            CONSTANT SetupHigh     : IN     TIME := 0 ns;            CONSTANT SetupLow      : IN     TIME := 0 ns;            CONSTANT HoldHigh      : IN     TIME := 0 ns;            CONSTANT HoldLow       : IN     TIME := 0 ns;            VARIABLE RefTime       : IN     TIME;            VARIABLE RefEdge       : IN     BOOLEAN;            VARIABLE TestTime      : IN     TIME;            VARIABLE TestEvent     : IN     BOOLEAN;            VARIABLE SetupEn       : INOUT  BOOLEAN;            VARIABLE HoldEn        : INOUT  BOOLEAN;            VARIABLE CheckInfo     : INOUT  CheckInfoType;            CONSTANT MsgOn         : IN     BOOLEAN    ) IS        VARIABLE bias, b2 : TIME;    BEGIN        -- Check SETUP constraint      IF RefEdge THEN          IF SetupEn THEN            CheckInfo.ObsTime   := RefTime - TestTime;            CheckInfo.State     := To_X01(TestSignal);            CASE CheckInfo.State IS              WHEN '0' => CheckInfo.ExpTime := SetupLow;              WHEN '1' => CheckInfo.ExpTime := SetupHigh;              WHEN 'X' => CheckInfo.ExpTime := Maximum(SetupHigh,SetupLow);            END CASE;            CheckInfo.Violation := CheckInfo.ObsTime < CheckInfo.ExpTime;            SetupEn  := FALSE;          ELSE            CheckInfo.Violation := FALSE;          END IF;          -- Check HOLD constraint      ELSIF TestEvent THEN          IF HoldEn THEN            CheckInfo.ObsTime := TestTime - RefTime;            CheckInfo.State := To_X01(TestSignal);            CASE CheckInfo.State IS              WHEN '0' => CheckInfo.ExpTime := HoldHigh;              WHEN '1' => CheckInfo.ExpTime := HoldLow;              WHEN 'X' => CheckInfo.ExpTime := Maximum(HoldHigh,HoldLow);            END CASE;            CheckInfo.Violation   := CheckInfo.ObsTime < CheckInfo.ExpTime;            HoldEn := NOT CheckInfo.Violation;          ELSE            CheckInfo.Violation := FALSE;          END IF;      ELSE          CheckInfo.Violation := FALSE;      END IF;      -- Adjust report values to account for internal model delays      -- Note: TestDelay, RefDelay, TestTime, RefTime and bias are non-negative      IF MsgOn AND CheckInfo.Violation THEN          bias := TestDelay - RefDelay;          IF TestTime - RefTime <= bias THEN            CheckInfo.CheckKind := SetupCheck;            b2 := TIME'HIGH - bias;            IF (CheckInfo.ObsTime <= b2)              THEN CheckInfo.ObsTime := CheckInfo.ObsTime + bias;              ELSE CheckInfo.ObsTime := Time'HIGH;            END IF;            IF (CheckInfo.ExpTime <= b2)              THEN CheckInfo.ExpTime := CheckInfo.ExpTime + bias;              ELSE CheckInfo.ExpTime := Time'HIGH;            END IF;            CheckInfo.DetTime := RefTime - RefDelay;          ELSE            CheckInfo.CheckKind :=  HoldCheck;            CheckInfo.ObsTime := CheckInfo.ObsTime - bias;            IF (CheckInfo.ExpTime >= 0 ns) THEN              CheckInfo.ExpTime := CheckInfo.ExpTime - bias;            END IF;            CheckInfo.DetTime := TestTime - TestDelay;          END IF;      END IF;    END InternalTimingCheck;    ---------------------------------------------------------------------------    ---------------------------------------------------------------------------    FUNCTION VitalTimingDataInit             RETURN VitalTimingDataType IS    BEGIN        RETURN (FALSE,'X', 0 ns, FALSE, 'X', 0 ns, FALSE, NULL, NULL, NULL, NULL);    END;    ---------------------------------------------------------------------------    -- Procedure  : VitalSetupHoldCheck    ---------------------------------------------------------------------------    PROCEDURE VitalSetupHoldCheck (            VARIABLE Violation     : OUT    X01;            VARIABLE TimingData    : INOUT  VitalTimingDataType;            SIGNAL   TestSignal    : IN     std_ulogic;            CONSTANT TestSignalName: IN     STRING := "";            CONSTANT TestDelay     : IN     TIME := 0 ns;            SIGNAL   RefSignal     : IN     std_ulogic;            CONSTANT RefSignalName : IN     STRING := "";            CONSTANT RefDelay      : IN     TIME := 0 ns;            CONSTANT SetupHigh     : IN     TIME := 0 ns;            CONSTANT SetupLow      : IN     TIME := 0 ns;            CONSTANT HoldHigh      : IN     TIME := 0 ns;            CONSTANT HoldLow       : IN     TIME := 0 ns;            CONSTANT CheckEnabled  : IN     BOOLEAN := TRUE;            CONSTANT RefTransition : IN     VitalEdgeSymbolType;            CONSTANT HeaderMsg     : IN     STRING  := " ";            CONSTANT XOn           : IN     BOOLEAN := TRUE;            CONSTANT MsgOn         : IN     BOOLEAN := TRUE;            CONSTANT MsgSeverity   : IN     SEVERITY_LEVEL := WARNING    ) IS         VARIABLE CheckInfo : CheckInfoType;        VARIABLE RefEdge, TestEvent : BOOLEAN;        VARIABLE TestDly : TIME := Maximum(0 ns, TestDelay);        VARIABLE RefDly  : TIME := Maximum(0 ns, RefDelay);        VARIABLE bias : TIME;    BEGIN      IF (TimingData.NotFirstFlag = FALSE) THEN         TimingData.TestLast := To_X01(TestSignal);         TimingData.RefLast := To_X01(RefSignal);         TimingData.NotFirstFlag := TRUE;      END IF;      -- Detect reference edges and record the time of the last edge      RefEdge := EdgeSymbolMatch(TimingData.RefLast, To_X01(RefSignal),                                 RefTransition);      TimingData.RefLast := To_X01(RefSignal);      IF RefEdge THEN        TimingData.RefTime := NOW;        TimingData.HoldEn  := TRUE;      END IF;      -- Detect test (data) changes and record the time of the last change      TestEvent := TimingData.TestLast /= To_X01Z(TestSignal);      TimingData.TestLast := To_X01Z(TestSignal);      IF TestEvent THEN        TimingData.TestTime := NOW;        TimingData.SetupEn  := TRUE;      END IF;      -- Perform timing checks (if enabled)      Violation := '0';      IF (CheckEnabled) THEN         InternalTimingCheck (             TestSignal   => TestSignal,             RefSignal    => RefSignal,             TestDelay    => TestDly,             RefDelay     => RefDly,             SetupHigh    => SetupHigh,             SetupLow     => SetupLow,             HoldHigh     => HoldHigh,             HoldLow      => HoldLow,             RefTime      => TimingData.RefTime,             RefEdge      => RefEdge,             TestTime     => TimingData.TestTime,             TestEvent    => TestEvent,             SetupEn      => TimingData.SetupEn,             HoldEn       => TimingData.HoldEn,             CheckInfo    => CheckInfo,             MsgOn        => MsgOn );        -- Report any detected violations and set return violation flag        IF CheckInfo.Violation THEN            IF (MsgOn) THEN                ReportViolation (TestSignalName, RefSignalName,                                 HeaderMsg, CheckInfo, MsgSeverity );            END IF;            IF (XOn) THEN Violation := 'X'; END IF;        END IF;      END IF;    END VitalSetupHoldCheck;    ---------------------------------------------------------------------------    PROCEDURE VitalSetupHoldCheck (            VARIABLE Violation     : OUT    X01;            VARIABLE TimingData    : INOUT  VitalTimingDataType;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -