跳转到内容

微处理器设计/设计步骤

来自维基教科书,开放世界中的开放书籍

在设计新的微处理器或微控制器单元时,可以遵循一些通用的步骤,使流程更具逻辑性。这些步骤可以进一步细分为更小的任务,以便更轻松地处理。设计新微处理器的通用步骤如下

  1. 确定新处理器应该具备的功能。
  2. 规划数据通路以处理必要的功能。
  3. 定义机器码指令格式(ISA)。
  4. 构建控制数据通路的必要逻辑。

我们将在下面讨论这些步骤中的每一个。

确定机器功能

[编辑 | 编辑源代码]

在你开始设计新的处理器单元之前,重要的是首先问问自己为什么要设计它。你的处理器将实现哪些现有处理器无法实现的新功能?请记住,使用现有芯片总是比设计和制造新芯片更便宜。

一些开始的问题

  1. 这个芯片是嵌入式芯片、通用芯片还是完全不同的类型?
  2. 在资源、价格、功耗或速度方面是否存在任何限制?

考虑到这一点,我们需要问问我们的芯片将做什么

  1. 它是否具有整数、浮点或定点算术,或者三者的组合?
  2. 它是否具有标量或向量运算能力?
  3. 它是否自包含,还是必须与许多外部外设接口?
  4. 它是否支持中断?如果是,中断延迟是多少?中断响应抖动是多少?

我们还需要问问自己,机器是否支持广泛的指令,或者它是否只有有限的指令集。更多的指令会使设计更困难,但会使编程和使用芯片更容易。另一方面,使用更少的指令更容易设计,但可能更难且更昂贵地进行编程。

规划你的芯片应具有的基本算术运算

  • 加法/减法
  • 乘法
  • 除法
  • 移位和旋转
  • 逻辑运算:AND、OR、XOR、NOR、NOT等。

列出你的机器的其他功能

  • 无条件跳转
  • 条件跳转(以及什么条件?)
  • 堆栈操作(压栈、出栈)

一旦我们知道我们的芯片应该做什么,就更容易规划我们数据通路的框架。

设计数据通路

[编辑 | 编辑源代码]

我们首先需要确定我们的处理器将使用哪种ALU架构

  • 累加器
  • 堆栈
  • 寄存器
  • 以上三者的组合

此决定比任何其他决定都会对你的最终设计产生最大的影响。在你做出此决定之前,不要继续设计流程。一旦你有了ALU架构,你就可以创建你的存储元素(堆栈或寄存器文件),然后可以规划你的ALU。

创建ISA

[编辑 | 编辑源代码]

一旦我们有了基本的数据通路,我们就可以开始设计我们的ISA。我们需要考虑一些事情

  1. 这个处理器是RISC、CISC还是VLIW?
  2. 机器字长是多少?
  3. 如何处理立即数?哪些指令可以接受立即数?

一旦我们有了机器码的基础,我们经常需要确定我们的处理器是否与高级语言兼容。具体来说,是否存在任何可用于函数调用和返回的指令?

确定RISC中指令字长的长度是一个非常重要的问题,值得认真思考。为了获得额外的灵活性,你可以使用可变长度指令集(就像大多数CISC机器一样),但这会以增加(并且更复杂)的指令解码逻辑为代价。如果指令字太长,程序员将无法在内存中放入太多指令。如果指令字太小,将没有足够的空间容纳所有必要的信息。在具有数兆字节甚至千兆字节RAM的台式PC上,较大的指令字不是什么大问题。然而,在具有有限程序ROM的嵌入式系统中,指令字的长度会直接影响潜在程序的大小和芯片的实用性。

每个指令都应该有一个关联的操作码,并且通常所有指令的操作码字段的长度都应该是恒定的,以减少解码器的复杂性。操作码字段的长度会直接影响可以实现的独特指令的数量。如果操作码字段太小,你将没有足够的空间来指定所有指令。如果操作码太大,你将在指令字中浪费宝贵的位。

有些指令需要比其他指令更大。例如,处理立即数、内存位置或跳转地址的指令通常比只处理寄存器的指令更大。因此,只处理寄存器的指令将有额外的空间可用作操作码字段的扩展。

示例:MIPS R型

在MIPS架构中,只处理寄存器的指令称为R型指令。对于32个寄存器,寄存器地址只有5位宽。MIPS操作码为6位宽。对于操作码和三个寄存器地址(两个源寄存器和一个目标寄存器),R型指令仅使用32个可用位中的21个。

剩下的11位被分成两个额外的字段:Shamt,一个5位立即数,控制移位或旋转指令的移位位置数量;以及Func。Func是一个6位字段,包含有关R型指令的附加信息。由于Func字段的存在,所有R型指令的操作码都为0。

指令集设计

[编辑 | 编辑源代码]

选择特定的指令集通常更像是一门艺术而不是一门科学。

从历史上看,对什么是“好的”指令集有不同的看法。

  • 早期的CISC时代专注于创建让经验丰富的汇编语言程序员喜欢编程的指令集——“代码密度”是一个常见的指标。
  • 早期的RISC时代专注于创建运行几个C语言基准测试程序的指令集,这些程序使用相对原始的编译器进行编译,速度非常快——“每条指令的周期数”,后来“每周期指令数”被认为是实现低“运行基准测试的时间”的重要组成部分。
  • 多任务操作系统的兴起(以及共享内存并行处理器)导致了非阻塞同步的发现以及支持它的必要指令。
  • 专用于单个应用程序的CPU(ASIC或FPGA)导致了为一个特定应用程序定制CPU的想法[1]

构建控制逻辑

[编辑 | 编辑源代码]

一旦我们有了数据通路和ISA,我们就可以开始构建我们的主要控制单元的逻辑。这些单元通常被实现为有限状态机,我们可以尝试以逻辑的方式将ISA映射到控制单元。

我们在后面的章节中详细介绍了控制单元设计,微处理器设计/控制和数据通路微处理器设计/指令解码器

设计地址通路

[编辑 | 编辑源代码]

如果简单的虚拟 == 物理地址路径足够满足您的 CPU,您可以跳过本节。

大多数处理器都具有非常简单的地址路径 - 地址位来自 PC 或其他一些程序员可见的寄存器,或者直接来自某些指令,并且它们直接应用于地址总线。

许多通用处理器都具有更复杂的地址路径:用户级程序运行就像它们具有简单的地址路径一样,但应用于地址总线的物理地址与程序员可见的地址有很大不同。这使得虚拟内存、内存保护和其他期望的功能成为可能。

我们将在

验证设计

[编辑 | 编辑源代码]

设计 CPU 的人通常会花更多时间进行功能验证,而不是所有其他步骤的总和。

进一步阅读

[编辑 | 编辑源代码]
  • Kong 和 Patterson。 “指令集设计”。 1995。 [1]

参考资料

[编辑 | 编辑源代码]
  1. "从应用程序生成指令集和微架构" 由 Ing-Jer Huang 和 Alvin M. Despain 撰写
华夏公益教科书