📄 mb811643242.vhd
字号:
VitalSetupHoldCheck ( TestSignal => DataIn, TestSignalName => "Data", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => (CKEreg ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_D0_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_D0_CLK ); VitalSetupHoldCheck ( TestSignal => CKEIn, TestSignalName => "CKE", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => true, RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_CKE_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_CKE_CLK ); VitalSetupHoldCheck ( TestSignal => AddressIn, TestSignalName => "Address", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => (CKEreg ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_Address_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_Address_CLK ); VitalSetupHoldCheck ( TestSignal => WENegIn, TestSignalName => "WENeg", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => (CKEreg ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_WENeg_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_WENeg_CLK ); VitalSetupHoldCheck ( TestSignal => RASNegIn, TestSignalName => "RASNeg", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => (CKEreg ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_RASNeg_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_RASNeg_CLK ); VitalSetupHoldCheck ( TestSignal => CSNegIn, TestSignalName => "CSNeg", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => (CKEreg ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_CSNeg_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_CSNeg_CLK ); VitalSetupHoldCheck ( TestSignal => CASNegIn, TestSignalName => "CASNeg", RefSignal => CLKIn, RefSignalName => "CLK", SetupHigh => tsetup_DQ0_CLK, SetupLow => tsetup_DQ0_CLK, HoldHigh => thold_DQ0_CLK, HoldLow => thold_DQ0_CLK, CheckEnabled => (CKEreg ='1'), RefTransition => '/', HeaderMsg => InstancePath & PartID, TimingData => TD_CASNeg_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Tviol_CASNeg_CLK ); VitalPeriodPulseCheck ( TestSignal => CLKIn, TestSignalName => "CLK", Period => tperiod_CLK_posedge, PulseWidthLow => tpw_CLK_negedge, PulseWidthHigh => tpw_CLK_posedge, PeriodData => PD_CLK, XOn => XOn, MsgOn => MsgOn, Violation => Pviol_CLK, HeaderMsg => InstancePath & PartID, CheckEnabled => TRUE ); Violation := Pviol_CLK OR Tviol_BA_CLK OR Tviol_DQM0_CLK OR Tviol_DQM1_CLK OR Tviol_DQM2_CLK OR Tviol_DQM3_CLK OR Tviol_D0_CLK OR Tviol_CKE_CLK OR Tviol_Address_CLK OR Tviol_WENeg_CLK OR Tviol_RASNeg_CLK OR Tviol_CSNeg_CLK OR Tviol_CASNeg_CLK; ASSERT Violation = '0' REPORT InstancePath & partID & ": simulation may be" & " inaccurate due to timing violations" SEVERITY SeverityMode; END IF; -- Timing Check Section -------------------------------------------------------------------- -- Functional Section -------------------------------------------------------------------- IF (rising_edge(CLKIn)) THEN CKEreg <= CKEIn; IF (NOW > Next_Ref AND PoweredUp = true AND Ref_Cnt > 0) THEN Ref_Cnt := Ref_Cnt - 1; Next_Ref := NOW + tdevice_REF; END IF; END IF; IF (rising_edge(CLKIn) AND CKEreg = '1' AND to_X01(CSNegIn) = '0') THEN ASSERT (not(Is_X(DQM0In))) REPORT InstancePath & partID & ": Unusable value for DQM0" SEVERITY SeverityMode; ASSERT (not(Is_X(DQM1In))) REPORT InstancePath & partID & ": Unusable value for DQM1" SEVERITY SeverityMode; ASSERT (not(Is_X(DQM2In))) REPORT InstancePath & partID & ": Unusable value for DQM2" SEVERITY SeverityMode; ASSERT (not(Is_X(DQM3In))) REPORT InstancePath & partID & ": Unusable value for DQM3" SEVERITY SeverityMode; ASSERT (not(Is_X(WENegIn))) REPORT InstancePath & partID & ": Unusable value for WENeg" SEVERITY SeverityMode; ASSERT (not(Is_X(RASNegIn))) REPORT InstancePath & partID & ": Unusable value for RASNeg" SEVERITY SeverityMode; ASSERT (not(Is_X(CASNegIn))) REPORT InstancePath & partID & ": Unusable value for CASNeg" SEVERITY SeverityMode; -- Command Decode IF ((RASNegIn = '1') AND (CASNegIn = '1') AND (WENegIn = '1')) THEN command := nop; ELSIF ((RASNegIn = '0') AND (CASNegIn = '1') AND (WENegIn = '1')) THEN command := act; ELSIF ((RASNegIn = '1') AND (CASNegIn = '0') AND (WENegIn = '1')) THEN command := read; ELSIF ((RASNegIn = '1') AND (CASNegIn = '0') AND (WENegIn = '0')) THEN command := writ; ELSIF ((RASNegIn = '1') AND (CASNegIn = '1') AND (WENegIn = '0')) THEN command := bst; ELSIF ((RASNegIn = '0') AND (CASNegIn = '1') AND (WENegIn = '0')) THEN command := pre; ELSIF ((RASNegIn = '0') AND (CASNegIn = '0') AND (WENegIn = '1')) THEN command := ref; ELSIF ((RASNegIn = '0') AND (CASNegIn = '0') AND (WENegIn = '0')) THEN command := mrs; END IF; -- PowerUp Check IF (NOT(PoweredUp) AND command /= nop) THEN ASSERT false REPORT InstancePath & partID & ": Incorrect power up. Command" & " issued before power up complete." SEVERITY SeverityMode; END IF; -- Bank Decode CASE BAIn IS WHEN "00" => cur_bank := 0; BankString := " Bank-0 "; WHEN "01" => cur_bank := 1; BankString := " Bank-1 "; WHEN "10" => cur_bank := 2; BankString := " Bank-2 "; WHEN "11" => cur_bank := 3; BankString := " Bank-3 "; WHEN others => ASSERT false REPORT InstancePath & partID & ": Could not decode bank" & " selection - results may be incorrect." SEVERITY SeverityMode; END CASE; END IF; -- The Big State Machine IF (rising_edge(CLKIn) AND CKEreg = '1') THEN ASSERT (not(Is_X(CSNegIn))) REPORT InstancePath & partID & ": Unusable value for CSNeg" SEVERITY SeverityMode; IF (CSNegIn = '1') THEN command := nop; END IF; -- DQM pipeline DQM3_reg2 := DQM3_reg1; DQM2_reg2 := DQM2_reg1; DQM1_reg2 := DQM1_reg1; DQM0_reg2 := DQM0_reg1; DQM3_reg1 := DQM3_reg0; DQM2_reg1 := DQM2_reg0; DQM1_reg1 := DQM1_reg0; DQM0_reg1 := DQM0_reg0; DQM3_reg0 := DQM3In; DQM2_reg0 := DQM2In; DQM1_reg0 := DQM1In; DQM0_reg0 := DQM0In; -- by default data drive is Z, might get over written in one -- of the passes below DataDrive(3) := (OTHERS => 'Z'); DataDrive(2) := (OTHERS => 'Z'); DataDrive(1) := (OTHERS => 'Z'); DataDrive(0) := (OTHERS => 'Z'); banks : FOR bank IN 0 TO hi_bank LOOP CASE statebank(bank) IS WHEN pwron => ASSERT (DQM0In = '1' AND DQM1In = '1' AND DQM2In = '1' AND DQM3In = '1') REPORT InstancePath & partID & BankString &": DQMs must be held high" & " during initialization." SEVERITY SeverityMode; IF (PoweredUp = false) THEN ASSERT (command = nop) REPORT InstancePath & partID & BankString &": Only NOPs allowed" & " during power up." SEVERITY SeverityMode; DataDrive(3) := "ZZZZZZZZ"; DataDrive(2) := "ZZZZZZZZ"; DataDrive(1) := "ZZZZZZZZ"; DataDrive(0) := "ZZZZZZZZ"; ELSIF (command = pre) AND ((cur_bank = bank) OR (AddressIn(10) = '1')) THEN statebank(bank) <= precharge, idle AFTER tdevice_TRP; END IF; WHEN precharge =>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -