課程鏈接:
計算機組成_北京大學_中國大學MOOC(慕課)
5 - 1 - 501-處理器的設計步驟(14-'49--)_嗶哩嗶哩_bilibili
處理器,或者說是CPU,是現(xiàn)代計算機中最為復雜的一個部件。不過先不要勸退,要設計一個簡單但是能工作的處理器,也沒有那么的神秘。這一節(jié)我們就一起來探索處理器是怎么設計出來的。
0. 處理器的設計步驟
要設計一個處理器,主要分為以下幾個步驟。
1. 首先,需要分析指令系統(tǒng)。指令系統(tǒng)是在處理器設計之前就由軟件和硬件的設計人員共同協(xié)商決定的,關于指令系統(tǒng),可以參考這篇博客:【計算機組成 課程筆記】2.1 設計自己的計算機_Elaine_Bao的博客-CSDN博客。通過分析指令系統(tǒng),我們可以得出指令所要操作的數據需要通過怎樣的一個電路結構,這就是數據通路。
2. 在我們得到這樣的需求之后,我們就可以為數據通路選擇合適的集成電路組件,比如加法器,減法器,寄存器等。
3. 選好了合適的組件之后,我們就按照最開始分析出的需求把這些組件連接起來,就構成了完整的數據通路。
4. 但是僅有數據通路是不夠的,我們還要控制這些數據通路應該如何工作。因此第4步,需要分析每條指令的實現(xiàn),以確定控制數據通路工作的控制信號。
5. 最后是把這些控制信號匯總起來,形成完整的控制邏輯,也可以稱之為控制器。
下面我們還是以MIPS指令系統(tǒng)為例進行講解。不過整個MIPS指令系統(tǒng)的指令還是太多了,我們進行一個簡化,只考慮以下幾條指令:
假設這就是我們當前用來設計處理器的指令系統(tǒng)。那么我們下面就要分析這個指令系統(tǒng)對數據通路有什么樣的需求。
1. 指令系統(tǒng)對數據通路的需求
首先我們對指令的位域進行分解,來看看各個指令的含義。
對于R型指令,它一共分為6個位域,最高的6-bit是操作碼,接下來連續(xù)的3個5-bit的位域各自標明了一個寄存器的編號。然后的5-bit在完整的MIPS指令系統(tǒng)中是用作標記移位的數量,而在咱們簡化后的版本中沒有用到,因此我們可以看成是保留的位域。最后6-bit是功能位域。因此,當我們取到一條R型指令后,就可以將它分解為以上的6組控制信號。
與之類似,I型指令包含了4個位域,也就可以被分解為4組控制信號。
而且我們要注意,這些指令的編碼都是從存儲器中取得的,因此我們首先需要一個存放指令的存儲器。對于指令存儲器來說,它不需要支持寫入的功能,只要可讀就可以了,而且我們希望對于這個存儲器,外界給它32位的地址,它就會給出對應的32位的數據。
那么這個32位的地址又是從哪里來呢?這就是我們的另一個需求,我們需要一個存放指令地址的32位寄存器,稱為PC,也就是程序計數器。
滿足了這兩個需求,我們就可以取得想要的指令了。
然后我們再從指令的操作,來分析其他的需求。
首先來看加法和減法指令。
這兩條指令的主體功能都是選擇兩個不同的寄存器,對它進行加法或減法的運算,然后將結果存入另一個寄存器。因此我們首先需要有一組存放數據的通用寄存器,每個寄存器都是32位的,這樣一組通用的寄存器我們稱為寄存器堆。從加法和減法的指令我們還可以看出,在運算時我們需要同時讀取兩個寄存器的內容,并寫入一個寄存器(兩讀一寫)。
再來看一下立即數的邏輯或指令。
在運算時,它只需要讀取一個寄存器的內容,另一個操作數是一個立即數,其中16位是直接填寫在指令位域當中的,但是我們的運算是32位的,因此這里還有一個需求是將16位立即數擴展到32位。
上述3條指令都是運算指令,因此我們還要支持不同的運算類型的運算器。這個運算器的操作數既可以是寄存器,也可以是擴展后的立即數。
這些就是運算指令的需求了。
我們再來看一下訪存指令。
對于LOAD指令來說,它需要從存儲器中讀出一個字,而這個字所在的存儲單元的地址是由一個寄存器的內容+一個立即數的符號擴展。取出這個字之后,會存放到寄存器堆當中由rt指定的寄存器。
與之相對的還有STORE指令,它是將rt寄存器的內容,寫入到存儲器中。
對于這兩條訪存指令,我們的需求是:首先我們需要一個存放數據的存儲器,這個存儲器既要可讀也要可寫,它的地址輸入以及輸入輸出的數據都是32位的。另外這個地址的計算中需要堆立即數進行符號擴展。這就是訪存指令的主要需求。
最后我們來看分支指令。
對于分支指令,首先要判斷兩個寄存器中的內容是否相等,如果相等就將指令位域中立即數的部分經過變換加到PC上,從而得到新的PC。如果不等則新的PC=PC+4。
因此分支指令的需求,首先是要能否比較兩個寄存器的內容,并判斷是否相等。然后還需要PC寄存器支持兩種自增的方式。一種是+4,一種是+一個立即數。前者對于之前提到的其他指令也都是需要的。
2. 根據需求選擇合適的組件
我們把之前提到的需求總結一下就可以得到對組件的需求。
選擇了上述合適的組件后,我們就可以開始著手建立數據通路的工作了。
3. 連接組件建立數據通路
要建立數據通路,基本原則是分析指令系統(tǒng)中的每一條指令,根據其需求連接組件,從而建立數據通路。那么指令的需求又分為兩大類,一類是所有指令的共同需求,另一類是不同指令的不同需求。
首先我們來看所有指令的共同需求。
首先需要取指令。指令是放在存儲器中的,要從存儲器中取得指令,需要一個地址,這個地址則是存放在PC寄存器中。我們已經有了一個32位的PC寄存器,我們就把PC寄存器的輸出連接到指令存儲器,而指令存儲器則根據地址的輸入,選中對應的存儲單元,并將其內容輸出。這樣我們就得到了所需指令的二進制編碼。
那除了取得當前的指令之外,我們還需要為下一條指令做準備,這就需要更新PC寄存器。這又分成了兩種情況。
大多數時候,指令是順序執(zhí)行的,這種情況下PC只要加上當前指令的長度,就可以得到下一條指令的地址。在MIPS指令系統(tǒng)中,每一條指令都是4個字節(jié)的,所以PC=PC+4。那在我們剛才的結構上面,需要增加一個簡單的加法器,實現(xiàn)PC+4的操作。這樣,當前PC寄存器的內容,既會送到指令存儲器,獲得指令編碼,又會送到加法器,從而計算出一個PC+4的值,在下一個時鐘上升沿來臨時,PC寄存器就會將PC+4的值存入其中,然后再將這個更新后的內容送到指令存儲器和加法器,如此周而復始。
而如果遇到分支指令,那下一條指令的地址就不是簡單的PC+4,而是由分支指令進行指定。因此還需要繼續(xù)修改這個結構。我們需要增加一個二選一的多選器,在順序執(zhí)行時,我們選擇這個多選器的0號輸入端,在發(fā)生分支時,選擇1號輸入端,也就是由分支指令指定的目標地址。那在下一個時鐘上升沿到來的時候,PC寄存器就會采樣這個多選器的輸出,并將其保存起來。
這樣一個結構就完成了不斷取指令的功能,我們把它稱為取指部件(Instruction Fetch Unit, IFU)。IFU作為一個整體,同外界只有一個時鐘信號clk的輸入,和一個多選器選擇信號nPC_sel的輸入,并且提供一個指令編碼Instruction Word的輸出。
我們只用在系統(tǒng)啟動時給PC寄存器一個合適的初始值,并在指令存儲器中存放好我們需要運行的指令,然后在運行過程中給出合適的多選器的選擇信號,這個IFU就可以在時鐘信號的驅動下,自動地連續(xù)工作起來了。
這些就是所有指令的共同需求。
然后我們再根據指令的不同類別,分析它們的各自需求。
首先我們來看加法和減法指令。這兩個指令是R型執(zhí)行,讀寫的都是寄存器,所以我們需要寄存器堆這個組件。指令中讀取的寄存器是rs和rt,寫入的寄存器是rd,所以我們只需要把這3個位域的值連接到寄存器堆的輸入上(Ra,Rb,Rw),這樣在寄存器堆的輸出端,busA就會輸出rs寄存器的內容,busB則會輸出rt寄存器的內容。然后我們將busA和busB連接到ALU的輸入端,并且我們根據指令編碼中的操作碼和功能位域就可以知道當前是加法還是減法指令,通過ALUCtr控制信號來選擇當前ALU提供的運算的類型。然后還要將ALU的輸出連接到寄存器堆的輸入端,也就是busW。在下一個時鐘上升沿到來的時候,如果寄存器堆的寫使能信號RegWr是有效的,busW信號上的內容就會寫入rd所指定的寄存器中。這樣,我們就在一個時鐘周期完成了一條加法或減法的指令。
然后我們來看邏輯運算指令的需求。這是一條I型指令,那么剛才建立的數據通路,要滿足這條指令的運算,還存在幾個問題:1. 目的寄存器是rt而非rd,2. ALU的輸入包含一個立即數,3.立即數只有16位。
針對這幾個問題,我們要把數據通路進行一個改造。針對問題1,增加一個二選一的多選器,來選擇目的寄存器是rd還是rt。針對問題2,增加一個二選一的多選器來選擇ALU的輸入來自于busB(rt寄存器)還是立即數。針對問題3,增加一個零擴展部件對立即數進行擴展。
這樣我們就通過增加兩個多選器和一個零擴展部件來滿足邏輯運算指令帶來的新需求。
然后我們再來看訪存指令的需求。訪存指令也是I型指令。先來看其中的LOAD指令。LOAD指令中存入的地址是rt寄存器,這個需求已經被滿足了。而訪問的地址是將rs寄存器的內容+立即數的符號擴展。這里存在的問題是:1. 目前還不支持符號擴展,2. 這個計算得到的地址應該是去訪問存儲器,從而獲得數據,而不是直接連到寄存器堆的寫入端。
針對這兩個問題,我們繼續(xù)對數據通路進行改造。針對問題1,將原來的零擴展的部件改造為一個多功能的擴展部件,通過控制信號來控制是進行零擴展還是符號擴展。針對問題2,新增一個數據存儲器,這個存儲器根據地址就可以得到對應的存儲單元中的數據。另外增加一個多選器,控制寫入到寄存器中的數據是來自于ALU的輸出還是來自于數據存儲器。
再來看一下另一條訪存指令,STORE指令。這條指令會把rt寄存器的內容寫入到數據存儲器中。所以數據存儲器需要接收一個輸入,來自于busB(rt寄存器),當控制信號MemWr有效時,會進行寫入的操作。這樣我們就滿足了STORE指令的需求。
現(xiàn)在除了比較特殊的分支指令之外,我們已經分析了其他指令的需求,并將各個組件連接了起來。再加上之前已經構造的IFU部件,我們就初步完成了數據通路的建立工作。
文章來源:http://www.zghlxwxcb.cn/news/detail-696124.html
現(xiàn)在在處理器的設計步驟中,我們已經完成了前三步。后兩步將會在后續(xù)博客中介紹。文章來源地址http://www.zghlxwxcb.cn/news/detail-696124.html
到了這里,關于【計算機組成 課程筆記】5.1 處理器的設計步驟的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!