📄 prmtvs_b.vhdl
字号:
GlitchData.CurrentValue := GlitchData.SchedValue; IF (GlitchDelay <= 0 ns) THEN IF (NewValue = GlitchData.SchedValue) THEN RETURN; END IF; NoGlitchDet := TRUE; END IF; -- Transaction currently scheduled - if glitch already happened ELSIF GlitchData.GlitchTime <= NOW THEN GlitchData.CurrentValue := 'X'; OldGlitch := TRUE; IF (GlitchData.SchedValue = NewValue) THEN dly := Minimum( GlitchData.SchedTime-NOW, NewDelay ); END IF; -- Transaction currently scheduled (no glitch if same value) ELSIF (GlitchData.SchedValue = NewValue) AND (GlitchData.SchedTime = GlitchData.GlitchTime) AND (GlitchDelay <= 0 ns) THEN NoGlitchDet := TRUE; Dly := Minimum( GlitchData.SchedTime-NOW, NewDelay ); END IF; GlitchData.SchedTime := NOW+Dly; IF OldGlitch THEN OutSignal <= NewValue AFTER Dly; ELSIF NoGlitchDet THEN GlitchData.GlitchTime := NOW+Dly; OutSignal <= NewValue AFTER Dly; ELSE -- new glitch GlitchData.GlitchTime := GlitchMinTime ( GlitchData.GlitchTime, NOW+GlitchDelay ); IF (GlitchMode = MessagePlusX) OR (GlitchMode = MessageOnly) THEN ReportGlitch ( "VitalGlitchOnEvent", OutSignalName, GlitchData.GlitchTime, GlitchData.SchedValue, (Dly + NOW), NewValue, MsgSeverity=>MsgSeverity ); END IF; IF (GlitchMode = MessagePlusX) OR (GlitchMode = XOnly) THEN OutSignal <= 'X' AFTER GlitchData.GlitchTime-NOW; OutSignal <= TRANSPORT NewValue AFTER Dly; ELSE OutSignal <= NewValue AFTER Dly; END IF; END IF; GlitchData.SchedValue := NewValue; END IF; RETURN; END; ---------------------------------------------------------------------------- PROCEDURE VitalGlitchOnEvent ( SIGNAL OutSignal : OUT std_logic_vector; CONSTANT OutSignalName : IN STRING; VARIABLE GlitchData : INOUT GlitchDataArrayType; CONSTANT NewValue : IN std_logic_vector; CONSTANT NewDelay : IN VitalTimeArray; CONSTANT GlitchMode : IN VitalGlitchModeType := MessagePlusX; CONSTANT GlitchDelay : IN VitalTimeArray; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ) IS ALIAS GlDataAlias : GlitchDataArrayType(1 TO GlitchData'LENGTH) IS GlitchData; ALIAS NewValAlias : std_logic_vector(1 TO NewValue'LENGTH) IS NewValue; ALIAS GlDelayAlias : VitalTimeArray(1 TO GlitchDelay'LENGTH) IS GlitchDelay; ALIAS NewDelAlias : VitalTimeArray(1 TO NewDelay'LENGTH) IS NewDelay; VARIABLE Index : INTEGER := OutSignal'LEFT; VARIABLE Direction : INTEGER; VARIABLE NoGlitchDet : BOOLEAN; VARIABLE OldGlitch : BOOLEAN; VARIABLE Dly, GlDly : TIME; BEGIN IF (OutSignal'LEFT > OutSignal'RIGHT) THEN Direction := -1; ELSE Direction := 1; END IF; IF ( (OutSignal'LENGTH /= GlitchData'LENGTH) OR (OutSignal'LENGTH /= NewValue'LENGTH) OR (OutSignal'LENGTH /= NewDelay'LENGTH) OR (OutSignal'LENGTH /= GlitchDelay'LENGTH) ) THEN VitalError ( "VitalGlitchOnEvent", ErrVctLng, OutSignalName ); RETURN; END IF; -- a call to the scalar function cannot be made since the actual -- name associated with a signal parameter must be locally static FOR n IN 1 TO OutSignal'LENGTH LOOP NoGlitchDet := FALSE; OldGlitch := FALSE; Dly := NewDelAlias(n); -- If nothing to schedule, just skip to next loop iteration IF NewDelAlias(n) < 0 ns THEN IF (NewValAlias(n) /= GlDataAlias(n).SchedValue) THEN VitalError ( "VitalGlitchOnEvent", ErrNegDel, OutSignalName ); END IF; ELSE -- If nothing currently scheduled (i.e. last scheduled -- transaction already occurred) IF GlDataAlias(n).SchedTime <= NOW THEN GlDataAlias(n).CurrentValue := GlDataAlias(n).SchedValue; IF (GlDelayAlias(n) <= 0 ns) THEN -- Next iteration if no change in value IF (NewValAlias(n) = GlDataAlias(n).SchedValue) THEN Index := Index + Direction; NEXT; END IF; -- since last transaction already occurred there is no glitch NoGlitchDet := TRUE; END IF; -- Transaction currently scheduled - if glitch already happened ELSIF GlDataAlias(n).GlitchTime <= NOW THEN GlDataAlias(n).CurrentValue := 'X'; OldGlitch := TRUE; IF (GlDataAlias(n).SchedValue = NewValAlias(n)) THEN dly := Minimum( GlDataAlias(n).SchedTime-NOW, NewDelAlias(n) ); END IF; -- Transaction currently scheduled ELSIF (GlDataAlias(n).SchedValue = NewValAlias(n)) AND (GlDataAlias(n).SchedTime = GlDataAlias(n).GlitchTime) AND (GlDelayAlias(n) <= 0 ns) THEN NoGlitchDet := TRUE; Dly := Minimum( GlDataAlias(n).SchedTime-NOW, NewDelAlias(n) ); END IF; -- update last scheduled transaction GlDataAlias(n).SchedTime := NOW+Dly; IF OldGlitch THEN OutSignal(Index) <= NewValAlias(n) AFTER Dly; ELSIF NoGlitchDet THEN -- if no glitch then update last glitch time -- and OutSignal(actual_index) GlDataAlias(n).GlitchTime := NOW+Dly; OutSignal(Index) <= NewValAlias(n) AFTER Dly; ELSE -- new glitch GlDataAlias(n).GlitchTime := GlitchMinTime ( GlDataAlias(n).GlitchTime, NOW+GlDelayAlias(n) ); IF (GlitchMode = MessagePlusX) OR (GlitchMode = MessageOnly) THEN ReportGlitch ( "VitalGlitchOnEvent", OutSignalName, GlDataAlias(n).GlitchTime, GlDataAlias(n).SchedValue, (Dly + NOW), NewValAlias(n), Index, TRUE, MsgSeverity ); END IF; IF (GlitchMode = MessagePlusX) OR (GlitchMode = XOnly) THEN GlDly := GlDataAlias(n).GlitchTime - NOW; OutSignal(Index) <= 'X' AFTER GlDly; OutSignal(Index) <= TRANSPORT NewValAlias(n) AFTER Dly; ELSE OutSignal(Index) <= NewValAlias(n) AFTER Dly; END IF; END IF; -- glitch / no-glitch GlDataAlias(n).SchedValue := NewValAlias(n); END IF; -- NewDelAlias(n) < 0 ns Index := Index + Direction; END LOOP; RETURN; END; --------------------------------------------------------------------------- -- ------------------------------------------------------------------------ -- PROCEDURE NAME : TruthOutputX01Z -- -- PARAMETERS : table_out - output of table -- X01Zout - output converted to X01Z -- err - true if illegal character is encountered -- -- -- DESCRIPTION : converts the output of a truth table to a valid -- std_ulogic -- ------------------------------------------------------------------------ PROCEDURE TruthOutputX01Z ( CONSTANT TableOut : IN VitalTruthSymbolType; VARIABLE X01Zout : OUT std_ulogic; VARIABLE Err : OUT BOOLEAN ) IS VARIABLE TempOut : std_ulogic; BEGIN Err := FALSE; TempOut := TruthTableOutMap(TableOut); IF (TempOut = '-') THEN Err := TRUE; TempOut := 'X'; VitalError ( "VitalTruthTable", ErrOutSym, To_TruthChar(TableOut)); END IF; X01Zout := TempOut; END; -- ------------------------------------------------------------------------ -- PROCEDURE NAME : StateOutputX01Z -- -- PARAMETERS : table_out - output of table -- prev_out - previous output value -- X01Zout - output cojnverted to X01Z -- err - true if illegal character is encountered -- -- DESCRIPTION : converts the output of a state table to a -- valid std_ulogic -- ------------------------------------------------------------------------ PROCEDURE StateOutputX01Z ( CONSTANT TableOut : IN VitalStateSymbolType; CONSTANT PrevOut : IN std_ulogic; VARIABLE X01Zout : OUT std_ulogic; VARIABLE Err : OUT BOOLEAN ) IS VARIABLE TempOut : std_ulogic; BEGIN Err := FALSE; TempOut := StateTableOutMap(TableOut); IF (TempOut = '-') THEN Err := TRUE; TempOut := 'X'; VitalError ( "VitalStateTable", ErrOutSym, To_StateChar(TableOut)); ELSIF (TempOut = 'W') THEN TempOut := To_X01Z(PrevOut); END IF; X01Zout := TempOut; END; -- ------------------------------------------------------------------------ -- PROCEDURE NAME: StateMatch -- -- PARAMETERS : symbol - symbol from state table -- in2 - input from VitalStateTble procedure -- to state table -- in2LastValue - previous value of input -- state - false if the symbol is from the input -- portion of the table, -- true if the symbol is from the state -- portion of the table -- Err - true if symbol is not a valid input symbol -- ReturnValue - true if match occurred -- -- DESCRIPTION : This procedure sets ReturnValue to true if in2 matches -- symbol (from the state table). If symbol is an edge -- value edge is set to true and in2 and in2LastValue are -- checked against symbol. Err is set to true if symbol -- is an invalid value for the input portion of the state -- table. -- -- ------------------------------------------------------------------------ PROCEDURE StateMatch ( CONSTANT Symbol : IN VitalStateSymbolType; CONSTANT in2 : IN std_ulogic; CONSTANT in2LastValue : IN std_ulogic; CONSTANT State : IN BOOLEAN; VARIABLE Err : OUT BOOLEAN; VARIABLE ReturnValue : OUT BOOLEAN ) IS BEGIN IF (State) THEN IF (NOT ValidStateTableState(Symbol)) THEN VitalError ( "VitalStateTable", ErrStaSym, To_StateChar(Symbol)); Err := TRUE; ReturnValue := FALSE; ELSE Err := FALSE; ReturnValue := StateTableMatch(in2LastValue, in2, Symbol); END IF; ELSE IF (NOT ValidStateTableInput(Symbol) ) THEN VitalError ( "VitalStateTable", ErrInpSym, To_StateChar(Symbol)); Err := TRUE; ReturnValue := FALSE; ELSE ReturnValue := StateTableMatch(in2LastValue, in2, Symbol); Err := FALSE; END IF; END IF; END; -- -----------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -