📄 timing_b.vhdl
字号:
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 : TIME; VARIABLE actualObsTime : TIME; VARIABLE BC : TIME; VARIABLE Message:LINE; 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; -- start of new code IR245-246 BC := HoldHigh; -- end of new code IR245-246 WHEN '1' => CheckInfo.ExpTime := SetupHigh; -- start of new code IR245-246 BC := HoldLow; -- end of new code IR245-246 WHEN 'X' => CheckInfo.ExpTime := Maximum(SetupHigh,SetupLow); -- start of new code IR245-246 BC := Maximum(HoldHigh,HoldLow); -- end of new code IR245-246 END CASE; -- added the second condition for IR 245-246 CheckInfo.Violation := ( (CheckInfo.ObsTime < CheckInfo.ExpTime) AND ( NOT ((CheckInfo.ObsTime = BC) and (BC = 0 ns))) ); -- start of new code IR245-246 IF(CheckInfo.ExpTime = 0 ns) THEN CheckInfo.CheckKind := HoldCheck; ELSE CheckInfo.CheckKind := SetupCheck; END IF; -- end of new code IR245-246 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; -- new code for unnamed IR CheckInfo.State := '1'; -- start of new code IR245-246 BC := SetupLow; -- end of new code IR245-246 WHEN '1' => CheckInfo.ExpTime := HoldLow; -- new code for unnamed IR CheckInfo.State := '0'; -- start of new code IR245-246 BC := SetupHigh; -- end of new code IR245-246 WHEN 'X' => CheckInfo.ExpTime := Maximum(HoldHigh,HoldLow); -- start of new code IR245-246 BC := Maximum(SetupHigh,SetupLow); -- end of new code IR245-246 END CASE; -- added the second condition for IR 245-246 CheckInfo.Violation := ( (CheckInfo.ObsTime < CheckInfo.ExpTime) AND ( NOT ((CheckInfo.ObsTime = BC) and (BC = 0 ns))) ); -- start of new code IR245-246 IF(CheckInfo.ExpTime = 0 ns) THEN CheckInfo.CheckKind := SetupCheck; ELSE CheckInfo.CheckKind := HoldCheck; END IF; -- end of new code IR245-246 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 are non-negative -- Note: bias may be negative or positive IF MsgOn AND CheckInfo.Violation THEN -- modified the code for correct reporting of violation in case of -- order of signals being reversed because of internal delays -- new variable actualObsTime := (TestTime-TestDelay)-(RefTime-RefDelay); bias := TestDelay - RefDelay; IF (actualObsTime < 0 ns) THEN -- It should be a setup check IF ( CheckInfo.CheckKind = HoldCheck) then CheckInfo.CheckKind := SetupCheck; CASE CheckInfo.State IS WHEN '0' => CheckInfo.ExpTime := SetupLow; WHEN '1' => CheckInfo.ExpTime := SetupHigh; WHEN 'X' => CheckInfo.ExpTime := Maximum(SetupHigh,SetupLow); END CASE; END IF; CheckInfo.ObsTime := -actualObsTime; CheckInfo.ExpTime := CheckInfo.ExpTime + bias; CheckInfo.DetTime := RefTime - RefDelay; ELSE -- It should be a hold check IF ( CheckInfo.CheckKind = SetupCheck) then CheckInfo.CheckKind := HoldCheck; CASE CheckInfo.State IS WHEN '0' => CheckInfo.ExpTime := HoldHigh; CheckInfo.State := '1'; WHEN '1' => CheckInfo.ExpTime := HoldLow; CheckInfo.State := '0'; WHEN 'X' => CheckInfo.ExpTime := Maximum(HoldHigh,HoldLow); END CASE; END IF; CheckInfo.ObsTime := actualObsTime; CheckInfo.ExpTime := CheckInfo.ExpTime - bias; 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; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; --IR252 3/23/98 CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; --IR252 3/23/98 CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; --IR252 3/23/98 CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE --IR252 3/23/98 ) 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.SetupEn := TimingData.SetupEn AND EnableSetupOnRef; --IR252 3/23/98 TimingData.HoldEn := EnableHoldOnRef; --IR252 3/23/98 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 := EnableSetupOnTest; --IR252 3/23/98 TimingData.HoldEn := TimingData.HoldEn AND EnableHoldOnTest; --IR252 3/23/98 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; SIGNAL TestSignal : IN std_logic_vector; 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; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; --IR252 3/23/98 CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; --IR252 3/23/98 CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; --IR252 3/23/98 CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE --IR252 3/23/98 ) IS VARIABLE CheckInfo : CheckInfoType; VARIABLE RefEdge : BOOLEAN; VARIABLE TestEvent : VitalBoolArrayT(TestSignal'RANGE); VARIABLE TestDly : TIME := Maximum(0 ns, TestDelay); VARIABLE RefDly : TIME := Maximum(0 ns, RefDelay); VARIABLE bias : TIME; VARIABLE ChangedAllAtOnce : BOOLEAN := TRUE; VARIABLE StrPtr1 : LINE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -