📄 timing_b.vhdl
字号:
OutSignal <= NewValue AFTER dly; ELSIF ( Mode = VitalTransport ) THEN OutSignal <= TRANSPORT NewValue AFTER dly; ELSE -- Glitch Processing --- -- If nothing currently scheduled IF GlitchData.SchedTime <= NOW THEN -- NOW >= last event -- Note: NewValue is always /= OldValue when called from VPPD IF (NewValue = GlitchData.SchedValue) THEN RETURN; END IF; NewGlitch := FALSE; GlitchData.GlitchTime := NOW+dly; -- New value earlier than the earliest previous value scheduled -- (negative preemptive) ELSIF (NOW+dly <= GlitchData.GlitchTime) AND (NOW+dly <= GlitchData.SchedTime) THEN -- Glitch is negative preemptive - check if same value and -- NegPreempt is on IR225 IF (GlitchData.SchedValue /= NewValue) AND (NegPreemptOn) AND (NOW > 0 NS) THEN NewGlitch := TRUE; NegPreemptGlitch :=TRUE; -- Set preempt Glitch condition ELSE NewGlitch := FALSE; -- No new glitch, save time for -- possible future glitch END IF; GlitchData.GlitchTime := NOW+dly; -- Transaction currently scheduled - if glitch already happened ELSIF GlitchData.GlitchTime <= NOW THEN IF (GlitchData.SchedValue = NewValue) THEN dly := Minimum( GlitchData.SchedTime-NOW, NewDelay ); END IF; NewGlitch := FALSE; -- Transaction currently scheduled (no glitch if same value) ELSIF (GlitchData.SchedValue = NewValue) AND (GlitchData.SchedTime = GlitchData.GlitchTime) THEN -- revise scheduled output time if new delay is sooner dly := Minimum( GlitchData.SchedTime-NOW, NewDelay ); -- No new glitch, save time for possable future glitch NewGlitch := FALSE; GlitchData.GlitchTime := NOW+dly; -- Transaction currently scheduled represents a glitch ELSE NewGlitch := TRUE; -- A new glitch has been detected END IF; IF NewGlitch THEN -- If messages requested, report the glitch IF MsgOn THEN IF NegPreemptGlitch THEN --IR225 ReportGlitch ("VitalGlitch-Neg", OutSignalName, GlitchData.GlitchTime, GlitchData.SchedValue, (dly + NOW), NewValue, MsgSeverity=>MsgSeverity ); ELSE ReportGlitch ("VitalGlitch", OutSignalName, GlitchData.GlitchTime, GlitchData.SchedValue, (dly + NOW), NewValue, MsgSeverity=>MsgSeverity ); END IF; END IF; -- If 'X' generation is requested, schedule the new value -- preceeded by a glitch pulse. -- Otherwise just schedule the new value (inertial mode). IF XOn THEN IF (Mode = OnDetect) THEN OutSignal <= 'X'; ELSE OutSignal <= 'X' AFTER GlitchData.GlitchTime-NOW; END IF; IF NegPreemptGlitch THEN -- IR225 OutSignal <= TRANSPORT NewValue AFTER GlitchData.SchedTime-NOW; ELSE OutSignal <= TRANSPORT NewValue AFTER dly; END IF; ELSE OutSignal <= NewValue AFTER dly; -- no glitch regular prop delay END IF; -- If there no new glitch was detected, just schedule the new value. ELSE OutSignal <= NewValue AFTER dly; END IF; END IF; -- Record the new value and time depending on glitch type just scheduled. IF NOT NegPreemptGlitch THEN -- 5/2/96 for "x-pulse" IR225 GlitchData.SchedValue := NewValue; GlitchData.SchedTime := NOW+dly; -- pulse timing. ELSE GlitchData.SchedValue := 'X'; -- leave GlitchData.SchedTime to old value since glitch is negative END IF; RETURN; END; --------------------------------------------------------------------------- PROCEDURE VitalPathDelay ( SIGNAL OutSignal : OUT std_logic; VARIABLE GlitchData : INOUT VitalGlitchDataType; CONSTANT OutSignalName : IN string; CONSTANT OutTemp : IN std_logic; CONSTANT Paths : IN VitalPathArrayType; CONSTANT DefaultDelay : IN VitalDelayType := VitalZeroDelay; CONSTANT Mode : IN VitalGlitchKindType := OnEvent; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT NegPreemptOn : IN BOOLEAN := FALSE; --IR225 3/14/98 CONSTANT IgnoreDefaultDelay : IN BOOLEAN := FALSE --IR248 3/14/98 ) 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 = OutTemp) THEN RETURN; END IF; -- Evaluate propagation delay paths PropDelay := VitalSelectPathDelay (OutTemp, GlitchData.LastValue, OutSignalName, Paths, DefaultDelay, IgnoreDefaultDelay); GlitchData.LastValue := OutTemp; -- Schedule the output transactions - including glitch handling VitalGlitch (OutSignal, GlitchData, OutSignalName, OutTemp, PropDelay, Mode, XOn, NegPreemptOn, MsgOn, MsgSeverity ); END VitalPathDelay; --------------------------------------------------------------------------- PROCEDURE VitalPathDelay01 ( SIGNAL OutSignal : OUT std_logic; VARIABLE GlitchData : INOUT VitalGlitchDataType; CONSTANT OutSignalName : IN string; CONSTANT OutTemp : IN std_logic; CONSTANT Paths : IN VitalPathArray01Type; CONSTANT DefaultDelay : IN VitalDelayType01 := VitalZeroDelay01; CONSTANT Mode : IN VitalGlitchKindType := OnEvent; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT NegPreemptOn : IN BOOLEAN := FALSE; --IR225 3/14/98 CONSTANT IgnoreDefaultDelay : IN BOOLEAN := FALSE; --IR248 3/14/98 CONSTANT RejectFastPath : IN BOOLEAN := FALSE --IR250 ) 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 = OutTemp) THEN RETURN; -- Check if the new value to be Scheduled is the same as the -- previously scheduled output transactions. If this condition -- exists and the new scheduled time is < the current GlitchData. -- schedTime then a fast path condition exists (IR250). If the -- modeler wants this condition rejected by setting the -- RejectFastPath actual to true then exit out. ELSIF (GlitchData.SchedValue=OutTemp) AND (RejectFastPath) THEN RETURN; END IF; -- Evaluate propagation delay paths PropDelay := VitalSelectPathDelay (OutTemp, GlitchData.LastValue, OutSignalName, Paths, DefaultDelay, IgnoreDefaultDelay); GlitchData.LastValue := OutTemp; VitalGlitch (OutSignal, GlitchData, OutSignalName, OutTemp, PropDelay, Mode, XOn, NegPreemptOn, 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; CONSTANT NegPreemptOn : IN BOOLEAN := FALSE; --IR225 3/14/98 CONSTANT IgnoreDefaultDelay : IN BOOLEAN := FALSE; --IR248 3/14/98 CONSTANT RejectFastPath : IN BOOLEAN := FALSE --IR250 ) 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 = OutTemp) THEN RETURN; -- Check if the new value to be Scheduled is the same as the -- previously scheduled output transactions. If this condition -- exists and the new scheduled time is < the current GlitchData. -- schedTime then a fast path condition exists (IR250). If the -- modeler wants this condition rejected by setting the -- RejectFastPath actual to true then exit out. ELSIF (GlitchData.SchedValue=OutTemp) AND (RejectFastPath) THEN RETURN; END IF; -- Evaluate propagation delay paths PropDelay := VitalSelectPathDelay (OutTemp, GlitchData.LastValue, OutSignalName, Paths, DefaultDelay, IgnoreDefaultDelay); GlitchData.LastValue := OutTemp; -- Schedule the output transactions - including glitch handling VitalGlitch (OutSignal, GlitchData, OutSignalName, OutTemp, PropDelay, Mode, XOn, NegPreemptOn, 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 ") );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -