diff --git a/doc/计算机结构设计实验/RV64.vsdx b/doc/计算机结构设计实验/RV64.vsdx index 39716fa..f67c404 100644 Binary files a/doc/计算机结构设计实验/RV64.vsdx and b/doc/计算机结构设计实验/RV64.vsdx differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107150933149.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107150933149.png deleted file mode 100644 index 567908e..0000000 Binary files a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107150933149.png and /dev/null differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107165900444.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107165900444.png new file mode 100644 index 0000000..b46fd44 Binary files /dev/null and b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107165900444.png differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107193813519.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107193813519.png new file mode 100644 index 0000000..305c471 Binary files /dev/null and b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107193813519.png differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107201217987.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107201217987.png new file mode 100644 index 0000000..6cffca7 Binary files /dev/null and b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107201217987.png differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107213027949.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107213027949.png new file mode 100644 index 0000000..30bbb08 Binary files /dev/null and b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107213027949.png differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107213744736.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107213744736.png new file mode 100644 index 0000000..d36663e Binary files /dev/null and b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107213744736.png differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107222701967.png b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107222701967.png new file mode 100644 index 0000000..691ebe7 Binary files /dev/null and b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.assets/image-20240107222701967.png differ diff --git a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.md b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.md index c05f2a6..2da260b 100644 --- a/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.md +++ b/doc/计算机结构设计实验/实现R型运算类指令的理想流水线设计实验/实现R型运算类指令的理想流水线设计实验.md @@ -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 所示)。 -![图 9.3 流水线CPU](实现R型运算类指令的理想流水线设计实验.assets/image-20240107150933149.png) +![图 9.3 五级流水线CPU](实现R型运算类指令的理想流水线设计实验.assets/image-20240107165900444.png) 所有部件采用同一个系统时钟 clock 来同步,每到来一个时钟 clock,各段逻辑功能部件处理完毕的数据会锁存到下一级的流水线缓存中,作为下一段的输入数据,指令执行进入下一阶段。clock 频率的取决于流水线缓存两级间的最大逻辑延迟。图 9.3 展示了 RISC-V 流水线的逻辑架构。 +#### 性能差异 + +![图 9.4 单周期流水线CPU时空图](实现R型运算类指令的理想流水线设计实验.assets/image-20240107201217987.png) + +![图 9.5 理想的五级流水线CPU时空图](实现R型运算类指令的理想流水线设计实验.assets/image-20240107193813519.png) + +图 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 理想的五级流水线 CPU 数据与控制信号传递图](实现R型运算类指令的理想流水线设计实验.assets/image-20240107213744736.png) + +根据指令系统规范中的定义设计出“数据通路+控制逻辑”的基本方法是:对指令系统中定义的指令逐条进行功能分解,得到一系列操作和操作的对象。显然,这些操作和操作的对象必然对应其各自的数据通路,又因为指令间存在一些相同或相近的操作和操作对象,所以我们可以只设计一套数据通路供多个指令公用。对于确实存在差异无法共享数据通路的情况,只能各自设计一套,再用多路选择器从中选择出所需的结果。接下来,我们将遵循这个一般性方法,具体介绍如何分析指令的功能以及如何设计出数据通路。图 9.5 展示了 RISC-V 理想的五级流水线 CPU 数据与控制信号传递图。 + +#### 以 ADD 指令为例 + +我们只有知道了指令的定义,才可以对指令功能进行分解,因此第一步应该查阅手册,找到 ADD 指令在手册中的定义。图 9.6 是手册对 ADD 指令的定义。 + +![图 9.6 ADD指令的定义](实现R型运算类指令的理想流水线设计实验.assets/image-20240107213027949.png) + +根据手册对指令的定义,我们可以开始思考 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之间只是组合逻辑的关系。 + +![取指单元](实现R型运算类指令的理想流水线设计实验.assets/image-20240107222701967.png) + +PC 的输出将送到指令 SRAM 中用于获取指令,由于我们的指令 SRAM 的地址宽度只有 32 位,因此只有 PC 的低 32 会被使用。目前来看,PC 的输入有两个,一个是复位值 0x80000000,一个是复位撤销之后每执行完一条指令更新为当前 PC+4 得到的值。这里的 4 代 +表寻址 4 个字节,即一条指令的宽度,所以 PC+4 就是当前指令之后一条指令的 PC 值。 + +### 差分测试 ![交互接口](实现R型运算类指令的理想流水线设计实验.assets/image-20240107144041910.png)