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

📄 vital_timing_body.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 4 页
字号:
--------------------------------------------------------------------------------- Title        : Standard VITAL TIMING Package--              : $Revision: 597 $-- Library      : VITAL--              :  -- Developers   : IEEE DASC Timing Working Group (TWG), PAR 1076.4--              :  -- Purpose      : This packages defines standard types, attributes, constants,--              : functions and procedures for use in developing ASIC models.--              : This file contains the Package Body.-- -------------------------------------------------------------------------------- ------------------------------------------------------------------------------ Modification History : -- ------------------------------------------------------------------------------ Version No:|Auth:| Mod.Date:| Changes Made:--   v95.0 A  |     | 06/08/95 | Initial ballot draft 1995--   v95.1    |     | 08/31/95 | #203 - Timing violations at time 0--                               #204 - Output mapping prior to glitch detection-- ----------------------------------------------------------------------------LIBRARY STD;USE STD.TEXTIO.ALL;PACKAGE BODY VITAL_Timing IS    -- --------------------------------------------------------------------    -- Package Local Declarations    -- --------------------------------------------------------------------    TYPE CheckType IS ( SetupCheck, HoldCheck, RecoveryCheck, RemovalCheck,                        PulseWidCheck, PeriodCheck );    TYPE CheckInfoType IS RECORD            Violation : BOOLEAN;            CheckKind : CheckType;            ObsTime   : TIME;            ExpTime   : TIME;            DetTime   : TIME;            State     : X01;    END RECORD;    TYPE LogicCvtTableType IS ARRAY (std_ulogic) OF CHARACTER;     TYPE HiLoStrType IS ARRAY (std_ulogic RANGE 'X' TO '1') OF STRING(1 TO 4);     CONSTANT LogicCvtTable : LogicCvtTableType                      := ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-');     CONSTANT HiLoStr     : HiLoStrType := ("  X ", " Low", "High" );     TYPE EdgeSymbolMatchType IS ARRAY (X01,X01,VitalEdgeSymbolType) OF BOOLEAN;    -- last value, present value, edge symbol    CONSTANT EdgeSymbolMatch : EdgeSymbolMatchType :=  (      'X'=>('X'=>(                                 OTHERS => FALSE),            '0'=>('N'|'F'|'v'|'E'|'D'|'*' => TRUE, OTHERS => FALSE ),            '1'=>('P'|'R'|'^'|'E'|'A'|'*' => TRUE, OTHERS => FALSE ) ),      '0'=>('X'=>(    'r'|'p'|'R'|'A'|'*' => TRUE, OTHERS => FALSE ),            '0'=>(                                 OTHERS => FALSE ),            '1'=>(    '/'|'P'|'p'|'R'|'*' => TRUE, OTHERS => FALSE ) ),      '1'=>('X'=>(    'f'|'n'|'F'|'D'|'*' => TRUE, OTHERS => FALSE ),            '0'=>(    '\'|'N'|'n'|'F'|'*' => TRUE, OTHERS => FALSE ),            '1'=>(                                 OTHERS => FALSE ) ) );    ---------------------------------------------------------------------------    ---------------------------------------------------------------------------    -- Misc Utilities Local Utilities    ---------------------------------------------------------------------------    -----------------------------------------------------------------------    FUNCTION Minimum ( CONSTANT t1,t2 : IN TIME ) RETURN TIME IS    BEGIN        IF ( t1 < t2 ) THEN RETURN (t1); ELSE RETURN (t2); END IF;    END Minimum;    -----------------------------------------------------------------------    FUNCTION Maximum ( CONSTANT t1,t2 : IN TIME ) RETURN TIME IS    BEGIN        IF ( t1 > t2 ) THEN RETURN (t1); ELSE RETURN (t2); END IF;    END Maximum;    --------------------------------------------------------------------    -- Error Message Types and Tables    --------------------------------------------------------------------    TYPE VitalErrorType IS (        ErrVctLng  ,        ErrNoPath  ,        ErrNegPath ,        ErrNegDel    );     TYPE VitalErrorSeverityType IS ARRAY (VitalErrorType) OF SEVERITY_LEVEL;    CONSTANT VitalErrorSeverity : VitalErrorSeverityType := (        ErrVctLng    => ERROR,        ErrNoPath    => WARNING,        ErrNegPath   => WARNING,        ErrNegDel    => WARNING    );     CONSTANT MsgNoPath : STRING :=      "No Delay Path Condition TRUE.  0-delay used. Output signal is: ";    CONSTANT MsgNegPath : STRING :=      "Path Delay less than time since input. 0 delay used. Output signal is: ";    CONSTANT MsgNegDel : STRING :=      "Negative delay. New output value not scheduled. Output signal is: ";    CONSTANT MsgVctLng : STRING :=      "Vector (array) lengths not equal. ";     CONSTANT MsgUnknown : STRING :=      "Unknown error message.";     FUNCTION VitalMessage (            CONSTANT ErrorId : IN VitalErrorType          ) RETURN STRING IS    BEGIN        CASE ErrorId IS            WHEN ErrVctLng    => RETURN MsgVctLng;            WHEN ErrNoPath    => RETURN MsgNoPath;            WHEN ErrNegPath   => RETURN MsgNegPath;            WHEN ErrNegDel    => RETURN MsgNegDel;            WHEN OTHERS       => RETURN MsgUnknown;        END CASE;    END;    PROCEDURE VitalError (            CONSTANT Routine : IN STRING;            CONSTANT ErrorId : IN VitalErrorType    ) IS    BEGIN        ASSERT FALSE          REPORT Routine & ": " & VitalMessage(ErrorId)          SEVERITY VitalErrorSeverity(ErrorId);    END;     PROCEDURE VitalError (            CONSTANT Routine : IN STRING;            CONSTANT ErrorId : IN VitalErrorType;            CONSTANT Info    : IN STRING    ) IS    BEGIN        ASSERT FALSE          REPORT Routine & ": " & VitalMessage(ErrorId) & Info          SEVERITY VitalErrorSeverity(ErrorId);    END;     PROCEDURE VitalError (            CONSTANT Routine : IN STRING;            CONSTANT ErrorId : IN VitalErrorType;            CONSTANT Info    : IN CHARACTER    ) IS    BEGIN        ASSERT FALSE          REPORT Routine & ": " & VitalMessage(ErrorId) & Info          SEVERITY VitalErrorSeverity(ErrorId);    END;     ---------------------------------------------------------------------------    -- Time Delay Assignment Subprograms    ---------------------------------------------------------------------------    FUNCTION VitalExtendToFillDelay (             CONSTANT Delay : IN VitalDelayType          ) RETURN VitalDelayType01Z IS    BEGIN        RETURN (OTHERS => Delay);    END VitalExtendToFillDelay;    FUNCTION VitalExtendToFillDelay (             CONSTANT Delay : IN VitalDelayType01          ) RETURN VitalDelayType01Z IS        VARIABLE Delay01Z  : VitalDelayType01Z;    BEGIN        Delay01Z(tr01) := Delay(tr01);        Delay01Z(tr0z) := Delay(tr01);        Delay01Z(trz1) := Delay(tr01);        Delay01Z(tr10) := Delay(tr10);        Delay01Z(tr1z) := Delay(tr10);        Delay01Z(trz0) := Delay(tr10);        RETURN (Delay01Z);    END VitalExtendToFillDelay;    FUNCTION VitalExtendToFillDelay (             CONSTANT Delay : IN VitalDelayType01Z          ) RETURN VitalDelayType01Z IS    BEGIN        RETURN Delay;    END VitalExtendToFillDelay;    ---------------------------------------------------------------------------    FUNCTION VitalCalcDelay (            CONSTANT NewVal : IN std_ulogic   := 'X';            CONSTANT OldVal : IN std_ulogic   := 'X';            CONSTANT Delay  : IN VitalDelayType          ) RETURN TIME IS    BEGIN          RETURN delay;    END VitalCalcDelay;    FUNCTION VitalCalcDelay (            CONSTANT NewVal : IN std_ulogic   := 'X';            CONSTANT OldVal : IN std_ulogic   := 'X';            CONSTANT Delay  : IN VitalDelayType01          ) RETURN TIME IS        VARIABLE Result : TIME;    BEGIN        CASE Newval IS          WHEN '0' | 'L' => Result := Delay(tr10);          WHEN '1' | 'H' => Result := Delay(tr01);          WHEN 'Z' =>            CASE Oldval IS              WHEN '0' | 'L' => Result := Delay(tr01);              WHEN '1' | 'H' => Result := Delay(tr10);              WHEN OTHERS    => Result := MAXIMUM(Delay(tr10), Delay(tr01));            END CASE;          WHEN OTHERS =>            CASE Oldval IS              WHEN '0' | 'L' => Result := Delay(tr01);              WHEN '1' | 'H' => Result := Delay(tr10);              WHEN 'Z'       => Result := MINIMUM(Delay(tr10), Delay(tr01));              WHEN OTHERS    => Result := MAXIMUM(Delay(tr10), Delay(tr01));            END CASE;        END CASE;        RETURN Result;    END VitalCalcDelay;    FUNCTION VitalCalcDelay (            CONSTANT NewVal : IN std_ulogic   := 'X';            CONSTANT OldVal : IN std_ulogic   := 'X';            CONSTANT Delay  : IN VitalDelayType01Z          ) RETURN TIME IS        VARIABLE Result : TIME;    BEGIN        CASE Oldval IS          WHEN '0' | 'L' =>            CASE Newval IS              WHEN '0' | 'L' => Result := Delay(tr10);              WHEN '1' | 'H' => Result := Delay(tr01);              WHEN 'Z'       => Result := Delay(tr0z);              WHEN OTHERS    => Result := MINIMUM(Delay(tr01), Delay(tr0z));            END CASE;          WHEN '1' | 'H' =>            CASE Newval IS              WHEN '0' | 'L' => Result := Delay(tr10);              WHEN '1' | 'H' => Result := Delay(tr01);              WHEN 'Z'       => Result := Delay(tr1z);              WHEN OTHERS    => Result := MINIMUM(Delay(tr10), Delay(tr1z));            END CASE;          WHEN 'Z' =>            CASE Newval IS              WHEN '0' | 'L' => Result := Delay(trz0);              WHEN '1' | 'H' => Result := Delay(trz1);              WHEN 'Z'       => Result := MAXIMUM (Delay(tr0z), Delay(tr1z));              WHEN OTHERS    => Result := MINIMUM (Delay(trz1), Delay(trz0));            END CASE;          WHEN 'U' | 'X' | 'W' | '-'  =>            CASE Newval IS              WHEN '0' | 'L' => Result := MAXIMUM(Delay(tr10), Delay(trz0));              WHEN '1' | 'H' => Result := MAXIMUM(Delay(tr01), Delay(trz1));              WHEN 'Z'       => Result := MAXIMUM(Delay(tr1z), Delay(tr0z));              WHEN OTHERS    => Result := MAXIMUM(Delay(tr10), Delay(tr01));            END CASE;        END CASE;        RETURN Result;    END VitalCalcDelay;    ---------------------------------------------------------------------------    FUNCTION VitalSelectPathDelay (            CONSTANT NewValue      : IN  std_logic;            CONSTANT OldValue      : IN  std_logic;            CONSTANT OutSignalName : IN  string;            CONSTANT Paths         : IN  VitalPathArrayType;            CONSTANT DefaultDelay  : IN  VitalDelayType          ) RETURN TIME IS         VARIABLE TmpDelay  : TIME;        VARIABLE InputAge  : TIME := TIME'HIGH;        VARIABLE PropDelay : TIME := TIME'HIGH;    BEGIN        -- for each delay path        FOR i IN Paths'RANGE LOOP            -- ignore the delay path if it is not enabled            NEXT WHEN NOT Paths(i).PathCondition;            -- ignore the delay path if a more recent input event has been seen            NEXT WHEN Paths(i).InputChangeTime > InputAge;             -- This is the most recent input change (so far)            -- Get the transition dependent delay            TmpDelay := VitalCalcDelay(NewValue, OldValue, Paths(i).PathDelay);             -- If other inputs changed at the same time,            --  then use the minimum of their propagation delays,            --  else use the propagation delay from this input.            IF Paths(i).InputChangeTime < InputAge THEN                PropDelay := TmpDelay;            ELSE -- Simultaneous inputs change                IF TmpDelay < PropDelay THEN PropDelay := TmpDelay; END IF;            end if;             InputAge := Paths(i).InputChangeTime;        END LOOP;         -- If there were no paths (with an enabled condition),        --  use the default the delay        IF (PropDelay  = TIME'HIGH ) THEN            PropDelay := VitalCalcDelay(NewValue, OldValue, DefaultDelay);         -- If the time since the most recent input event is greater than the        -- propagation delay from that input then        --  use the default the delay        ELSIF (InputAge > PropDelay) THEN            PropDelay := VitalCalcDelay(NewValue, OldValue, DefaultDelay);         -- Adjust the propagation delay by the time since the        -- the input event occurred  (Usually 0 ns).        ELSE            PropDelay := PropDelay - InputAge;        END IF;         RETURN PropDelay;    END;     FUNCTION VitalSelectPathDelay (            CONSTANT NewValue      : IN  std_logic;            CONSTANT OldValue      : IN  std_logic;            CONSTANT OutSignalName : IN  string;

⌨️ 快捷键说明

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