2008年11月16日 星期日

CPU 設計的藝術(II)

一般的CPU設計大概都會分成 (1) Fetch Code (2) Decode (3) Execution (4) Write-Back 等Stages, 以下分別說明:

Fetch Code:
是把程式從Memory讀進來的動作, 通常會有Instruction Queue 儲存fetch 進來的code. 之所以需要Instruction Queue我想是因為code 有時從較慢的DRAM讀進來, 有時則從較快的Cache SRAM讀進來, 其速度是不定的. 當fetch code的速度較消耗的速度快時 (EX: from Cache SRAM), Queue 會漸漸被堆起來, 只要Queue沒有滿, 就可以繼續fetch code. 相反的, 當fetch code變得比code消耗地慢時, 假如Queue裡面正好有堆積了一些, 則會開始把Queue裡的code消耗掉.不至於沒有東西可以執行而造成浪費時間. 另外, CISC的CPU比RISC的CPU更需要Instruction Queu. 因為CISC的指令長度不定, 因此每次fetch進來的指令數量也不一定. 所以CISC的fetch code和consume code 的速度存在更多的差異. 當input和 output之間的速度有差異, 就需要 buffer幫忙: input 較快時, 先存些東西; 而當outout較快時, 因為平時可能有存些東西在buffer了, 所以也不至於沒東西可以處理. 如此可以有較多機會保持CPU不停地工作.

Decode:
Decode Stage 則是將Fetch進來的code "decode"成許多內部的control訊號, 根據code的要求做相對應的control. 而code需要做運算的部份, 則交給下一個Execution Stage處理. 在進入Execution Stage運算前, Decode stage則負責把需要切換或開啟的動作訊號準備好. 對CISC而言, Decode的動作更為複雜, 因為每一道指令長度都不固定, decoder就需從code的內容先decode出它的長度, 再根據其長度"align" 出指令. CISC的一個指令可能需要好幾個micro-op完成(如前篇所述), 此時通常需要一個所謂micro-rom的東西幫忙把後續的micro-op查出來, 一般稱做"micro rom sequence"

Execution:
大概就是處理加減乘除或邏輯運算等. 複雜一點的可能還有相量運算(多用於多媒體應用)以及符點運算(科學計算軟體)等. 此外, 對於記憶體的存取, 需要計算計憶體位址. 對x86 CPU而言, 更有複雜的保護模式需處理. (Task switch, Memory Limit check, priority check等). 此部份有機會以後再介紹囉!

Write-Back:
指令運作的結果通常會儲存到internal 的register, 以供後面的指令取用. 此動作就叫做write-back.

沒有留言: