1.指令體系結構:處理器支持的指令和指令的字節級編碼。
2.與 X86-64 相比,Y86-64 指令集的數據類型、指令和尋址方式要少一些,字節級編碼也比較簡單,機器代碼沒有 Y86-64 緊湊,雖簡單但足夠完整。
3.定義一個指令集體系結構與包括定義各類狀態單元、指令集和它們的編碼、一組編程規範和異常事件處理。
4.Y86-64 有8個程序寄存器:%rax,%rcx,%rdx,%rbx,%rsi,%rdi,%rsp,%rbp 和 %r8 到 %r14(少了 %r15)。%rsp 被入棧、出棧、調用和返回指令做爲棧指針,其它寄存器沒有固定的含義或固定值。
5.下圖是 Y86-64 指令集。指令編碼長度從1~10個字節不等。字段 fn 指明是某個整數操做(OPL)、數據移動條件(cmovXX)或分支條件(jXX)。編程
6.每條指令的第一個字節表面指令的類型。本字節分爲兩部分,高4位是代碼部分,低4位是功能部分。rrmovq 與條件傳送的指令代碼都爲2,能夠把它看做是一個「無條件傳送」。緩存
15個程序寄存器中每一個都有一個相對應的範圍在0
~0xE之間的寄存器標識符。程序寄存器存在CPU中的寄存器文件(以寄存器id做爲地址的隨機訪問存儲器)中,當須要指明不該訪問任何寄存器時用 0xF 表示。函數
7.沒有寄存器操做數的指令(分支指令和call指令)沒有寄存器指示符字節;只須要一個寄存器操做數的指令(irmovl,pushl,popl)將另外一個寄存器指示符設爲0xF;有些指令須要附加的4字節常數字,可做 irmovl 的當即數數據,rmmol 和 mrmovl 的地址指示符的偏移量、分支指令和調用指令的目的地址。注意: 分支指令和調用指令的目的地址是一個絕對地址,全部整數採用小端法編碼。性能
8.rmmovq %rsp,0x123456789abcd(%rdx)
中偏移量要放在8字節的常數字中,因此得先填充0變成8字節,而後再按反序輸出,最後字節編碼爲 4042cdab896745230100。測試
9.狀態碼 Stat 描述程序執行的整體狀態。ADR 表示處理器試圖從一個非法內存地址讀或者向一個非法內存地址寫。INS 表示遇到了非法的指令代碼。編碼
11.pushq %rsp
壓入 %rsp 的原始值,popq %rsp
將 %rsp 設置爲從內存中讀出來的值。設計
1.數字系統須要三個主要組成部分:3d
2.C語言中符號運算符的邏輯門下面是對應的HCL表達式:AND用&&表示,OR用||表示,而NOT用!表示。邏輯門只對單個位的數進行操做。邏輯門老是活動的,輸入變化輸出很快就跟着變化。指針
用HCL來寫這個網的函數:bool eq = (a && b) || (!a && !b)
code
多路複用器(根據s的值選擇是輸出a或者b)用HCL來描述:out = (s && a) || (!s && b)
3.將不少的邏輯門組合成一個網,就能構建計算塊,稱爲組合電路。構建這些網時,兩個或多個邏輯門的輸出不能連在一塊兒且這個網必須是無環的。一般設計的是能對字進行操做的電路:
在HCL中,全部字級的信號都聲明爲int,不指定字的大小。此電路的函數在字級上表達成 bool Eq = ( A == B )
4.在處理器設計中,不少時候須要將一個信號與許多可能匹配的信號作比較,以此來檢驗正在處理的信號是否屬於某一類指令代碼:
此電路中,兩位信號code可控制對4個數據字A、B、C、D作選擇,根據code值,能夠用相等測試來表示信號 s1 和 s0 的產生:bool si = code in { 2, 3 };bool s0 = code in { 1, 3 };
5.組合電路自己不能存儲信息。爲了產生時序電路,必須引入按位存儲信息的設備。一類是時鐘寄存器(簡稱寄存器),儲存單個位或字。另外一類是隨機訪問儲存器(簡稱儲存器):儲存多個字,用地址選擇該讀/寫哪一個字,例子包括處理器的虛擬內存系統和寄存器文件。
6.寄存器文件有內部存儲,不是組合電路。有A、B兩個讀端口,和一個W寫端口。容許同時進行多個讀寫操做,能夠同時讀兩個寄存器,同時更新第三個寄存器的狀態。兩個讀端口有地址輸入srcA、srcB和數據輸入valA和valB。寫端口有地址輸入dstW,數據輸入valW。向寄存器文件寫入字是由時鐘信號控制的,每次時鐘上升時,輸入valW上的值會被寫入輸入dstW上的寄存器ID指示的程序寄存器。
7.隨機訪問存儲器從內存中讀的操做方式相似於組合邏輯,寫內存時由時鐘控制的。
1.處理一條指令包含不少操做,將它們組織成某個特殊的階段序列。分爲如下幾個階段:
2.如下是各個 Y86-64 指令在順序實現中的計算:
jXX Dest
在執行階段,檢查條件碼和跳轉條件來肯定是否要選擇分支,產生出一個一位信號 Cnd 。在更新 PC 階段,檢查這個標誌,若是標誌爲1,就將PC設爲valC(跳轉目標),若是爲0,就設爲valP(下一條指令的地址)。
3.咱們要將上述計算映射到硬件上,就是要實現邏輯控制,它能在不一樣硬件單元之間傳送數據,以及操做這些單元,使得對每一個不一樣的指令執行指定的運算。SEQ 硬件結構中灰色圓角方框表示的就是控制邏輯塊:
4.要控制處理器中活動的時序,只須要寄存器和內存的時鐘控制。經過時鐘週期來控制元素的更新,經過組合邏輯來傳播,每次時鐘週期由低到高時,處理器開始執行一條新指令。處理器歷來不須要爲了完成一條指令的執行而去讀該指令更新了的狀態。
1.非流水線化的硬件系統:
2.流水線化的硬件系統:
流水線階段之間的指令轉移是由時鐘信號來控制的。每隔120ps信號從0上升至1,開始下一組流水線階段的計算。
3.流水線的侷限性:
1.對 SEQ 中五個階段的順序進行調整,使得更新 PC 階段在一個時鐘週期開始時執行,而不是在結束時才執行。這種修改過的設計爲「SEQ+」。SEQ+中沒有單獨的硬件寄存器來存放pc,而是經過pIconde、pCnd等寄存器(保存的是前一個週期中產生的控制信號),在一個新的時鐘週期開始時用一樣的邏輯來計算 pc 值。
3.D_stat、E_stat、M_stat、W_stat指的是流水線寄存器的狀態碼字段,而小寫的 f、d、e、m、w指的是流水線階段,是爲了引用某些在一個階段內剛剛計算出來的信號。
4.數據相關和控制相關可能會致使流水線產生計算錯誤,成爲冒險。首先關心數據冒險,而後再考慮控制冒險。
5.避免數據冒險的方法:
6.異常處理方法:
7.PIPE 是使用了轉發技術的流水線化的 Y86-64 處理器:
8.流水線控制邏輯根據來自流水線寄存器和流水線階段的信號,控制邏輯產生流水線寄存器的暫停和睦泡控制信號,同時也決定是否要更新條件碼寄存器。PIPE流水線控制邏輯覆蓋了經過流水線的正常指令流,以處理特殊條件,例如過程返回、預測錯誤的分支、加載/使用冒險和程序異常:
9.經過肯定往流水線中插入氣泡的頻率來衡量效率的損失。一條返回指令會產生三個氣泡,一個加載/使用冒險會產生一個,一個預測錯誤的分支會產生兩個。經過計算PIPE執行一條指令所須要的平均時鐘週期數的估計值來量化處罰對總體性能的影響(CPI)。CPI = 1.0 + lp + mp + rp
。
算出CPI的值爲1.27。咱們的目標是設計一個每一個週期發射一條指令的流水線,即CPII爲1.0。要想下降CPI,要集中注意力預測錯誤的分支。
10.實現多週期指令能夠簡單擴展執行階段邏輯的功能,添加一些整數和浮點算術運算單元;用暫停來處理短期的高速緩存不命中和用異常處理來處理長時間的缺頁結合起來可以顧及到存儲器訪問時因爲存儲器層次結構引發的全部不可預測性。