cpu: Add O3 CPU width checks
O3CPU has a compile-time maximum width set in o3/impl.hh, but checking the configuration against this limit was not implemented anywhere except for fetch. Configuring a wider pipe than the limit can silently cause various issues during the simulation. This patch adds the proper checking in the constructor of the various pipeline stages.
This commit is contained in:
@@ -108,6 +108,11 @@ DefaultCommit<Impl>::DefaultCommit(O3CPU *_cpu, DerivO3CPUParams *params)
|
||||
canHandleInterrupts(true),
|
||||
avoidQuiesceLiveLock(false)
|
||||
{
|
||||
if (commitWidth > Impl::MaxWidth)
|
||||
fatal("commitWidth (%d) is larger than compiled limit (%d),\n"
|
||||
"\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
|
||||
commitWidth, static_cast<int>(Impl::MaxWidth));
|
||||
|
||||
_status = Active;
|
||||
_nextStatus = Inactive;
|
||||
std::string policy = params->smtCommitPolicy;
|
||||
|
||||
@@ -68,6 +68,11 @@ DefaultDecode<Impl>::DefaultDecode(O3CPU *_cpu, DerivO3CPUParams *params)
|
||||
decodeWidth(params->decodeWidth),
|
||||
numThreads(params->numThreads)
|
||||
{
|
||||
if (decodeWidth > Impl::MaxWidth)
|
||||
fatal("decodeWidth (%d) is larger than compiled limit (%d),\n"
|
||||
"\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
|
||||
decodeWidth, static_cast<int>(Impl::MaxWidth));
|
||||
|
||||
// @todo: Make into a parameter
|
||||
skidBufferMax = (fetchToDecodeDelay + 1) * params->fetchWidth;
|
||||
}
|
||||
|
||||
@@ -79,6 +79,19 @@ DefaultIEW<Impl>::DefaultIEW(O3CPU *_cpu, DerivO3CPUParams *params)
|
||||
wbWidth(params->wbWidth),
|
||||
numThreads(params->numThreads)
|
||||
{
|
||||
if (dispatchWidth > Impl::MaxWidth)
|
||||
fatal("dispatchWidth (%d) is larger than compiled limit (%d),\n"
|
||||
"\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
|
||||
dispatchWidth, static_cast<int>(Impl::MaxWidth));
|
||||
if (issueWidth > Impl::MaxWidth)
|
||||
fatal("issueWidth (%d) is larger than compiled limit (%d),\n"
|
||||
"\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
|
||||
issueWidth, static_cast<int>(Impl::MaxWidth));
|
||||
if (wbWidth > Impl::MaxWidth)
|
||||
fatal("wbWidth (%d) is larger than compiled limit (%d),\n"
|
||||
"\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
|
||||
wbWidth, static_cast<int>(Impl::MaxWidth));
|
||||
|
||||
_status = Active;
|
||||
exeStatus = Running;
|
||||
wbStatus = Idle;
|
||||
|
||||
@@ -71,6 +71,11 @@ DefaultRename<Impl>::DefaultRename(O3CPU *_cpu, DerivO3CPUParams *params)
|
||||
maxPhysicalRegs(params->numPhysIntRegs + params->numPhysFloatRegs
|
||||
+ params->numPhysCCRegs)
|
||||
{
|
||||
if (renameWidth > Impl::MaxWidth)
|
||||
fatal("renameWidth (%d) is larger than compiled limit (%d),\n"
|
||||
"\tincrease MaxWidth in src/cpu/o3/impl.hh\n",
|
||||
renameWidth, static_cast<int>(Impl::MaxWidth));
|
||||
|
||||
// @todo: Make into a parameter.
|
||||
skidBufferMax = (2 * (decodeToRenameDelay * params->decodeWidth)) + renameWidth;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user