diff options
author | Dam Sunwoo <dam.sunwoo@arm.com> | 2014-04-23 05:18:18 -0400 |
---|---|---|
committer | Dam Sunwoo <dam.sunwoo@arm.com> | 2014-04-23 05:18:18 -0400 |
commit | 84f8fe637cbf15c403f39aaa10c0ea66ace6083d (patch) | |
tree | 9655f3537e6e8c05806b78b24cfd48cc623100f6 | |
parent | c9071ff95e5835e100e642ceba99a1bce8c3d02d (diff) | |
download | gem5-84f8fe637cbf15c403f39aaa10c0ea66ace6083d.tar.xz |
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.
-rw-r--r-- | src/cpu/o3/commit_impl.hh | 5 | ||||
-rw-r--r-- | src/cpu/o3/decode_impl.hh | 5 | ||||
-rw-r--r-- | src/cpu/o3/iew_impl.hh | 13 | ||||
-rw-r--r-- | src/cpu/o3/rename_impl.hh | 5 |
4 files changed, 28 insertions, 0 deletions
diff --git a/src/cpu/o3/commit_impl.hh b/src/cpu/o3/commit_impl.hh index 5ca15f611..35d21d071 100644 --- a/src/cpu/o3/commit_impl.hh +++ b/src/cpu/o3/commit_impl.hh @@ -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; diff --git a/src/cpu/o3/decode_impl.hh b/src/cpu/o3/decode_impl.hh index c78e7f211..c66f488a5 100644 --- a/src/cpu/o3/decode_impl.hh +++ b/src/cpu/o3/decode_impl.hh @@ -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; } diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh index 927a8d5a6..3c133ff0c 100644 --- a/src/cpu/o3/iew_impl.hh +++ b/src/cpu/o3/iew_impl.hh @@ -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; diff --git a/src/cpu/o3/rename_impl.hh b/src/cpu/o3/rename_impl.hh index 242d5a4e3..dcf1d4c66 100644 --- a/src/cpu/o3/rename_impl.hh +++ b/src/cpu/o3/rename_impl.hh @@ -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; } |