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

📄 timing_b.vhdl

📁 vhdl集成电路设计软件.需要用gcc-4.0.2版本编译.
💻 VHDL
📖 第 1 页 / 共 5 页
字号:
        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 + -