為什麼是根據指令集設計 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: