CPU體系結構筆記

4.1 Y86-64指令集體系結構

經過Y86——一個模擬X86的體系結構學習CPU結構

程序員可見狀態

image
去掉了%r15,用F表明無寄存器。程序員

Y86-64指令

只支持64位。學習

mov:

分紅irmovq,rrmovq,mrmovq,rmmovq。不支持第二變址寄存器,和伸縮。即rrmovq (%rdi,%rsi,4) %rdx這樣的格式。fetch

算數運算:

addq, subq, andq, xorq,這些指令會設置條件碼。編碼

剩餘:跳轉,條件傳送,call&ret,push&pop,halt

指令編碼

與x86相似。第一個字節前四位指明指令大類,後四位指明具體行爲,好比 addq=0x60。第二個字節指明REGIS A,B。
imagespa

4.2邏輯設計和硬件控制語言HCL

邏輯門

image
[邏輯門類型和圖形表示]設計

組合電路和HCL布爾表達式

HCL布爾表達式都可以被轉化成電路設計。好比位相等bool eq = (a && b) || (!a && !b)就能夠用下圖表示。
image
而多路複用器電路bool out = (s && a) || (!s && b);(用S控制輸出a/b)能夠用下圖表示。
imagecode

字節級別

將64個小電路作AND運算便可。
image
能夠抽象成一個大單元。blog

存儲器和時鐘

做者先提出了兩類寄存器的區別。這是在後面纔會學到的。硬件寄存器,是用於字傳送的,程序員不可見。程序寄存器,程序員可見,就是彙編用到的那些。
寄存器在電壓上升是載入新值,輸出舊址(保存的值)。時鐘控制着寄存器的加載。內存

4.3 Y86-64的SEQ實現

SEQ硬件實現

在順序實現中,一個時鐘週期被分爲5片(2和5常常在一塊兒說):1.fetch 2. decode 3.execute 4.memory 5.write back 6.pc updaterem

fetch

從M[PC]中拿到指令,rA,rB,valC,valP(+8的)。檢測簡單錯誤。

decode

從寄存器獲得valA,valB。

execute

根據icode,決定ALU的功能,輸出valE。

memory

根據memo_addr,memo_data,從內存中讀取/寫入數據/產出錯誤。他們的值從HCL中來。

write back

根據dstE,valE(execute獲得的),dstM,valM(memory獲得的)更新目標寄存器。
結構

SEQ的實現

這個部分把上面的圖拆成5個部分,每一個部分用小圖和HCL的方式描述出來。完整HCL以下

fetch

取指

#SEQ

bool need_regids =icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, IIRMOVQ, IRMMOVQ, IMRMOVQ };

bool need_valC = icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL };

decode&writeback

decode&writeback

word srcA = [ icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ icode in { IPOPQ, IRET } : RRSP; 1 : RNONE; # Don’t need register ];

word srcB = [ icode in { IOPQ, IRMMOVQ, IMRMOVQ } : rB; icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; 1 : RNONE; # Don’t need register ];

# WARNING: Conditional move not implemented correctly here word 
dstE = [ icode in { IRRMOVQ } : rB; icode in { IIRMOVQ, IOPQ} : rB; icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; 1 : RNONE; # Don’t write any register ];

word dstM = [ icode in { IMRMOVQ, IPOPQ } : rA; 1 : RNONE; # Don’t write any register ];

word dstE = [ icode in { IRRMOVQ } && Cnd : rB; icode in { IIRMOVQ, IOPQ} : rB; icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP; 1 : RNONE; # Don’t write any register ];

execute

execute

word aluA = [icode in { IRRMOVQ, IOPQ } : valA; icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC;

word aluB = [ icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, IPUSHQ, IRET, IPOPQ } : valB;
icode in { IRRMOVQ, IIRMOVQ } : 0;
# Other instructions don’t need ALU 
];


word alufun = [ icode == IOPQ : ifun; 1 : ALUADD; ];

bool set_cc = icode in { IOPQ };

memory

memo

word mem_addr = [ icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE; icode in { IPOPQ, IRET } : valA; 
# Other instructions don’t need address
];

word mem_data = [ # Value from register icode in { IRMMOVQ, IPUSHQ } : valA; # Return PC icode == ICALL : valP; 
# Default: Don’t write anything
];

bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET };

bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL };

update pc

word new_pc = [

# Call. Use instruction constant 
icode == ICALL : valC; 
# Taken branch. Use instruction constant
 icode == IJXX && Cnd : valC; 
# Completion of RET instruction. Use value from stack
 icode == IRET : valM; 
# Default: Use incremented 
1 : valP;
];
# Determine instruction status 
word Stat = [ imem_error || dmem_error : SADR; !instr_valid: SINS; icode == IHALT : SHLT; 1 : SAOK; ];

4.4 流水線通用原理

相關文章
相關標籤/搜索