我想为一个特殊的慢速CPU写一个模拟器,它运行在600左右的千赫兹。如果我以天真的方式为CPU编写一个仿真器(即一次仿真一条指令而没有其他任何东西),仿真速度将远远超过600千赫兹。
如何编程模拟器以正确的速度模拟CPU,而不管主机的速度如何?现实世界的模拟器通常使用什么技术来做到这一点?如何避免抖动减慢仿真速度?
答案 0 :(得分:3)
在典型的平台上,唯一可用的"定期事件"是不准确和低频,当然没有像0.6MHz。但使用"慢"计时器(可能是100Hz左右)你可以"运行很多短的冲刺",有足够的时间"休息"在平均值之间,您每秒钟会模拟正确的周期数。时间通常可以相当准确地测量,因此您可以在每个" sprint"中精确模拟正确的周期数。
在较高的层面上,这看起来像这样:
int cycle_budget = 0;
time last_sprint = something;
// on timer fire
cycle_budget += (current_time - last_sprint) * clock_rate;
last_sprint = current_time;
while (cycle_budget >= slowest_instruction)
tick(); // emulates one instruction, subtracts from cycle_budget
有一些明显的变化,例如你可以让预算变为负值,而不是测试是否有足够的运行慢速指令。或者您可以解码指令,然后测试是否有足够的预算来运行它。这一切都假设一条指令不会被任意长,但据我所知,这从来都不是问题(甚至像z80的字符串指令一样,它们实际上是通过分支和重新执行来循环的本身)。