MACPU-ISA
——近朱者赤,近墨者黑
有关MACPU ISA的具体设计,可以参见MACPU-FPGA仓库中的Instruction.md
CPU,从功能而言,是很简单的:能够按部就班地顺序执行运算步骤,括弧,如果性能再高点就好了。如果仅考虑按部就班地执行运算步骤,那么世界很美好——最古老的CPU被设计出来的时候,就使用来干这个的,显然,类似于Intel 4004之流的CPU也不可能有太高的性能,对比如今动辄数吉赫兹频率的CPU,其最高工作频率(740KHz)是在是太不够看了。
一般来说,要设计一款CPU,首先要决定其可以执行的指令。这些指令的数量一般会有很多,不过,我们也可以仅使用个位数的指令来设计一款CPU,但是那将会为配套的编译器带来一些问题。这些指令的集合就是指令集架构,它解决了CPU可以做什么的问题。但是对于一款CPU,仅有指令集架构是不够的,我们还需要提供一些其它的信息:
- 指令的编码格式:CPU是无法直接理解人的语言的。如果你对它说,告诉我1 + 1等于几,它是玩玩无法做出回应的。它只能理解数字信号:0、1和它们的组合。因此,我们需要将每一条指令翻译成0、1和它们的组合,而如何进行翻译则完全由设计者决定。
- 寄存器:寄存器是CPU中用来临时存储数据的东西。受限于电路实现,这些东西的存在是必须的。
- 异常处理:当CPU发现错误的时候,应该做出怎样的反应?错误将会被如何进行处理?由此引发的一系列问题直接关系到CPU工作是否稳定。
- 中断:当发生突发事件时,CPU应该怎样应对?
- ……
这一些列的信息,就可以开始规划CPU,把问题由做什么进一步地推进到需要怎么做。这些信息,像一个框架,为CPU的具体实现提供了重要参考依据,我们一般称其为“ISA”,即Instruction-Set Architecture,指令集体系结构。
由于ISA将会牵扯到很多方面的具体实现,因此,在设计ISA时就应该同时考虑到这些因素。一个设计得足够好的ISA一定可以帮助同时统筹软件实现和物理逻辑实现的各方各面。可以说,ISA才是整个CPU和系统实现的灵魂,所以在开始设计ISA时就下足够的功夫无疑是一件值得的事情。
在实际设计ISA时,以我个人的经验而言,时长需要考虑如下问题:
- 是使用简单的物理实现,简单的指令集,配合复杂的编译器优化,还是使用复杂的物理实,复杂的指令集,现配合简单的编译器优化?
- 对于一条具体的指令,当有多种具体的物理实现方法时,应该怎么选择?
- 面对持续增长的算力需求,在更新换代CPU时,应该如何保持ISA的兼容性,并且添加新的东西?
- ……
CPU发展的路程走过了五十甚至六十年,而各大团体,公司和组织对这些问题都已经有了深入的研究,目前,大家普遍认为RISC(精简指令集)的执行效率要明显高于CISC(复杂指令集),在这方面,走在世界前列的无疑是RISC-V,其极低的功耗,完全开源的设计理念正在引来世界各大公司的广泛关注。