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:
parent
c9071ff95e
commit
84f8fe637c
4 changed files with 28 additions and 0 deletions
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue