跳轉到內容

微處理器設計/設計步驟

來自華夏公益教科書

在設計新的微處理器或微控制器單元時,可以遵循一些通用的步驟,使流程更具邏輯性。這些步驟可以進一步細分為更小的任務,以便更輕鬆地處理。設計新微處理器的通用步驟如下

  1. 確定新處理器應該具備的功能。
  2. 規劃資料通路以處理必要的功能。
  3. 定義機器碼指令格式(ISA)。
  4. 構建控制資料通路的必要邏輯。

我們將在下面討論這些步驟中的每一個。

確定機器功能

[編輯 | 編輯原始碼]

在你開始設計新的處理器單元之前,重要的是首先問問自己為什麼要設計它。你的處理器將實現哪些現有處理器無法實現的新功能?請記住,使用現有晶片總是比設計和製造新晶片更便宜。

一些開始的問題

  1. 這個晶片是嵌入式晶片、通用晶片還是完全不同的型別?
  2. 在資源、價格、功耗或速度方面是否存在任何限制?

考慮到這一點,我們需要問問我們的晶片將做什麼

  1. 它是否具有整數、浮點或定點算術,或者三者的組合?
  2. 它是否具有標量或向量運算能力?
  3. 它是否自包含,還是必須與許多外部外設介面?
  4. 它是否支援中斷?如果是,中斷延遲是多少?中斷響應抖動是多少?

我們還需要問問自己,機器是否支援廣泛的指令,或者它是否只有有限的指令集。更多的指令會使設計更困難,但會使程式設計和使用晶片更容易。另一方面,使用更少的指令更容易設計,但可能更難且更昂貴地進行程式設計。

規劃你的晶片應具有的基本算術運算

  • 加法/減法
  • 乘法
  • 除法
  • 移位和旋轉
  • 邏輯運算:AND、OR、XOR、NOR、NOT等。

列出你的機器的其他功能

  • 無條件跳轉
  • 條件跳轉(以及什麼條件?)
  • 堆疊操作(壓棧、出棧)

一旦我們知道我們的晶片應該做什麼,就更容易規劃我們資料通路的框架。

設計資料通路

[編輯 | 編輯原始碼]

我們首先需要確定我們的處理器將使用哪種ALU架構

  • 累加器
  • 堆疊
  • 暫存器
  • 以上三者的組合

此決定比任何其他決定都會對你的最終設計產生最大的影響。在你做出此決定之前,不要繼續設計流程。一旦你有了ALU架構,你就可以建立你的儲存元素(堆疊或暫存器檔案),然後可以規劃你的ALU。

建立ISA

[編輯 | 編輯原始碼]

一旦我們有了基本的資料通路,我們就可以開始設計我們的ISA。我們需要考慮一些事情

  1. 這個處理器是RISC、CISC還是VLIW?
  2. 機器字長是多少?
  3. 如何處理立即數?哪些指令可以接受立即數?

一旦我們有了機器碼的基礎,我們經常需要確定我們的處理器是否與高階語言相容。具體來說,是否存在任何可用於函式呼叫和返回的指令?

確定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]

構建控制邏輯

[編輯 | 編輯原始碼]

一旦我們有了資料通路和ISA,我們就可以開始構建我們的主要控制單元的邏輯。這些單元通常被實現為有限狀態機,我們可以嘗試以邏輯的方式將ISA對映到控制單元。

我們在後面的章節中詳細介紹了控制單元設計,微處理器設計/控制和資料通路微處理器設計/指令解碼器

設計地址通路

[編輯 | 編輯原始碼]

如果簡單的虛擬 == 物理地址路徑足夠滿足您的 CPU,您可以跳過本節。

大多數處理器都具有非常簡單的地址路徑 - 地址位來自 PC 或其他一些程式設計師可見的暫存器,或者直接來自某些指令,並且它們直接應用於地址匯流排。

許多通用處理器都具有更復雜的地址路徑:使用者級程式執行就像它們具有簡單的地址路徑一樣,但應用於地址匯流排的物理地址與程式設計師可見的地址有很大不同。這使得虛擬記憶體、記憶體保護和其他期望的功能成為可能。

我們將在

驗證設計

[編輯 | 編輯原始碼]

設計 CPU 的人通常會花更多時間進行功能驗證,而不是所有其他步驟的總和。

進一步閱讀

[編輯 | 編輯原始碼]
  • Kong 和 Patterson。 “指令集設計”。 1995。 [1]

參考資料

[編輯 | 編輯原始碼]
  1. "從應用程式生成指令集和微架構" 由 Ing-Jer Huang 和 Alvin M. Despain 撰寫
華夏公益教科書