📄 mt48lc16m16a2.vhd
字号:
-- Read or Write with Auto Precharge Counter IF Auto_precharge (0) = '1' THEN Count_precharge (0) := Count_precharge (0) + 1; END IF; IF Auto_precharge (1) = '1' THEN Count_precharge (1) := Count_precharge (1) + 1; END IF; IF Auto_precharge (2) = '1' THEN Count_precharge (2) := Count_precharge (2) + 1; END IF; IF Auto_precharge (3) = '1' THEN Count_precharge (3) := Count_precharge (3) + 1; END IF; -- Auto Precharge Timer for tWR if (Burst_length_1 = '1' OR Write_burst_mode = '1') then if (Count_precharge(0) = 1) then Count_time(0) := NOW; end if; if (Count_precharge(1) = 1) then Count_time(1) := NOW; end if; if (Count_precharge(2) = 1) then Count_time(2) := NOW; end if; if (Count_precharge(3) = 1) then Count_time(3) := NOW; end if; elsif (Burst_length_2 = '1') then if (Count_precharge(0) = 2) then Count_time(0) := NOW; end if; if (Count_precharge(1) = 2) then Count_time(1) := NOW; end if; if (Count_precharge(2) = 2) then Count_time(2) := NOW; end if; if (Count_precharge(3) = 2) then Count_time(3) := NOW; end if; elsif (Burst_length_4 = '1') then if (Count_precharge(0) = 4) then Count_time(0) := NOW; end if; if (Count_precharge(1) = 4) then Count_time(1) := NOW; end if; if (Count_precharge(2) = 4) then Count_time(2) := NOW; end if; if (Count_precharge(3) = 4) then Count_time(3) := NOW; end if; elsif (Burst_length_8 = '1') then if (Count_precharge(0) = 8) then Count_time(0) := NOW; end if; if (Count_precharge(1) = 8) then Count_time(1) := NOW; end if; if (Count_precharge(2) = 8) then Count_time(2) := NOW; end if; if (Count_precharge(3) = 8) then Count_time(3) := NOW; end if; end if; -- tMRD Counter MRD_chk := MRD_chk + 1; -- tWR Counter WR_counter(0) := WR_counter(0) + 1; WR_counter(1) := WR_counter(1) + 1; WR_counter(2) := WR_counter(2) + 1; WR_counter(3) := WR_counter(3) + 1; -- Auto Refresh IF Aref_enable = '1' THEN -- Auto Refresh to Auto Refresh ASSERT (NOW - RC_chk >= tRC) REPORT "tRC violation during Auto Refresh" SEVERITY WARNING; -- Precharge to Auto Refresh ASSERT (NOW - RP_chk0 >= tRP OR NOW - RP_chk1 >= tRP OR NOW - RP_chk2 >= tRP OR NOW - RP_chk3 >= tRP) REPORT "tRP violation during Auto Refresh" SEVERITY WARNING; -- All banks must be idle before refresh IF (Pc_b3 ='0' OR Pc_b2 = '0' OR Pc_b1 ='0' OR Pc_b0 = '0') THEN ASSERT (FALSE) REPORT "All banks must be Precharge before Auto Refresh" SEVERITY WARNING; END IF; -- Record current tRC time RC_chk := NOW; END IF; -- Load Mode Register IF Mode_reg_enable = '1' THEN Mode_reg <= TO_BITVECTOR (Addr); IF (Pc_b3 ='0' OR Pc_b2 = '0' OR Pc_b1 ='0' OR Pc_b0 = '0') THEN ASSERT (FALSE) REPORT "All bank must be Precharge before Load Mode Register" SEVERITY WARNING; END IF; -- REF to LMR ASSERT (NOW - RC_chk >= tRC) REPORT "tRC violation during Load Mode Register" SEVERITY WARNING; -- LMR to LMR ASSERT (MRD_chk >= tMRD) REPORT "tMRD violation during Load Mode Register" SEVERITY WARNING; -- Record current tMRD time MRD_chk := 0; END IF; -- Active Block (latch Bank and Row Address) IF Active_enable = '1' THEN IF Ba = "00" AND Pc_b0 = '1' THEN Act_b0 := '1'; Pc_b0 := '0'; B0_row_addr := TO_BITVECTOR (Addr); RCD_chk0 := NOW; RAS_chk0 := NOW; -- Precharge to Active Bank 0 ASSERT (NOW - RP_chk0 >= tRP) REPORT "tRP violation during Activate Bank 0" SEVERITY WARNING; ELSIF Ba = "01" AND Pc_b1 = '1' THEN Act_b1 := '1'; Pc_b1 := '0'; B1_row_addr := TO_BITVECTOR (Addr); RCD_chk1 := NOW; RAS_chk1 := NOW; -- Precharge to Active Bank 1 ASSERT (NOW - RP_chk1 >= tRP) REPORT "tRP violation during Activate Bank 1" SEVERITY WARNING; ELSIF Ba = "10" AND Pc_b2 = '1' THEN Act_b2 := '1'; Pc_b2 := '0'; B2_row_addr := TO_BITVECTOR (Addr); RCD_chk2 := NOW; RAS_chk2 := NOW; -- Precharge to Active Bank 2 ASSERT (NOW - RP_chk2 >= tRP) REPORT "tRP violation during Activate Bank 2" SEVERITY WARNING; ELSIF Ba = "11" AND Pc_b3 = '1' THEN Act_b3 := '1'; Pc_b3 := '0'; B3_row_addr := TO_BITVECTOR (Addr); RCD_chk3 := NOW; RAS_chk3 := NOW; -- Precharge to Active Bank 3 ASSERT (NOW - RP_chk3 >= tRP) REPORT "tRP violation during Activate Bank 3" SEVERITY WARNING; ELSIF Ba = "00" AND Pc_b0 = '0' THEN ASSERT (FALSE) REPORT "Bank 0 is not Precharged" SEVERITY WARNING; ELSIF Ba = "01" AND Pc_b1 = '0' THEN ASSERT (FALSE) REPORT "Bank 1 is not Precharged" SEVERITY WARNING; ELSIF Ba = "10" AND Pc_b2 = '0' THEN ASSERT (FALSE) REPORT "Bank 2 is not Precharged" SEVERITY WARNING; ELSIF Ba = "11" AND Pc_b3 = '0' THEN ASSERT (FALSE) REPORT "Bank 3 is not Precharged" SEVERITY WARNING; END IF; -- Active Bank A to Active Bank B IF ((Previous_bank /= TO_BITVECTOR (Ba)) AND (NOW - RRD_chk < tRRD)) THEN ASSERT (FALSE) REPORT "tRRD violation during Activate" SEVERITY WARNING; END IF; -- LMR to ACT ASSERT (MRD_chk >= tMRD) REPORT "tMRD violation during Activate" SEVERITY WARNING; -- AutoRefresh to Activate ASSERT (NOW - RC_chk >= tRC) REPORT "tRC violation during Activate" SEVERITY WARNING; -- Record variable for checking violation RRD_chk := NOW; Previous_bank := TO_BITVECTOR (Ba); END IF; -- Precharge Block IF Prech_enable = '1' THEN IF Addr(10) = '1' THEN Pc_b0 := '1'; Pc_b1 := '1'; Pc_b2 := '1'; Pc_b3 := '1'; Act_b0 := '0'; Act_b1 := '0'; Act_b2 := '0'; Act_b3 := '0'; RP_chk0 := NOW; RP_chk1 := NOW; RP_chk2 := NOW; RP_chk3 := NOW; -- Activate to Precharge all banks ASSERT ((NOW - RAS_chk0 >= tRAS) OR (NOW - RAS_chk1 >= tRAS)) REPORT "tRAS violation during Precharge all banks" SEVERITY WARNING; -- tWR violation check for Write IF ((NOW - WR_chkp(0) < tWRp) OR (NOW - WR_chkp(1) < tWRp) OR (NOW - WR_chkp(2) < tWRp) OR (NOW - WR_chkp(3) < tWRp)) THEN ASSERT (FALSE) REPORT "tWR violation during Precharge ALL banks" SEVERITY WARNING; END IF; ELSIF Addr(10) = '0' THEN IF Ba = "00" THEN Pc_b0 := '1'; Act_b0 := '0'; RP_chk0 := NOW; -- Activate to Precharge bank 0 ASSERT (NOW - RAS_chk0 >= tRAS) REPORT "tRAS violation during Precharge bank 0" SEVERITY WARNING; ELSIF Ba = "01" THEN Pc_b1 := '1'; Act_b1 := '0'; RP_chk1 := NOW; -- Activate to Precharge bank 1 ASSERT (NOW - RAS_chk1 >= tRAS) REPORT "tRAS violation during Precharge bank 1" SEVERITY WARNING; ELSIF Ba = "10" THEN Pc_b2 := '1'; Act_b2 := '0'; RP_chk2 := NOW; -- Activate to Precharge bank 2 ASSERT (NOW - RAS_chk2 >= tRAS) REPORT "tRAS violation during Precharge bank 2" SEVERITY WARNING; ELSIF Ba = "11" THEN Pc_b3 := '1'; Act_b3 := '0'; RP_chk3 := NOW; -- Activate to Precharge bank 3 ASSERT (NOW - RAS_chk3 >= tRAS) REPORT "tRAS violation during Precharge bank 3" SEVERITY WARNING; END IF; -- tWR violation check for Write ASSERT (NOW - WR_chkp(TO_INTEGER(Ba)) >= tWRp) REPORT "tWR violation during Precharge" SEVERITY WARNING; END IF; -- Terminate a Write Immediately (if same bank or all banks) IF (Data_in_enable = '1' AND (Bank = TO_BITVECTOR(Ba) OR Addr(10) = '1')) THEN Data_in_enable := '0'; END IF; -- Precharge Command Pipeline for READ IF CAS_latency_3 = '1' THEN Command(2) := PRECH; Bank_precharge(2) := TO_BITVECTOR (Ba); A10_precharge(2) := TO_BIT(Addr(10)); ELSIF CAS_latency_2 = '1' THEN Command(1) := PRECH; Bank_precharge(1) := TO_BITVECTOR (Ba); A10_precharge(1) := TO_BIT(Addr(10)); END IF; END IF; -- Burst Terminate IF Burst_term = '1' THEN -- Terminate a Write immediately IF Data_in_enable = '1' THEN Data_in_enable := '0'; END IF; -- Terminate a Read depend on CAS Latency IF CAS_latency_3 = '1' THEN Command(2) := BST; ELSIF CAS_latency_2 = '1' THEN Command(1) := BST; END IF; END IF; -- Read, Write, Column Latch IF Read_enable = '1' OR Write_enable = '1' THEN
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -