思維導圖

前兩章中簡要概述了指令的形式及其作用,處理器的主要功能就是在規定的時間内處理指令.
處理器是如何處理指令的呢?從硬體結構上講,處理器有資料通路和控制器構成.其中,資料通路的主要功能是根據指令處理資料的流通,在此過程之中,會讀取或者寫入資料,也會對資料進行算術等處理,如何判斷是進行寫入還是讀取或者是其他的操作呢?這就會使用到控制器的控制單元,他會将指令解碼形成不同的控制信号,以控制資料通路的組成建構進行不同的操作
本文将由簡到繁的描述資料通路是如何構成以及如何實作的.然後寫控制單元是如何實作的,兩者有時如何協調工作的.最後将簡要描述處理器的流水線是怎樣實作的,會遇到什麼問題.
一.資料通路
1.1資料通路的組成
資料通路的功能部件包括兩種邏輯單元:
- 組合單元:用于處理資料的單元.他會接受資料并進行處理,然後輸出資料.相同的輸入資料就會産生相同的輸出資料.如ALU
- 狀态單元:用于記錄狀态的存儲單元.計算機可以根據其記錄的值進行恢複.比如寄存器或者存儲器.狀态單元至少有兩個輸入, 一個輸出.兩個輸入分别是寫入的資料和決定何時可以寫入的時鐘信号.一個輸出是上個時鐘信号寫入的資料.狀态 單元随時可讀.
資料通路的具體部件是用于操作或者儲存處理器中資料的單元,包括:
- 指令存儲器
- 資料存儲器
- 寄存器堆
- ALU
- 加法器
1.2資料通路的實作
我們将實作可以處理 存儲器通路指令:sw,lw. 算術邏輯指令:add,sub,and,or,slt和分支指令:beq,j的處理器.(圖中的英文RegWrite 表示控制信号,控制功能部件的具體操作,後文再說)
首先分析以上指令将會使用那些構成部件:
- 無論執行什麼指令,都需要指令存儲器以擷取和儲存目前需要執行的指令,需要程式電腦指向目前指令的位址,而下一條指令可能就是本次執行指令的位址+4,是以需要一個加法器計算下一條指令的位址.
- 除了j指令外,其餘指令都需要使用寄存器,而寄存器在寄存器堆中,因為指令最多會讀取兩個寄存器,寫入一個寄存器,是以,寄存器堆有兩個讀端口,一個寫端口.隻通過寄存器号以确定是哪個寄存器.也需要使用算術邏輯單元(ALU)進行計算,比如add,sub等等.
- 資料存取指令還需要資料存儲單元,以儲存從存儲器中擷取的資料,符号擴充單元,将指令中的偏移量由16位擴充至32位.
- 此外,多選器會根據控制信号從多個輸入資料中選擇一個輸出
以上便是實作這些指令所需要的功能部件.
以下是這些功能部件是如何搭配,協作,以實作具體指令.
- 公共部分,可以實作取出目前指令及程式計數器的自增.取出的指令會被其他部分使用.
- 分支指令的實作部分,如beq $s1,$s2,25.會讀取兩個寄存器的值,并設定新的指令位址
- 存取指令的實作部分,如lw $s1,25($s2) sw $s1,25($s2),會同存儲器讀取資料或者寫入資料.此部分會使用到資料存儲單元,不單單列舉.
- 最後,将所有的部分彙合在一起,形成資料通路的結構.
二.控制器
資料通路對于處理器的簡單實作并不完整,其中,多選器選擇哪一個資料輸出,資料存儲器到底是進行寫入操作還是讀取操作,ALU執行加法還是減法,寄存器堆中的寄存器是寫入還是讀取,這些判斷是由控制器的控制單元生成的控制信号進行控制的.
2.1ALU的控制
控制單元會根據指令生成控制信号,控制ALU的操作,以下是上述指令可能會生成的4位控制信号.
控制信号又是如何生成的呢?控制單元會使用指令的2位ALUOp位字段和funct字段,通過真值表的方式生成控制信号.
最後,是指令和控制信号的映射關系
上圖中funct字段為XXXXXX代表目前指令不需要funct字段即可生成控制信号.
2.2主要制單元的控制
主要制單元生成的控制信号會對其他功能部件進行控制,控制信号長1位
本文中的指令有R型和L型,其具體格式如下,其中x:x表示在指令中的位置.
而根據不同的指令,可能會生成如下控制信号:
是以,将資料通路和控制單元融合後,會形成處理器的簡單實作,此處理器實作了add,sub,and,or,beq,sw,lw,等指令.淺顔色的線條表示控制信号.
特别的,如果需要實作跳轉指令,則需要在上圖的基礎上再添加一部分.首先,跳轉指令j的實作方式是目前PC+4的高4位和j指令的26位立即數組合而成.是以需要添加一個多選器和控制信号Jump,當操作碼為2時,該控制信号有效.
- j型指令格式
最終的處理器的簡單實作如下:
計算機組成與設計(4)-----處理器 三.指令級并行
上文中設計的處理器如果每次隻處理一條指令,顯然不符合現在計算機對速度的追求.是以有了流水線技術.它通過多條指令的重疊執行以提高處理器的執行效率.它不提高單挑指令的處理速度,而是提高整體的吞吐率,也可以說是功能部件的使用率來提高處理速度.也有一種被稱之為多發射的技術,可以一次執行多條指令.
3.1流水線
- 3.1.1流水線的原理
舉例,現在需要處理一批衣服的清洗工作(一批指令的處理),每一件衣服(每一條指令)的處理步驟有4
- 放入洗衣機
- 清洗後烘幹
- 堆疊整齊
- 收納入櫃
下圖是清洗一件衣服(每次清洗一件)和流水線(每次清洗一批)清洗的差別:
假設:處理指令的每一步最多消耗一個周期.(200ps),是以指令的處理步驟如下:
将一個步驟稱為一個流水線級數,上述流水線級數為4,當存在相當大量的指令需要執行時,流水線執行效率=一次一條/流水線級數.當然,如果需要執行的指令數量偏少,不會有那麼高的效率,而流水線會引入其他的開銷,也會減低指令執行的效率.
- 3.1.2流水線冒險
當流水線的下一條指令不能執行時,我們将這種情況稱之為冒險.有三種常見的流水線冒險:
- 1.結構冒險:因為缺乏必要的硬體支援而導緻指令不能再下一個時鐘周期執行的情況.比如,在上圖中,如果隻有一個存儲器的話,第一條指令通路存儲器時,第四條指令也會通路存儲器,就會發生結構冒險.
- 2.資料冒險:無法提高指令所需要的資料而導緻指令不能再規定的時鐘周期内執行的情況.比如,一條加法指令後緊跟着一條需要加法指令結果進行輸入的減法指令.就會發生資料冒險,因為減法指令隻能等待加法指令執行完畢後,在執行,而解決資料冒險的方法稱之為前推,即在加法指令得到結果而又沒有完全執行完時,減法指令可以利用加法指令的結果開始執行,如下圖:
- 3.控制冒險(分支冒險):取到的指令不是預期的指令,即決策依賴于一條指令(分支指令)的結果,而其他的指令正在執行中.比如:分支指令正在執行,将要跳轉到其他位址而非下一條位址.就會發生控制冒險.控制冒險的解決方法一般有兩種:
- 一種是阻塞:在确定分支位址後再執行下一條該執行的指令,如下圖:
計算機組成與設計(4)-----處理器 - 一種是預測,即預測将要執行那條指令,如果預測錯誤,則保證已執行的指令不會生效,然後在正确的分支位址重新執行,如下圖:
3.2多發射
多發射是複制自己内部部件的數量,使得每個流水級可以啟動多條指令的技術.
而多發射必須處理兩個問題,一是發射槽中的指令數量.一個時鐘周期内執行多少條指令,這個問題的解決不同的多發射機制有不同的處理辦法..另一個問題是如何處理控制冒險和資料冒險,現在一般使用一種被稱之為推測的技術
- 推測:編譯期或處理器推測指令的結果以消除執行其他指令對該結果的依賴.編譯期會添加額外的指令檢查推測結果的正确性并在推測結果錯誤是提供專門的修複方法,而處理器經常會緩存推測的結果直至确認推測的正确性.如果推測正确,則将推測結果寫入寄存器堆和存儲器,如果錯誤,則清除緩存,并重新執行正确的指令.
- 發射槽:多發射需要使用發射槽,發射槽是在給定時鐘周期内能夠發射指令的位置.類似于短跑比賽的起點位置.
多發射的實作主要有兩種,他們的主要差別在于決策是在指令編譯階段做出還是在指令執行做出.
- 3.2.1靜态多發射處理器
靜态多發射的決策在指令編譯階段做出,靜态多發射會在給定時鐘周期内發射多條指令,稱之為發射包,發射包可以在編譯期生成,也可以在有處理器動态生成,不同的靜态多發射在于如何處理潛在的資料冒險和控制冒險.
- 3.2.2動态多發射處理器
動态多發射的決策在指令執行階段做出.動态多發射處理器通常包含動态流水線排程:
- 動态流水線排程:對指令進行重新排序以避免阻塞的硬體支援
在這種處理器中,流水線被劃分為3個部分:
- 取指與發射單元:取指并譯碼,然後将每條指令發送到相應的功能單元執行.
- 功能單元:每個功能單元都有自己的緩沖區(保留站),用來儲存操作數和操作,當緩沖區包含了需要的所有操作數且功能單元就緒時,會計算結果.安全後,将結果寫回寄存器堆和存儲器.
- 送出單元:送出單元含有一個緩沖區,稱為重排序緩沖區,用于暫時儲存執行結果,安全時,就會将結果寫回寄存器對或存儲器.
其中亂序執行值執行的指令被堵塞時,不會影響導緻的指令等待,順序送出指流水線的執行結果以取指順序寫回.
注:本篇文章由《計算機組成與設計》第四章-處理器 總結而來,由于本人非計算機專業出身,許多知識實在是了解不能,總結有相當多的遺漏,乃是我看不懂所緻,更别說其中内容肯定有大量的了解錯誤,萬望大家提出批評,我好改正。