我一直在为内斯模拟器处理CPU,我想知道管理多周期指令的周期的最佳方法是什么。
(假设实现了一个周期的时间延迟)我可以在指令的每个步骤中单独递增周期,如下所示:
void EXAMPLE_INSTRUCTION(){
step1();
cycles++;
step2();
cycles++;
step3();
cycles++;
}
或者在指令完成时一次执行3个周期,如下所示:
void EXAMPLE_INSTRUCTION(){
step1();
step2();
step3();
cycles+=3;
试图跟踪指令的哪些部分需要一个周期并依靠我的手计数变得越来越烦人,我想知道删除我目前实现的时钟周期是否有任何缺点,而不是在指令完成之前立即采取所有周期。
1条答案
按热度按时间kgsdhlau1#
答案是这要看情况。
如果您的模拟器不是周期精确的,您可以在最后一次添加所有周期。实际上,您可以为每条指令创建一个周期计数查找表,这样就不必在每条指令实现中添加增量
cycles
。对于这种方法有一个警告,那就是你需要意识到并不是所有的指令都有恒定的周期计数。例如,所有分支指令采用:
所以
BNE
可能需要2、3或4个周期。我采取的方法是将基本计数保存在查找表中,并根据需要在指令实现中添加额外的周期。如果你想要一个周期精确的仿真,你将不得不使用你的第一种方法,因为对数据总线的访问可能会发生一个精确的周期计数。
例如,阅读和/或写入IO寄存器可以触发外部事件。通常情况下,您希望读或写是指令执行期间发生的最后一件事,但您可能希望准确地模拟奇怪的事情,例如递增恰好是IO寄存器的内存位置或意外跳转到IO寄存器的位置。