继续增加实验9的文档
Before Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 8.1 KiB |
After Width: | Height: | Size: 5.8 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 39 KiB |
After Width: | Height: | Size: 26 KiB |
After Width: | Height: | Size: 22 KiB |
|
@ -8,7 +8,9 @@
|
|||
|
||||
## 实验原理与实验内容
|
||||
|
||||
### 单周期 CPU 与流水线 CPU 结构的差异
|
||||
### 单周期与流水线
|
||||
|
||||
#### 结构差异
|
||||
|
||||
RISC-V 单周期 CPU 设计实现简单,控制器部分是纯组合逻辑电路,但该 CPU 所有指令执行时间均是一个相同的周期,即以速度最慢的指令作为设计其时钟周期的依据。如图 9.1 所示,单周期 CPU 的时钟频率取决于数据通路中的关键路径(最长路径),所以单周期 CPU 效率较低,性能不佳,现代处理器中已不再采用单周期方式,取而代之的是多周期设计方式。而多周期 CPU 设计中流水线 CPU 设计是目前的主流技术。
|
||||
|
||||
|
@ -28,13 +30,50 @@ RISC-V 单周期 CPU 设计实现简单,控制器部分是纯组合逻辑电
|
|||
|
||||
结合这个流水线阶段的划分方案,我们将单周期 CPU 的数据通路拆分为五段(如图 9.2 所示),并在各段之间加入触发器作为流水线缓存(如图 9.3 所示)。
|
||||
|
||||

|
||||

|
||||
|
||||
所有部件采用同一个系统时钟 clock 来同步,每到来一个时钟 clock,各段逻辑功能部件处理完毕的数据会锁存到下一级的流水线缓存中,作为下一段的输入数据,指令执行进入下一阶段。clock 频率的取决于流水线缓存两级间的最大逻辑延迟。图 9.3 展示了 RISC-V 流水线的逻辑架构。
|
||||
|
||||
#### 性能差异
|
||||
|
||||

|
||||
|
||||

|
||||
|
||||
图 9.4 给出了 RISC-V 单周期 CPU 的时空图,可以看到,每条指令执行需要 5 个时钟周期,即 $\rm 5\Delta t$。1 个时钟周期是 1 个 $\rm \Delta t$ ,也就是每 5 个 $\rm \Delta t$ 可以提交 1 条指令,单周期 CPU 的 IPC 是 0.2。算出运行 n 条指令花费的总时间为 $\rm n\times 5\Delta t$ 。
|
||||
|
||||
图 9.5 给出了 RISC-V 理想的五级流水线 CPU 时空图。在理想情况下,当流水线满载运行时,每个时钟周期流水线可以提交 1 条指令,也就是 CPU 的 IPC 为 1。流水线完成 n 条指令的总时间为 $\rm (4+n)\times \Delta t$ 。
|
||||
|
||||
当 n 趋近于 $\rm \infty$ 时,相比单周期 CPU 执行 n 条指令花费的时间,五级流水线的加速比 $\rm \lim_{n \to \infty}S_p=\frac{5n\times \Delta t}{(4+n)\times \Delta t}=5$ ,即理想的五级流水线 CPU 的执行效率是单周期 CPU 的 5 倍。
|
||||
|
||||
### 数据通路设计
|
||||
|
||||
#### 设计的基本方法
|
||||
|
||||
经过之前的数字电路设计实验的学习,你应该掌握了数字逻辑电路设计的一般性方法。在计算机结构设计实验中,我们要设计的 CPU 也是一个数字逻辑电路,它的设计也应该遵循数字逻辑电路设计的一般性方法。CPU 不但要完成运算,也要维持自身的状态,所以 CPU 这个数字逻辑电路一定是既有组合逻辑电路又有时序逻辑电路的。CPU 输入的、运算的、存储的、输出的数据都在组合逻辑电路和时序逻辑电路上流转,我们常称这些逻辑电路为数据通路(Datapath)。因此,要设计 CPU 这个数字逻辑电路,首要的工作就是设计数据通路。同时,因为数据通路中会有多路选择器、时序逻辑器件,所以还要有相应的控制信号,产生这些控制信号的逻辑称为控制逻辑。所以,从宏观的视角来看,设计一个 CPU 就是设计它的“数据通路+控制逻辑”。
|
||||
|
||||
那么,怎么根据指令系统规范中的定义设计出“数据通路+控制逻辑”呢?基本方法是:对指令系统中定义的指令逐条进行功能分解,得到一系列操作和操作的对象。显然,这些操作和操作的对象必然对应其各自的数据通路,又因为指令间存在一些相同或相近的操作和操作对象,所以我们可以只设计一套数据通路供多个指令公用。对于确实存在差异无法共享数据通路的情况,只能各自设计一套,再用多路选择器从中选择出所需的结果。接下来,我们将遵循这个一般性方法,具体介绍如何分析指令的功能以及如何设计出数据通路。
|
||||

|
||||
|
||||
根据指令系统规范中的定义设计出“数据通路+控制逻辑”的基本方法是:对指令系统中定义的指令逐条进行功能分解,得到一系列操作和操作的对象。显然,这些操作和操作的对象必然对应其各自的数据通路,又因为指令间存在一些相同或相近的操作和操作对象,所以我们可以只设计一套数据通路供多个指令公用。对于确实存在差异无法共享数据通路的情况,只能各自设计一套,再用多路选择器从中选择出所需的结果。接下来,我们将遵循这个一般性方法,具体介绍如何分析指令的功能以及如何设计出数据通路。图 9.5 展示了 RISC-V 理想的五级流水线 CPU 数据与控制信号传递图。
|
||||
|
||||
#### 以 ADD 指令为例
|
||||
|
||||
我们只有知道了指令的定义,才可以对指令功能进行分解,因此第一步应该查阅手册,找到 ADD 指令在手册中的定义。图 9.6 是手册对 ADD 指令的定义。
|
||||
|
||||

|
||||
|
||||
根据手册对指令的定义,我们可以开始思考 ADD 指令需要哪些数据通路部件。
|
||||
|
||||
(1)取指单元
|
||||
|
||||
因为实现的是一个 64 位的处理器,所以 PC 的指令宽度是 64 比特。我们用一组 64 位的触发器来存放 PC。(后面为了行文简洁,在不会导致混淆的情况下,我们用 pc 代表这组用于存放 PC 的 64 位触发器。)由于我们的处理器使用到了 SRAM 进行数据的存取,而 SRAM 的特性是一次读数操作需要跨越两个时钟周期,第一个时钟周期向 RAM 发出读使能和读地址,第二个时钟周期 RAM 才能返回读结果。因此我们发送给指令 SRAM 的地址应该是下一拍的 PC,也就是 pc_next,而目前的实验设计 pc_next 的大小将一直等于 pc+4,因此pc_next和pc之间只是组合逻辑的关系。
|
||||
|
||||

|
||||
|
||||
PC 的输出将送到指令 SRAM 中用于获取指令,由于我们的指令 SRAM 的地址宽度只有 32 位,因此只有 PC 的低 32 会被使用。目前来看,PC 的输入有两个,一个是复位值 0x80000000,一个是复位撤销之后每执行完一条指令更新为当前 PC+4 得到的值。这里的 4 代
|
||||
表寻址 4 个字节,即一条指令的宽度,所以 PC+4 就是当前指令之后一条指令的 PC 值。
|
||||
|
||||
### 差分测试
|
||||
|
||||

|
||||
|
||||
|
|