考纲第一章 量化设计与分析基础
- 计算机的分类类别
- 计算机系统结构定义和计算机的设计任务:指令集结构概念及要素
- 实现技术的趋势:技术发展的趋势
- 集成电路功耗的趋势:功耗的概念
- 可靠性:提高可靠性的方法
- 测量、报告和总结计算机性能:计算机主要性能指标
- 计算机设计的量化原则:Amdahl定律
第二章 指令系统原理与示例
- 指令集系统结构的分类:指令集系统的不同结构
- 存储器寻址:大小端模式及地址对齐
- MIPS系统结构:MIPS指令集结构
第三章 单周期MIPS处理器的设计
- add, sub, addi, subi, lw, sw, beq, j 每条指令在单周期处理器中的执行逻辑
- 上述指令的指令编码、代码、功能以及在单周期中的数据通路,条件分支指令的地址计算、单周期各功能部件的控制信号值判断
- 中断和异常的处理时机
第四章 流水线技术及指令级并行
- 流水线的概念、分类
- 流水线的时空图及性能指标计算
- add, sub, addi, subi, lw, sw, beq每条指令在5级流水线的执行过程
- 结构冒险、数据冒险和控制冒险的判断,以及需要暂停的时钟周期数的判断(控制冒险的解决性能依赖于分支地址计算阶段和分支条件判断阶段)
- 结构冒险、数据冒险和控制冒险的解决办法
- 流水线中处理中断和异常的方法
- 记分牌动态调度算法
第五章 存储系统
- 存储器的分类和主要特点
- Cache的三种映像关系:全相联、直接映像、组相联
- 主存地址Tag、Index、块内偏移三个字段的计算
- Cache块的替换策略
- Cache的读写过程
- 平均访存时间和CPU时间的计算
- Cache失效率的类别,以及每种失效率的解决方法有哪些
- 虚拟地址到物理地址的转换过程,TLB表的原理和作用,与Cache的关系,访存时间的最好情况和最坏情况的判断
第一章 量化设计与分析基础
1. 计算机的分类类别
计算机的分类主要依据Flynn分类法和市场分类法。
Flynn分类法(基于指令流和数据流数量):
- SISD (Single Instruction Single Data):串行计算机。在任一时钟周期内只有单个指令流在CPU执行,且只有单个数据流用作输入。它是最老的计算机类型,例子包括早期的多数微处理器。
- MISD (Multiple Instruction Single Data):资料中标记为待定。
- SIMD (Single Instruction Multiple Data):一种并行计算机,用于处理数据级并行。
- MIMD (Multiple Instruction Multiple Data):例如SPARCCenter、T3D等,Cell处理器整体来看也是MIMD处理器。
市场分类法(5类计算机):
| 类别 | 关键系统设计问题 |
|---|---|
| 个人移动设备 | 成本、功耗、媒体性能、响应率。这类设备通常是具有多媒体用户界面的无线设备,如手机和平台电脑。嵌入式与非嵌入式的区别在于能否运行第三方软件(例如手机可以下载APP,而路由器只能运行固化软件)。 |
| 桌面计算机 | 性价比、图形性能、能耗。 |
| 服务器 | 可靠性、吞吐量、可扩展性。 |
| 集群/仓库级计算机 | 性价比、吞吐量、能耗、均衡性。 |
| 嵌入式计算机 | 价格、功耗、专门应用性能。 |
2. 计算机系统结构定义和计算机的设计任务:指令集结构概念及要素
计算机系统结构的定义:
- 原始概念 (1964):由程序员(机器语言)看到的(计算)系统属性,即概念性结构和功能行为,用以区分数据流动和控制逻辑设计的组成以及物理实现。
- 现代定义:在满足功能、性能和价格目标的条件下,设计、选择和互连硬件部件构成计算机。它涵盖了指令系统设计、组成(高层次设计,如CPU内部结构、存储器、I/O系统、多处理器、网络)和硬件(具体实现技术,如详细逻辑设计、封装、冷却系统、功耗等)。
计算机的设计任务: 设计任务包括确定一台新计算机的重要属性,必须在考虑成本、功耗、可用性等限制下使性能最优。
- 定义用户需求:包括功能需求和非功能需求(如性价比、可用性、功耗、大小、温度等)。
- 指令集(系统)结构(ISA)设计。
- 功能组成:计算机设计的高级方面。
- 逻辑设计和实现。
指令集结构(ISA)的概念及要素: ISA确定了计算机系统的软、硬件界面。 ISA的要素包括:
- 寻址方式。
- 操作数类型和大小(如8位字符,32位整型数)。
- 操作类型(如数据传输,算术/逻辑)。
- 控制流指令(如转移,子程序调用/返回)。
- ISA编码(固定长度,可变长度)。
3. 实现技术的趋势:技术发展的趋势
摩尔定律(Moore Law):
- 指导半导体工业界在降低电子器件成本的同时,提供更强大芯片的原则。
- 最初预测(1965年)集成在一个芯片上的元件数量每年翻一番,后更新为每两年翻一番(1975年)。
具体技术发展趋势:
- 集成电路逻辑技术:晶体管密度每年增加约35%,芯片尺寸(Die size)每年增加10%-20%,每个芯片晶体管总数每年增加40-55%。
- 半导体DRAM:容量每年增加约40%,访问速度每年增加约10%。
- 磁盘技术:容量每年增加约60%。
性能趋势:带宽改进优于时延
- 带宽/吞吐量:在给定时间完成的工作总量。
- 时延/响应时间:一个事件从开始到完成的时间。
- 经验法则:带宽增加速度与时延平方改进速度成比例。
集成电路技术挑战(纳米效应):
- 特征尺寸减少虽然使连线缩短,但会导致单位长度的电阻和电容增加,进而导致信号延迟增大。
- 特征尺寸减少还会导致晶体管变小,漏电流增大,从而增加单位面积的功耗。
4. 集成电路功耗的趋势:功耗的概念
功耗(Power)的概念和挑战:
- 功耗对芯片的规模提出了挑战。
- 早期的微处理器功耗仅为1/10瓦特,而2GHz的奔腾4处理器(P4)功耗达到了135瓦特。
- 技术挑战包括分配功率、散热和避免过热点。
5. 可靠性:提高可靠性的方法
可靠性(Dependability):
- 在广义上包括可靠性 (reliability)、安全性 (security) 和可用性 (availability)。
- 计算机系统的可靠性用于表示系统提供给用户服务的质量。
提高可靠性的方法: 主要方法是采用冗余(Redundancy)。
- 时间冗余:重复操作直到无错。
- 资源冗余:配置另外的相同部件,有错时用于替代出错部件。
6. 测量、报告和总结计算机性能:计算机主要性能指标
计算机主要性能指标:
- 响应(执行)时间:衡量用户感觉和系统性能。它是各方都认可的性能测量指标。
- CPU时间
- 吞吐量
- MIPS
性能评价方法:
- 理想的性能评估是运行随机取样的用户程序和操作系统命令。
- 常用方法是使用基准测试程序 (benchmarks),包括通用基准测试程序(如SPEC测试程序集)。
- 注意:通用基准测试程序有时可能产生误导,因为硬件和编译器的供应商可能会针对这些程序进行优化。
7. 计算机设计的量化原则:Amdahl定律
计算机设计的量化原则包括:
- 利用并行性(parallelism):这是改善计算机性能最重要的方法。
- 局部性原理(Principle of Locality):程序特性倾向于重用最近用过的数据和指令。包括时间局部性(最近访问过的项很可能近期被访问)和空间局部性(地址相近单元的内容趋向于被相近访问)。
- 注重经常性事件(the common case):这是计算机设计最重要和普遍的原则。简化常用事件可以提高速度(例如,简化不溢出相加的操作)。
Amdahl定律:
- 定义:采用更快的执行方式后所获得的系统性能提高,与这种执行方式的使用频率或占总执行时间的比例有关。
- Amdahl定律定义了一台计算机系统采用某种改进措施所取得的加速比。加速比反映了使用改进措施后完成一个任务比不使用改进措施完成同一任务加快的比率。
- 加速比与两个因素有关:
- 改进比例 :改进前可改进部分占整个任务执行时间的比例。
- 改进加速比 :改进前改进部分的执行时间与改进后改进部分的执行时间之比。
Amdahl定律表明,无论局部改进的速度有多快,系统整体的加速上限受到不可改进部分执行时间所限制。例如,如果一个任务有90秒是不可改进的,即使将可改进的10秒部分加速10倍(变成1秒),总执行时间也仅从100秒降到91秒。
第二章 指令系统原理与示例
1. 指令集系统结构的分类:指令集系统的不同结构
指令集系统结构最根本的区别在于处理器内部数据的存储结构不同。
主要分类依据存储结构:
- 堆栈系统结构 (Stack Architecture):
- 特点: 操作数被隐含地定位在栈顶(TOS)。
- 操作: 运算(如加法)会从堆栈中弹出操作数,结果存放在堆栈顶部的相应位置。
- 示例: 执行 时,指令包括
Push A,Push B,Add,Pop C。
- 累加器系统结构 (Accumulator Architecture):
- 特点: 一个操作数是隐含地位于累加器中。累加器既是隐含的输入操作数,也是运算结果的存放地。
- 示例: 执行 时,指令包括
Load A,Add B,Store C。
- 通用寄存器系统结构 (General-Purpose Register, GPR Architecture):
- 特点: 必须明确地指定操作数,操作数不是寄存器就是存储器地址。
- 优势: 寄存器比存储器快;编译器能高效利用寄存器来存放变量;减少了数据流量;且寄存器地址位数较少,改善了代码密度。
通用寄存器结构的子分类(按存储器访问方式):
通用寄存器ISA可根据运算类指令中包含的存储器操作数数量进一步细分。
| 分类 | 内存操作数数量(ALU) | 特点/访问方式 | 优点 | 缺点 |
|---|---|---|---|---|
| Load-Store (Reg-Reg) | 0 | 只能通过独立的 load 和 store 指令访问存储器。MIPS属于此类型。 | 指令格式简单、定长编码;代码生成简单;每条指令执行时间(时钟周期数)相近,有利于流水线实现。 | 目标代码指令数较多,指令密度低,程序体积大。 |
| Register-Memory (Reg-Mem) | 1 | 一般的指令(不只是Load/Store)可以访问存储器。 | 数据可以直接访问而不需要专门的载入指令;代码密度高。 | 源操作数易被破坏;指令编码更复杂;每条指令执行所需的时钟周期可能不同。 |
| Memory-Memory (Mem-Mem) | 2 或 3 | 所有操作数都存放在存储器中(教材中提到纯Mem-Mem结构在现实中不存在)。 | 最紧凑,不浪费寄存器作为临时空间。 | 指令长短不相同;指令操作各不相同;存储器访问成为瓶颈。 |
历史演变: 20世纪80年代后,由于成熟的编译器技术和对机器效率的重视,RISC(基于Load-Store)的简单系统成为主流。
2. 存储器寻址:大小端模式及地址对齐
存储器地址表示
现代指令系统通常都是字节寻址的,支持字节(8位)、半字(16位)、字(32位),以及多数计算机支持双字(64位)寻址。
大小端模式 (Endianness)
处理多字节数据时,不同架构存储字节顺序不同:
- 小端模式 (Little Endian): 将整个字的最低有效字节(LSB)放在地址最低有效位置上(低地址存低字节)。
- 大端模式 (Big Endian): 将整个字的最高有效字节(MSB)放在地址最低有效位置上(低地址存高字节)。
地址对齐 (Alignment)
- 概念: 假设一个数据占据 字节,其起始地址为 ,如果 ,则该数据访问是对齐的
- 重要性: 字或双字整数倍对齐访问存储器可以简化硬件实现的复杂性。即使在没有严格对齐限制的计算机中,对齐访问的程序也运行得更快,因为一次不对齐的访问可能会导致多次对齐的存储器访问。
寻址方式 (Addressing Modes)
寻址方式描述了指令中如何指定操作数的地址(常量、寄存器或存储器)。
- 最常用和基本的寻址方式包括: 立即数寻址、位移量寻址和寄存器间接寻址。
- 位移量寻址(Displacement Addressing): 它是最常用的寻址方式之一。在MIPS等架构中,位移量长度通常需要 13到16位,以覆盖大多数变量的存取范围。
- 立即数寻址(Immediate Addressing): 也是最常用的寻址方式之一。大约四分之一的数据传输和定点ALU操作使用立即数操作数。
3. MIPS系统结构:MIPS指令集结构
MIPS是一种典型的 64位 Load-Store 系统结构,其设计理念是简化指令,以利于实现高效流水线和编译器优化。
| 特征类别 | MIPS 具体描述 |
|---|---|
| 系统类型 | 简单的64位 Load-Store (Reg-Reg) 系统结构。 |
| 指令格式 | 固定长度编码(32位)。这使得机器更容易进行流水线操作和译码。MIPS有三种指令格式:I型(立即数/分支)、R型(寄存器-寄存器ALU)、J型(跳转)。 |
| 寄存器 | 32个64位通用寄存器 (GPR),其中 R0的值永远是0。32个浮点寄存器 (FPR),可用作32位单精度或64位双精度。 |
| 寻址方式 | 仅使用两种存储器寻址方式:16位立即数(用于操作数本身)和16位位移量方式(基址寻址)。 |
| 访存寻址实现 | 位移量为0时实现寄存器间接寻址;R0作为基址寄存器时实现16位绝对寻址。 |
| 数据类型 | 定点:字节、半字、字、双字。浮点:32位单精度和64位双精度。 |
| ALU操作 | 所有的ALU指令都是寄存器-寄存器指令(R型)。支持立即数寻址。 |
| 控制流 | 采用跳转和分支指令。分支目标地址是基于PC的相对寻址(16位带符号位移量左移2位 + PC+4)。MIPS使用条件寄存器来测试条件(而非条件码),优点是简单。 |
MIPS指令执行频率: 根据在SPECint2000程序上的定点平均值测试,MIPS中最常用的指令包括:载入 (26%)、加 (19%)、条件转移 (12%) 和 存储 (10%)。这印证了指令系统的一般规律:最常用的是简单指令。
第三章 单周期 MIPS 处理器的设计
事实上,计算机往往由五大部件组成,分别是输入、输出、控制部件、数据通路和存储器。对于 MIPS 指令子集,我们设计的关键都是构建数据通路和控制部件。
我们又知道,程序员实际上要根据我们的指令集去做相关的工作,第一步就是分析设计指令集,然后建立数据通路,从而分析出所有指令需要的控制信号,建立控制信号的真值表/最后使用逻辑电路实现控制信号真值表,形成产生控制信号的控制部件。
MIPS 的指令子集有几种指令,类似 lw 和 sw 这些存储器访问指令,也就是 I 型指令,还有 add sub and or 和 slt 这种 R 型指令。当然,我们有通过计算进行分支跳转的 beq 指令,他是访存的 i 型指令,还有直接跳转的 j 型指令。
MIPS 的每一条指令固定为 32 位。


根据上面的两个图片可以看到,我们的所有的 R 型指令的 op 都是 0,然后我们的 I 型指令则用 16 位表示一个立即数, I 型指令通过 op 码互相区分,实现 rt <-> M[rs + immediate]
j 型指令则是利用对齐,表示了 28 位地址空间,剩下的 4 位借用我们的 PC 的高四位。所以实际上 j 是不能大范围跳转的。
接下来我们看一下具体的数据通路。
我们的 add 主要是依赖于 ALU 和寄存器堆。

ALU 输入的是 A 和 B 的数据,将 SUM 的数据从 SUM 总线出去,同时有 op 这个线来控制运算类型。

我们这里会输入三个寄存器号,Ra 的数据会从 A 出去,而 Rb 的数据会从 B 出去,而时钟边沿变化的时候Data 的数据会写入 Rb。
按这个思路,我们完成取指后,就可以设计出这样的电路。

而单纯的 R 型指令,命令本身就带有对应的 immediate 给到 ALU。不过要涉及到和存储器的交互。


除此以外,还有我们的 I 型指令 beq

如果我们用这样的设计,就可以合并 R 型指令和 I 型指令的运算,一个是单纯的运算,一个是计算实际的地址,然后作为 ADDR 的输入,然后将对应的寄存器结果作为 WD 或者 RD。

我们知道此时如果是 R 型指令可能要从 ALU 的 sum 直接写寄存器,反之如果是 store 则要用 MEM 的 RD 的数据接入寄存器堆的 Data。