📄 idt71124.vhd
字号:
WENegIn : IN std_ulogic := 'U'; CENegIn : IN std_ulogic := 'U' ); PORT MAP ( DataOut(0) => D0, DataOut(1) => D1, DataOut(2) => D2, DataOut(3) => D3, DataOut(4) => D4, DataOut(5) => D5, DataOut(6) => D6, DataOut(7) => D7, DataIn(0) => D0_ipd, DataIn(1) => D1_ipd, DataIn(2) => D2_ipd, DataIn(3) => D3_ipd, DataIn(4) => D4_ipd, DataIn(5) => D5_ipd, DataIn(6) => D6_ipd, DataIn(7) => D7_ipd, AddressIn(0) => A0_ipd, AddressIn(1) => A1_ipd, AddressIn(2) => A2_ipd, AddressIn(3) => A3_ipd, AddressIn(4) => A4_ipd, AddressIn(5) => A5_ipd, AddressIn(6) => A6_ipd, AddressIn(7) => A7_ipd, AddressIn(8) => A8_ipd, AddressIn(9) => A9_ipd, AddressIn(10) => A10_ipd, AddressIn(11) => A11_ipd, AddressIn(12) => A12_ipd, AddressIn(13) => A13_ipd, AddressIn(14) => A14_ipd, AddressIn(15) => A15_ipd, AddressIn(16) => A16_ipd, OENegIn => OENeg_ipd, WENegIn => WENeg_ipd, CENegIn => CENeg_ipd ); SIGNAL D_zd : std_logic_vector(HiDbit DOWNTO 0); BEGIN ------------------------------------------------------------------------ -- Behavior Process ------------------------------------------------------------------------ Behavior : PROCESS (OENegIn, WENegIn, CENegIn, AddressIn, DataIn) -- Timing Check Variables VARIABLE Tviol_D0_WENeg: X01 := '0'; VARIABLE TD_D0_WENeg : VitalTimingDataType; VARIABLE Tviol_D0_CENeg: X01 := '0'; VARIABLE TD_D0_CENeg : VitalTimingDataType; VARIABLE Pviol_WENeg : X01 := '0'; VARIABLE PD_WENeg : VitalPeriodDataType := VitalPeriodDataInit; -- Memory array declaration TYPE MemStore IS ARRAY (0 to TotalLOC) OF INTEGER RANGE -2 TO MaxData; -- Functionality Results Variables VARIABLE Violation : X01 := '0'; VARIABLE DataDrive : std_logic_vector(HiDbit DOWNTO 0) := (OTHERS => 'X'); VARIABLE DataTemp : INTEGER RANGE -2 TO MaxData := -2; VARIABLE Location : NATURAL RANGE 0 TO TotalLOC := 0; VARIABLE MemData : MemStore; -- No Weak Values Variables VARIABLE OENeg_nwv : UX01 := 'U'; VARIABLE WENeg_nwv : UX01 := 'U'; VARIABLE CENeg_nwv : UX01 := 'U'; BEGIN OENeg_nwv := To_UX01 (s => OENegIn); WENeg_nwv := To_UX01 (s => WENegIn); CENeg_nwv := To_UX01 (s => CENegIn); -------------------------------------------------------------------- -- Timing Check Section -------------------------------------------------------------------- IF (TimingChecksOn) THEN VitalSetupHoldCheck ( TestSignal => DataIn, TestSignalName => "Data", RefSignal => WENegIn, RefSignalName => "WENeg", SetupHigh => tsetup_D0_WENeg, SetupLow => tsetup_D0_WENeg, HoldHigh => thold_D0_WENeg, HoldLow => thold_D0_WENeg, CheckEnabled => (CENeg_nwv ='0' and OENeg_nwv ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_D0_WENeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D0_WENeg ); VitalSetupHoldCheck ( TestSignal => DataIn, TestSignalName => "Data", RefSignal => CENegIn, RefSignalName => "CENeg", SetupHigh => tsetup_D0_CENeg, SetupLow => tsetup_D0_CENeg, HoldHigh => thold_D0_CENeg, HoldLow => thold_D0_CENeg, CheckEnabled => (WENeg_nwv ='0' and OENeg_nwv ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_D0_CENeg, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D0_CENeg ); VitalPeriodPulseCheck ( TestSignal => WENegIn, TestSignalName => "WENeg", PulseWidthLow => tpw_WENeg_negedge, PeriodData => PD_WENeg, XOn => XOn, MsgOn => MsgOn, Violation => Pviol_WENeg, HeaderMsg => InstancePath & PartID, CheckEnabled => TRUE ); Violation := Pviol_WENeg OR Tviol_D0_WENeg OR Tviol_D0_CENeg; ASSERT Violation = '0' REPORT InstancePath & partID & ": simulation may be" & " inaccurate due to timing violations" SEVERITY SeverityMode; END IF; -- Timing Check Section -------------------------------------------------------------------- -- Functional Section -------------------------------------------------------------------- DataDrive := (OTHERS => 'Z'); IF (CENeg_nwv = '0') THEN IF (OENeg_nwv = '0' OR WENeg_nwv = '0') THEN Location := To_Nat(AddressIn); IF (OENeg_nwv = '0' AND WENeg_nwv = '1') THEN DataTemp := MemData(Location); IF DataTemp >= 0 THEN DataDrive := To_slv(DataTemp, DataWidth); ELSIF DataTemp = -2 THEN DataDrive := (OTHERS => 'U'); ELSE DataDrive := (OTHERS => 'X'); END IF; ELSE IF Violation = '0' THEN DataTemp := To_Nat(DataIn); ELSE DataTemp := -1; END IF; MemData(Location) := DataTemp; END IF; END IF; END IF; -------------------------------------------------------------------- -- Output Section -------------------------------------------------------------------- D_zd <= DataDrive; END PROCESS; ------------------------------------------------------------------------ -- Path Delay Processes generated as a function of data width ------------------------------------------------------------------------ DataOut_Width : FOR i IN HiDbit DOWNTO 0 GENERATE DataOut_Delay : PROCESS (D_zd(i)) VARIABLE D_GlitchData:VitalGlitchDataArrayType(HiDbit Downto 0); BEGIN VitalPathDelay01Z ( OutSignal => DataOut(i), OutSignalName => "Data", OutTemp => D_zd(i), Mode => OnEvent, GlitchData => D_GlitchData(i), Paths => ( 0 => (InputChangeTime => OENeg_ipd'LAST_EVENT, PathDelay => tpd_OENeg_D0, PathCondition => TRUE), 1 => (InputChangeTime => CENeg_ipd'LAST_EVENT, PathDelay => tpd_CENeg_D0, PathCondition => TRUE), 2 => (InputChangeTime => AddressIn'LAST_EVENT, PathDelay => VitalExtendToFillDelay(tpd_A0_D0), PathCondition => TRUE) ) ); END PROCESS; END GENERATE; END BLOCK;END vhdl_behavioral;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -