📄 ecp2_mem.vhd
字号:
tpw_wre_posedge : VitalDelayType := 0.001 ns; tpw_wre_negedge : VitalDelayType := 0.001 ns; tperiod_wck : VitalDelayType := 0.001 ns; tpw_wck_posedge : VitalDelayType := 0.001 ns; tpw_wck_negedge : VitalDelayType := 0.001 ns; -- propagation delays tpd_rad0_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad1_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad2_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad3_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad0_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad1_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad2_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad3_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad0_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad1_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad2_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad3_do2 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad0_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad1_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad2_do3 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_rad3_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; wck : IN std_logic; wre : IN std_logic; rad0 : IN std_logic; rad1 : IN std_logic; rad2 : IN std_logic; rad3 : IN std_logic; wad0 : IN std_logic; wad1 : IN std_logic; wad2 : IN std_logic; wad3 : IN std_logic; do0 : OUT std_logic; do1 : OUT std_logic; do2 : OUT std_logic; do3 : OUT std_logic); ATTRIBUTE Vital_Level0 OF dpr16x4a : ENTITY IS TRUE;END dpr16x4a;-- architecture body --ARCHITECTURE v OF dpr16x4a 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 rad0_ipd : std_logic := 'X'; SIGNAL rad1_ipd : std_logic := 'X'; SIGNAL rad2_ipd : std_logic := 'X'; SIGNAL rad3_ipd : std_logic := 'X'; SIGNAL wad0_ipd : std_logic := 'X'; SIGNAL wad1_ipd : std_logic := 'X'; SIGNAL wad2_ipd : std_logic := 'X'; SIGNAL wad3_ipd : std_logic := 'X'; SIGNAL wre_ipd : std_logic := 'X'; SIGNAL wck_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(rad0_ipd, rad0, tipd_rad0); VitalWireDelay(rad1_ipd, rad1, tipd_rad1); VitalWireDelay(rad2_ipd, rad2, tipd_rad2); VitalWireDelay(rad3_ipd, rad3, tipd_rad3); VitalWireDelay(wad0_ipd, wad0, tipd_wad0); VitalWireDelay(wad1_ipd, wad1, tipd_wad1); VitalWireDelay(wad2_ipd, wad2, tipd_wad2); VitalWireDelay(wad3_ipd, wad3, tipd_wad3); VitalWireDelay(wre_ipd, wre, tipd_wre); VitalWireDelay(wck_ipd, wck, tipd_wck); END BLOCK; ----------------------- -- behavior section ----------------------- VitalBehavior : PROCESS (wck_ipd, wre_ipd, wad0_ipd, wad1_ipd, wad2_ipd, wad3_ipd, rad0_ipd, rad1_ipd, rad2_ipd, rad3_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_wad0 : x01 := '0'; VARIABLE tviol_wad1 : x01 := '0'; VARIABLE tviol_wad2 : x01 := '0'; VARIABLE tviol_wad3 : x01 := '0'; VARIABLE tviol_wre : x01 := '0'; VARIABLE tsviol_wre : x01 := '0'; VARIABLE tviol_wck : x01 := '0'; VARIABLE PeriodCheckInfo_wre : VitalPeriodDataType; VARIABLE PeriodCheckInfo_wck : VitalPeriodDataType; VARIABLE wad0_wck_TimingDatash : VitalTimingDataType; VARIABLE wad1_wck_TimingDatash : VitalTimingDataType; VARIABLE wad2_wck_TimingDatash : VitalTimingDataType; VARIABLE wad3_wck_TimingDatash : VitalTimingDataType; VARIABLE wre_wck_TimingDatash : VitalTimingDataType; VARIABLE di0_wck_TimingDatash : VitalTimingDataType; VARIABLE di1_wck_TimingDatash : VitalTimingDataType; VARIABLE di2_wck_TimingDatash : VitalTimingDataType; VARIABLE di3_wck_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 => wad0_ipd, TestSignalName => "wad0", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_wad0_wck_noedge_posedge, setuplow => tsetup_wad0_wck_noedge_posedge, HoldHigh => thold_wad0_wck_noedge_posedge, HoldLow => thold_wad0_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => wad0_wck_timingdatash, Violation => tviol_wad0, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => wad1_ipd, TestSignalName => "wad1", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_wad1_wck_noedge_posedge, setuplow => tsetup_wad1_wck_noedge_posedge, HoldHigh => thold_wad1_wck_noedge_posedge, HoldLow => thold_wad1_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => wad1_wck_timingdatash, Violation => tviol_wad1, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => wad2_ipd, TestSignalName => "wad2", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_wad2_wck_noedge_posedge, setuplow => tsetup_wad2_wck_noedge_posedge, HoldHigh => thold_wad2_wck_noedge_posedge, HoldLow => thold_wad2_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => wad2_wck_timingdatash, Violation => tviol_wad2, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => wad3_ipd, TestSignalName => "wad3", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_wad3_wck_noedge_posedge, setuplow => tsetup_wad3_wck_noedge_posedge, HoldHigh => thold_wad3_wck_noedge_posedge, HoldLow => thold_wad3_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => wad3_wck_timingdatash, Violation => tviol_wad3, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => wre_ipd, TestSignalName => "wre", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_wre_wck_noedge_posedge, setuplow => tsetup_wre_wck_noedge_posedge, HoldHigh => thold_wre_wck_noedge_posedge, HoldLow => thold_wre_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => wre_wck_timingdatash, Violation => tsviol_wre, MsgSeverity => warning); -- setup and hold checks on data VitalSetupHoldCheck ( TestSignal => di0_ipd, TestSignalName => "di0", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_di0_wck_noedge_posedge, setuplow => tsetup_di0_wck_noedge_posedge, HoldHigh => thold_di0_wck_noedge_posedge, HoldLow => thold_di0_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di0_wck_timingdatash, Violation => tviol_di0, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => di1_ipd, TestSignalName => "di1", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_di1_wck_noedge_posedge, setuplow => tsetup_di1_wck_noedge_posedge, HoldHigh => thold_di1_wck_noedge_posedge, HoldLow => thold_di1_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di1_wck_timingdatash, Violation => tviol_di1, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => di2_ipd, TestSignalName => "di2", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_di2_wck_noedge_posedge, setuplow => tsetup_di2_wck_noedge_posedge, HoldHigh => thold_di2_wck_noedge_posedge, HoldLow => thold_di2_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di2_wck_timingdatash, Violation => tviol_di2, MsgSeverity => warning); VitalSetupHoldCheck ( TestSignal => di3_ipd, TestSignalName => "di3", RefSignal => wck_ipd, RefSignalName => "wck", SetupHigh => tsetup_di3_wck_noedge_posedge, setuplow => tsetup_di3_wck_noedge_posedge, HoldHigh => thold_di3_wck_noedge_posedge, HoldLow => thold_di3_wck_noedge_posedge, CheckEnabled => (set_reset='1'), RefTransition => '/', MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, TimingData => di3_wck_timingdatash, Violation => tviol_di3, MsgSeverity => warning); -- Period and pulse width checks on write and port enables VitalPeriodPulseCheck ( TestSignal => wck_ipd, TestSignalName => "wck", Period => tperiod_wck, PulseWidthHigh => tpw_wck_posedge, PulseWidthLow => tpw_wck_posedge, Perioddata => periodcheckinfo_wck, Violation => tviol_wck, MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, CheckEnabled => TRUE, MsgSeverity => warning); VitalPeriodPulseCheck ( TestSignal => wre_ipd, TestSignalName => "wre", Period => tperiod_wre, PulseWidthHigh => tpw_wre_posedge, PulseWidthLow => tpw_wre_posedge, Perioddata => periodcheckinfo_wre, Violation => tviol_wre, MsgOn => MsgOn, XOn => XOn, HeaderMsg => InstancePath, CheckEnabled => TRUE, MsgSeverity => warning); END IF; ------------------------ -- functionality section ------------------------ Violation := tviol_di0 or tviol_di1 or tviol_di2 or tviol_di3 or tviol_wad0 or tviol_wad1 or tviol_wad2 or tviol_wad3 or tviol_wre or tviol_wck or tsviol_wre ; IF (is_x(wre_ipd) and (set_reset='1')) THEN if (wck_ipd'event and wck_ipd = '1') then assert FALSE report "dpr16x4a memory hazard write enable unknown!" severity warning; results := (others => 'X'); end if; ELSIF (is_x(rad0_ipd) or is_x(rad1_ipd) or is_x(rad2_ipd) or is_x(rad3_ipd)) THEN-- assert FALSE-- report "dpr16x4a memory hazard read address unknown!"-- severity warning; results := (others => 'X'); ELSIF ((is_x(wad0_ipd) or is_x(wad1_ipd) or is_x(wad2_ipd) or is_x(wad3_ipd)) and (set_reset='1')) THEN if (wck_ipd'event and wck_ipd = '1') then assert FALSE report "dpr16x4a memory hazard write address unknown!" severity warning; results := (others => 'X'); end if; ELSE -- register the write address, write enables and data but not the -- read address IF ((wck_ipd'event and wck_ipd = '1') and (set_reset= '1')) THEN wre_reg := (wre_ipd); din_reg := (di3_ipd, di2_ipd, di1_ipd, di0_ipd); wadr_reg := (wad3_ipd, wad2_ipd, wad1_ipd, wad0_ipd); END IF; windex := conv_integer(wadr_reg); radr_reg := (rad3_ipd, rad2_ipd, rad1_ipd, rad0_ipd); rindex := conv_integer(radr_reg); IF (wre_reg = '1') THEN IF (wck_ipd'event and wck_ipd = '1') THEN memory(windex) := din_reg; END IF; END IF; -- asynchronous reads IF (violation = '0') THEN results(3 downto 0) := memory(rindex); ELSE results := (others => 'X'); END IF; END IF; ------------------------ -- path delay section
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -