📄 memory_b.vhdl
字号:
TYPE EdgeSymbolMatchType IS ARRAY (X01,X01,VitalEdgeSymbolType) OF BOOLEAN;-- last value, present value, edge symbolCONSTANT 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 ) ) );-- ----------------------------------------------------------------------------FUNCTION Minimum ( CONSTANT t1, t2 : IN TIME ) RETURN TIME ISBEGIN IF (t1 < t2) THEN RETURN (t1); ELSE RETURN (t2); END IF;END Minimum;-- ----------------------------------------------------------------------------FUNCTION Maximum ( CONSTANT t1, t2 : IN TIME) RETURN TIME ISBEGIN IF (t1 < t2) THEN RETURN (t2); ELSE RETURN (t1); END IF;END Maximum;-- ------------------------------------------------------------------------------ FUNCTION: VitalMemoryCalcDelay-- Description: Select Transition dependent Delay. -- Used internally by VitalMemorySelectDelay. -- ----------------------------------------------------------------------------FUNCTION VitalMemoryCalcDelay ( CONSTANT NewVal : IN STD_ULOGIC := 'X'; CONSTANT OldVal : IN STD_ULOGIC := 'X'; CONSTANT Delay : IN VitalDelayType01ZX) RETURN VitalMemoryDelayType IS VARIABLE Result : VitalMemoryDelayType;BEGIN CASE Oldval IS WHEN '0' | 'L' => CASE Newval IS WHEN '0' | 'L' => Result.PropDelay := Delay(tr10); WHEN '1' | 'H' => Result.PropDelay := Delay(tr01); WHEN 'Z' => Result.PropDelay := Delay(tr0Z); WHEN OTHERS => Result.PropDelay := Minimum(Delay(tr01), Delay(tr0Z)); END CASE; Result.OutputRetainDelay := Delay(tr0X); WHEN '1' | 'H' => CASE Newval IS WHEN '0' | 'L' => Result.PropDelay := Delay(tr10); WHEN '1' | 'H' => Result.PropDelay := Delay(tr01); WHEN 'Z' => Result.PropDelay := Delay(tr1Z); WHEN OTHERS => Result.PropDelay := Minimum(Delay(tr10), Delay(tr1Z)); END CASE; Result.OutputRetainDelay := Delay(tr1X); WHEN 'Z' => CASE Newval IS WHEN '0' | 'L' => Result.PropDelay := Delay(trZ0); WHEN '1' | 'H' => Result.PropDelay := Delay(trZ1); WHEN 'Z' => Result.PropDelay := Maximum(Delay(tr1Z), Delay(tr0Z)); WHEN OTHERS => Result.PropDelay := Minimum(Delay(trZ1), Delay(trZ0)); END CASE; Result.OutputRetainDelay := Delay(trZX); WHEN OTHERS => CASE Newval IS WHEN '0' | 'L' => Result.PropDelay := Maximum(Delay(tr10), Delay(trZ0)); WHEN '1' | 'H' => Result.PropDelay := Maximum(Delay(tr01), Delay(trZ1)); WHEN 'Z' => Result.PropDelay := Maximum(Delay(tr1Z), Delay(tr0Z)); WHEN OTHERS => Result.PropDelay := Maximum(Delay(tr10), Delay(tr01)); END CASE; Result.OutputRetainDelay := Minimum(Delay(tr1X), Delay(tr0X)); END CASE; RETURN Result;END VitalMemoryCalcDelay;-- ----------------------------------------------------------------------------FUNCTION VitalMemoryCalcDelay ( CONSTANT NewVal : IN STD_ULOGIC := 'X'; CONSTANT OldVal : IN STD_ULOGIC := 'X'; CONSTANT Delay : IN VitalDelayType01Z) RETURN VitalMemoryDelayType IS VARIABLE Result : VitalMemoryDelayType;BEGINCASE Oldval IS WHEN '0' | 'L' => CASE Newval IS WHEN '0' | 'L' => Result.PropDelay := Delay(tr10); WHEN '1' | 'H' => Result.PropDelay := Delay(tr01); WHEN OTHERS => Result.PropDelay := Minimum(Delay(tr01), Delay(tr10)); END CASE; Result.OutputRetainDelay := Delay(tr0Z); WHEN '1' | 'H' => CASE Newval IS WHEN '0' | 'L' => Result.PropDelay := Delay(tr10); WHEN '1' | 'H' => Result.PropDelay := Delay(tr01); WHEN OTHERS => Result.PropDelay := Minimum(Delay(tr10), Delay(tr01)); END CASE; Result.OutputRetainDelay := Delay(tr1Z); WHEN OTHERS => Result.PropDelay := Maximum(Delay(tr10),Delay(tr01)); Result.OutputRetainDelay := Minimum(Delay(tr1Z),Delay(tr0Z)); END CASE; RETURN Result;END VitalMemoryCalcDelay;-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryUpdateInputChangeTime ( VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; VARIABLE NumBitsPerSubword : INTEGER) IS VARIABLE LastInputValue : STD_LOGIC_VECTOR(InputSignal'LENGTH-1 downto 0); VARIABLE InSignalNorm : STD_LOGIC_VECTOR(InputSignal'LENGTH-1 downto 0); VARIABLE ChangeTimeNorm : VitalTimeArrayT(InputSignal'LENGTH-1 downto 0); VARIABLE BitsPerWord : INTEGER;BEGIN LastInputValue := InputSignal'LAST_VALUE; IF NumBitsPerSubword = DefaultNumBitsPerSubword THEN BitsPerWord := InputSignal'LENGTH; ELSE BitsPerWord := NumBitsPerSubword; END IF; FOR i IN InSignalNorm'RANGE LOOP IF (InSignalNorm(i) /= LastInputValue(i)) THEN ChangeTimeNorm(i/BitsPerWord) := NOW - InputSignal'LAST_EVENT; ELSE ChangeTimeNorm(i/BitsPerWord) := InputChangeTimeArray(i); END IF; END LOOP; FOR i IN ChangeTimeNorm'RANGE LOOP ChangeTimeNorm(i) := ChangeTimeNorm(i/BitsPerword); END LOOP; InputChangeTimeArray := ChangeTimeNorm; -- for debug purpose only PrintInputChangeTime(InputChangeTimeArray);END VitalMemoryUpdateInputChangeTime;-- ------------------------------------------------------------------------------ Procedure: VitalMemoryUpdateInputChangeTime-- Description: Time since previous event for each bit of the input-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryUpdateInputChangeTime ( VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; SIGNAL InputSignal : IN STD_LOGIC_VECTOR) IS VARIABLE LastInputValue : STD_LOGIC_VECTOR(InputSignal'RANGE) ;BEGIN LastInputValue := InputSignal'LAST_VALUE; FOR i IN InputSignal'RANGE LOOP IF (InputSignal(i) /= LastInputValue(i)) THEN InputChangeTimeArray(i) := NOW - InputSignal'LAST_EVENT; END IF; END LOOP; -- for debug purpose only PrintInputChangeTime(InputChangeTimeArray);END VitalMemoryUpdateInputChangeTime;-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryUpdateInputChangeTime ( VARIABLE InputChangeTime : INOUT TIME; SIGNAL InputSignal : IN STD_ULOGIC) ISBEGIN InputChangeTime := NOW - InputSignal'LAST_EVENT; -- for debug purpose only PrintInputChangeTime(InputChangeTime);END VitalMemoryUpdateInputChangeTime;-- ----------------------------------------------------------------------------PROCEDURE VitalMemoryExpandPortFlag ( CONSTANT PortFlag : IN VitalPortFlagVectorType; CONSTANT NumBitsPerSubword : IN INTEGER; VARIABLE ExpandedPortFlag : OUT VitalPortFlagVectorType) IS VARIABLE PortFlagNorm : VitalPortFlagVectorType( PortFlag'LENGTH-1 downto 0) := PortFlag; VARIABLE ExpandedPortFlagNorm : VitalPortFlagVectorType( ExpandedPortFlag'LENGTH-1 downto 0); VARIABLE SubwordIndex : INTEGER;BEGIN FOR Index IN INTEGER RANGE 0 to ExpandedPortFlag'LENGTH-1 LOOP IF NumBitsPerSubword = DefaultNumBitsPerSubword THEN SubwordIndex := 0; ELSE SubwordIndex := Index / NumBitsPerSubword; END IF; ExpandedPortFlagNorm(Index) := PortFlagNorm(SubWordIndex); END LOOP; ExpandedPortFlag := ExpandedPortFlagNorm; END VitalMemoryExpandPortFlag;-- ------------------------------------------------------------------------------ Procedure: VitalMemorySelectDelay-- Description : Select Propagation Delay. Used internally by -- VitalMemoryAddPathDelay.-- ------------------------------------------------------------------------------ ------------------------------------------------------------------------------ VitalDelayArrayType01ZX-- ----------------------------------------------------------------------------PROCEDURE VitalMemorySelectDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; VARIABLE InputChangeTimeArray : IN VitalTimeArrayT; CONSTANT OutputSignalName : IN STRING :=""; CONSTANT PathDelayArray : IN VitalDelayArrayType01ZX; 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 : VitalDelayArrayType01ZX( 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -