cpu: Add O3 CPU width checks
authorDam Sunwoo <dam.sunwoo@arm.com>
Wed, 23 Apr 2014 09:18:18 +0000 (05:18 -0400)
committerDam Sunwoo <dam.sunwoo@arm.com>
Wed, 23 Apr 2014 09:18:18 +0000 (05:18 -0400)
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.

src/cpu/o3/commit_impl.hh
src/cpu/o3/decode_impl.hh
src/cpu/o3/iew_impl.hh
src/cpu/o3/rename_impl.hh

index 5ca15f61101f8f703a4e071d6119c49e821595df..35d21d0715925f21e820a41d4a31fc6a22c1dac0 100644 (file)
@@ -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;
index c78e7f21160443e42b1a50ca57237337cb1e3dc7..c66f488a5c65e06ace144218e30eb295ae342fb9 100644 (file)
@@ -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;
 }
index 927a8d5a6a4d3ff576efddcb58536bc9b9b2fe96..3c133ff0cd0cabb15f58a191e1ee53848626c791 100644 (file)
@@ -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;
index 242d5a4e3d4e10ef6f4d27522ed0246ddd9e2007..dcf1d4c663b476f470a7ecb90fae0d2b38ec15e6 100644 (file)
@@ -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;
 }