現(xiàn)代微處理器可以稱得上是人類創(chuàng)造出的最復雜的系統(tǒng)之 谐算。一塊手指甲大小的硅片上熟尉,可以容納一個完整的高性能處理器、大的高速緩存洲脂,以及用來連接到外部設備的邏輯電路斤儿。從性能上來說,今天在 塊芯片上實現(xiàn)的處理器巳經(jīng)使 20 年前價值 1000 萬美元恐锦、房間那么大的超級計算機相形見細了往果。即使是在像手機、導航系統(tǒng)和可編程恒溫器這樣的日常設備中的嵌入式處理器一铅,也比早期計算機開發(fā)者所能想到的強大得多陕贮。
到目前為止,我們看到的計算機系統(tǒng)只限于機器語言程序級潘飘。我們知道處理器必須執(zhí)行一系列指令肮之,每條指令執(zhí)行某個簡單操作,例如兩個數(shù)相加卜录。指令被編碼為由一個或多個字節(jié)序列組成的二進制格式戈擒。一個處理器支持的指令和指令的字節(jié)級編碼稱為它的指令集體系結(jié)構(gòu) (Instruction-Set Architecture, ISA)。不同的處理器“家族”艰毒,例如 Intel IA32 和 x86-64筐高、IBM/Freescale Power 和 ARM 處理器家族,都有不同的 ISA 。一個程序編譯成在一種機器上運行柑土,就不能在另一種機器上運行蜀肘。另外,同一個家族里也有很多不同型號的處理器稽屏。雖然每個廠商制造的處理器性能和復雜性不斷提高幌缝,但是不同的型號在 ISA 級別上都保持著兼容。一些常見的處理器家族(例如 x86-64) 中的處理器分別由多個廠商提供诫欠。因此涵卵, ISA 在編譯器編寫者和處理器設計人員之間提供了一個概念抽象層,編譯器編寫者只需要知道允許哪些指令荒叼,以及它們是如何編碼的轿偎;而處理器設計者必須建造出執(zhí)行這些指令的處理器。
本章將簡要介紹處理器硬件的設計被廓。我們將研究一個硬件系統(tǒng)執(zhí)行某種 ISA 指令的方式坏晦。這會使你能更好地理解計算機是如何工作的,以及計算機制造商們面臨的技術(shù)挑戰(zhàn)嫁乘。一個很重要的概念是昆婿,現(xiàn)代處理器的實際工作方式可能跟 ISA 隱含的計算模型大相徑庭。ISA 模型看上去應該是順序指令執(zhí)行蜓斧,也就是先取出一條指令仓蛆,等到它執(zhí)行完畢,再開始下一條挎春。然而看疙,與一個時刻只執(zhí)行一條指令相比,通過同時處理多條指令的不同部分直奋,處理器可以獲得更高的性能能庆。為了保證處理器能得到同順序執(zhí)行相同的結(jié)果,人們采用了一些特殊的機制脚线。在計算機科學中搁胆,用巧妙的方法在提高性能的同時又保待一個更簡單、更抽象模型的功能邮绿,這種思想是眾所周知的渠旁。在 Web 瀏覽器或平衡二叉樹和哈希表這樣的信息檢索數(shù)據(jù)結(jié)構(gòu)中使用緩存,就是這樣的例子斯碌。
你很可能永遠都不會自己設計處理器一死。這是專家們的任務,他們工作在全球不到 100 家的公司里傻唾。那么為什么你還應該了解處理器設計呢?
- 從智力方面來說,處理器設計是非常有趣而且很重要的冠骄。學習事物是怎樣工作的有其內(nèi)在價值伪煤。了解作為計算機科學家和工程師日常生活一部分的一個系統(tǒng)的內(nèi)部工作原理(特別是對很多人來說這還是個謎),是件格外有趣的事情凛辣。處理器設計包括許多好的工程實踐原理抱既。它需要完成復雜的任務,而結(jié)構(gòu)又要盡可能簡單和規(guī)則扁誓。
- 理解處理器如何工作能幫助理解整個計算機系統(tǒng)如何工作防泵。在第 6 章,我們將講述存儲器系統(tǒng)蝗敢,以及用來創(chuàng)建很大的內(nèi)存映像同時又有快速訪問時間的技術(shù)捷泞。看看處理器端的處理器——內(nèi)存接口寿谴,會使那些講述更加完整锁右。
- 雖然很少有人設計處理器,但是許多人設計包含處理器的硬件系統(tǒng)讶泰。將處理器嵌人到現(xiàn)實世界的系統(tǒng)中咏瑟,如汽車和家用電器,已經(jīng)變得非常普通了痪署。嵌入式系統(tǒng)的設計者必須了解處理器是如何工作的码泞,因為這些系統(tǒng)通常在比桌面和基于服務器的系統(tǒng)更低抽象級別上進行設計和編程。
- 你的工作可能就是處理器設計狼犯。雖然生產(chǎn)處理器的公司很少浦夷,但是研究處理器的設計人員隊伍已經(jīng)非常巨大了,而且還在壯大辜王。一個主要的處理器設計的各個方面大約涉及 1000 多人劈狐。
本章首先定義一個簡單的指令集,作為我們處理器實現(xiàn)的運行示例呐馆。因為受 x86-64指令集的啟發(fā)肥缔,它被俗稱為 "x86",所以我們稱我們的指令集為 "Y86-64" 指令集汹来。與 x86-64 相比续膳,Y86-64 指令集的數(shù)據(jù)類型、指令和尋址方式都要少一些收班。它的字節(jié)級編碼也比較簡單坟岔,機器代碼沒有相應 x86-64 代碼緊湊,不過設計它的 CPU 譯碼邏輯也要簡單一些摔桦。雖然 Y86-64 令集很簡單社付,它仍然足夠完整承疲,能讓我們寫一些處理整數(shù)的程序。設計一個實現(xiàn) Y86-64 的處理器要求 我們解決許多處理器設計者同樣會面對的問題鸥咖。
接下來會提供一些數(shù)字硬件設計的背景燕鸽。我們會描述處理器中使用的基本構(gòu)件塊,以及它們?nèi)绾芜B接起來和操作啼辣。這些介紹是建立在第 2 章對布爾代數(shù)和位級操作的討論的基礎上的啊研。我們還將介紹一種描述硬件系統(tǒng)控制部分的簡單語言, HCL(Hardw re Control Language, 硬件控制語言)鸥拧。然后党远,用它來描述我們的處理器設計。即使你已經(jīng)有了一些邏輯設計的背景知識富弦,也應該讀讀這個部分沟娱,用以了解我們的特殊符號表示方法。
作為設計處理器的第一步舆声,我們給出一個基于順序操作花沉、功能正確但是有點不實用的 Y86-64 處理器。這個處理器每個時鐘周期執(zhí)行一條完 Y86-64 指令媳握。所以它的時鐘必須足夠慢碱屁,以允許在一個周期內(nèi)完成所有的動作。這樣一個處理器是可以實現(xiàn)的蛾找,但是它的性能遠遠低于同樣的硬件應該能達到的性能娩脾。
以這個順序設計為基礎,我們進行一系列的改造打毛,創(chuàng)建一個流水線化的處理器 (pipelined processor)柿赊。這個處理器將每條指令的執(zhí)行分解成五步,每個步驟由一個獨立的硬件部分或階段 (stage) 來處理幻枉。指令步經(jīng)流水線的各個階段碰声,且每個時鐘周期有一條新指令進入流水線。所以熬甫,處理器可以同時執(zhí)行五條指令的不同階段胰挑。為了使這個處理器保留 Y86-64 ISA 的順序行為,就要求處理很多冒險或沖突 (hazard) 情況椿肩,冒險就是一條指令的位置或操作數(shù)依賴于其他仍在流水線中的指令瞻颂。
我們設計了一些工具來研究和測試處理器設計。其中包括 Y86-64 的匯編器郑象、在你的機器上運行 Y86-64 程序的模擬器贡这,還有針對兩個順序處理器設計和一個流水線化處理器設計的模擬器。這些設計的控制邏輯用 HCL 符號表示的文件描述厂榛。通過編輯這些文件和重新編譯模擬器盖矫,你可以改變和擴展模擬器行為丽惭。我們還提供許多練習,包括實現(xiàn)新的指令和修改機器處理指令的方式炼彪。還提供測試代碼以幫助你評價修改的正確性吐根。這些練習將極大地幫助你理解所有這些內(nèi)容正歼,也能使你更理解處理器設計者面臨的許多不同的設計選擇辐马。
網(wǎng)絡旁注 ARCH:VLOG 給出了用 Verilog 硬件描述語言描述的流水線化的 Y86-64 處理器。其中包括為基本的硬件構(gòu)建塊和整個的處理器結(jié)構(gòu)創(chuàng)建模塊局义。我們自動地將控制邏輯的 HCL 描述翻譯成 Verilog 喜爷。首先用我們的模擬器調(diào)試 HCL 描述,能消除很多在硬件設計中會出現(xiàn)的棘手的問題 萄唇。給定一個 Verilog 描述檩帐,有商業(yè)和開源工具來支持模擬和邏樣合成 (logic synthesis),產(chǎn)生實際的微處理器電路設計另萤。因此湃密,雖然我們在此花費大部分精力創(chuàng)建系統(tǒng)的圖形和文字描述,寫軟件的時候也會花費同樣的精力四敞,但是這些設計能夠自動地合成泛源,這表明我們確實在創(chuàng)建一個能夠用硬件實現(xiàn)的系統(tǒng)。