📄 timing_b.vhdl
字号:
--------------------------------------------------------------------------------- Title : Standard VITAL TIMING Package-- : $Revision: 598 $-- 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 | #IR203 - Timing violations at time 0-- #IR204 - Output mapping prior to glitch detection-- v98.0 |TAG | 03/27/98 | Initial ballot draft 1998-- | #IR225 - Negative Premptive Glitch-- **Code_effected=ReportGlitch,VitalGlitch,-- VitalPathDelay,VitalPathDelay01,-- VitalPathDelay01z.-- #IR105 - Skew timing check needed-- **Code_effected=NONE, New code added!! -- #IR245,IR246,IR251 ITC code to fix false boundry cases-- **Code_effected=InternalTimingCheck.-- #IR248 - Allows VPD to use a default timing delay-- **Code_effected=VitalPathDelay,-- VitalPathDelay01,VitalPathDelay01z,-- VitalSelectPathDelay,VitalSelectPathDelay01,-- VitalSelectPathDelay01z.-- #IR250 - Corrects fastpath condition in VPD-- **Code_effected=VitalPathDelay01,-- VitalPathDelay01z,-- #IR252 - Corrects cancelled timing check call if-- condition expires. -- **Code_effected=VitalSetupHoldCheck,-- VitalRecoveryRemovalCheck.-- v98.1 | jdc | 03/25/99 | Changed UseDefaultDelay to IgnoreDefaultDelay-- and set default to FALSE in VitalPathDelay()---- ----------------------------------------------------------------------------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 ) ) ); --------------------------------------------------------------------------- -- Tables used to implement 'posedge' and 'negedge' in path delays -- These are new tables for Skewcheck routines. IR105 --------------------------------------------------------------------------- TYPE EdgeRable IS ARRAY(std_ulogic, std_ulogic) OF boolean; CONSTANT Posedge : EdgeRable := ( -- ------------------------------------------------------------------------ -- | U X 0 1 Z W L H - -- ------------------------------------------------------------------------ ( FALSE, FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE ), -- U ( FALSE, FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE ), -- X ( TRUE , TRUE , FALSE, TRUE , TRUE , TRUE , FALSE, TRUE , TRUE ), -- 0 ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- 1 ( FALSE, FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE ), -- Z ( FALSE, FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE ), -- W ( TRUE , TRUE , FALSE, TRUE , TRUE , TRUE , FALSE, TRUE , TRUE ), -- L ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- H ( FALSE, FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE ) -- - ); --IR105 CONSTANT Negedge : EdgeRable := ( -- ----------------------------------------------------------------------- -- | U X 0 1 Z W L H - -- ----------------------------------------------------------------------- ( FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE, FALSE ), -- U ( FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE, FALSE ), -- X ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- 0 ( TRUE , TRUE , TRUE , FALSE, TRUE , TRUE , TRUE , FALSE, TRUE ), -- 1 ( FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE, FALSE ), -- Z ( FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE, FALSE ), -- W ( FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE ), -- L ( TRUE , TRUE , TRUE , FALSE, TRUE , TRUE , TRUE , FALSE, TRUE ), -- H ( FALSE, FALSE, TRUE , FALSE, FALSE, FALSE, TRUE , FALSE, FALSE ) -- - ); --IR105 TYPE SkewType IS (Inphase, Outphase); --IR105 CONSTANT noTrigger : TIME := -1 ns; --IR105 --------------------------------------------------------------------------- -- End of Skew (IR105 additions) --------------------------------------------------------------------------- --------------------------------------------------------------------------- --------------------------------------------------------------------------- -- 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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -