📄 vital_timing_body.vhdl
字号:
--------------------------------------------------------------------------------- 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 + -