Fix LPDDR5 AllBank and Per2Bank Refresh

This commit is contained in:
2025-03-26 15:10:56 +01:00
parent 1ad352aa8b
commit db615eb6a4
2 changed files with 48 additions and 18 deletions

View File

@@ -1839,8 +1839,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
if (burstLength == 32)
{
const sc_time constraint = currentTime + ((memSpec.BL_n_min_32 + memSpec.tRBTP) + memSpec.tRPpb);
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
for (unsigned int i = static_cast<unsigned>(bank) + memSpec.banksPerRank * static_cast<unsigned>(rank); i < memSpec.banksPerRank * (1 + static_cast<unsigned>(rank)); i += memSpec.getPer2BankOffset())
{
Bank currentBank{i};
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
}
}
@@ -1849,8 +1853,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
if (burstLength != 32)
{
const sc_time constraint = currentTime + ((memSpec.BL_n_min_16 + memSpec.tRBTP) + memSpec.tRPpb);
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
for (unsigned int i = static_cast<unsigned>(bank) + memSpec.banksPerRank * static_cast<unsigned>(rank); i < memSpec.banksPerRank * (1 + static_cast<unsigned>(rank)); i += memSpec.getPer2BankOffset())
{
Bank currentBank{i};
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
}
}
@@ -2448,8 +2456,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
if (burstLength == 32)
{
const sc_time constraint = currentTime + ((((memSpec.tWL + memSpec.BL_n_min_32) + memSpec.tCK) + memSpec.tWR) + memSpec.tRPpb);
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
for (unsigned int i = static_cast<unsigned>(bank) + memSpec.banksPerRank * static_cast<unsigned>(rank); i < memSpec.banksPerRank * (1 + static_cast<unsigned>(rank)); i += memSpec.getPer2BankOffset())
{
Bank currentBank{i};
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
}
}
@@ -2458,8 +2470,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
if (burstLength != 32)
{
const sc_time constraint = currentTime + ((((memSpec.tWL + memSpec.BL_n_min_16) + memSpec.tCK) + memSpec.tWR) + memSpec.tRPpb);
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
for (unsigned int i = static_cast<unsigned>(bank) + memSpec.banksPerRank * static_cast<unsigned>(rank); i < memSpec.banksPerRank * (1 + static_cast<unsigned>(rank)); i += memSpec.getPer2BankOffset())
{
Bank currentBank{i};
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
}
}
@@ -3650,8 +3666,12 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
// Bank (ACT,REFP2B) (memSpec.tRCpb + memSpec.tCK) [] Per2ComponentsIn(level=<ComponentLevel.BankGroup: 2>)
{
const sc_time constraint = currentTime + (memSpec.tRCpb + memSpec.tCK);
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][bank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
for (unsigned int i = static_cast<unsigned>(bank) + memSpec.banksPerRank * static_cast<unsigned>(rank); i < memSpec.banksPerRank * (1 + static_cast<unsigned>(rank)); i += memSpec.getPer2BankOffset())
{
Bank currentBank{i};
sc_time &earliestTimeToStart = nextCommandByBank[Command::REFP2B][currentBank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
}
// Rank (ACT,ACT) memSpec.tRRD [] SameComponent()
@@ -3813,13 +3833,6 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
}
case Command::REFP2B:
{
// Bank (REFP2B,ACT) (memSpec.tRFCpb - memSpec.tCK) [] SameComponent()
{
const sc_time constraint = currentTime + (memSpec.tRFCpb - memSpec.tCK);
sc_time &earliestTimeToStart = nextCommandByBank[Command::ACT][bank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
// Bank (REFP2B,REFP2B) memSpec.tRFCpb [] SameComponent()
{
const sc_time constraint = currentTime + memSpec.tRFCpb;
@@ -3827,6 +3840,17 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
// Bank (REFP2B,ACT) (memSpec.tRFCpb - memSpec.tCK) [] Per2ComponentsIn(level=<ComponentLevel.BankGroup: 2>)
{
const sc_time constraint = currentTime + (memSpec.tRFCpb - memSpec.tCK);
for (unsigned int i = static_cast<unsigned>(bank) + memSpec.banksPerRank * static_cast<unsigned>(rank); i < memSpec.banksPerRank * (1 + static_cast<unsigned>(rank)); i += memSpec.getPer2BankOffset())
{
Bank currentBank{i};
sc_time &earliestTimeToStart = nextCommandByBank[Command::ACT][currentBank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
}
// Rank (REFP2B,ACT) (memSpec.tpbR2act - memSpec.tCK) [] SameComponent()
{
const sc_time constraint = currentTime + (memSpec.tpbR2act - memSpec.tCK);
@@ -3872,6 +3896,13 @@ void CheckerLPDDR5::insert(Command command, const tlm_generic_payload& payload)
}
case Command::REFAB:
{
// Rank (REFAB,ACT) (memSpec.tRFCab - memSpec.tCK) [] SameComponent()
{
const sc_time constraint = currentTime + (memSpec.tRFCab - memSpec.tCK);
sc_time &earliestTimeToStart = nextCommandByRank[Command::ACT][rank];
earliestTimeToStart = std::max(earliestTimeToStart, constraint);
}
// Rank (REFAB,REFAB) memSpec.tRFCab [] SameComponent()
{
const sc_time constraint = currentTime + memSpec.tRFCab;

View File

@@ -41,7 +41,6 @@
#include "DRAMSys/configuration/memspec/MemSpecLPDDR5.h"
#include <queue>
#include <vector>
namespace DRAMSys
{