处理器体系结构
- 现代微处理器可以称得上是人类创造出的最复杂的系统之一。一块手指甲大小的硅片上,可以容纳一个完整的高性能处理器、大的高速缓存,以及用来连接到外部设备的逻辑电路。
- 处理器必须执行一系列指令,每条指令执行某个简单操作,例如两个数相加。指令被编码为由一个或多个字节序列组成的二进制格式。一个处理器支持的指令和指令的字节级编码称为它的指令级体系结构(
Instruction-Set Architecture,ISA
)。不同的处理器"家族",例如Intel IA32
和x86-64
、IBM/Freescale Power
和ARM
处理器家族,都有不同的ISA
。一个程序编译成在一种机器上运行,就不能在另一种机器上运行。因此,ISA
在编译器编写者和处理器设计人员之间提供了一个概念抽象层,编译器编写者只需要知道允许哪些指令,以及它们是如何编码的;而处理器设计者必须建造出执行这些指令的处理器。
逻辑设计和硬件控制语言HCL
- 在硬件设计中,用电子电路来计算对位进行运算的函数,以及在各种存储器单元中存储位,大多数现代电路技术都是用信号线上的高电压或低电压来表示不同的位置。
- 在当前的技术中,逻辑1是用1.0伏特左右的高电压表示的,而逻辑0是用0.0伏特左右的低电压表示的。
- 要实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器单元,以及控制存储器单元更新的时钟信号。
逻辑门
- 逻辑门是数字电路的基本计算单元。它们产生的输出,等于它们输入位值的某个布尔函数。逻辑门总是活动的(
active
),一旦一个门的输入变化了,在很短的时间内,输出就会响应的变化。
组合电路
- 将很多的逻辑门组合成一个网,就能构建计算块(
computational block
),称为组合电路(combinational circuits
)。如何构建这些网有几个限制:- 每个逻辑门的输入必须连接到下述选项之一:
- 一个系统输入(称为主输入)
- 某个存储器单元的输出
- 某个逻辑门的输出
- 两个或多个逻辑门的输出不能连接在一起。否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障
- 这个网必须是无环的。也就是在网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义。
- 每个逻辑门的输入必须连接到下述选项之一:
存储器和时钟
- 组合电路从本质上讲,不存储任何信息。相反,它们只是简单地响应输入信号,产生等于输入的某个函数的输出。
- 为了产生时序电路(
sequential circuit
),也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。 - 存储设备都是由同一个时钟控制的,时钟是一个周期性信号,决定什么时候要把新值加载到设备中。
- 考虑两类存储器设备:
- 时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值
- 随机访问存储器(简称内存)存储多个字,用地址来选择该读或该写哪个字。随机访问存储器的例子
- 处理器的虚拟内存系统,硬件和操作系统软件结合起来使处理器可以在一个很大的地址空间内访问任意的字
- 寄存器文件,在此,寄存器标识符作为地址
将处理组织成阶段
- 通常,处理一条指令包括很多操作。将它们组织成某个特殊的阶段序列,即使指令的动作差异很大,但所有的指令都遵循统一的序列。下面使关于各个阶段以及各阶段内执行操作的简略描述
- 取指(
fetch
):取指阶段从内存读取指令字节,地址为程序计数器(PC
)的值。 - 译码(
decode
):译码阶段从寄存器文件读入最多两个操作数,得到值valA
和/
或valB
。 - 执行(
execute
):在执行阶段,算术/逻辑单元(ALU
)要么执行指令指明的操作,计算内存引用的有效地址,要么增加或减少栈指针。 - 访存(
memory
):访存阶段可以将数据写入内存,或者从内存中读出数据。读出的值位valM
- 写回(
write back
):写回阶段最多可以写两个结果到寄存器文件 - 更新
PC
(PC update
):将PC
设置成下一条指令的地址
- 取指(
流水线
流水线操作的详细说明
- 随着时钟周而复始地上升和下降,不同的指令就会通过流水线的各个阶段,不会相互干扰。