230 likes | 307 Views
建構 Beta 電腦. 中央處理單元的設計取捨. 最大效能 : 以每秒可執行的指令數來衡量. 最小成本 : 以電路的大小來衡量. 最佳效能 / 價錢 : 以 MIPS( 每秒百萬指令 ) 與大小的來比例來衡量 . 在重視能量消耗的應用中 , MIPS/ 瓦特也很重要. 效能之量測. 每秒百萬指令. 時脈頻率 ( 百萬赫 ). 每指令所需時脈數. 推進效能 ... 今天 : 1 時脈 / 指令 . 下次 : 以管路技術來達成更多百萬赫 下下次 : 修正不同的管路技術問題. Beta 指令集.
E N D
建構 Beta電腦 10/29/0
中央處理單元的設計取捨 最大效能: 以每秒可執行的指令數來衡量 最小成本: 以電路的大小來衡量 最佳效能/價錢: 以MIPS(每秒百萬指令)與大小的來比例來衡量. 在重視能量消耗的應用中, MIPS/瓦特也很重要. 10/29/0
效能之量測 每秒百萬指令 時脈頻率(百萬赫) 每指令所需時脈數 推進效能 ... 今天: 1 時脈/指令. 下次: 以管路技術來達成更多百萬赫 下下次: 修正不同的管路技術問題 10/29/0
Beta指令集 操作類別: Reg[Rc] ← Reg[Ra] op Reg[Rb] 以操作碼區分的指令類別: OP OPC MEM Transfer of Control 操作類別: Reg[Rc] ← Reg[Ra] op SXT(C) 兩種格式共用的操作碼(OPCODE): ADD SUB MUL* DIV* *optional CMPEQ CMPLE CMPLT AND OR XOR SHL SHR SRA 10/29/0
達成方法: 累進功能法 每個指令是由一個簡單的功能組件成來達成的. 我們將試著實現各個指令類別的資料路徑, 然後再將它們合併(使用解多工器等). 我們的組件百寶袋: 步驟: 1. 操作類指令 2. 存取類指令 3. 跳躍與分流類指令 4. 例外 5. 合併資料路徑 暫存器 解多工器 “黑盒子” 運算邏輯單元 記憶體 10/29/0
多埠暫存器檔案 (獨立讀取位址) 2 combinational READ ports*, 1 clocked WRITE port *internal logic ensures Reg[31] reads as 0 10/29/0
暫存器檔案之時序 兩組組合邏輯式讀取埠, 一組時脈控制式寫入埠 如果 (舉例來說) WA=RA1, 將會如何??? RD1 會讀取 “舊的” Reg[RA1] 之值, 一直到下一個時脈邊緣為止! 10/29/0
起始點: ALU 操作 32-位元 (4-位元組) ADD 指令: 對BETA而言, 表示Reg[R4] ← Reg[R2] + Reg[R3] 首先, 硬體必需能夠: • 讀取下一個 32-位元 指令 • 指令解碼(DECODE): ADD, SUB, XOR, 等等 • 從暫存器檔案進行讀取 (READ) (Ra, Rb) 之操作; • 執行(PERFORM)指定的操作; • 將結果寫回(WRITE)暫存器檔案(Rc). 10/29/0
指令取得/解碼 • 使用計數器來取得(FETCH)下一個指令: 程式計數器 (PC) • 使用PC 來當作記憶體位址 • 加4到PC, 然後在時脈結束時載入新的值 • 從記憶體取得指令 o直接使用某些指令欄位 (暫存器編號, 16-位元之常數) o使用 <31:26>位元來產生控制訊號 INSTRUCTION WORD FIELDS CONTROL SIGNALS 10/29/0
ALU 操作之資料路徑 OP: Reg[Rc] ← Reg[Ra] op Reg[Rb] 10/29/0
ALU 操作 (常數存在時) OPC: Reg[Rc] ← Reg[Ra] op SXT(C) 10/29/0
“載入”指令 LD: Reg[Rc] ← Mem[Reg[Ra]+SXT(C)] 10/29/0
“儲存”指令 ST: Mem[Reg[Ra]+SXT(C)] ← Reg[Rc] 10/29/0
”跳躍”(JMP)指令 JMP: Reg[Rc] ← PC+4; PC ← Reg[Ra] 10/29/0
BEQ/BNE(當相等/不等時, 則跳躍) 指令 BEQ: Reg[Rc] ← PC+4; if Reg[Ra]=0 then PC ← PC+4+4*SXT(C) BNE: Reg[Rc] ← PC+4; if Reg[Ra]≠0 then PC ← PC+4+4*SXT(C) 10/29/0
“載入相對位址”指令 LDR: Reg[Rc] ← Mem[PC + 4+ 4*SXT(C)] 等等, “載入相對位址”指令有什麼好處呢??? 我認為 • 程式碼是單純的, 舉例來說, 它們是唯讀的, 並且存在一個”程式”記憶體區; • 但資料是可讀/寫的, 而使用以下方法之一來儲存 • 存在堆疊(STACK)中 (內部); 或 • 在某些外部變數中; 或 • 存在一個外部的儲存堆疊(HEAP). 所以, 為什麼一個指令要設計成可以載入”靠近”這個指令的資料呢???當資料是 ”位址”及”其他較大的常數”時 10/29/0
“載入相對位址”(LDR)指令 LDR: Reg[Rc] ← Mem[PC + 4 + 4*SXT(C)] 10/29/0
例外處理 計劃:: • 中斷正在執行的程式 • 呼叫例外處理(像是一個程序呼叫) • 返回並繼續執行. 我們希望有 可修復的中斷 以達成 • 由中央處理器(CPU)或系統產生的同步化事件 錯誤 (例如, 不合法的指令, 除數為0, 不合法的記憶體位址) 捕捉 及 系統呼叫 (例如, 從週邊讀取一個字元) • 由I/O所產生的非同步化事件 (例如, 鍵盤鍵入, 收到封包, 磁碟傳輸完成) 關鍵: 對於被中斷程式的透明度. • 這對非同步化中斷是最難的 10/29/0
實施方法… 例外如何運作: • 不要執行現在的指令 • 取而代之的, 假裝有一個”強制”的程序呼叫 • 儲存現在的程式計數(PC) (事實上是現在的 PC + 4) • 用例外向量載入PC • 同步化例外是0x4, 非同步化例外是0x8 問題: 要把現在的PC + 4存到哪呢? • 我們的方法: 保留一個暫存器 (R30, 也稱 XP) • 禁止使用者程式使用XP. 為什麼? 不合法的操作: PUSH(XP) 取得指令於 Mem[Reg[XP]–4] 檢查 DIV 操作碼, 找到暫存器號碼 用軟體來執行這個操作, 填入結果暫存器 POP(XP) JMP(XP) 例子: DIV指令並未實施 LD(R31,A,R0) LD(R31,B,R1) DIV(R0,R1,R2) ST(R2,C,R31) 以硬體強制執行 10/29/0
例外 Bad Opcode: Reg[XP] ← PC+4; PC ← “IllOp” Other: Reg[XP] ← PC+4; PC ←“Xadr” 10/29/0
控制邏輯 實施方法的選擇: • 以操作碼(opcode), 外部跳躍, 以及捕捉邏輯索引的唯讀記憶體(ROM) • 可程式化邏輯陣列(PLA) • “隨機”邏輯 (例如: 標準元件邏輯閘) 10/29/0
Beta: 我們的”最終答案” 10/29/0
下回: 管路化的Beta電腦 那麼, 我們到 6.004的實驗室去, 把Intel的生意搶走吧! 嗯, 建構一台電腦並不是那麼難嘛 10/29/0