學習計時:共12小時
讀書:4
代碼:1
做業:3
博客:4html
現代微處理器能夠稱得上是人類創造的最複雜的系統之一。一塊手指甲大小的硅片上,能夠容納一個完整的高性能處理器、大的高速緩存,以及用來鏈接到外部設備的邏輯電路。linux
對於Y86,當遇到這些異常的時候,咱們就簡單地讓處理器中止執行指令。在更完整的的設計中,處理器一般會調用一個異常處理程序,這個過程被指定用來處理遇到的某種類型的異常。就像在第8章中講述的,異常處理程序能夠被配置成不一樣的結果,例如,放棄程序或者調用一個用戶自定義的信號處理程序。程序員
程序中以「.」開頭的詞是彙編器命令。緩存
圖4-11多路複用器根據輸入控制信號的值,從一組不一樣的數據信號中選出一個,在這個單個位的多路複用器中,兩個數據信號是輸入位a和b,控制信號是輸入位s,當s爲1時,輸出等於a:而當s爲0時,輸出等於b。在這個電路中,咱們能夠看出兩個AND門決定了是否將它們相對應的數據輸入傳送到OR門。
HCL表達式很清楚地代表了組合邏輯電路和C語言中邏輯表達式的對應之處。它們都是用布爾操做來對輸入進行計算的函數。值得注意的是,這兩種表達計算的方法之間有如下區別:安全
由於組合電路是由一系列的邏輯門組成,它的屬性是輸出會持續地響應輸入的變化。若是電路的輸入變化了,在必定的延時以後,輸出也會相應的變化。相比之下,C表達式只會在程序執行過程當中被遇到時才進行求值。
C的邏輯表達式容許參數是任意整數,0表示FALSE,其餘任何值都表示TRUE。而邏輯門只對位值0和1進行操做.
C的邏輯表達式有個屬性就是它們可能只被部分求值。若是―個AND或OR操做的結果只用對第一個參數求值就能肯定,那麼就不會對第二個參數求值了。markdown
在處理器設計中,不少時候都須要將一個信號與許多可能匹配的信號作比較,以此來檢測正在處理的某個指令代碼是否屬於某一類指令代碼。app
爲了產生時序電路,咱們必須引入按位存儲信息的設備。存儲設備都是由同一個時鐘控制,時鐘是一個週期性信號,決定何時要把新值加載到設備中。考慮兩類存儲器設備:框架
1.時鐘寄存器(簡稱寄存器)存儲單個位或字。時鐘信號控制寄存器加載輸入值。
2.隨機訪問存儲器(簡稱存儲器)存儲多個字,用地址來選擇該讀或該寫哪一個字。隨機訪問存儲器的例子包括:1)處理器的虛擬存儲器系統,硬件和操做系統軟件結合起來使處理器能夠在一個很大的地址空間內訪問任意的字;2)寄存器文件,在此,寄存器標識符做爲地址。在IA32或Y86處理器中,寄存器文件有8個程序寄存器。函數
大多數時候,寄存器都保持在穩定狀態(用×表示)產生的輸出等於它的當前狀態。信號沿着寄存器前面的組合邏輯傳播這時,產生了一個新的寄存器輸入(用y表示)但只要時鐘是低電位的,寄存器的輸出就仍然保持不變。當時鍾變成高電位的時候,輸入信號就加載到寄存器中,成爲下一個狀態y直到下一個時鐘上升沿,這個狀態就一直是寄存器的新輸出。關鍵是寄存器是做爲電路不一樣部分中的組合邏輯之間的屏障。每當每一個時鐘到達上升沿時,值纔會從寄存器的輸入傳送至輸出。性能
一般,處理一條指令包括不少操做。將它們組織成某個特殊的階段序列,即便指令的動做差別很大,但全部的指令都遵循統一的序列。每一步的具體操做取決於正在執行的指令。建立這樣的框架,咱們便能設計一個充分利用硬件的處理器。簡略描述:
取指
譯碼
執行
訪存
寫回
更新PC
咱們面臨的一個挑戰是將每條不一樣指令所須要的計算放入到上述那個通用框架中。咱們會使用圖4-17中所示的代碼來描述不一樣Y86指令的處理。表中的這種格式很容易映射到硬件,表中的每一行都描述了一個信號或存儲狀態的分配。閱讀時能夠把它當作是從上至下的順序求值。當咱們將這些計算映射到硬件時,會發現其實並不須要嚴格按照順序來執行這些求值。
硬件單元與各個處理階段相關聯:
SEQ的實現包括組合邏輯和兩種存儲器設備:時鐘寄存器,隨機訪問存儲器(寄存器文件、指令存儲器和數據存儲器)。組合邏輯不須要任什麼時候序或控制。對於較小的存儲器來講(例如寄存器文件)這是一個合理的假設,而對於較大的電路來講,能夠用特殊的時鐘電路來模擬這個效果。因爲指令存儲器只用來讀指令,所以咱們能夠將這個單元當作是組合邏輯。
寄存器文件有四個端口,它支持同時進行兩個讀(在端口A和B上)和兩個寫(在端口E和M)。每一個端口都有一個地址鏈接和―個數據鏈接,地址鏈接是一個寄存器ID,而數據鏈接是一組32根線路,既能夠做爲寄存器文件的輸出字,也能夠做爲它的輸入字。若是某個地址端口上的值爲特殊標識符0xF,則代表不須要訪問寄存器。
在現代邏輯設計中,電路延遲以微微秒,也就是10的負12次方秒爲單位來計算。
爲了更好地理解流水線是怎樣工做的,詳細看看流水線計算的時序和操做。圖4-34是三階段流水線的流水線圖,流水線階段之間的指令轉移是由時鐘信號來控制的"每隔120ps,信號從0上升至1開始下一組流水線階段的計算。
做爲實現流水線化設計的一個過渡步驟,咱們必須稍微調整一下SEQ中五個階段的順序,使得更新PC階段在一個時鐘週期開始時執行,而不是結束時才執行。只須要對總體硬件結構作最小的改動,對於流水線階段中的活動的時序,它能工做得更好。咱們稱這和修改過的設計爲「SEQ+」。咱們移動PC階段,使得它的邏輯在時鐘週期開始時活動,使它計算當前指令的PC值。
順序實現SEQ和SEQ+在一個時刻只處理一條指令。在流水線化的設計中,與各個指令相關聯的值有多個版本,會隨着指令一塊兒流過系統。咱們須要很當心以確保使用的是正確版本確版本的信號,不然會致使很嚴重的錯誤。經過在信號名前面加上大寫的流水線寄存器名字做爲前綴,存儲在流水線寄存器中的信號能夠惟一的被標識。
在PIPE―設計中,咱們採起了一些措施來正確處理控制相關。流水線化設計的目的就是每一個時鐘週期都發射一條新指令,也就是說每一個時鐘週期都有一條新指令進入執行階段並最終完成。要是達到這個目的就意味着吞吐量是每一個時鐘週期一條指令。要作到這一點,咱們必須在取出當前指令以後,立刻肯定下一條指令的位置。不幸的是,若是取出的指令是條件分支指令,要到幾個週期後,也就是指令經過執行階段以後,咱們才能知道是否要選擇分支。相似地,若是取出的指令是ret,要到指令經過訪存階段,才能肯定返回地址。
PIPE-結構是建立一個流水線化的Y86處理器的好開端。不過,回憶4.44節中的討論,將流水線技術引入一個帶反饋的系統,當相鄰指令同存在相關時會致使出現問題。在完成咱們的設計以前,必須解決這個問題。
這些相關有兩種形式:
1)數據相關,下一條指令會用到這條指令計算出的結果;
2)控制相關,一條指令要肯定下一條指令的位置,例如在執行跳轉、調用或返回指令時,這些相關可能會致使流水線產生計算錯誤,稱爲冒險。同相關同樣,冒險也能夠分爲兩類:數據冒險和控制冒險。
暫停是避免冒險的―種經常使用技術,暫停時,處理器會中止流水線中一條或多條指令,直到冒險條件再也不知足,讓一條指令停頓在譯碼階段,直到產生它的源操做數的指令經過了寫回階段,這樣咱們的處理器就能避免數據冒險,。它對流水線控制邏輯作了一些簡單的增強。當指令addl處於譯碼階段時,流水線控制邏輯發現執行、訪存或寫回階段中至少有―條指令會更新寄存器。
爲了充分利用數據轉發技術,咱們還能夠將新計算出來的值從執行階段傳到譯碼階段,以免程序prog4所須要的暫停。在週期4中,譯碼階段邏輯發如今訪存階段中有對寄存器%edX未進行的寫,並且執行階段中ALU正在計算的值稍後也會寫入寄存器%eaX。它能夠將訪存階段中的值做爲操做數Va1A也能夠將ALU的輸出做爲操做數~Va1B,注意,使用ALU的輸出不會致使任什麼時候序問題,譯碼階段只要在時鐘週期結束以前產生信號Va1A和Va1B,在時鐘上升開始下一個週期時,流水線寄存器E就能裝載來自譯碼階段的值,而在此以前ALU的輸出已是合法的了。
有類數據冒險不能單純用轉發來解決,由於存儲器在流水線發生的比較晚。
咱們的指令集體系結構包括三種不一樣的內部產生的異常:1:)halt指令,2)有非法指令和功能碼組合的指令, 3)取指或數據讀寫試圖訪問一個非法地址。正確處理異常是任何微處理器設計中頗有挑戰性的一面。異常可能出如今不可預測的時間,須要明確的中斷經過處理器流水線的指令流。
如今準備建立流水線控制邏輯,以完成咱們的PIPE設計。這個邏輯必須處理如下4種控制狀況,這些狀況是其餘機制(例如數據轉發和分支預測)不能能處理的:
處理ret:流水線必須暫停直到ret指令到達寫回階段。
加載/使用冒險:流水線必須暫停一個週期。
預測錯誤的分支:在分支邏輯發現不該該選擇分支以前,分支目標處的幾條指令已經進流水線了。必須從流水線中去掉這些指令。
異常:當―條指令致使異常,咱們想要禁止後面的指令更新程序員可見的狀態,並睏異常指令到達寫回階段時,中止執行。
咱們先瀏覽每種狀況所指望的行爲,而後再設計處理這些狀況的控制邏輯。
咱們能夠看到,全部須要流水線控制邏輯進行特殊處理的條件,都會致使流水線不可以實現每一個時鐘週期發射一條新指令的目標。咱們能夠經過肯定往流水線中插入氣泡的頻率,來衡量這種效率的損失。由於插入氣泡會引起未使用的流水線週期。一條返回指令會產生三個氣泡,一個加載/使用冒險會產生一個,而一個預測錯誤的分支會產生兩個。
構建YIS環境:
cd ~/Code/shiyanlou_cs413
wget http://labfile.oss.aliyuncs.com/courses/413/sim.tar
tar -xvf sim.tar
cd sim
sudo apt-get install tk
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
make
YIS測試:
cd y86-code
進入測試代碼,教材p239頁代碼爲asuml.ys,能夠經過
make asuml.yo
進行彙編,asuml.yo就是彙編後的結果,見教材p238。
make all
能夠彙編運行全部代碼結果。
在實驗樓中沒法解析主機地址
還有不太清楚實驗樓中第一項任務的要求。
解決方法:在答疑論壇中看到了同窗的提問和老師的回覆。
實驗樓普通用戶不能聯外網,因此不能夠解析外部的網址,目前外網權限只對會員開放了。老師在實驗樓工做人員的幫助下,已經修改了實驗指導書,把外網地址改爲內網地址了。