Files
912-notes/cod/chp2.md
2019-12-21 21:57:36 +08:00

5.4 KiB
Raw Blame History

计组第二章知识脉络

本章讨论控制器的设计。在第一章的基础上,我们已经成功完成了数据通路的设计,这意味着计算机已经具有了[计算]的硬件条件,这就好比工厂已经有了工人,但是这还远远不够。为了让计算机运行起来,还需要正确地指导“工人”,使他们协同完成一系列用户指定的工作,这就是控制器的任务。这里,用户是通过指令的形式,来传达工作的要求,控制器的设计就需要识别这些指令,根据指令的内容控制数据通路的运行。

所以本章主要讨论两个问题,即指令以及指令的实现方式,具体又分为单周期CPU多周期CPU以及流水线

指令部分首先要关注的点是指令的设计,即如何合理组织操作码(opcode),使它代表不同长度的各种指令,本质上就是一个编码的问题。此外要了解具体的MIPS指令集的三种指令类型,即R型,I型,J型指令,它们各自的格式,以及实例。还需要关注一个寻址方式的问题。

不同的指令执行的步骤也不相同,不过大体上还是存在一些共性,比如都存在取指(Instruction Fetch)指令译码(Instruction Decode)操作。可以将MIPS指令集的指令都划分为五个基本操作,除了上面两个以外,还有指令执行EXE存储器读写MEM,以及结果写回(Write Back)。在此基础上,可以给出单周期CPU的设计方案,即每条指令都执行一个时钟周期(CPI = 1),时钟周期与执行时间最长的指令一致,并且将一个时钟周期划分为上述五个子段,分别执行相应的功能。控制信号在指令译码阶段全部给出,并且在整个时钟周期内保持。单周期CPU控制器的设计方案如下图所示:

single_cycle

这张图肯定是要非常熟悉的,其中的各个控制信号都要清楚,以及在每条指令执行的时候,各个控制信号的值是多少。

在指令集比较大的时候,单周期CPU的效率会比较低下,这是因为此时不同指令执行所需要的时间往往有很大差异,在单周期CPU中,所有指令的执行时间都与最长的指令相同。为了解决这个问题,产生了多周期CPU的设计方案,即指令的每一个阶段都执行一个时钟周期,不同的指令具有不同的时钟周期数,例如jump指令只需要两个时钟周期,而lw执行需要五个时钟周期。

容易看到,多周期CPU设计的难点在于一个时序的问题,即在指令执行的不同周期内,需要给到数据通路不同的控制信号。这里有两种实现方法,一种是硬布线控制器,它是通过引入一个节拍发生器来指示当前指令执行到了哪一个阶段,所以控制信号是操作码节拍的函数,通过复杂的组合逻辑电路来实现。另一种方案是微程序控制器,它是将控制信号全部存储在控制存储器当中,通过微指令下地址逻辑来给出当前阶段的控制信号。需要关注一下多周期CPU的各条指令的有限状态机

实际上,无论是单周期CPU还是多周期CPU,它们的元件利用率都还有很大的提升余地,一个洗衣房的例子可以很好地说明流水线的优势,流水线的本质是时间并行,而非空间并行,后者是指同时存在多套硬件系统并行运行。流水线将一个指令的执行过程划分为若干个流水级(piped stages),流水级的长度需要与最耗时的操作一致,在这个方面流水线是类似于多周期CPU的,即每一条执行的执行都需要多个周期;但是为了避免结构冲突,不同的指令的流水级数仍然是相同的,这个方面流水线类似于单周期CPU流水线实现的难点在于任一时刻,数据通路的不同部件是在执行不同的指令,因此需要给到不同执令的控制信号,因此需要设置流水线寄存器来传递这些控制信号,除此以外还要传递各条执行的参数,目标操作数,中间结果等。流水线实现的关键就在于流水线寄存器

然而,流水线还存在一些问题,即它的执行过程中会产生一些冲突,或者冒险(hazard)。具体说来,有三种冲突,即结构冲突数据冲突以及控制冲突结构冲突是指不同指令对同一资源的抢占,比如在取指阶段以及MEM阶段都可能发生内存的访问,解决方案是暂停流水线,或者增设资源,比如这里分别设置执令存储器与数据存储器,或者使存储器具有两个读取端口;

数据冲突是指相邻执行的指令中,对数据的依赖性关系,具有RAWWAWWAR三种情形,其中在MIPS中只可能出现RAW。数据冲突的解决方案有数据旁路暂停流水线编译器静态调度或者动态调度,需要指出前一条指令是lw时的数据冲突无法通过旁路来解决,而必须进行阻塞

控制冲突是跳转相关执行会出现的,控制器由于不知道下一条指令的地址,所以无法实现指令预取。控制冲突的解决方案有暂停流水线静态预测动态预测延迟槽,其中动态预测还可以通过采取两位预测位的方法,对于多重循环获得更高的预测精度。