为什么是根据指令集设计 CPU,而不是根据 CPU 架构设计指令集?
有点出乎意料。
我一直以为应该是先有基本的CPU的框架,再在cpu框架上设计各种指令集。
但是,我看到很多文章都是先有一套指令集,然后再设计cpu来配合这套指令集。
为什么会呢?
另外,如果是指令集在先,那么是不是意味著:
1、我们可以在arm上去实现x86、riscv的指令集?
2、理论上谁都可以造一份指令集出来?cpu的开发就是个体力活了?
3、如果指令集有bug怎么办?
ARM,x86,这种可以叫做架构,
ARMv7,ARMv8,x86,amd64,AVX这种可以叫指令集,
A52,A72,skylake,zen这种可以叫微架构。
所以第一个问题你是想用一个指令集去实现另一个指令集?当然可以啦, 中间加一层二进位转换,surface pro x用ARM跑windows不就是嘛。
当然你想问的可能是用ARM处理器的微架构(硬体)去跑x86的指令集?那就不行了,指令集和微架构是相辅相成的,难以剥离的。
第二个问题,造指令集,理论上是谁都可以造。但CPU开发却不是体力活那么简单。
当然你按体力活的方法去搭硬体也不是不可以,只不过从性能上说就不好看了。更重要的是如果你指令集设计得太不合理或者难度太高的话就GG了。
先有指令集再造硬体的说法是合理的,就像软体开发要先定需求,写开发文档再写代码一样。
当然很多在职码农也会反驳说自己公司是边写代码边写文档,或者写了代码没有文档,但这样就很难团队间合作了咯。而造CPU硬体本身的难度通常是大于普通中小软体开发的,牵一发而动全身。
第三个问题,指令集本身复杂度是会很高,但限定了规则的话其实还没那么容易出错的。
但相比之下微架构设计这种硬体层面的东西才更复杂,更容易出错。现在CPU出bug很多啊,比如Intel就经常要发微码去更新填补漏洞,再比如TSX指令集的硬体设计也是两次出bug被禁用到现在。还比如spectre这样的漏洞,就很难补。
换句话说,指令集本身只是规定了什么对外可见,什么操作对外提供,哪些要求限制依赖需要满足。事实上微架构的重要性可以说比指令性更高,能发挥的余地也更大。
比如x86这么多年了,本质上没做太大修改,但底下硬体明明已经翻天覆地面目全非了。
指令集算是介面,微架构是内部实现。介面出bug是大问题,而内部实现更加复杂,出bug就寻常多了。
至于你说的,先造好CPU硬体再在基础上设计指令集……但是指令集一改,硬体或多或少也要跟著改,流片不要钱的嘛……
不过大家这时候可能会上FPGA搞设计和验证,这也算是变相符合了你说的做法吧。
well,事实上,是同时进行的。
通常,人们谈到CPU的指令集,是指x86,ARM这些。然而,实际上CPU真正在执行的时候,(大部分)并非是直接执行这些指令。
学过CPU微架构的话,应该知道CPU的指令队列连接著一个解码器。这个解码器就是将上面的指令集翻译成CPU真正的操作码,通常称为(OP)。
因为外部的指令集决定了上层软体环境,如果自造一套指令集,则等于抛弃了从编译器到网页脚本这整个现存的软体环境,除非是军事医疗等特别领域,对于通用领域来说这等于自己挖坑,对于CPU的设计来说是致命的。
然而另外一方面,CPU要实现省电、高性能等要求,指令集如果一成不变,则会对CPU当中的数字电路设计形成很大制约。况且,还有复杂的专利保护等问题。所以,当今CPU多数内部有另外一套本地的操作码,但是对于外部则以通用指令集公开。这样在保证兼容性的同时,可以对CPU内部的设计进行很多优化升级,并且容易绕开其它公司的专利,形成自己的核心技术。
至于非x86架构的CPU执行x86的指令集,这是完全可以(虽然有一定限制)并且实际上这样的产品过去存在过。比如索尼的PCG-U3: