📄 mt48lc4m32b2.vhd
字号:
SHARED VARIABLE Mem : MemBlock; SHARED VARIABLE DataDrive : std_logic_vector(31 DOWNTO 0); BEGIN PoweredUp <= false, true after tpowerup; --------------------------------------------------------------------------- -- Main Behavior Process --------------------------------------------------------------------------- Behavior : PROCESS (BAIn, DQM0In, DQM1In, DQM2In, DQM3In, DataIn, CLKIn, CKEIn, AddressIn, WENegIn, RASNegIn, CSNegIn, CASNegIn, PoweredUp) -- Timing Check Variables VARIABLE Tviol_BA_CLK : X01 := '0'; VARIABLE TD_BA_CLK : VitalTimingDataType; VARIABLE Tviol_DQM0_CLK : X01 := '0'; VARIABLE TD_DQM0_CLK : VitalTimingDataType; VARIABLE Tviol_DQM1_CLK : X01 := '0'; VARIABLE TD_DQM1_CLK : VitalTimingDataType; VARIABLE Tviol_DQM2_CLK : X01 := '0'; VARIABLE TD_DQM2_CLK : VitalTimingDataType; VARIABLE Tviol_DQM3_CLK : X01 := '0'; VARIABLE TD_DQM3_CLK : VitalTimingDataType; VARIABLE Tviol_D0_CLK : X01 := '0'; VARIABLE TD_D0_CLK : VitalTimingDataType; VARIABLE Tviol_CKE_CLK : X01 := '0'; VARIABLE TD_CKE_CLK : VitalTimingDataType; VARIABLE Tviol_Address_CLK : X01 := '0'; VARIABLE TD_Address_CLK : VitalTimingDataType; VARIABLE Tviol_WENeg_CLK : X01 := '0'; VARIABLE TD_WENeg_CLK : VitalTimingDataType; VARIABLE Tviol_RASNeg_CLK : X01 := '0'; VARIABLE TD_RASNeg_CLK : VitalTimingDataType; VARIABLE Tviol_CSNeg_CLK : X01 := '0'; VARIABLE TD_CSNeg_CLK : VitalTimingDataType; VARIABLE Tviol_CASNeg_CLK : X01 := '0'; VARIABLE TD_CASNeg_CLK : VitalTimingDataType; VARIABLE Pviol0_CLK : X01 := '0'; VARIABLE PD0_CLK : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol1_CLK : X01 := '0'; VARIABLE PD1_CLK : VitalPeriodDataType := VitalPeriodDataInit; VARIABLE Pviol2_CLK : X01 := '0'; VARIABLE PD2_CLK : VitalPeriodDataType := VitalPeriodDataInit; -- Type definition for commands TYPE command_type is ( desl, nop, bst, read, writ, act, pre, mrs, ref ); TYPE Burst_type IS (sequential, interleave); TYPE Write_Burst_type IS (programmed, single); TYPE sequence IS ARRAY (0 to 7) OF NATURAL RANGE 0 to 7; TYPE seqtab IS ARRAY (0 to 7) OF sequence; TYPE MemLoc IS ARRAY (0 to 3) OF std_logic_vector(19 DOWNTO 0); TYPE burst_counter IS ARRAY (0 to 3) OF NATURAL RANGE 0 to 257; TYPE StartAddr_type IS ARRAY (0 to 3) OF NATURAL RANGE 0 TO 7; TYPE BurstInc_type IS ARRAY (0 to 3) OF NATURAL RANGE 0 TO 255; TYPE BaseLoc_type IS ARRAY (0 to 3) OF NATURAL RANGE 0 TO depth; CONSTANT seq0 : sequence := (0 & 1 & 2 & 3 & 4 & 5 & 6 & 7); CONSTANT seq1 : sequence := (1 & 0 & 3 & 2 & 5 & 4 & 7 & 6); CONSTANT seq2 : sequence := (2 & 3 & 0 & 1 & 6 & 7 & 4 & 5); CONSTANT seq3 : sequence := (3 & 2 & 1 & 0 & 7 & 6 & 5 & 4); CONSTANT seq4 : sequence := (4 & 5 & 6 & 7 & 0 & 1 & 2 & 3); CONSTANT seq5 : sequence := (5 & 4 & 7 & 6 & 1 & 0 & 3 & 2); CONSTANT seq6 : sequence := (6 & 7 & 4 & 5 & 2 & 3 & 0 & 1); CONSTANT seq7 : sequence := (7 & 6 & 5 & 4 & 3 & 2 & 1 & 0); CONSTANT intab : seqtab :=(seq0, seq1, seq2, seq3, seq4, seq5, seq6, seq7); FILE mem_file : text IS mem_file_name; VARIABLE file_bank : NATURAL := 0; VARIABLE ind : NATURAL := 0; VARIABLE buf : line; VARIABLE MemAddr : MemLoc; VARIABLE Loc : NATURAL RANGE 0 TO 4*depth := 0; VARIABLE BaseLoc : BaseLoc_type; VARIABLE BurstInc : BurstInc_type; VARIABLE StartAddr : StartAddr_type; VARIABLE BurstLen : NATURAL RANGE 0 TO 256 := 0; VARIABLE Burst_Bits : NATURAL RANGE 0 TO 7 := 0; VARIABLE Burst : Burst_Type; VARIABLE WB : Write_Burst_Type; VARIABLE BurstCnt : burst_counter; VARIABLE command : command_type; VARIABLE written : boolean := false; VARIABLE chip_en : boolean := false; VARIABLE cur_bank : natural range 0 to hi_bank; VARIABLE ModeReg : std_logic_vector(11 DOWNTO 0) := (OTHERS => 'X'); VARIABLE Ref_Cnt : NATURAL RANGE 0 TO 4096 := 0; VARIABLE Next_Ref : TIME; VARIABLE BankString : STRING(8 DOWNTO 1) := " Bank-X "; -- Functionality Results Variables VARIABLE Violation : X01 := '0'; VARIABLE DataDriveOut : std_logic_vector(31 DOWNTO 0) := (OTHERS => 'Z'); SUBTYPE OutWord IS std_logic_vector(31 DOWNTO 0); VARIABLE DataDrive1 : OutWord; VARIABLE DataDrive2 : OutWord; VARIABLE DataDrive3 : OutWord; VARIABLE DQM0_reg0 : UX01; VARIABLE DQM0_reg1 : UX01; VARIABLE DQM0_reg2 : UX01; VARIABLE DQM1_reg0 : UX01; VARIABLE DQM1_reg1 : UX01; VARIABLE DQM1_reg2 : UX01; VARIABLE DQM2_reg0 : UX01; VARIABLE DQM2_reg1 : UX01; VARIABLE DQM2_reg2 : UX01; VARIABLE DQM3_reg0 : UX01; VARIABLE DQM3_reg1 : UX01; VARIABLE DQM3_reg2 : UX01; VARIABLE report_err : BOOLEAN := FALSE; VARIABLE line : NATURAL := 0; PROCEDURE generate_out (Bank : IN NATURAL ) IS BEGIN DataDrive(7 downto 0) := (others => 'U'); IF Mem(Bank)(Loc) > -2 THEN DataDrive(7 downto 0) := (others => 'X'); END IF; IF Mem(Bank)(Loc) > -1 THEN DataDrive(7 downto 0) := to_slv(Mem(Bank)(Loc),8); END IF; DataDrive(15 downto 8) := (others => 'U'); IF Mem(Bank)(Loc+1) > -2 THEN DataDrive(15 downto 8) := (others => 'X'); END IF; IF Mem(Bank)(Loc+1) > -1 THEN DataDrive(15 downto 8) := to_slv(Mem(Bank)(Loc+1),8); END IF; DataDrive(23 downto 16) := (others => 'U'); IF Mem(Bank)(Loc+2) > -2 THEN DataDrive(23 downto 16) := (others => 'X'); END IF; IF Mem(Bank)(Loc+2) > -1 THEN DataDrive(23 downto 16) := to_slv(Mem(Bank)(Loc+2),8); END IF; DataDrive(31 downto 24) := (others => 'U'); IF Mem(Bank)(Loc+3) > -2 THEN DataDrive(31 downto 24) := (others => 'X'); END IF; IF Mem(Bank)(Loc+3) > -1 THEN DataDrive(31 downto 24) := to_slv(Mem(Bank)(Loc+3),8); END IF; END PROCEDURE generate_out; PROCEDURE MemWrite (Bank : IN NATURAL ) IS BEGIN IF (DQM0_nwv = '0') THEN Mem(Bank)(Loc) := -1; IF Violation = '0' THEN Mem(Bank)(Loc) := to_nat(DataIn(7 downto 0)); END IF; END IF; IF (DQM1_nwv = '0') THEN Mem(Bank)(Loc+1) := -1; IF Violation = '0' THEN Mem(Bank)(Loc+1) := to_nat(DataIn(15 downto 8)); END IF; END IF; IF (DQM2_nwv = '0') THEN Mem(Bank)(Loc+2) := -1; IF Violation = '0' THEN Mem(Bank)(Loc+2) := to_nat(DataIn(23 downto 16)); END IF; END IF; IF (DQM3_nwv = '0') THEN Mem(Bank)(Loc+3) := -1; IF Violation = '0' THEN Mem(Bank)(Loc+3) := to_nat(DataIn(31 downto 24)); END IF; END IF; END PROCEDURE MemWrite; PROCEDURE BurstIncProc (Bank : IN NATURAL ) IS BEGIN BurstInc(bank) := 0; IF (Burst_Bits > 0) THEN BurstInc(bank) := to_nat(AddressIn(Burst_Bits-1 downto 0)); END IF; END PROCEDURE BurstIncProc; PROCEDURE NextStateAuto (Bank : IN NATURAL; state : IN mem_state ) IS BEGIN IF (AddressIn(10) = '0') THEN statebank(bank) <= state; ELSIF (AddressIn(10) = '1') THEN IF state = write THEN statebank(bank) <= write_auto_pre; ELSE statebank(bank) <= read_auto_pre; END IF; END IF; END PROCEDURE NextStateAuto; BEGIN -------------------------------------------------------------------- -- Timing Check Section -------------------------------------------------------------------- IF (TimingChecksOn) THEN VitalSetupHoldCheck ( TestSignal => BAIn, TestSignalName => "BA", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => chip_en, RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_BA_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_BA_CLK ); VitalSetupHoldCheck ( TestSignal => DQM0In, TestSignalName => "DQM0", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => chip_en, RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_DQM0_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_DQM0_CLK ); VitalSetupHoldCheck ( TestSignal => DQM1In, TestSignalName => "DQM1", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => chip_en, RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_DQM1_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_DQM1_CLK ); VitalSetupHoldCheck ( TestSignal => DQM2In, TestSignalName => "DQM2", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => chip_en, RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_DQM2_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_DQM2_CLK );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -