📄 orca_mem.vhd
字号:
wad2 : IN std_logic; wad3 : IN std_logic; wdo0 : OUT std_logic; wdo1 : OUT std_logic; rdo0 : OUT std_logic; rdo1 : OUT std_logic); ATTRIBUTE Vital_Level0 OF dpr16x2b : ENTITY IS TRUE;END dpr16x2b;-- architecture body --ARCHITECTURE v OF dpr16x2b IS ATTRIBUTE Vital_Level0 OF v : ARCHITECTURE IS TRUE; SIGNAL di0_ipd : std_logic := 'X'; SIGNAL di1_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(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) VARIABLE memory : mem_type_2 ((2**4)-1 downto 0); VARIABLE radr_reg, wadr_reg, wadr_reg1 : std_logic_vector(3 downto 0) := "0000"; VARIABLE din_reg : std_logic_vector(1 downto 0) := "00"; VARIABLE wre_reg : std_logic := '0'; VARIABLE rindex, windex, windex1 : integer := 0; VARIABLE set_reset : std_logic := '1'; -- timing check results VARIABLE tviol_di0 : x01 := '0'; VARIABLE tviol_di1 : 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; -- functionality results VARIABLE violation : x01 := '0'; VARIABLE results : std_logic_vector (3 downto 0) := (others => 'X'); ALIAS wdo0_zd : std_ulogic IS results(0); ALIAS wdo1_zd : std_ulogic IS results(1); ALIAS rdo0_zd : std_ulogic IS results(2); ALIAS rdo1_zd : std_ulogic IS results(3); -- output glitch results VARIABLE wdo0_GlitchData : VitalGlitchDataType; VARIABLE wdo1_GlitchData : VitalGlitchDataType; VARIABLE rdo0_GlitchData : VitalGlitchDataType; VARIABLE rdo1_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); -- 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 -------------------------- IF (disabled_gsr = 1) THEN-- set_reset := purnet;-- ELSE-- set_reset := purnet AND gsrnet;-- END IF;-- IF (set_reset= '0') THEN-- wre_reg := '0';-- wadr_reg := "0000";-- END IF; Violation := tviol_di0 or tviol_di1 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 assert FALSE report "dpr16x2b memory hazard write enable unknown!" severity warning; results := (others => 'X'); ELSIF (is_x(rad0_ipd) or is_x(rad1_ipd) or is_x(rad2_ipd) or is_x(rad3_ipd)) THEN assert FALSE report "dpr16x2b 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 assert FALSE report "dpr16x2b memory hazard write address unknown!" severity warning; results := (others => 'X'); 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 := (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); wadr_reg1 := (wad3_ipd, wad2_ipd, wad1_ipd, wad0_ipd); windex1 := conv_integer(wadr_reg1); -- at the falling edge of wck, write to memory at address IF (wre_reg = '1') THEN IF (wck_ipd'event and wck_ipd = '1') THEN memory(windex) := din_reg; END IF; END IF; -- asynchronous and synchronous reads IF (violation = '0') THEN results(3 downto 2) := memory(rindex); results(1 downto 0) := memory(windex1); ELSE results := (others => 'X'); END IF; END IF; ------------------------ -- path delay section ------------------------ VitalPathDelay01 ( OutSignal => wdo0, OutSignalName => "wdo0", OutTemp => wdo0_zd, Paths => (0 => (wck_ipd'last_event, tpd_wck_wdo0, TRUE)), GlitchData => wdo0_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => wdo1, OutSignalName => "wdo1", OutTemp => wdo1_zd, Paths => (0 => (wck_ipd'last_event, tpd_wck_wdo1, TRUE)), GlitchData => wdo1_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => rdo0, OutSignalName => "rdo0", OutTemp => rdo0_zd, Paths => (0 => (rad0_ipd'last_event, tpd_rad0_rdo0, TRUE), 1 => (rad1_ipd'last_event, tpd_rad1_rdo0, TRUE), 2 => (rad2_ipd'last_event, tpd_rad2_rdo0, TRUE), 3 => (rad3_ipd'last_event, tpd_rad3_rdo0, TRUE)), GlitchData => rdo0_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => rdo1, OutSignalName => "rdo1", OutTemp => rdo1_zd, Paths => (0 => (rad0_ipd'last_event, tpd_rad0_rdo1, TRUE), 1 => (rad1_ipd'last_event, tpd_rad1_rdo1, TRUE), 2 => (rad2_ipd'last_event, tpd_rad2_rdo1, TRUE), 3 => (rad3_ipd'last_event, tpd_rad3_rdo1, TRUE)), GlitchData => rdo1_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); END PROCESS;END v;------- cell spr16x2b -------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 spr16x2b IS GENERIC ( -- miscellaneous vital GENERICs TimingChecksOn : boolean := TRUE; XOn : boolean := FALSE; MsgOn : boolean := TRUE; InstancePath : string := "spr16x2b"; -- 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_wre : VitalDelayType01 := (0.0 ns, 0.0 ns);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -