sim: separate nextCycle() and clockEdge() in clockedObjects
authorDam Sunwoo <dam.sunwoo@arm.com>
Mon, 22 Apr 2013 17:20:31 +0000 (13:20 -0400)
committerDam Sunwoo <dam.sunwoo@arm.com>
Mon, 22 Apr 2013 17:20:31 +0000 (13:20 -0400)
commite8381142b061fbdf2f22d958f1c7559e9ffb3bd8
tree452e96de7f6322d62f325992a9ce5d1d2a3c3bbb
parent2c1e34431326381833de289b1d90f2427ba16c98
sim: separate nextCycle() and clockEdge() in clockedObjects

Previously, nextCycle() could return the *current* cycle if the current tick was
already aligned with the clock edge. This behavior is not only confusing (not
quite what the function name implies), but also caused problems in the
drainResume() function. When exiting/re-entering the sim loop (e.g., to take
checkpoints), the CPUs will drain and resume. Due to the previous behavior of
nextCycle(), the CPU tick events were being rescheduled in the same ticks that
were already processed before draining. This caused divergence from runs that
did not exit/re-entered the sim loop. (Initially a cycle difference, but a
significant impact later on.)

This patch separates out the two behaviors (nextCycle() and clockEdge()),
uses nextCycle() in drainResume, and uses clockEdge() everywhere else.
Nothing (other than name) should change except for the drainResume timing.
src/cpu/inorder/cpu.cc
src/cpu/o3/cpu.cc
src/cpu/simple/timing.cc
src/dev/arm/hdlcd.cc
src/dev/arm/pl111.cc
src/mem/bridge.cc
src/mem/bus.cc
src/mem/ruby/system/RubyMemoryControl.cc
src/sim/clocked_object.hh