📄 orca_mem.vhd
字号:
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; 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; -- 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_ck_do0 : VitalDelayType01 := (0.001 ns, 0.001 ns); tpd_ck_do1 : VitalDelayType01 := (0.001 ns, 0.001 ns)); port (di0 : IN std_logic; di1 : 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); ATTRIBUTE Vital_Level0 OF spr16x2b : ENTITY IS TRUE;END spr16x2b;-- architecture body --ARCHITECTURE v OF spr16x2b IS ATTRIBUTE Vital_Level0 OF v : ARCHITECTURE IS TRUE; SIGNAL di0_ipd : std_logic := 'X'; SIGNAL di1_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(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) VARIABLE memory : mem_type_2 ((2**4)-1 downto 0); VARIABLE radr_reg, wadr_reg : 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 : integer := 0; VARIABLE set_reset : std_logic := '1'; -- timing check results VARIABLE tviol_di0 : x01 := '0'; VARIABLE tviol_di1 : 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; -- functionality results VARIABLE violation : x01 := '0'; VARIABLE results : std_logic_vector (1 downto 0) := (others => 'X'); ALIAS do0_zd : std_ulogic IS results(0); ALIAS do1_zd : std_ulogic IS results(1); -- output glitch results VARIABLE do0_GlitchData : VitalGlitchDataType; VARIABLE do1_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); -- Period and pulse width checks on write and port enables VitalPeriodPulseCheck ( TestSignal => ck_ipd, TestSignalName => "ck", Period => tperiod_ck, PulseWidthHigh => tpw_ck_posedge, PulseWidthLow => tpw_ck_posedge, Perioddata => periodcheckinfo_ck, Violation => tviol_ck, 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_di0 or tviol_ad0 or tviol_ad1 or tviol_ad2 or tviol_ad3 or tviol_wre or tviol_ck or tsviol_wre; IF ((is_x(wre_ipd)) and (set_reset='1')) THEN assert FALSE report "spr16x2b memory hazard write enable unknown!" severity warning; results := (others => 'X'); ELSIF (is_x(ad0_ipd) or is_x(ad1_ipd) or is_x(ad2_ipd) or is_x(ad3_ipd)) THEN assert FALSE report "spr16x2b memory hazard read address unknown!" severity warning; results := (others => 'X'); ELSE -- register the write address, write enables and data but not the -- read address IF ((ck_ipd'event and ck_ipd = '1') and (set_reset= '1')) THEN wre_reg := (wre_ipd); din_reg := (di1_ipd, di0_ipd); wadr_reg := (ad3_ipd, ad2_ipd, ad1_ipd, ad0_ipd); END IF; windex := conv_integer(wadr_reg); radr_reg := (ad3_ipd, ad2_ipd, ad1_ipd, ad0_ipd); rindex := conv_integer(radr_reg); -- at the falling edge of ck, write to memory at address IF (wre_reg = '1') THEN IF (ck_ipd'event and ck_ipd = '1') THEN memory(windex) := din_reg; END IF; END IF; -- asynchronous and synchronous reads IF (violation = '0') THEN results(1 downto 0) := memory(rindex); ELSE results := (others => 'X'); END IF; END IF; ------------------------ -- path delay section ------------------------ VitalPathDelay01 ( OutSignal => do0, OutSignalName => "do0", OutTemp => do0_zd, Paths => (0 => (ck_ipd'last_event, tpd_ck_do0, TRUE)), GlitchData => do0_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); VitalPathDelay01 ( OutSignal => do1, OutSignalName => "do1", OutTemp => do1_zd, Paths => (0 => (ck_ipd'last_event, tpd_ck_do1, TRUE)), GlitchData => do1_glitchdata, Mode => ondetect, XOn => XOn, MsgOn => MsgOn); END PROCESS;END v;-------cell dp8ka------library ieee;use ieee.std_logic_1164.all;use ieee.vital_timing.all;use ieee.vital_primitives.all;use ieee.std_logic_unsigned.all;use work.global.gsrnet;use work.global.purnet;use work.mem3.all;-- entity declaration --ENTITY dp8ka IS GENERIC ( DATA_WIDTH_A : Integer := 18; DATA_WIDTH_B : Integer := 18; REGMODE_A : String := "NOREG"; REGMODE_B : String := "NOREG"; RESETMODE : String := "SYNC"; CSDECODE_A : String := "000"; CSDECODE_B : String := "000"; WRITEMODE_A : String := "NORMAL"; WRITEMODE_B : String := "NORMAL"; GSR : String := "DISABLED"; initval_00 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_01 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_02 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_03 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_04 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_05 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_06 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_07 : String := "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000"; initval_08 : String := "0x0000000000000000000000
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -