微处理器设计/设计步骤
在设计新的微处理器或微控制器单元时,可以遵循一些通用的步骤,使流程更具逻辑性。这些步骤可以进一步细分为更小的任务,以便更轻松地处理。设计新微处理器的通用步骤如下
- 确定新处理器应该具备的功能。
- 规划数据通路以处理必要的功能。
- 定义机器码指令格式(ISA)。
- 构建控制数据通路的必要逻辑。
我们将在下面讨论这些步骤中的每一个。
在你开始设计新的处理器单元之前,重要的是首先问问自己为什么要设计它。你的处理器将实现哪些现有处理器无法实现的新功能?请记住,使用现有芯片总是比设计和制造新芯片更便宜。
一些开始的问题
- 这个芯片是嵌入式芯片、通用芯片还是完全不同的类型?
- 在资源、价格、功耗或速度方面是否存在任何限制?
考虑到这一点,我们需要问问我们的芯片将做什么
- 它是否具有整数、浮点或定点算术,或者三者的组合?
- 它是否具有标量或向量运算能力?
- 它是否自包含,还是必须与许多外部外设接口?
- 它是否支持中断?如果是,中断延迟是多少?中断响应抖动是多少?
我们还需要问问自己,机器是否支持广泛的指令,或者它是否只有有限的指令集。更多的指令会使设计更困难,但会使编程和使用芯片更容易。另一方面,使用更少的指令更容易设计,但可能更难且更昂贵地进行编程。
规划你的芯片应具有的基本算术运算
- 加法/减法
- 乘法
- 除法
- 移位和旋转
- 逻辑运算:AND、OR、XOR、NOR、NOT等。
列出你的机器的其他功能
- 无条件跳转
- 条件跳转(以及什么条件?)
- 堆栈操作(压栈、出栈)
一旦我们知道我们的芯片应该做什么,就更容易规划我们数据通路的框架。
我们首先需要确定我们的处理器将使用哪种ALU架构
- 累加器
- 堆栈
- 寄存器
- 以上三者的组合
此决定比任何其他决定都会对你的最终设计产生最大的影响。在你做出此决定之前,不要继续设计流程。一旦你有了ALU架构,你就可以创建你的存储元素(堆栈或寄存器文件),然后可以规划你的ALU。
一旦我们有了基本的数据通路,我们就可以开始设计我们的ISA。我们需要考虑一些事情
- 这个处理器是RISC、CISC还是VLIW?
- 机器字长是多少?
- 如何处理立即数?哪些指令可以接受立即数?
一旦我们有了机器码的基础,我们经常需要确定我们的处理器是否与高级语言兼容。具体来说,是否存在任何可用于函数调用和返回的指令?
确定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]
- 病毒和其他恶意软件的兴起促使人们认识到 Popek和Goldberg虚拟化需求。
一旦我们有了数据通路和ISA,我们就可以开始构建我们的主要控制单元的逻辑。这些单元通常被实现为有限状态机,我们可以尝试以逻辑的方式将ISA映射到控制单元。
我们在后面的章节中详细介绍了控制单元设计,微处理器设计/控制和数据通路 和 微处理器设计/指令解码器。
如果简单的虚拟 == 物理地址路径足够满足您的 CPU,您可以跳过本节。
大多数处理器都具有非常简单的地址路径 - 地址位来自 PC 或其他一些程序员可见的寄存器,或者直接来自某些指令,并且它们直接应用于地址总线。
许多通用处理器都具有更复杂的地址路径:用户级程序运行就像它们具有简单的地址路径一样,但应用于地址总线的物理地址与程序员可见的地址有很大不同。这使得虚拟内存、内存保护和其他期望的功能成为可能。
我们将在
设计 CPU 的人通常会花更多时间进行功能验证,而不是所有其他步骤的总和。
- Kong 和 Patterson。 “指令集设计”。 1995。 [1]
- ↑ "从应用程序生成指令集和微架构" 由 Ing-Jer Huang 和 Alvin M. Despain 撰写