📄 memory_b.vhdl
字号:
PropDelay := CurPropDelay; END IF; IF (OutputRetainFlag = TRUE) THEN IF (CurRetainDelay < RetainDelay) THEN RetainDelay := CurRetainDelay; END IF; END IF; END IF; END LOOP; -- Store it back to data strucutre ScheduleDataArrayNorm(OutBitPos).PropDelay := PropDelay; ScheduleDataArrayNorm(OutBitPos).OutputRetainDelay:= RetainDelay; ScheduleDataArrayNorm(OutBitPos).InputAge := InputAge; -- for debug purpose PrintDelay(outbitPos,InputArrayLow, InputArrayHigh, debugprop, debugretain); END LOOP; ScheduleDataArray := ScheduleDataArrayNorm;END VitalMemorySelectDelay;-- ------------------------------------------------------------------------------ VitalDelayArrayType01Z-- ----------------------------------------------------------------------------PROCEDURE VitalMemorySelectDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; VARIABLE InputChangeTimeArray : IN VitalTimeArrayT; CONSTANT OutputSignalName : IN STRING :=""; CONSTANT PathDelayArray : IN VitalDelayArrayType01Z; CONSTANT ArcType : IN VitalMemoryArcType; CONSTANT PathConditionArray : IN VitalBoolArrayT; CONSTANT OutputRetainFlag : IN BOOLEAN) IS VARIABLE InputArrayLow : INTEGER := 0; VARIABLE InputArrayHigh : INTEGER := 0; VARIABLE DelayArrayIndex : INTEGER := 0; VARIABLE NumBitsPerSubWord : INTEGER := DefaultNumBitsPerSubword; VARIABLE NewValue : STD_ULOGIC; VARIABLE OldValue : STD_ULOGIC; VARIABLE OutputLength : INTEGER := 0; VARIABLE OutArrayIndex : INTEGER; VARIABLE PropDelay : TIME; VARIABLE RetainDelay : TIME; VARIABLE CurPropDelay : TIME; VARIABLE CurRetainDelay : TIME; VARIABLE InputAge : TIME; VARIABLE CurInputAge : TIME; VARIABLE InputChangeTimeNorm : VitalTimeArrayT( InputChangeTimeArray'LENGTH-1 downto 0):=InputChangeTimeArray; VARIABLE DelayArrayNorm : VitalDelayArrayType01Z( PathDelayArray'LENGTH-1 downto 0):= PathDelayArray; VARIABLE ScheduleDataArrayNorm : VitalMemoryScheduleDatavectorType (ScheduleDataArray'LENGTH-1 downto 0):=ScheduleDataArray; -- for debug purpose VARIABLE debugprop : VitalTimeArrayT(MaxNoInputBits-1 downto 0); VARIABLE debugretain : VitalTimeArrayT(MaxNoInputBits-1 downto 0);BEGIN -- for debug purpose PrintArcType(ArcType); OutputLength := ScheduleDataArray'LENGTH; FOR OutBitPos IN 0 to (OutputLength -1) LOOP NEXT WHEN PathConditionArray(OutBitPos) = FALSE; NEXT WHEN ((ScheduleDataArrayNorm(OutBitPos).ScheduleValue = ScheduleDataArrayNorm(OutBitPos).OutputData) AND (ScheduleDataArrayNorm(OutBitPos).ScheduleTime <= NOW) AND (OutputRetainFlag = FALSE)); NewValue := ScheduleDataArrayNorm(OutBitPos).OutputData; OldValue := ScheduleDataArrayNorm(OutBitPos).LastOutputValue; PropDelay :=ScheduleDataArrayNorm(OutBitPos).PropDelay; InputAge := ScheduleDataArrayNorm(OutBitPos).InputAge; RetainDelay:=ScheduleDataArrayNorm(OutBitPos).OutputRetainDelay; NumBitsPerSubWord:=ScheduleDataArrayNorm(OutBitPos).NumBitsPerSubWord; CASE ArcType IS WHEN ParallelArc => InputArrayLow := OutBitPos; InputArrayHigh := OutBitPos; DelayArrayIndex := OutBitPos; WHEN CrossArc => InputArrayLow := 0; InputArrayHigh := InputChangeTimeArray'LENGTH-1; DelayArrayIndex := OutBitPos; WHEN SubwordArc => InputArrayLow := OutBitPos / NumBitsPerSubWord; InputArrayHigh := OutBitPos / NumBitsPerSubWord; DelayArrayIndex := OutBitPos + (OutputLength * (OutBitPos / NumBitsPerSubWord)); END CASE; FOR i IN InputArrayLow TO InputArrayHigh LOOP (CurPropDelay, CurRetainDelay) := VitalMemoryCalcDelay ( NewValue, OldValue, DelayArrayNorm(DelayArrayIndex) ); IF (OutputRetainFlag = FALSE) THEN CurRetainDelay := TIME'HIGH; END IF; -- for debug purpose debugprop(i) := CurPropDelay; debugretain(i) := CurRetainDelay; IF (ArcType = CrossArc) THEN DelayArrayIndex := DelayArrayIndex + OutputLength; END IF; -- If there is one input change at a time, then choose the -- delay from that input. If there is simultaneous input -- change, then choose the minimum of propagation delays IF (InputChangeTimeNorm(i) < 0 ns) THEN CurInputAge := TIME'HIGH; ELSE CurInputAge := NOW - InputChangeTimeNorm(i); END IF; IF (CurInputAge < InputAge) THEN PropDelay := CurPropDelay; RetainDelay := CurRetainDelay; InputAge := CurInputAge; ELSIF (CurInputAge = InputAge) THEN IF (CurPropDelay < PropDelay) THEN PropDelay := CurPropDelay; END IF; IF (OutputRetainFlag = TRUE) THEN IF (CurRetainDelay < RetainDelay) THEN RetainDelay := CurRetainDelay; END IF; END IF; END IF; END LOOP; -- Store it back to data strucutre ScheduleDataArrayNorm(OutBitPos).PropDelay := PropDelay; ScheduleDataArrayNorm(OutBitPos).OutputRetainDelay:= RetainDelay; ScheduleDataArrayNorm(OutBitPos).InputAge := InputAge; -- for debug purpose PrintDelay(outbitPos, InputArrayLow, InputArrayHigh, debugprop, debugretain); END LOOP; ScheduleDataArray := ScheduleDataArrayNorm;END VitalMemorySelectDelay;-- ------------------------------------------------------------------------------ VitalDelayArrayType01-- ----------------------------------------------------------------------------PROCEDURE VitalMemorySelectDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; VARIABLE InputChangeTimeArray : IN VitalTimeArrayT; CONSTANT OutputSignalName : IN STRING :=""; CONSTANT PathDelayArray : IN VitalDelayArrayType01; CONSTANT ArcType : IN VitalMemoryArcType; CONSTANT PathConditionArray : IN VitalBoolArrayT) IS VARIABLE CurPathDelay : VitalMemoryDelayType; VARIABLE InputArrayLow : INTEGER := 0; VARIABLE InputArrayHigh : INTEGER := 0; VARIABLE DelayArrayIndex : INTEGER := 0; VARIABLE NumBitsPerSubWord : INTEGER := DefaultNumBitsPerSubword; VARIABLE NewValue : STD_ULOGIC; VARIABLE OldValue : STD_ULOGIC; VARIABLE OutputLength : INTEGER := 0; VARIABLE OutArrayIndex : INTEGER; VARIABLE PropDelay : TIME; VARIABLE CurPropDelay : TIME; VARIABLE InputAge : TIME; VARIABLE CurInputAge : TIME; VARIABLE InputChangeTimeNorm : VitalTimeArrayT( InputChangeTimeArray'LENGTH-1 downto 0):= InputChangeTimeArray; VARIABLE DelayArrayNorm : VitalDelayArrayType01( PathDelayArray'LENGTH-1 downto 0):= PathDelayArray; VARIABLE ScheduleDataArrayNorm : VitalMemoryScheduleDatavectorType (ScheduleDataArray'LENGTH-1 downto 0):=ScheduleDataArray; -- for debug purpose VARIABLE debugprop : VitalTimeArrayT(MaxNoInputBits-1 downto 0); VARIABLE debugretain : VitalTimeArrayT(MaxNoInputBits-1 downto 0);BEGIN -- for debug purpose PrintArcType(ArcType); OutputLength := ScheduleDataArray'LENGTH; FOR OutBitPos IN 0 to (OutputLength -1) LOOP NEXT WHEN PathConditionArray(OutBitPos) = FALSE; NEXT WHEN ((ScheduleDataArrayNorm(OutBitPos).ScheduleValue = ScheduleDataArrayNorm(OutBitPos).OutputData) AND (ScheduleDataArrayNorm(OutBitPos).ScheduleTime <= NOW)); NewValue := ScheduleDataArrayNorm(OutBitPos).OutputData; OldValue := ScheduleDataArrayNorm(OutBitPos).LastOutputValue; PropDelay :=ScheduleDataArrayNorm(OutBitPos).PropDelay; InputAge := ScheduleDataArrayNorm(OutBitPos).InputAge; NumBitsPerSubWord:=ScheduleDataArrayNorm(OutBitPos).NumBitsPerSubWord; CASE ArcType IS WHEN ParallelArc => InputArrayLow := OutBitPos; InputArrayHigh := OutBitPos; DelayArrayIndex := OutBitPos; WHEN CrossArc => InputArrayLow := 0; InputArrayHigh := InputChangeTimeArray'LENGTH-1; DelayArrayIndex := OutBitPos; WHEN SubwordArc => InputArrayLow := OutBitPos / NumBitsPerSubWord; InputArrayHigh := OutBitPos / NumBitsPerSubWord; DelayArrayIndex := OutBitPos + (OutputLength * (OutBitPos / NumBitsPerSubWord)); END CASE; FOR i IN InputArrayLow TO InputArrayHigh LOOP CurPropDelay:= VitalCalcDelay (NewValue, OldValue, DelayArrayNorm(DelayArrayIndex)); -- for debug purpose debugprop(i) := CurPropDelay; debugretain(i) := TIME'HIGH; IF (ArcType = CrossArc) THEN DelayArrayIndex := DelayArrayIndex + OutputLength; END IF; -- If there is one input change at a time, then choose the -- delay from that input. If there is simultaneous input -- change, then choose the minimum of propagation delays IF (InputChangeTimeNorm(i) < 0 ns) THEN CurInputAge := TIME'HIGH; ELSE CurInputAge := NOW - InputChangeTimeNorm(i); END IF; IF (CurInputAge < InputAge) THEN PropDelay := CurPropDelay; InputAge := CurInputAge; ELSIF (CurInputAge = InputAge) THEN IF (CurPropDelay < PropDelay) THEN PropDelay := CurPropDelay; END IF; END IF; END LOOP; -- Store it back to data strucutre ScheduleDataArrayNorm(OutBitPos).PropDelay := PropDelay; ScheduleDataArrayNorm(OutBitPos).InputAge := InputAge; -- for debug purpose PrintDelay(outbitPos, InputArrayLow, InputArrayHigh, debugprop, debugretain); END LOOP; ScheduleDataArray := ScheduleDataArrayNorm;END VitalMemorySelectDelay;-- ------------------------------------------------------------------------------ VitalDelayArrayType-- ----------------------------------------------------------------------------PROCEDURE VitalMemorySelectDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; VARIABLE InputChangeTimeArray : IN VitalTimeArrayT; CONSTANT OutputSignalName : IN STRING :=""; CONSTANT PathDelayArray : IN VitalDelayArrayType; CONSTANT ArcType : IN VitalMemoryArcType; CONSTANT PathConditionArray : IN VitalBoolArrayT) IS VARIABLE InputArrayLow : INTEGER := 0; VARIABLE InputArrayHigh : INTEGER := 0; VARIABLE DelayArrayIndex : INTEGER := 0; VARIABLE NumBitsPerSubWord : INTEGER := DefaultNumBitsPerSubword; VARIABLE NewValue : STD_ULOGIC; VARIABLE OldValue : STD_ULOGIC; VARIABLE OutputLength : INTEGER := 0; VARIABLE OutArrayIndex : INTEGER; VARIABLE PropDelay : TIME; VARIABLE CurPropDelay : TIME; VARIABLE InputAge : TIME; VARIABLE CurInputAge : TIME; VARIABLE InputChangeTimeNorm : VitalTimeArrayT( InputChangeTimeArray'LENGTH-1 downto 0) := InputChangeTimeArray; VARIABLE DelayArrayNorm : VitalDelayArrayType( PathDelayArray'LENGTH-1 downto 0) := PathDelayArray; VARIABLE ScheduleDataArrayNorm : VitalMemoryScheduleDatavectorType (ScheduleDataArray'LENGTH-1 downto 0) := ScheduleDataArray; -- for debug purpose VARIABLE debugprop : VitalTimeArrayT(MaxNoInputBits-1 downto 0); VARIABLE debugretain : VitalTimeArrayT(MaxNoInputBits-1 downto 0);BEGIN -- for debug purpose PrintArcType(ArcType); OutputLength := ScheduleDataArray'LENGTH; FOR OutBitPos IN 0 to (OutputLength -1) LOOP NEXT WHEN PathConditionArray(OutBitPos) = FALSE; NEXT WHEN ((ScheduleDataArrayNorm(OutBitPos).ScheduleValue = ScheduleDataArrayNorm(OutBitPos).OutputData) AND (ScheduleDataArrayNorm(OutBitPos).ScheduleTime <= NOW)); NewValue := ScheduleDataArrayNorm(OutBitPos).OutputData; OldValue := ScheduleDataArrayNorm(OutBitPos).LastOutputValue; PropDelay :=ScheduleDataArrayNorm(OutBitPos).PropDelay; InputAge := ScheduleDataArrayNorm(OutBitPos).InputAge; NumBitsPerSubWord:=ScheduleDataArrayNorm(OutBitPos).NumBitsPerSubWord; CASE ArcType IS WHEN ParallelArc => InputArrayLow := OutBitPos; InputArrayHigh := OutBitPos; DelayArrayIndex := OutBitPos; WHEN CrossArc => InputArrayLow := 0; InputArrayHigh := InputChangeTimeArray'LENGTH-1; DelayArrayIndex := OutBitPos; WHEN SubwordArc => InputArrayLow := OutBitPos / NumBitsPerSubWord; InputArrayHigh := OutBitPos / NumBitsPerSubWord; DelayArrayIndex := OutBitPos + (OutputLength * (OutBitPos / NumBitsPerSubWord)); END CASE; FOR i IN InputArrayLow TO InputArrayHigh LOOP CurPropDelay := VitalCalcDelay (NewValue, OldValue, DelayArrayNorm(DelayArrayIndex));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -