-- ---------------------------------------------------------------------------- -- Title : Standard VITAL Memory Package -- : -- Library : Vital_Memory -- : -- Developers : IEEE DASC Timing Working Group (TWG), PAR 1076.4 -- : Ekambaram Balaji, LSI Logic Corporation -- : Jose De Castro, Consultant -- : Prakash Bare, GDA Technologies -- : William Yam, LSI Logic Corporation -- : Dennis Brophy, Model Technology -- : -- Purpose : This packages defines standard types, constants, functions -- : and procedures for use in developing ASIC memory models. -- : -- ---------------------------------------------------------------------------- -- -- ---------------------------------------------------------------------------- -- Modification History : -- ---------------------------------------------------------------------------- -- Ver:|Auth:| Date:| Changes Made: -- 0.1 | eb |071796| First prototye as part of VITAL memory proposal -- 0.2 | jdc |012897| Initial prototyping with proposed MTM scheme -- 0.3 | jdc |090297| Extensive updates for TAG review (functional) -- 0.4 | eb |091597| Changed naming conventions for VitalMemoryTable -- | | | Added interface of VitalMemoryCrossPorts() & -- | | | VitalMemoryViolation(). -- 0.5 | jdc |092997| Completed naming changes thoughout package body. -- | | | Testing with simgle port test model looks ok. -- 0.6 | jdc |121797| Major updates to the packages: -- | | | - Implement VitalMemoryCrossPorts() -- | | | - Use new VitalAddressValueType -- | | | - Use new VitalCrossPortModeType enum -- | | | - Overloading without SamePort args -- | | | - Honor erroneous address values -- | | | - Honor ports disabled with 'Z' -- | | | - Implement implicit read 'M' table symbol -- | | | - Cleanup buses to use (H DOWNTO L) -- | | | - Message control via MsgOn,HeaderMsg,PortName -- | | | - Tested with 1P1RW,2P2RW,4P2R2W,4P4RW cases -- 0.7 | jdc |052698| Bug fixes to the packages: -- | | | - Fix failure with negative Address values -- | | | - Added debug messages for VMT table search -- | | | - Remove 'S' for action column (only 's') -- | | | - Remove 's' for response column (only 'S') -- | | | - Remove 'X' for action and response columns -- 0.8 | jdc |061298| Implemented VitalMemoryViolation() -- | | | - Minimal functionality violation tables -- | | | - Missing: -- | | | - Cannot handle wide violation variables -- | | | - Cannot handle sub-word cases -- | | | Fixed IIC version of MemoryMatch -- | | | Fixed 'M' vs 'm' switched on debug output -- | | | TO BE DONE: -- | | | - Implement 'd' corrupting a single bit -- | | | - Implement 'D' corrupting a single bit -- 0.9 |eb/sc|080498| Added UNDEF value for VitalPortFlagType -- 0.10|eb/sc|080798| Added CORRUPT value for VitalPortFlagType -- 0.11|eb/sc|081798| Added overloaded function interface for -- | | | VitalDeclareMemory -- 0.14| jdc |113198| Merging of memory functionality and version -- | | | 1.4 9/17/98 of timing package from Prakash -- 0.15| jdc |120198| Major development of VMV functionality -- 0.16| jdc |120298| Complete VMV functionlality for initial testing -- | | | - New ViolationTableCorruptMask() procedure -- | | | - New MemoryTableCorruptMask() procedure -- | | | - HandleMemoryAction(): -- | | | - Removed DataOutBus bogus output -- | | | - Replaced DataOutTmp with DataInTmp -- | | | - Added CorruptMask input handling -- | | | - Implemented 'd','D' using CorruptMask -- | | | - CorruptMask on 'd','C','L','D','E' -- | | | - CorruptMask ignored on 'c','l','e' -- | | | - Changed 'l','d','e' to set PortFlag to CORRUPT -- | | | - Changed 'L','D','E' to set PortFlag to CORRUPT -- | | | - Changed 'c','l','d','e' to ignore HighBit, LowBit -- | | | - Changed 'C','L','D','E' to use HighBit, LowBit -- | | | - HandleDataAction(): -- | | | - Added CorruptMask input handling -- | | | - Implemented 'd','D' using CorruptMask -- | | | - CorruptMask on 'd','C','L','D','E' -- | | | - CorruptMask ignored on 'l','e' -- | | | - Changed 'l','d','e' to set PortFlag to CORRUPT -- | | | - Changed 'L','D','E' to set PortFlag to CORRUPT -- | | | - Changed 'l','d','e' to ignore HighBit, LowBit -- | | | - Changed 'L','D','E' to use HighBit, LowBit -- | | | - MemoryTableLookUp(): -- | | | - Added MsgOn table debug output -- | | | - Uses new MemoryTableCorruptMask() -- | | | - ViolationTableLookUp(): -- | | | - Uses new ViolationTableCorruptMask() -- 0.17| jdc |120898| - Added VitalMemoryViolationSymbolType, -- | | | VitalMemoryViolationTableType data -- | | | types but not used yet (need to discuss) -- | | | - Added overload for VitalMemoryViolation() -- | | | which does not have array flags -- | | | - Bug fixes for VMV functionality: -- | | | - ViolationTableLookUp() not handling '-' in -- | | | scalar violation matching -- | | | - VitalMemoryViolation() now normalizes -- | | | VFlagArrayTmp'LEFT as LSB before calling -- | | | ViolationTableLookUp() for proper scanning -- | | | - ViolationTableCorruptMask() had to remove -- | | | normalization of CorruptMaskTmp and -- | | | ViolMaskTmp for proper MSB:LSB corruption -- | | | - HandleMemoryAction(), HandleDataAction() -- | | | - Removed 'D','E' since not being used -- | | | - Use XOR instead of OR for corrupt masks -- | | | - Now 'd' is sensitive to HighBit, LowBit -- | | | - Fixed LowBit overflow in bit writeable case -- | | | - MemoryTableCorruptMask() -- | | | - ViolationTableCorruptMask() -- | | | - VitalMemoryTable() -- | | | - VitalMemoryCrossPorts() -- | | | - Fixed VitalMemoryViolation() failing on -- | | | error AddressValue from earlier VMT() -- | | | - Minor cleanup of code formatting -- 0.18| jdc |032599| - In VitalDeclareMemory() -- | | | - Added BinaryLoadFile formal arg and -- | | | modified LoadMemory() to handle bin -- | | | - Added NOCHANGE to VitalPortFlagType -- | | | - For VitalCrossPortModeType -- | | | - Added CpContention enum -- | | | - In HandleDataAction() -- | | | - Set PortFlag := NOCHANGE for 'S' -- | | | - In HandleMemoryAction() -- | | | - Set PortFlag := NOCHANGE for 's' -- | | | - In VitalMemoryTable() and -- | | | VitalMemoryViolation() -- | | | - Honor PortFlag = NOCHANGE returned -- | | | from HandleMemoryAction() -- | | | - In VitalMemoryCrossPorts() -- | | | - Fixed Address = AddressJ for all -- | | | conditions of DoWrCont & DoCpRead -- | | | - Handle CpContention like WrContOnly -- | | | under CpReadOnly conditions, with -- | | | associated memory message changes -- | | | - Handle PortFlag = NOCHANGE like -- | | | PortFlag = READ for actions -- | | | - Modeling change: -- | | | - Need to init PortFlag every delta -- | | | PortFlag_A := (OTHES => UNDEF); -- | | | - Updated InternalTimingCheck code -- 0.19| jdc |042599| - Fixes for bit-writeable cases -- | | | - Check PortFlag after HandleDataAction -- | | | in VitalMemoryViolation() -- 0.20| jdc |042599| - Merge PortFlag changes from Prakash -- | | | and Willian: -- | | | VitalMemorySchedulePathDelay() -- | | | VitalMemoryExpandPortFlag() -- 0.21| jdc |072199| - Changed VitalCrossPortModeType enums, -- | | | added new CpReadAndReadContention. -- | | | - Fixed VitalMemoryCrossPorts() parameter -- | | | SamePortFlag to INOUT so that it can -- | | | set CORRUPT or READ value. -- | | | - Fixed VitalMemoryTable() where PortFlag -- | | | setting by HandleDataAction() is being -- | | | ignored when HandleMemoryAction() sets -- | | | PortFlagTmp to NOCHANGE. -- | | | - Fixed VitalMemoryViolation() to set -- | | | all bits of PortFlag when violating. -- 0.22| jdc |072399| - Added HIGHZ to PortFlagType. HandleData -- | | | checks whether the previous state is HIGHZ. -- | | | If yes then portFlag should be NOCHANGE -- | | | for VMPD to ignore IORetain corruption. -- | | | The idea is that the first Z should be -- | | | propagated but later ones should be ignored. -- | | | -- 0.23| jdc |100499| - Took code checked in by Dennis 09/28/99 -- | | | - Changed VitalPortFlagType to record of -- | | | new VitalPortStateType to hold current, -- | | | previous values and separate disable. -- | | | Also created VitalDefaultPortFlag const. -- | | | Removed usage of PortFlag NOCHANGE -- | | | - VitalMemoryTable() changes: -- | | | Optimized return when all curr = prev -- | | | AddressValue is now INOUT to optimize -- | | | Transfer PF.MemoryCurrent to MemoryPrevious -- | | | Transfer PF.DataCurrent to DataPrevious -- | | | Reset PF.OutputDisable to FALSE -- | | | Expects PortFlag init in declaration -- | | | No need to init PortFlag every delta -- | | | - VitalMemorySchedulePathDelay() changes: -- | | | Initialize with VitalDefaultPortFlag -- | | | Check PortFlag.OutputDisable -- | | | - HandleMemoryAction() changes: -- | | | Set value of PortFlag.MemoryCurrent -- | | | Never set PortFlag.OutputDisable -- | | | - HandleDataAction() changes: -- | | | Set value of PortFlag.DataCurrent -- | | | Set PortFlag.DataCurrent for HIGHZ -- | | | - VitalMemoryCrossPorts() changes: -- | | | Check/set value of PF.MemoryCurrent -- | | | Check value of PF.OutputDisable -- | | | - VitalMemoryViolation() changes: -- | | | Fixed bug - not reading inout PF value -- | | | Clean up setting of PortFlag -- 0.24| jdc |100899| - Modified update of PF.OutputDisable -- | | | to correctly accomodate 2P1W1R case: -- | | | the read port should not exhibit -- | | | IO retain corrupt when reading -- | | | addr unrelated to addr being written. -- 0.25| jdc |100999| - VitalMemoryViolation() change: -- | | | Fixed bug with RDNWR mode incorrectly -- | | | updating the PF.OutputDisable -- 0.26| jdc |100999| - VitalMemoryCrossPorts() change: -- | | | Fixed bugs with update of PF -- 0.27| jdc |101499| - VitalMemoryCrossPorts() change: -- | | | Added DoRdWrCont message (ErrMcpRdWrCo, -- | | | Memory cross port read/write data only -- | | | contention) -- | | | - VitalMemoryTable() change: -- | | | Set PF.OutputDisable := TRUE for the -- | | | optimized cases. -- 0.28| pb |112399| - Added 8 VMPD procedures for vector -- | | | PathCondition support. Now the total -- | | | number of overloadings for VMPD is 24. -- | | | - Number of overloadings for SetupHold -- | | | procedures increased to 5. Scalar violations -- | | | are not supported anymore. Vector checkEnabled -- | | | support is provided through the new overloading -- 0.29| jdc |120999| - HandleMemoryAction() HandleDataAction() -- | | | Reinstated 'D' and 'E' actions but -- | | | with new PortFlagType -- | | | - Updated file handling syntax, must compile -- | | | with -93 syntax now. -- 0.30| jdc |022300| - Formated for 80 column max width -- ---------------------------------------------------------------------------- LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.Vital_Timing.ALL; USE IEEE.Vital_Primitives.ALL; LIBRARY STD; USE STD.TEXTIO.ALL; PACKAGE Vital_Memory IS -- ---------------------------------------------------------------------------- -- Timing Section -- ---------------------------------------------------------------------------- -- ---------------------------------------------------------------------------- -- Types and constants for Memory timing procedures -- ---------------------------------------------------------------------------- TYPE VitalMemoryArcType IS (ParallelArc, CrossArc, SubwordArc); TYPE OutputRetainBehaviorType IS (BitCorrupt, WordCorrupt); TYPE VitalMemoryMsgFormatType IS (Vector, Scalar, VectorEnum); TYPE X01ArrayT IS ARRAY (NATURAL RANGE <> ) OF X01; TYPE X01ArrayPT IS ACCESS X01ArrayT; TYPE VitalMemoryViolationType IS ACCESS X01ArrayT; CONSTANT DefaultNumBitsPerSubword : INTEGER := -1; -- Data type storing path delay and schedule information for output bits TYPE VitalMemoryScheduleDataType IS RECORD OutputData : std_ulogic; NumBitsPerSubWord : INTEGER; ScheduleTime : TIME; ScheduleValue : std_ulogic; LastOutputValue : std_ulogic; PropDelay : TIME; OutputRetainDelay : TIME; InputAge : TIME; END RECORD; TYPE VitalMemoryTimingDataType IS RECORD NotFirstFlag : BOOLEAN; RefLast : X01; RefTime : TIME; HoldEn : BOOLEAN; TestLast : std_ulogic; TestTime : TIME; SetupEn : BOOLEAN; TestLastA : VitalLogicArrayPT; TestTimeA : VitalTimeArrayPT; RefLastA : X01ArrayPT; RefTimeA : VitalTimeArrayPT; HoldEnA : VitalBoolArrayPT; SetupEnA : VitalBoolArrayPT; END RECORD; TYPE VitalPeriodDataArrayType IS ARRAY (NATURAL RANGE <>) OF VitalPeriodDataType; -- Data type storing path delay and schedule information for output -- vectors TYPE VitalMemoryScheduleDataVectorType IS ARRAY (NATURAL RANGE <> ) OF VitalMemoryScheduleDataType; -- VitalPortFlagType records runtime mode of port sub-word slices -- TYPE VitalPortFlagType IS ( -- UNDEF, -- READ, -- WRITE, -- CORRUPT, -- HIGHZ, -- NOCHANGE -- ); -- VitalPortFlagType records runtime mode of port sub-word slices TYPE VitalPortStateType IS ( UNDEF, READ, WRITE, CORRUPT, HIGHZ ); TYPE VitalPortFlagType IS RECORD MemoryCurrent : VitalPortStateType; MemoryPrevious : VitalPortStateType; DataCurrent : VitalPortStateType; DataPrevious : VitalPortStateType; OutputDisable : BOOLEAN; END RECORD; CONSTANT VitalDefaultPortFlag : VitalPortFlagType := ( MemoryCurrent => READ, MemoryPrevious => UNDEF, DataCurrent => READ, DataPrevious => UNDEF, OutputDisable => FALSE ); -- VitalPortFlagVectorType to be same width i as enables of a port -- or j multiples thereof, where j is the number of cross ports TYPE VitalPortFlagVectorType IS ARRAY (NATURAL RANGE <>) OF VitalPortFlagType; -- ---------------------------------------------------------------------------- -- Functions : VitalMemory path delay procedures -- - VitalMemoryInitPathDelay -- - VitalMemoryAddPathDelay -- - VitalMemorySchedulePathDelay -- -- Description: VitalMemoryInitPathDelay, VitalMemoryAddPathDelay and -- VitalMemorySchedulePathDelay are Level 1 routines used -- for selecting the propagation delay paths based on -- path condition, transition type and delay values and -- schedule a new output value. -- -- Following features are implemented in these procedures: -- o condition dependent path selection -- o Transition dependent delay selection -- o shortest delay path selection from multiple -- candidate paths -- o Scheduling of the computed values on the specified -- signal. -- o output retain behavior if outputRetain flag is set -- o output mapping to alternate strengths to model -- pull-up, pull-down etc. -- -- -- -- Following is information on overloading of the procedures. -- -- VitalMemoryInitPathDelay is overloaded for ScheduleDataArray and -- OutputDataArray -- -- ---------------------------------------------------------------------------- -- ScheduleDataArray OutputDataArray -- ---------------------------------------------------------------------------- -- Scalar Scalar -- Vector Vector -- ---------------------------------------------------------------------------- -- -- -- VitalMemoryAddPathDelay is overloaded for ScheduleDataArray, -- PathDelayArray, InputSignal and delaytype. -- -- ---------------------------------------------------------------------------- -- DelayType InputSignal ScheduleData PathDelay -- Array Array -- ---------------------------------------------------------------------------- -- VitalDelayType Scalar Scalar Scalar -- VitalDelayType Scalar Vector Vector -- VitalDelayType Vector Scalar Vector -- VitalDelayType Vector Vector Vector -- VitalDelayType01 Scalar Scalar Scalar -- VitalDelayType01 Scalar Vector Vector -- VitalDelayType01 Vector Scalar Vector -- VitalDelayType01 Vector Vector Vector -- VitalDelayType01Z Scalar Scalar Scalar -- VitalDelayType01Z Scalar Vector Vector -- VitalDelayType01Z Vector Scalar Vector -- VitalDelayType01Z Vector Vector Vector -- VitalDelayType01XZ Scalar Scalar Scalar -- VitalDelayType01XZ Scalar Vector Vector -- VitalDelayType01XZ Vector Scalar Vector -- VitalDelayType01XZ Vector Vector Vector -- ---------------------------------------------------------------------------- -- -- -- VitalMemorySchedulePathDelay is overloaded for ScheduleDataArray, -- and OutSignal -- -- ---------------------------------------------------------------------------- -- OutSignal ScheduleDataArray -- ---------------------------------------------------------------------------- -- Scalar Scalar -- Vector Vector -- ---------------------------------------------------------------------------- -- -- Procedure Declarations: -- -- -- Function : VitalMemoryInitPathDelay -- -- Arguments: -- -- INOUT Type Description -- -- ScheduleDataArray/ VitalMemoryScheduleDataVectorType/ -- ScheduleData VitalMemoryScheduleDataType -- Internal data variable for -- storing delay and schedule -- information for each output bit -- -- -- IN -- -- OutputDataArray/ STD_LOGIC_VECTOR/Array containing current output -- OutputData STD_ULOGIC value -- -- -- NumBitsPerSubWord INTEGER Number of bits per subword. -- Default value of this argument -- is DefaultNumBitsPerSubword -- which is interpreted as no -- subwords -- -- ---------------------------------------------------------------------------- -- -- -- ScheduleDataArray - Vector -- OutputDataArray - Vector -- PROCEDURE VitalMemoryInitPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; VARIABLE OutputDataArray : IN STD_LOGIC_VECTOR; CONSTANT NumBitsPerSubWord : IN INTEGER := DefaultNumBitsPerSubword ); -- -- ScheduleDataArray - Scalar -- OutputDataArray - Scalar -- PROCEDURE VitalMemoryInitPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; VARIABLE OutputData : IN STD_ULOGIC ); -- ---------------------------------------------------------------------------- -- -- Function : VitalMemoryAddPathDelay -- -- Arguments -- -- INOUT Type Description -- -- ScheduleDataArray/ VitalMemoryScheduleDataVectorType/ -- ScheduleData VitalMemoryScheduleDataType -- Internal data variable for -- storing delay and schedule -- information for each output bit -- -- InputChangeTimeArray/ VitaltimeArrayT/Time -- InputChangeTime Holds the time since the last -- input change -- -- IN -- -- InputSignal STD_LOGIC_VECTOR -- STD_ULOGIC/ Array holding the input value -- -- OutputSignalName STRING The output signal name -- -- PathDelayArray/ VitalDelayArrayType01ZX, -- PathDelay VitalDelayArrayType01Z, -- VitalDelayArrayType01, -- VitalDelayArrayType/ -- VitalDelayType01ZX, -- VitalDelayType01Z, -- VitalDelayType01, -- VitalDelayType Array of delay values -- -- ArcType VitalMemoryArcType -- Indicates the Path type. This -- can be SubwordArc, CrossArc or -- ParallelArc -- -- PathCondition BOOLEAN If True, the transition in -- the corresponding input signal -- is considered while -- caluculating the prop. delay -- else the transition is ignored. -- -- OutputRetainFlag BOOLEAN If specified TRUE,output retain -- (hold) behavior is implemented. -- -- ---------------------------------------------------------------------------- -- -- #1 -- DelayType - VitalDelayType -- Input - Scalar -- Output - Scalar -- Delay - Scalar -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelay : IN VitalDelayType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #2 -- DelayType - VitalDelayType -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #3 -- DelayType - VitalDelayType -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray: IN VitalBoolArrayT ); -- #4 -- DelayType - VitalDelayType -- Input - Vector -- Output - Scalar -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #5 -- DelayType - VitalDelayType -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #6 -- DelayType - VitalDelayType -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray : IN VitalBoolArrayT ); -- #7 -- DelayType - VitalDelayType01 -- Input - Scalar -- Output - Scalar -- Delay - Scalar -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelay : IN VitalDelayType01; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #8 -- DelayType - VitalDelayType01 -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType01; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #9 -- DelayType - VitalDelayType01 -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType01; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray: IN VitalBoolArrayT ); -- #10 -- DelayType - VitalDelayType01 -- Input - Vector -- Output - Scalar -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #11 -- DelayType - VitalDelayType01 -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE ); -- #12 -- DelayType - VitalDelayType01 -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray : IN VitalBoolArrayT ); -- #13 -- DelayType - VitalDelayType01Z -- Input - Scalar -- Output - Scalar -- Delay - Scalar -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelay : IN VitalDelayType01Z; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE ); -- #14 -- DelayType - VitalDelayType01Z -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType01Z; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE ); -- #15 -- DelayType - VitalDelayType01Z -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType01Z; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray: IN VitalBoolArrayT; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE ); -- #16 -- DelayType - VitalDelayType01Z -- Input - Vector -- Output - Scalar -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01Z; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE; CONSTANT OutputRetainBehavior : IN OutputRetainBehaviorType := BitCorrupt ); -- #17 -- DelayType - VitalDelayType01Z -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01Z; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE; CONSTANT OutputRetainBehavior : IN OutputRetainBehaviorType := BitCorrupt ); -- #18 -- DelayType - VitalDelayType01Z -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01Z; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray : IN VitalBoolArrayT; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE; CONSTANT OutputRetainBehavior : IN OutputRetainBehaviorType := BitCorrupt ); -- #19 -- DelayType - VitalDelayType01ZX -- Input - Scalar -- Output - Scalar -- Delay - Scalar -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelay : IN VitalDelayType01ZX; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE ); -- #20 -- DelayType - VitalDelayType01ZX -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType01ZX; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE ); -- #21 -- DelayType - VitalDelayType01ZX -- Input - Scalar -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_ULOGIC; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTime : INOUT Time; CONSTANT PathDelayArray : IN VitalDelayArrayType01ZX; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray: IN VitalBoolArrayT; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE ); -- #22 -- DelayType - VitalDelayType01ZX -- Input - Vector -- Output - Scalar -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01ZX; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE; CONSTANT OutputRetainBehavior : IN OutputRetainBehaviorType := BitCorrupt ); -- #23 -- DelayType - VitalDelayType01ZX -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Scalar PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01ZX; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathCondition : IN BOOLEAN := TRUE; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE; CONSTANT OutputRetainBehavior : IN OutputRetainBehaviorType := BitCorrupt ); -- #24 -- DelayType - VitalDelayType01ZX -- Input - Vector -- Output - Vector -- Delay - Vector -- Condition - Vector PROCEDURE VitalMemoryAddPathDelay ( VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType; SIGNAL InputSignal : IN STD_LOGIC_VECTOR; CONSTANT OutputSignalName : IN STRING := ""; VARIABLE InputChangeTimeArray : INOUT VitalTimeArrayT; CONSTANT PathDelayArray : IN VitalDelayArrayType01ZX; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT PathConditionArray : IN VitalBoolArrayT; CONSTANT OutputRetainFlag : IN BOOLEAN := FALSE; CONSTANT OutputRetainBehavior : IN OutputRetainBehaviorType := BitCorrupt ); -- ---------------------------------------------------------------------------- -- -- Function : VitalMemorySchedulePathDelay -- -- Arguments: -- -- OUT Type Description -- OutSignal STD_LOGIC_VECTOR/ The output signal for -- STD_ULOGIC scheduling -- -- IN -- OutputSignalName STRING The name of the output signal -- -- IN -- PortFlag VitalPortFlagType Port flag variable from -- functional procedures -- -- IN -- OutputMap VitalOutputMapType For VitalPathDelay01Z, the -- output can be mapped to -- alternate strengths to model -- tri-state devices, pull-ups -- and pull-downs. -- -- INOUT -- ScheduleDataArray/ VitalMemoryScheduleDataVectorType/ -- ScheduleData VitalMemoryScheduleDataType -- Internal data variable for -- storing delay and schedule -- information for each -- output bit -- -- ---------------------------------------------------------------------------- -- -- ScheduleDataArray - Vector -- OutputSignal - Vector -- PROCEDURE VitalMemorySchedulePathDelay ( SIGNAL OutSignal : OUT std_logic_vector; CONSTANT OutputSignalName : IN STRING := ""; CONSTANT PortFlag : IN VitalPortFlagType := VitalDefaultPortFlag; CONSTANT OutputMap : IN VitalOutputMapType := VitalDefaultOutputMap; VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType ); -- -- ScheduleDataArray - Vector -- OutputSignal - Vector -- PROCEDURE VitalMemorySchedulePathDelay ( SIGNAL OutSignal : OUT std_logic_vector; CONSTANT OutputSignalName : IN STRING := ""; CONSTANT PortFlag : IN VitalPortFlagVectorType; CONSTANT OutputMap : IN VitalOutputMapType := VitalDefaultOutputMap; VARIABLE ScheduleDataArray : INOUT VitalMemoryScheduleDataVectorType ); -- -- ScheduleDataArray - Scalar -- OutputSignal - Scalar -- PROCEDURE VitalMemorySchedulePathDelay ( SIGNAL OutSignal : OUT std_ulogic; CONSTANT OutputSignalName : IN STRING := ""; CONSTANT PortFlag : IN VitalPortFlagType := VitalDefaultPortFlag; CONSTANT OutputMap : IN VitalOutputMapType := VitalDefaultOutputMap; VARIABLE ScheduleData : INOUT VitalMemoryScheduleDataType ); -- ---------------------------------------------------------------------------- FUNCTION VitalMemoryTimingDataInit RETURN VitalMemoryTimingDataType; -- ---------------------------------------------------------------------------- -- -- Function Name: VitalMemorySetupHoldCheck -- -- Description: The VitalMemorySetupHoldCheck procedure detects a setup or a -- hold violation on the input test signal with respect -- to the corresponding input reference signal. The timing -- constraints are specified through parameters -- representing the high and low values for the setup and -- hold values for the setup and hold times. This -- procedure assumes non-negative values for setup and hold -- timing constraints. -- -- It is assumed that negative timing constraints -- are handled by internally delaying the test or -- reference signals. Negative setup times result in -- a delayed reference signal. Negative hold times -- result in a delayed test signal. Furthermore, the -- delays and constraints associated with these and -- other signals may need to be appropriately -- adjusted so that all constraint intervals overlap -- the delayed reference signals and all constraint -- values (with respect to the delayed signals) are -- non-negative. -- -- This function is overloaded based on the input -- TestSignal and reference signals. Parallel, Subword and -- Cross Arc relationships between test and reference -- signals are supported. -- -- TestSignal XXXXXXXXXXXX____________________________XXXXXXXXXXXXXXXXXXXXXX -- : -- : -->| error region |<-- -- : -- _______________________________ -- RefSignal \______________________________ -- : | | | -- : | -->| |<-- thold -- : -->| tsetup |<-- -- -- Arguments: -- -- IN Type Description -- TestSignal std_logic_vector Value of test signal -- TestSignalName STRING Name of test signal -- TestDelay VitalDelayArrayType Model's internal delay associated -- with TestSignal -- RefSignal std_ulogic Value of reference signal -- std_logic_vector -- RefSignalName STRING Name of reference signal -- RefDelay TIME Model's internal delay associated -- VitalDelayArrayType with RefSignal -- SetupHigh VitalDelayArrayType Absolute minimum time duration -- before the transition of RefSignal -- for which transitions of -- TestSignal are allowed to proceed -- to the "1" state without causing -- a setup violation. -- SetupLow VitalDelayArrayType Absolute minimum time duration -- before the transition of RefSignal -- for which transitions of -- TestSignal are allowed to proceed -- to the "0" state without causing -- a setup violation. -- HoldHigh VitalDelayArrayType Absolute minimum time duration -- after the transition of RefSignal -- for which transitions of -- TestSignal are allowed to -- proceed to the "1" state without -- causing a hold violation. -- HoldLow VitalDelayArrayType Absolute minimum time duration -- after the transition of RefSignal -- for which transitions of -- TestSignal are allowed to -- proceed to the "0" state without -- causing a hold violation. -- CheckEnabled BOOLEAN Check performed if TRUE. -- RefTransition VitalEdgeSymbolType -- Reference edge specified. Events -- on the RefSignal which match the -- edge spec. are used as reference -- edges. -- ArcType VitalMemoryArcType -- NumBitsPerSubWord INTEGER -- HeaderMsg STRING String that will accompany any -- assertion messages produced. -- XOn BOOLEAN If TRUE, Violation output -- parameter is set to "X". -- Otherwise, Violation is always -- set to "0." -- MsgOn BOOLEAN If TRUE, set and hold violation -- message will be generated. -- Otherwise, no messages are -- generated, even upon violations. -- MsgSeverity SEVERITY_LEVEL Severity level for the assertion. -- MsgFormat VitalMemoryMsgFormatType -- Format of the Test/Reference -- signals in violation messages. -- -- INOUT -- TimingData VitalMemoryTimingDataType -- VitalMemorySetupHoldCheck information -- storage area. This is used -- internally to detect reference -- edges and record the time of the -- last edge. -- -- OUT -- Violation X01 This is the violation flag returned. -- X01ArrayT Overloaded for array type. -- -- -- ---------------------------------------------------------------------------- PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01ArrayT; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; 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 VitalDelayType; CONSTANT SetupLow : IN VitalDelayType; CONSTANT HoldHigh : IN VitalDelayType; CONSTANT HoldLow : IN VitalDelayType; CONSTANT CheckEnabled : IN VitalBoolArrayT; 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; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01ArrayT; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; SIGNAL RefSignal : IN std_ulogic; CONSTANT RefSignalName : IN STRING := ""; CONSTANT RefDelay : IN TIME := 0 ns; CONSTANT SetupHigh : IN VitalDelayArrayType; CONSTANT SetupLow : IN VitalDelayArrayType; CONSTANT HoldHigh : IN VitalDelayArrayType; CONSTANT HoldLow : IN VitalDelayArrayType; 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 MsgFormat : IN VitalMemoryMsgFormatType; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01ArrayT; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; SIGNAL RefSignal : IN std_ulogic; CONSTANT RefSignalName : IN STRING := ""; CONSTANT RefDelay : IN TIME := 0 ns; CONSTANT SetupHigh : IN VitalDelayArrayType; CONSTANT SetupLow : IN VitalDelayArrayType; CONSTANT HoldHigh : IN VitalDelayArrayType; CONSTANT HoldLow : IN VitalDelayArrayType; CONSTANT CheckEnabled : IN VitalBoolArrayT; CONSTANT RefTransition : IN VitalEdgeSymbolType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT NumBitsPerSubWord : IN INTEGER := 1; CONSTANT HeaderMsg : IN STRING := " "; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT MsgFormat : IN VitalMemoryMsgFormatType; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01ArrayT; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; SIGNAL RefSignal : IN std_logic_vector; CONSTANT RefSignalName : IN STRING := ""; CONSTANT RefDelay : IN VitalDelayArrayType; CONSTANT SetupHigh : IN VitalDelayArrayType; CONSTANT SetupLow : IN VitalDelayArrayType; CONSTANT HoldHigh : IN VitalDelayArrayType; CONSTANT HoldLow : IN VitalDelayArrayType; CONSTANT CheckEnabled : IN BOOLEAN := TRUE; CONSTANT RefTransition : IN VitalEdgeSymbolType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT NumBitsPerSubWord : IN INTEGER := 1; CONSTANT HeaderMsg : IN STRING := " "; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT MsgFormat : IN VitalMemoryMsgFormatType; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01ArrayT; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; SIGNAL RefSignal : IN std_logic_vector; CONSTANT RefSignalName : IN STRING := ""; CONSTANT RefDelay : IN VitalDelayArrayType; CONSTANT SetupHigh : IN VitalDelayArrayType; CONSTANT SetupLow : IN VitalDelayArrayType; CONSTANT HoldHigh : IN VitalDelayArrayType; CONSTANT HoldLow : IN VitalDelayArrayType; CONSTANT CheckEnabled : IN VitalBoolArrayT; CONSTANT RefTransition : IN VitalEdgeSymbolType; CONSTANT ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT NumBitsPerSubWord : IN INTEGER := 1; CONSTANT HeaderMsg : IN STRING := " "; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT MsgFormat : IN VitalMemoryMsgFormatType; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); --------------- following are not needed -------------------------- PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; SIGNAL RefSignal : IN std_ulogic; CONSTANT RefSignalName : IN STRING := ""; CONSTANT RefDelay : IN TIME := 0 ns; CONSTANT SetupHigh : IN VitalDelayArrayType; CONSTANT SetupLow : IN VitalDelayArrayType; CONSTANT HoldHigh : IN VitalDelayArrayType; CONSTANT HoldLow : IN VitalDelayArrayType; 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 MsgFormat : IN VitalMemoryMsgFormatType; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); PROCEDURE VitalMemorySetupHoldCheck ( VARIABLE Violation : OUT X01; VARIABLE TimingData : INOUT VitalMemoryTimingDataType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; SIGNAL RefSignal : IN std_logic_vector; CONSTANT RefSignalName : IN STRING := ""; CONSTANT RefDelay : IN VitalDelayArrayType; CONSTANT SetupHigh : IN VitalDelayArrayType; CONSTANT SetupLow : IN VitalDelayArrayType; CONSTANT HoldHigh : IN VitalDelayArrayType; CONSTANT HoldLow : IN VitalDelayArrayType; 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 ArcType : IN VitalMemoryArcType := CrossArc; CONSTANT NumBitsPerSubWord : IN INTEGER := 1; CONSTANT MsgFormat : IN VitalMemoryMsgFormatType; CONSTANT EnableSetupOnTest : IN BOOLEAN := TRUE; CONSTANT EnableSetupOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnRef : IN BOOLEAN := TRUE; CONSTANT EnableHoldOnTest : IN BOOLEAN := TRUE ); -- ---------------------------------------------------------------------------- -- -- Function Name: VitalPeriodPulseCheck -- -- Description: VitalPeriodPulseCheck checks for minimum and maximum -- periodicity and pulse width for "1" and "0" values of -- the input test signal. The timing constraint is -- specified through parameters representing the minimal -- period between successive rising and falling edges of -- the input test signal and the minimum pulse widths -- associated with high and low values. -- -- VitalPeriodCheck's accepts rising and falling edges -- from 1 and 0 as well as transitions to and from 'X.' -- -- _______________ __________ -- ____________| |_______| -- -- |<--- pw_hi --->| -- |<-------- period ----->| -- -->| pw_lo |<-- -- -- Arguments: -- IN Type Description -- TestSignal std_logic_vector Value of test signal -- TestSignalName STRING Name of the test signal -- TestDelay VitalDelayArrayType -- Model's internal delay associated -- with TestSignal -- Period VitalDelayArrayType -- Minimum period allowed between -- consecutive rising ('P') or -- falling ('F') transitions. -- PulseWidthHigh VitalDelayArrayType -- Minimum time allowed for a high -- pulse ('1' or 'H') -- PulseWidthLow VitalDelayArrayType -- Minimum time allowed for a low -- pulse ('0' or 'L') -- CheckEnabled BOOLEAN Check performed if TRUE. -- HeaderMsg STRING String that will accompany any -- assertion messages produced. -- XOn BOOLEAN If TRUE, Violation output parameter -- is set to "X". Otherwise, Violation -- is always set to "0." -- MsgOn BOOLEAN If TRUE, period/pulse violation -- message will be generated. -- Otherwise, no messages are generated, -- even though a violation is detected. -- MsgSeverity SEVERITY_LEVEL Severity level for the assertion. -- MsgFormat VitalMemoryMsgFormatType -- Format of the Test/Reference signals -- in violation messages. -- -- INOUT -- PeriodData VitalPeriodDataArrayType -- VitalPeriodPulseCheck information -- storage area. This is used -- internally to detect reference edges -- and record the pulse and period -- times. -- OUT -- Violation X01 This is the violation flag returned. -- X01ArrayT Overloaded for array type. -- -- ---------------------------------------------------------------------------- PROCEDURE VitalMemoryPeriodPulseCheck ( VARIABLE Violation : OUT X01ArrayT; VARIABLE PeriodData : INOUT VitalPeriodDataArrayType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; CONSTANT Period : IN VitalDelayArrayType; CONSTANT PulseWidthHigh : IN VitalDelayArrayType; CONSTANT PulseWidthLow : IN VitalDelayArrayType; CONSTANT CheckEnabled : IN BOOLEAN := TRUE; CONSTANT HeaderMsg : IN STRING := " "; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT MsgFormat : IN VitalMemoryMsgFormatType ); PROCEDURE VitalMemoryPeriodPulseCheck ( VARIABLE Violation : OUT X01; VARIABLE PeriodData : INOUT VitalPeriodDataArrayType; SIGNAL TestSignal : IN std_logic_vector; CONSTANT TestSignalName : IN STRING := ""; CONSTANT TestDelay : IN VitalDelayArrayType; CONSTANT Period : IN VitalDelayArrayType; CONSTANT PulseWidthHigh : IN VitalDelayArrayType; CONSTANT PulseWidthLow : IN VitalDelayArrayType; CONSTANT CheckEnabled : IN BOOLEAN := TRUE; CONSTANT HeaderMsg : IN STRING := " "; CONSTANT XOn : IN BOOLEAN := TRUE; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING; CONSTANT MsgFormat : IN VitalMemoryMsgFormatType ); -- ---------------------------------------------------------------------------- -- Functionality Section -- ---------------------------------------------------------------------------- -- ---------------------------------------------------------------------------- -- All Memory Types and Record definitions. -- ---------------------------------------------------------------------------- TYPE MemoryWordType IS ARRAY (NATURAL RANGE <>) OF UX01; TYPE MemoryWordPtr IS ACCESS MemoryWordType; TYPE MemoryArrayType IS ARRAY (NATURAL RANGE <>) OF MemoryWordPtr; TYPE MemoryArrayPtrType IS ACCESS MemoryArrayType; TYPE VitalMemoryArrayRecType IS RECORD NoOfWords : POSITIVE; NoOfBitsPerWord : POSITIVE; NoOfBitsPerSubWord : POSITIVE; NoOfBitsPerEnable : POSITIVE; MemoryArrayPtr : MemoryArrayPtrType; END RECORD; TYPE VitalMemoryDataType IS ACCESS VitalMemoryArrayRecType; TYPE VitalTimingDataVectorType IS ARRAY (NATURAL RANGE <>) OF VitalTimingDataType; TYPE VitalMemoryViolFlagSizeType IS ARRAY (NATURAL RANGE <>) OF INTEGER; -- ---------------------------------------------------------------------------- -- Symbol Literals used for Memory Table Modeling -- ---------------------------------------------------------------------------- -- Symbol literals from '/' to 'S' are closely related to MemoryTableMatch -- lookup matching and the order cannot be arbitrarily changed. -- The remaining symbol literals are interpreted directly and matchting is -- handled in the MemoryMatch procedure itself. TYPE VitalMemorySymbolType IS ( '/', -- 0 -> 1 '\', -- 1 -> 0 'P', -- Union of '/' and '^' (any edge to 1) 'N', -- Union of '\' and 'v' (any edge to 0) 'r', -- 0 -> X 'f', -- 1 -> X 'p', -- Union of '/' and 'r' (any edge from 0) 'n', -- Union of '\' and 'f' (any edge from 1) 'R', -- Union of '^' and 'p' (any possible rising edge) 'F', -- Union of 'v' and 'n' (any possible falling edge) '^', -- X -> 1 'v', -- X -> 0 'E', -- Union of 'v' and '^' (any edge from X) 'A', -- Union of 'r' and '^' (rising edge to or from 'X') 'D', -- Union of 'f' and 'v' (falling edge to or from 'X') '*', -- Union of 'R' and 'F' (any edge) 'X', -- Unknown level '0', -- low level '1', -- high level '-', -- don't care 'B', -- 0 or 1 'Z', -- High Impedance 'S', -- steady value 'g', -- Good address (no transition) 'u', -- Unknown address (no transition) 'i', -- Invalid address (no transition) 'G', -- Good address (with transition) 'U', -- Unknown address (with transition) 'I', -- Invalid address (with transition) 'w', -- Write data to memory 's', -- Retain previous memory contents 'c', -- Corrupt entire memory with 'X' 'l', -- Corrupt a word in memory with 'X' 'd', -- Corrupt a single bit in memory with 'X' 'e', -- Corrupt a word with 'X' based on data in 'C', -- Corrupt a sub-word entire memory with 'X' 'L', -- Corrupt a sub-word in memory with 'X' -- The following entries are commented since their -- interpretation overlap with existing definitions. -- 'D', -- Corrupt a single bit of a sub-word with 'X' -- 'E', -- Corrupt a sub-word with 'X' based on datain 'M', -- Implicit read data from memory 'm', -- Read data from memory 't' -- Immediate assign/transfer data in ); TYPE VitalMemoryTableType IS ARRAY ( NATURAL RANGE <>, NATURAL RANGE <> ) OF VitalMemorySymbolType; TYPE VitalMemoryViolationSymbolType IS ( 'X', -- Unknown level '0', -- low level '-' -- don't care ); TYPE VitalMemoryViolationTableType IS ARRAY ( NATURAL RANGE <>, NATURAL RANGE <> ) OF VitalMemoryViolationSymbolType; TYPE VitalPortType IS ( UNDEF, READ, WRITE, RDNWR ); TYPE VitalCrossPortModeType IS ( CpRead, -- CpReadOnly, WriteContention, -- WrContOnly, ReadWriteContention, -- CpContention CpReadAndWriteContention, -- WrContAndCpRead, CpReadAndReadContention ); SUBTYPE VitalAddressValueType IS INTEGER; TYPE VitalAddressValueVectorType IS ARRAY (NATURAL RANGE <>) OF VitalAddressValueType; -- ---------------------------------------------------------------------------- -- Procedure: VitalDeclareMemory -- Parameters: NoOfWords - Number of words in the memory -- NoOfBitsPerWord - Number of bits per word in memory -- NoOfBitsPerSubWord - Number of bits per sub word -- MemoryLoadFile - Name of data file to load -- Description: This function is intended to be used to initialize -- memory data declarations, i.e. to be executed duing -- simulation elaboration time. Handles the allocation -- and initialization of memory for the memory data. -- Default NoOfBitsPerSubWord is NoOfBits. -- ---------------------------------------------------------------------------- IMPURE FUNCTION VitalDeclareMemory ( CONSTANT NoOfWords : IN POSITIVE; CONSTANT NoOfBitsPerWord : IN POSITIVE; CONSTANT NoOfBitsPerSubWord : IN POSITIVE; CONSTANT MemoryLoadFile : IN string := ""; CONSTANT BinaryLoadFile : IN BOOLEAN := FALSE ) RETURN VitalMemoryDataType; IMPURE FUNCTION VitalDeclareMemory ( CONSTANT NoOfWords : IN POSITIVE; CONSTANT NoOfBitsPerWord : IN POSITIVE; CONSTANT MemoryLoadFile : IN string := ""; CONSTANT BinaryLoadFile : IN BOOLEAN := FALSE ) RETURN VitalMemoryDataType; -- ---------------------------------------------------------------------------- -- Procedure: VitalMemoryTable -- Parameters: DataOutBus - Output candidate zero delay data bus out -- MemoryData - Pointer to memory data structure -- PrevControls - Previous data in for edge detection -- PrevEnableBus - Previous enables for edge detection -- PrevDataInBus - Previous data bus for edge detection -- PrevAddressBus - Previous address bus for edge detection -- PortFlag - Indicates port operating mode -- PortFlagArray - Vector form of PortFlag for sub-word -- Controls - Agregate of scalar control lines -- EnableBus - Concatenation of vector control lines -- DataInBus - Input value of data bus in -- AddressBus - Input value of address bus in -- AddressValue - Decoded value of the AddressBus -- MemoryTable - Input memory action table -- PortType - The type of port (currently not used) -- PortName - Port name string for messages -- HeaderMsg - Header string for messages -- MsgOn - Control the generation of messages -- MsgSeverity - Control level of message generation -- Description: This procedure implements the majority of the memory -- modeling functionality via lookup of the memory action -- tables and performing the specified actions if matches -- are found, or the default actions otherwise. The -- overloadings are provided for the word and sub-word -- (using the EnableBus and PortFlagArray arguments) addressing -- cases. -- ---------------------------------------------------------------------------- PROCEDURE VitalMemoryTable ( VARIABLE DataOutBus : INOUT std_logic_vector; VARIABLE MemoryData : INOUT VitalMemoryDataType; VARIABLE PrevControls : INOUT std_logic_vector; VARIABLE PrevDataInBus : INOUT std_logic_vector; VARIABLE PrevAddressBus : INOUT std_logic_vector; VARIABLE PortFlag : INOUT VitalPortFlagVectorType; CONSTANT Controls : IN std_logic_vector; CONSTANT DataInBus : IN std_logic_vector; CONSTANT AddressBus : IN std_logic_vector; VARIABLE AddressValue : INOUT VitalAddressValueType; CONSTANT MemoryTable : IN VitalMemoryTableType; CONSTANT PortType : IN VitalPortType := UNDEF; CONSTANT PortName : IN STRING := ""; CONSTANT HeaderMsg : IN STRING := ""; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ); PROCEDURE VitalMemoryTable ( VARIABLE DataOutBus : INOUT std_logic_vector; VARIABLE MemoryData : INOUT VitalMemoryDataType; VARIABLE PrevControls : INOUT std_logic_vector; VARIABLE PrevEnableBus : INOUT std_logic_vector; VARIABLE PrevDataInBus : INOUT std_logic_vector; VARIABLE PrevAddressBus : INOUT std_logic_vector; VARIABLE PortFlagArray : INOUT VitalPortFlagVectorType; CONSTANT Controls : IN std_logic_vector; CONSTANT EnableBus : IN std_logic_vector; CONSTANT DataInBus : IN std_logic_vector; CONSTANT AddressBus : IN std_logic_vector; VARIABLE AddressValue : INOUT VitalAddressValueType; CONSTANT MemoryTable : IN VitalMemoryTableType; CONSTANT PortType : IN VitalPortType := UNDEF; CONSTANT PortName : IN STRING := ""; CONSTANT HeaderMsg : IN STRING := ""; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ); -- ---------------------------------------------------------------------------- -- Procedure: VitalMemoryCrossPorts -- Parameters: DataOutBus - Output candidate zero delay data bus out -- MemoryData - Pointer to memory data structure -- SamePortFlag - Operating mode for same port -- SamePortAddressValue - Decoded AddressBus for same port -- CrossPortFlagArray - Operating modes for cross ports -- CrossPortAddressArray - Decoded AddressBus for cross ports -- CrossPortMode - Write contention and crossport read control -- PortName - Port name string for messages -- HeaderMsg - Header string for messages -- MsgOn - Control the generation of messages -- -- Description: These procedures control the effect of memory operations -- on a given port due to operations on other ports in a -- multi-port memory. -- This includes data write through when reading and writing -- to the same address, as well as write contention when -- there are multiple write to the same address. -- If addresses do not match then data bus is unchanged. -- The DataOutBus can be diabled with 'Z' value. -- ---------------------------------------------------------------------------- PROCEDURE VitalMemoryCrossPorts ( VARIABLE DataOutBus : INOUT std_logic_vector; VARIABLE MemoryData : INOUT VitalMemoryDataType; VARIABLE SamePortFlag : INOUT VitalPortFlagVectorType; CONSTANT SamePortAddressValue : IN VitalAddressValueType; CONSTANT CrossPortFlagArray : IN VitalPortFlagVectorType; CONSTANT CrossPortAddressArray : IN VitalAddressValueVectorType; CONSTANT CrossPortMode : IN VitalCrossPortModeType := CpReadAndWriteContention; CONSTANT PortName : IN STRING := ""; CONSTANT HeaderMsg : IN STRING := ""; CONSTANT MsgOn : IN BOOLEAN := TRUE ) ; PROCEDURE VitalMemoryCrossPorts ( VARIABLE MemoryData : INOUT VitalMemoryDataType; CONSTANT CrossPortFlagArray : IN VitalPortFlagVectorType; CONSTANT CrossPortAddressArray : IN VitalAddressValueVectorType; CONSTANT HeaderMsg : IN STRING := ""; CONSTANT MsgOn : IN BOOLEAN := TRUE ) ; -- ---------------------------------------------------------------------------- -- Procedure: VitalMemoryViolation -- Parameters: DataOutBus - Output zero delay data bus out -- MemoryData - Pointer to memory data structure -- PortFlag - Indicates port operating mode -- DataInBus - Input value of data bus in -- AddressValue - Decoded value of the AddressBus -- ViolationFlags - Aggregate of scalar violation vars -- ViolationFlagsArray - Concatenation of vector violation vars -- ViolationTable - Input memory violation table -- PortType - The type of port (currently not used) -- PortName - Port name string for messages -- HeaderMsg - Header string for messages -- MsgOn - Control the generation of messages -- MsgSeverity - Control level of message generation -- Description: This procedure is intended to implement all actions on the -- memory contents and data out bus as a result of timing viols. -- It uses the memory action table to perform various corruption -- policies specified by the user. -- ---------------------------------------------------------------------------- PROCEDURE VitalMemoryViolation ( VARIABLE DataOutBus : INOUT std_logic_vector; VARIABLE MemoryData : INOUT VitalMemoryDataType; VARIABLE PortFlag : INOUT VitalPortFlagVectorType; CONSTANT DataInBus : IN std_logic_vector; CONSTANT AddressValue : IN VitalAddressValueType; CONSTANT ViolationFlags : IN std_logic_vector; CONSTANT ViolationFlagsArray : IN X01ArrayT; CONSTANT ViolationSizesArray : IN VitalMemoryViolFlagSizeType; CONSTANT ViolationTable : IN VitalMemoryTableType; CONSTANT PortType : IN VitalPortType; CONSTANT PortName : IN STRING := ""; CONSTANT HeaderMsg : IN STRING := ""; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ) ; PROCEDURE VitalMemoryViolation ( VARIABLE DataOutBus : INOUT std_logic_vector; VARIABLE MemoryData : INOUT VitalMemoryDataType; VARIABLE PortFlag : INOUT VitalPortFlagVectorType; CONSTANT DataInBus : IN std_logic_vector; CONSTANT AddressValue : IN VitalAddressValueType; CONSTANT ViolationFlags : IN std_logic_vector; CONSTANT ViolationTable : IN VitalMemoryTableType; CONSTANT PortType : IN VitalPortType; CONSTANT PortName : IN STRING := ""; CONSTANT HeaderMsg : IN STRING := ""; CONSTANT MsgOn : IN BOOLEAN := TRUE; CONSTANT MsgSeverity : IN SEVERITY_LEVEL := WARNING ) ; END Vital_Memory;