📄 ecp2_mem.vhd
字号:
------------------------ VitalPathDelay01 ( OutSignal => do0, OutSignalName => "do0", OutTemp => do0_zd, Paths => (0 => (rad0_ipd'last_event, tpd_rad0_do0, TRUE), 1 => (rad1_ipd'last_event, tpd_rad1_do0, TRUE), 2 => (rad2_ipd'last_event, tpd_rad2_do0, TRUE), 3 => (rad3_ipd'last_event, tpd_rad3_do0, TRUE)), GlitchData => do0_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => do1, OutSignalName => "do1", OutTemp => do1_zd, Paths => (0 => (rad0_ipd'last_event, tpd_rad0_do1, TRUE), 1 => (rad1_ipd'last_event, tpd_rad1_do1, TRUE), 2 => (rad2_ipd'last_event, tpd_rad2_do1, TRUE), 3 => (rad3_ipd'last_event, tpd_rad3_do1, TRUE)), GlitchData => do1_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => do2, OutSignalName => "do2", OutTemp => do2_zd, Paths => (0 => (rad0_ipd'last_event, tpd_rad0_do2, TRUE), 1 => (rad1_ipd'last_event, tpd_rad1_do2, TRUE), 2 => (rad2_ipd'last_event, tpd_rad2_do2, TRUE), 3 => (rad3_ipd'last_event, tpd_rad3_do2, TRUE)), GlitchData => do2_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => do3, OutSignalName => "do3", OutTemp => do3_zd, Paths => (0 => (rad0_ipd'last_event, tpd_rad0_do3, TRUE), 1 => (rad1_ipd'last_event, tpd_rad1_do3, TRUE), 2 => (rad2_ipd'last_event, tpd_rad2_do3, TRUE), 3 => (rad3_ipd'last_event, tpd_rad3_do3, TRUE)), GlitchData => do3_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); END PROCESS;END v;------- cell spr16x4a -------LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;USE ieee.vital_timing.all;USE ieee.vital_primitives.all;USE work.mem1.all;-- entity declaration --ENTITY spr16x4a IS GENERIC ( -- miscellaneous vital GENERICs TimingChecksOn : boolean := TRUE; XOn : boolean := FALSE; MsgOn : boolean := TRUE; InstancePath : string := "spr16x4a"; -- input SIGNAL delays tipd_ad0 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_ad1 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_ad2 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_ad3 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_di0 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_di1 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_di2 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_di3 : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_wre : VitalDelayType01 := (0.0 ns, 0.0 ns); tipd_ck : VitalDelayType01 := (0.0 ns, 0.0 ns); -- setup and hold constraints tsetup_ad0_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_ad1_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_ad2_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_ad3_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_wre_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_di0_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_di1_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_di2_ck_noedge_posedge : VitalDelayType := 0.0 ns; tsetup_di3_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_ad0_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_ad1_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_ad2_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_ad3_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_wre_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_di0_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_di1_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_di2_ck_noedge_posedge : VitalDelayType := 0.0 ns; thold_di3_ck_noedge_posedge : VitalDelayType := 0.0 ns; -- pulse width constraints tperiod_wre : VitalDelayType := 0.001 ns; tpw_wre_posedge : VitalDelayType := 0.001 ns; tpw_wre_negedge : VitalDelayType := 0.001 ns; tperiod_ck : VitalDelayType := 0.001 ns; tpw_ck_posedge : VitalDelayType := 0.001 ns; tpw_ck_negedge : VitalDelayType := 0.001 ns; -- propagation delays tpd_ad0_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad1_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad2_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad3_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad0_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad1_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad2_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad3_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad0_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad1_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad2_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad3_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad0_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad1_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad2_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ad3_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns)); port (di0 : IN std_logic; di1 : IN std_logic; di2 : IN std_logic; di3 : IN std_logic; ck : IN std_logic; wre : IN std_logic; ad0 : IN std_logic; ad1 : IN std_logic; ad2 : IN std_logic; ad3 : IN std_logic; do0 : OUT std_logic; do1 : OUT std_logic; do2 : OUT std_logic; do3 : OUT std_logic); ATTRIBUTE Vital_Level0 OF spr16x4a : ENTITY IS TRUE;END spr16x4a;-- architecture body --ARCHITECTURE v OF spr16x4a IS ATTRIBUTE Vital_Level0 OF v : ARCHITECTURE IS TRUE; SIGNAL di0_ipd : std_logic := 'X'; SIGNAL di1_ipd : std_logic := 'X'; SIGNAL di2_ipd : std_logic := 'X'; SIGNAL di3_ipd : std_logic := 'X'; SIGNAL ad0_ipd : std_logic := 'X'; SIGNAL ad1_ipd : std_logic := 'X'; SIGNAL ad2_ipd : std_logic := 'X'; SIGNAL ad3_ipd : std_logic := 'X'; SIGNAL wre_ipd : std_logic := 'X'; SIGNAL ck_ipd : std_logic := 'X';BEGIN ----------------------- -- input path delays ----------------------- WireDelay : BLOCK BEGIN VitalWireDelay(di0_ipd, di0, tipd_di0); VitalWireDelay(di1_ipd, di1, tipd_di1); VitalWireDelay(di2_ipd, di2, tipd_di2); VitalWireDelay(di3_ipd, di3, tipd_di3); VitalWireDelay(ad0_ipd, ad0, tipd_ad0); VitalWireDelay(ad1_ipd, ad1, tipd_ad1); VitalWireDelay(ad2_ipd, ad2, tipd_ad2); VitalWireDelay(ad3_ipd, ad3, tipd_ad3); VitalWireDelay(wre_ipd, wre, tipd_wre); VitalWireDelay(ck_ipd, ck, tipd_ck); END BLOCK; ----------------------- -- behavior section ----------------------- VitalBehavior : PROCESS (ck_ipd, wre_ipd, ad0_ipd, ad1_ipd, ad2_ipd, ad3_ipd, di0_ipd, di1_ipd, di2_ipd, di3_ipd) VARIABLE memory : mem_type_4 ((2**4)-1 downto 0); VARIABLE radr_reg, wadr_reg : std_logic_vector(3 downto 0) := "0000"; VARIABLE din_reg : std_logic_vector(3 downto 0) := "0000"; VARIABLE wre_reg : std_logic := '0'; VARIABLE rindex, windex : integer := 0; VARIABLE set_reset : std_logic := '1'; -- timing check results VARIABLE tviol_di0 : x01 := '0'; VARIABLE tviol_di1 : x01 := '0'; VARIABLE tviol_di2 : x01 := '0'; VARIABLE tviol_di3 : x01 := '0'; VARIABLE tviol_ad0 : x01 := '0'; VARIABLE tviol_ad1 : x01 := '0'; VARIABLE tviol_ad2 : x01 := '0'; VARIABLE tviol_ad3 : x01 := '0'; VARIABLE tviol_wre : x01 := '0'; VARIABLE tsviol_wre : x01 := '0'; VARIABLE tviol_ck : x01 := '0'; VARIABLE PeriodCheckInfo_wre : VitalPeriodDataType; VARIABLE PeriodCheckInfo_ck : VitalPeriodDataType; VARIABLE ad0_ck_TimingDatash : VitalTimingDataType; VARIABLE ad1_ck_TimingDatash : VitalTimingDataType; VARIABLE ad2_ck_TimingDatash : VitalTimingDataType; VARIABLE ad3_ck_TimingDatash : VitalTimingDataType; VARIABLE wre_ck_TimingDatash : VitalTimingDataType; VARIABLE di0_ck_TimingDatash : VitalTimingDataType; VARIABLE di1_ck_TimingDatash : VitalTimingDataType; VARIABLE di2_ck_TimingDatash : VitalTimingDataType; VARIABLE di3_ck_TimingDatash : VitalTimingDataType; -- functionality results VARIABLE violation : x01 := '0'; VARIABLE results : std_logic_vector (3 downto 0) := (others => 'X'); ALIAS do0_zd : std_ulogic IS results(0); ALIAS do1_zd : std_ulogic IS results(1); ALIAS do2_zd : std_ulogic IS results(2); ALIAS do3_zd : std_ulogic IS results(3); -- output glitch results VARIABLE do0_GlitchData : VitalGlitchDataType; VARIABLE do1_GlitchData : VitalGlitchDataType; VARIABLE do2_GlitchData : VitalGlitchDataType; VARIABLE do3_GlitchData : VitalGlitchDataType; BEGIN ----------------------- -- timing check section ----------------------- IF (TimingChecksOn) THEN -- setup and hold checks on the write address lines VitalSetupHoldCheck ( TestSignal => ad0_ipd, TestSignalName => "ad0", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_ad0_ck_noedge_posedge, setuplow => tsetup_ad0_ck_noedge_posedge, HoldHigh => thold_ad0_ck_noedge_posedge, HoldLow => thold_ad0_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => ad0_ck_timingdatash, Violation => tviol_ad0, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => ad1_ipd, TestSignalName => "ad1", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_ad1_ck_noedge_posedge, setuplow => tsetup_ad1_ck_noedge_posedge, HoldHigh => thold_ad1_ck_noedge_posedge, HoldLow => thold_ad1_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => ad1_ck_timingdatash, Violation => tviol_ad1, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => ad2_ipd, TestSignalName => "ad2", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_ad2_ck_noedge_posedge, setuplow => tsetup_ad2_ck_noedge_posedge, HoldHigh => thold_ad2_ck_noedge_posedge, HoldLow => thold_ad2_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => ad2_ck_timingdatash, Violation => tviol_ad2, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => ad3_ipd, TestSignalName => "ad3", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_ad3_ck_noedge_posedge, setuplow => tsetup_ad3_ck_noedge_posedge, HoldHigh => thold_ad3_ck_noedge_posedge, HoldLow => thold_ad3_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => ad3_ck_timingdatash, Violation => tviol_ad3, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => wre_ipd, TestSignalName => "wre", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_wre_ck_noedge_posedge, setuplow => tsetup_wre_ck_noedge_posedge, HoldHigh => thold_wre_ck_noedge_posedge, HoldLow => thold_wre_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => wre_ck_timingdatash, Violation => tsviol_wre, MsgSeverity => warning); -- setup and hold checks on data VitalSetupHoldCheck ( TestSignal => di0_ipd, TestSignalName => "di0", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_di0_ck_noedge_posedge, setuplow => tsetup_di0_ck_noedge_posedge, HoldHigh => thold_di0_ck_noedge_posedge, HoldLow => thold_di0_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di0_ck_timingdatash, Violation => tviol_di0, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => di1_ipd, TestSignalName => "di1", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_di1_ck_noedge_posedge, setuplow => tsetup_di1_ck_noedge_posedge, HoldHigh => thold_di1_ck_noedge_posedge, HoldLow => thold_di1_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di1_ck_timingdatash, Violation => tviol_di1, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => di2_ipd, TestSignalName => "di2", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_di2_ck_noedge_posedge, setuplow => tsetup_di2_ck_noedge_posedge, HoldHigh => thold_di2_ck_noedge_posedge, HoldLow => thold_di2_ck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di2_ck_timingdatash, Violation => tviol_di2, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => di3_ipd, TestSignalName => "di3", RefSignal => ck_ipd, RefSignalName => "ck", SetupHigh => tsetup_di3_ck_noedge_posedge, setuplow => tsetup_di3_ck_noedge_pose
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -