在我的计算机架构讲座中,我被告知IR分配和PC增量是并行完成的。但是这肯定会对加载哪条指令产生影响。
如果PC = 0,则加载IR,然后PC递增,然后IR将保持地址0处的指令。
但是,如果PC = 0,则PC递增,然后加载IR,然后IR将保持地址1处的指令。
当然,他们不能同时完成,必须定义订单?
答案 0 :(得分:1)
你没有考虑FlipFlops的奇迹。确切的实现当然取决于您的具体设计,但是完全可以读取当前锁存在某个寄存器或锁存器上的值,同时准备一个不同的值存储在那里,只要您知道这些值是独立的(也有可能在更复杂的设计中进行“旁路”,但除了这一点之外)。
在这种情况下,您将读取PC
的当前值(并使用它来从内存,缓存或其他任何内容中获取代码),同时准备下一个值(例如{{ 1}}或者一些分支目标,如果你知道的话)。这就是管道的工作方式。
一般来说,你要么有足够的时间在同一个周期内做一些工作(递增PC+4
并将其用于代码获取),在这种情况下它们将适合同一个管道阶段,或者你可以及时制定它 - 你只需将这些串行活动分解为两个管道阶段,这样它们就可以“并行”完成,因为其中一个属于流经管道的下一个操作,因此不再存在依赖性(除了像树枝或气泡这样的角落案例)