📄 prmtvs_b.vhdl
字号:
(-- 1 (lastvalue) -- / \ P N r f -- p n R F ^ v -- E A D * -- X 0 1 - B Z S (FALSE,FALSE,FALSE,FALSE,FALSE,TRUE , FALSE,TRUE, FALSE,TRUE, FALSE,FALSE, FALSE,FALSE,TRUE, TRUE, TRUE, FALSE,FALSE,TRUE, FALSE,FALSE,FALSE), (FALSE,TRUE, FALSE,TRUE, FALSE,FALSE, FALSE,TRUE, FALSE,TRUE, FALSE,FALSE, FALSE,FALSE,FALSE,TRUE, FALSE,TRUE, FALSE,TRUE, TRUE, FALSE,FALSE), (FALSE,FALSE,FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,FALSE,FALSE, FALSE,FALSE,TRUE, TRUE, TRUE, FALSE,TRUE ) ) ); TYPE Logic_UX01Z_Table IS ARRAY (std_ulogic) OF UX01Z; ---------------------------------------------------------- -- table name : cvt_to_x01z -- parameters : std_ulogic -- some logic value -- returns : UX01Z -- state value of logic value -- purpose : to convert state-strength to state only ---------------------------------------------------------- CONSTANT cvt_to_ux01z : Logic_UX01Z_Table := ('U','X','0','1','Z','X','0','1','X' ); TYPE LogicCvtTableType IS ARRAY (std_ulogic) OF CHARACTER; CONSTANT LogicCvtTable : LogicCvtTableType := ( 'U', 'X', '0', '1', 'Z', 'W', 'L', 'H', '-'); -------------------------------------------------------------------- -- LOCAL Utilities -------------------------------------------------------------------- -- ------------------------------------------------------------------------ -- FUNCTION NAME : MINIMUM -- -- PARAMETERS : in1, in2 - integer, time -- -- DESCRIPTION : return smaller of in1 and in2 -- ------------------------------------------------------------------------ FUNCTION Minimum ( CONSTANT in1, in2 : INTEGER ) RETURN INTEGER IS BEGIN IF (in1 < in2) THEN RETURN in1; END IF; RETURN in2; END; -- ------------------------------------------------------------------------ FUNCTION Minimum ( CONSTANT t1,t2 : IN TIME ) RETURN TIME IS BEGIN IF ( t1 < t2 ) THEN RETURN (t1); ELSE RETURN (t2); END IF; END Minimum; -- ------------------------------------------------------------------------ -- FUNCTION NAME : MAXIMUM -- -- PARAMETERS : in1, in2 - integer, time -- -- DESCRIPTION : return larger of in1 and in2 -- ------------------------------------------------------------------------ FUNCTION Maximum ( CONSTANT in1, in2 : INTEGER ) RETURN INTEGER IS BEGIN IF (in1 > in2) THEN RETURN in1; END IF; RETURN in2; END; ----------------------------------------------------------------------- FUNCTION Maximum ( CONSTANT t1,t2 : IN TIME ) RETURN TIME IS BEGIN IF ( t1 > t2 ) THEN RETURN (t1); ELSE RETURN (t2); END IF; END Maximum; ----------------------------------------------------------------------- FUNCTION GlitchMinTime ( CONSTANT Time1, Time2 : IN TIME ) RETURN TIME IS BEGIN IF ( Time1 >= NOW ) THEN IF ( Time2 >= NOW ) THEN RETURN Minimum ( Time1, Time2); ELSE RETURN Time1; END IF; ELSE IF ( Time2 >= NOW ) THEN RETURN Time2; ELSE RETURN 0 ns; END IF; END IF; END; -------------------------------------------------------------------- -- Error Message Types and Tables -------------------------------------------------------------------- TYPE VitalErrorType IS ( ErrNegDel, ErrInpSym, ErrOutSym, ErrStaSym, ErrVctLng, ErrTabWidSml, ErrTabWidLrg, ErrTabResSml, ErrTabResLrg ); TYPE VitalErrorSeverityType IS ARRAY (VitalErrorType) OF SEVERITY_LEVEL; CONSTANT VitalErrorSeverity : VitalErrorSeverityType := ( ErrNegDel => WARNING, ErrInpSym => ERROR, ErrOutSym => ERROR, ErrStaSym => ERROR, ErrVctLng => ERROR, ErrTabWidSml => ERROR, ErrTabWidLrg => WARNING, ErrTabResSml => WARNING, ErrTabResLrg => WARNING ); CONSTANT MsgNegDel : STRING := "Negative delay. New output value not scheduled. Output signal is: "; CONSTANT MsgInpSym : STRING := "Illegal symbol in the input portion of a Truth/State table."; CONSTANT MsgOutSym : STRING := "Illegal symbol in the output portion of a Truth/State table."; CONSTANT MsgStaSym : STRING := "Illegal symbol in the state portion of a State table."; CONSTANT MsgVctLng : STRING := "Vector (array) lengths not equal. "; CONSTANT MsgTabWidSml : STRING := "Width of the Truth/State table is too small."; CONSTANT MsgTabWidLrg : STRING := "Width of Truth/State table is too large. Extra elements are ignored."; CONSTANT MsgTabResSml : STRING := "Result of Truth/State table has too many elements."; CONSTANT MsgTabResLrg : STRING := "Result of Truth/State table has too few elements."; CONSTANT MsgUnknown : STRING := "Unknown error message."; -------------------------------------------------------------------- -- LOCAL Utilities -------------------------------------------------------------------- FUNCTION VitalMessage ( CONSTANT ErrorId : IN VitalErrorType ) RETURN STRING IS BEGIN CASE ErrorId IS WHEN ErrNegDel => RETURN MsgNegDel; WHEN ErrInpSym => RETURN MsgInpSym; WHEN ErrOutSym => RETURN MsgOutSym; WHEN ErrStaSym => RETURN MsgStaSym; WHEN ErrVctLng => RETURN MsgVctLng; WHEN ErrTabWidSml => RETURN MsgTabWidSml; WHEN ErrTabWidLrg => RETURN MsgTabWidLrg; WHEN ErrTabResSml => RETURN MsgTabResSml; WHEN ErrTabResLrg => RETURN MsgTabResLrg; WHEN OTHERS => RETURN MsgUnknown; END CASE; END; PROCEDURE VitalError ( CONSTANT Routine : IN STRING; CONSTANT ErrorId : IN VitalErrorType ) IS BEGIN ASSERT FALSE REPORT Routine & ": " & VitalMessage(ErrorId) SEVERITY VitalErrorSeverity(ErrorId); END; PROCEDURE VitalError ( CONSTANT Routine : IN STRING; CONSTANT ErrorId : IN VitalErrorType; CONSTANT Info : IN STRING ) IS BEGIN ASSERT FALSE REPORT Routine & ": " & VitalMessage(ErrorId) & Info SEVERITY VitalErrorSeverity(ErrorId); END; PROCEDURE VitalError ( CONSTANT Routine : IN STRING; CONSTANT ErrorId : IN VitalErrorType; CONSTANT Info : IN CHARACTER ) IS BEGIN ASSERT FALSE REPORT Routine & ": " & VitalMessage(ErrorId) & Info SEVERITY VitalErrorSeverity(ErrorId); END; --------------------------------------------------------------------------- PROCEDURE ReportGlitch ( CONSTANT GlitchRoutine : IN STRING; CONSTANT OutSignalName : IN STRING; CONSTANT PreemptedTime : IN TIME; CONSTANT PreemptedValue : IN std_ulogic; CONSTANT NewTime : IN TIME; CONSTANT NewValue : IN std_ulogic; CONSTANT Index : IN INTEGER := 0; CONSTANT IsArraySignal : IN BOOLEAN := FALSE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ) IS VARIABLE StrPtr1, StrPtr2, StrPtr3, StrPtr4, StrPtr5 : LINE; BEGIN Write (StrPtr1, PreemptedTime ); Write (StrPtr2, NewTime); Write (StrPtr3, LogicCvtTable(PreemptedValue)); Write (StrPtr4, LogicCvtTable(NewValue)); IF IsArraySignal THEN Write (StrPtr5, STRING'( "(" ) ); Write (StrPtr5, Index); Write (StrPtr5, STRING'( ")" ) ); ELSE Write (StrPtr5, STRING'( " " ) ); END IF; -- Issue Report only if Preemted value has not been -- removed from event queue ASSERT PreemptedTime > NewTime REPORT GlitchRoutine & ": GLITCH Detected on port " & OutSignalName & StrPtr5.ALL & "; Preempted Future Value := " & StrPtr3.ALL & " @ " & StrPtr1.ALL & "; Newly Scheduled Value := " & StrPtr4.ALL & " @ " & StrPtr2.ALL & ";" SEVERITY MsgSeverity; DEALLOCATE(StrPtr1); DEALLOCATE(StrPtr2); DEALLOCATE(StrPtr3); DEALLOCATE(StrPtr4); DEALLOCATE(StrPtr5); RETURN; END ReportGlitch; --------------------------------------------------------------------------- -- Procedure : VitalGlitchOnEvent -- : -- Parameters : OutSignal ........ signal being driven -- : OutSignalName..... name of the driven signal -- : GlitchData........ internal data required by the procedure -- : NewValue.......... new value being assigned -- : NewDelay.......... Delay accompanying the assignment -- : (Note: for vectors, this is an array) -- : GlitchMode........ Glitch generation mode -- : MessagePlusX, MessageOnly, -- : XOnly, NoGlitch ) -- : GlitchDelay....... if <= 0 ns , then there will be no Glitch -- : if > NewDelay, then there is no Glitch, -- : otherwise, this is the time when a FORCED -- : generation of a glitch will occur. ---------------------------------------------------------------------------- PROCEDURE VitalGlitchOnEvent ( SIGNAL OutSignal : OUT std_logic; CONSTANT OutSignalName : IN STRING; VARIABLE GlitchData : INOUT GlitchDataType; CONSTANT NewValue : IN std_logic; CONSTANT NewDelay : IN TIME := 0 ns; CONSTANT GlitchMode : IN VitalGlitchModeType := MessagePlusX; CONSTANT GlitchDelay : IN TIME := -1 ns; -- IR#223 CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ) IS -- ------------------------------------------------------------------------ VARIABLE NoGlitchDet : BOOLEAN := FALSE; VARIABLE OldGlitch : BOOLEAN := FALSE; VARIABLE Dly : TIME := NewDelay; BEGIN -- If nothing to schedule, just return IF NewDelay < 0 ns THEN IF (NewValue /= GlitchData.SchedValue) THEN VitalError ( "VitalGlitchOnEvent", ErrNegDel, OutSignalName ); END IF; ELSE -- If nothing currently scheduled IF GlitchData.SchedTime <= NOW THEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -