summaryrefslogtreecommitdiff
path: root/src/cpu
diff options
context:
space:
mode:
authorDam Sunwoo <dam.sunwoo@arm.com>2014-04-23 05:18:18 -0400
committerDam Sunwoo <dam.sunwoo@arm.com>2014-04-23 05:18:18 -0400
commit84f8fe637cbf15c403f39aaa10c0ea66ace6083d (patch)
tree9655f3537e6e8c05806b78b24cfd48cc623100f6 /src/cpu
parentc9071ff95e5835e100e642ceba99a1bce8c3d02d (diff)
downloadgem5-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.
Diffstat (limited to 'src/cpu')
-rw-r--r--src/cpu/o3/commit_impl.hh5
-rw-r--r--src/cpu/o3/decode_impl.hh5
-rw-r--r--src/cpu/o3/iew_impl.hh13
-rw-r--r--src/cpu/o3/rename_impl.hh5
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;
}