– 1 –
Sequential (SEQ, Ardışıl) Y86 İşlemci Uygulaması (Devamı)
BIL-304: Bilgisayar Mimarisi
Dersi veren öğretim üyesi:
Dr. Öğr. Üyesi Fatih Gökçe
Ders kitabına ait sunum dosyalarından adapte edilmiştir: http://csapp.cs.cmu.edu/
Adapted from slides of the textbook: http://csapp.cs.cmu.edu/
call‘un Yürütülmesi
Fetch
9 byte okunur
PC 9 arttırılır
Decode
Yığın pointer’ı okunur
Execute
Yığın pointer’ı 8 azaltılır
Memory
Arttırılmış PC değeri (dönüş noktasının adresi) yığın
pointer’ının yeni değeriyle gösterilen adrese yazılır
Write back
Yığın pointer’ı güncellenir
PC Update
PC’ye Hedef’in adresi yüklenir
call Hedef 8 0 Hedef
XX XX Dönüş noktası:
XX XX Hedef:
– 3 –
Hesaplama Aşamaları: call
Yığın pointer’ını azaltmak için ALU kullanılır
Arttırılmış PC değeri (geri dönerken kullanılmak üzere yığına) kaydedilir
call Hedef
icode:ifun M1[PC]
valC M8[PC+1]
valP PC+9 Fetch
Komut byte’ını oku
Hedef adresini oku
Dönüş noktasının adresini hesapla
valB R[%rsp]
Decode
Yığın pointer’ını oku valE valB + –8
Execute Yığın pointer’ını azalt
M8[valE] valP
Memory Dönüş noktasının adresini yığına yaz
R[%rsp] valE Write
back
Yığın pointer’ını güncelle PC valC
PC update PC’ye Hedef adresini yükle
ret‘in Yürütülmesi
Fetch
1 byte okunur
Decode
Yığın pointer’ı okunur
Execute
Yığın pointer’ı 8 arttırılır
Memory
Geri dönüş adresi arttırılmamış yığın
pointer’ının gösterdiği adresten okunur
Write back
Yığın pointer’ını güncelle
PC Update
PC’ye okunan geri dönüş adresini yükle
ret 9 0
XX XX return:
– 5 –
Hesaplama Aşamaları: ret
Yığın pointer’ını arttırmak için ALU kullanılır
Geri dönüş adresi hafızadan okunur
ret
icode:ifun M1[PC]
Fetch
Komut byte’ını oku
valA R[%rsp]
valB R[%rsp]
Decode İşlem yapılacak yığın pointer’ını oku
İşlem yapılacak yığın pointer’ını oku valE valB + 8
Execute Yığın pointer’ını arttır
valM M8[valA]
Memory Geri dönüş adresini oku
R[%rsp] valE Write
back
Yığın pointer’ını güncelle PC valM
PC update PC’ye geri dönüş adresini yükle
Hesaplama Adımları
Tüm komutlar aynı genel biçimi izler
Her bir adımda hesaplananlar farklılaşır
OPq rA, rB
icode:ifun M1[PC]
rA:rB M1[PC+1]
valP PC+2 Fetch
Komut byte’ını oku Kaydedici byte’nı oku [Sabit sözcüğü oku]
Bir sonraki PC'yi hesapla valA R[rA]
valB R[rB]
Decode İşlem yapılacak A değerini oku
İşlem yapılacak B değerini oku valE valB OP valA
Set CC
Execute ALU işlemini gerçekleştir
Durum kodlarını güncelle
Memory [Hafızadan oku/hafızaya yaz]
R[rB] valE Write
back
ALU sonucunu geri yaz [Hafıza sonucunu geri yaz]
PC valP
PC update PC’yi güncelle
icode,ifun rA,rB
valC valP
valA, srcA valB, srcB valE
Cond code valM
dstE dstM PC
– 7 –
Hesaplama Adımları
Tüm komutlar aynı genel biçimi izler
Her bir adımda hesaplananlar farklılaşır
call Dest
Fetch
Decode
Execute Memory Write back
PC update
icode,ifun rA,rB
valC valP
valA, srcA valB, srcB valE
Cond code valM
dstE dstM PC
icode:ifun M1[PC]
valC M8[PC+1]
valP PC+9
valB R[%rsp]
valE valB + –8
M8[valE] valP R[%rsp] valE
PC valC
Komut byte’ını oku [Kaydedici byte’nı oku]
Sabit sözcüğü oku
Bir sonraki PC'yi hesapla [İşlem yapılacak A değerini oku] İşlem yapılacak B değerini oku ALU işlemini gerçekleştir [Durum kodlarını güncelle/kullan] Hafızaya yaz
ALU sonucunu geri yaz [Hafıza sonucunu geri yaz]
PC’yi güncelle
Hesaplanan Değerler
Fetch
icode Komut kodu
ifun Komut fonksiyonu rA Komut kaydedicisi A rB Komut kaydedicisi B valC Komut sabiti
valP Arttırılmış PC
Decode
srcA Kaydedici ID’si A srcB Kaydedici ID’si B dstE Hedef kaydedici E dstM Hedef kaydedici M valA Kaydedici değeri A valB Kaydedici değeri B
Execute
valE ALU sonucu
Cnd Şartlı Dallanma/taşıma bayrağı
Memory
valM Hafızadan okunan veri
– 9 –
SEQ Donanımı
Mavi kutular:
öntasarımlı donanım blokları
Örnek: hafızalar, ALU
Gri kutular:
kontrol lojiği
HCL’de tanımlanır
Beyaz oval kutular:
sinyal etiketleri
Kalın hatlar:
64-bit sözcük değerleri
İnce hatlar:
4-8 bit değerler
Kesikli noktalı hatlar:
1-bit değerler
Sağdaki şekildeki İngilizce terimler ilerleyen
slaytlarda her bir kısım
ayrı ayrı detaylandırılırken
çevrilecektir.
Fetch Lojiği
Öntasarımlı bloklar
PC: PC değerini içeren kaydedici
Komut hafızası: 10 byte okunması durumunda PC den PC+9’a kadar adreslerdeki byte’lar okunur
Geçersiz adres durumunda geçersiz adres hata sinyalini üretir
Böl: Komut byte’ını icode ve ifun kısımlarına ayırır
Hizala: rA, rB ve valC değerlerini çeker
Komut hafızası
PC arttırma
rB icode ifun rA
PC
valC valP
Need regids
(regid gerekli) Need valC (valC gerekli) Instr
valid (komut geçerli)
Hizala Böl
Bytes 1-9 Byte 0
imem_error
icode ifun
– 11 –
Fetch Lojiği
Kontrol lojiği
Instr. Valid (komut geçerli): Bu komut geçerli mi?
icode, ifun: Geçersiz adres durumunda nop komutu üretilir
Need regids (regids gerekli): Komutta kaydedici kullanılıyor mu?
Need valC (valC gerekli): Komutta sabit bir sözcük var mı?
Komut hafızası
PC arttırma
rB icode ifun rA
PC
valC valP
Need regids
(regid gerekli) Need valC (valC gerekli) Instr
valid (komut geçerli)
Hizala Böl
Bytes 1-9 Byte 0
imem_error
icode ifun
HCL dilinde Fetch Kontrol Lojiği
# Komut kodunu belirle int icode = [
imem_error: INOP;
1: imem_icode;
];
# Komut fonksiyonunu belirle int ifun = [
imem_error: FNONE;
1: imem_ifun;
];
Komut hafızası
PC
Böl
Byte 0
imem_error
icode ifun
– 13 –
HCL dilinde Fetch Kontrol Lojiği
bool need_regids =
icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, IIRMOVQ, IRMMOVQ, IMRMOVQ };
bool instr_valid = icode in
{ INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ };
pushq rA A 0 rA F
jXX Hedef 7 fn Hedef
popq rA B 0 rA F
call Hedef 8 0 Hedef
cmovXX rA, rB 2 fn rA rB
irmovq V, rB 3 0 F rB V
rmmovq rA, D(rB) 4 0 rA rB D
mrmovq D(rB), rA 5 0 rA rB D
OPq rA, rB 6 fn rA rB
ret 9 0
nop 1 0
halt 0 0
– 14 –
Decode Lojiği
Kaydedici Dizisi
Okuma portları: A, B
Yazma portları: E, M
Adresler kaydedici ID’leri veya 15 (0xF)’tir (kaydedici erişimi olmaması durumunda)
Kontrol Lojiği
srcA, srcB: Okuma port adresleri
dstE, dstM: Yazma port
adresleri
rBdstE dstM srcA srcB
Kaydedici dizisi
A B
M
E dstE dstM srcA srcB
icode rA
valB
valA valM valE
Cnd
Sinyaller
Cnd: Şartlı taşıma yapılıp yapılmayacağını belirtir
Execute aşamasında
hesaplanır
– 15 –
A Değerinin Kaynakları
int srcA = [
icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : rA;
icode in { IPOPQ, IRET } : RRSP;
1 : RNONE; # Kaydediciye gerek yok ];
cmovXX rA, rB valA R[rA]
Decode İşlem yapılacak A
değerini oku rmmovq rA, D(rB)
valA R[rA]
Decode İşlem yapılacak A
değerini oku popq rA
valA R[%rsp]
Decode Yığın pointer’ını oku
jXX Dest
Decode İşlem yapılacak bir şey yok
call Dest
valA R[%rsp]
Decode Yığın pointer’ını oku
ret
Decode İşlem yapılacak bir şey yok
OPq rA, rB valA R[rA]
Decode İşlem yapılacak A
değerini oku
– 16 –
E Değerinin Yazılacağı Yerler
int dstE = [
icode in { IRRMOVQ } && Cnd : rB;
icode in { IIRMOVQ, IOPQ} : rB;
icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
1 : RNONE; # Herhangi bir kaydediciye yazma ];
Hiçbir şey yok
R[%rsp] valE Yığın pointer’ını güncelle Hiçbir şey yok
R[rB] valE cmovXX rA, rB Write-back
rmmovq rA, D(rB)
popq rA
jXX Dest
call Dest
ret Write-back
Write-back
Write-back
Write-back
Write-back
Şarta bağlı olarak sonucu geri yaz
R[%rsp] valE Yığın pointer’ını güncelle
R[%rsp] valE Yığın pointer’ını güncelle R[rB] valE
OPq rA, rB
Write-back Sonucu geri yaz
– 17 –
Execute Lojiği
Birimler
ALU
İhtiyaç duyulan 4 fonksiyonu gerçekleştirir
Durum kodu değerlerini üretir
CC
3 bitlik durum kodlarını içeren kaydedici
cond
Şartlı dallanma/taşıma bayrağını (Cnd) hesaplar
Kontrol Lojiği
Set CC: Durum kodu kaydedicisi yüklenmeli mi?
ALU A: ALU’nun A girişi
ALU B: ALU’nun B girişi
ALU fun: ALU hangi fonksiyonu hesaplamalı?
CC ALU
ALU A
ALU B
ALU fun.
Cnd
icode ifun valC valA valB valE
Set CC
cond
– 18 –
ALU A Girişi
int aluA = [
icode in { IRRMOVQ, IOPQ } : valA;
icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ } : valC;
icode in { ICALL, IPUSHQ } : -8;
icode in { IRET, IPOPQ } : 8;
# Diğer komutlar ALU’ya gerek duymaz ];
valE valB + –8 Yığın pointer’ını azalt İşlem yok
valE valB + 8 Yığın pointer’ını arttır valE valB + valC Efektif adresi hesapla
valE 0 + valA valA’yı ALU üzerinden aktar cmovXX rA, rB
Execute
rmmovq rA, D(rB)
popq rA
jXX Dest
call Dest
ret Execute
Execute
Execute
Execute
Execute valE valB + 8 Yığın pointer’ını arttır valE valB OP valA ALU işlemini gerçekleştir OPq rA, rB
Execute
– 19 –
ALU İşlemi
int alufun = [
icode == IOPQ : ifun;
1 : ALUADD;
];
valE valB + –8 Yığın pointer’ını azalt İşlem yok
valE valB + 8 Yığın pointer’ını arttır valE valB + valC Efektif adresi hesapla
valE 0 + valA valA’yı ALU üzerinden aktar cmovXX rA, rB
Execute
rmmovl rA, D(rB)
popq rA
jXX Dest
call Dest
ret Execute
Execute
Execute
Execute
Execute valE valB + 8 Yığın pointer’ını arttır valE valB OP valA ALU işlemini gerçekleştir OPl rA, rB
Execute
Memory Lojiği
Memory
Hafızadan sözcük okunur veya hafızaya sözcük yazılır
Kontrol Lojiği
stat: Komutun durumu nedir?
Mem. read: sözcük okunacak mı?
Mem. write: sözcük yazılacak mı?
Mem. addr.: Adresi seçer
Mem. data.: Veriyi seçer
Veri Hafızası
Mem.
read
Mem.
addr
okuma
yazma
Veri çıkışı
Mem.
data
valE valM
valA valP Mem.
write
Veri girişi
icode Stat
dmem_error
instr_valid imem_error
stat
– 21 –
Komut durumu
Kontrol Lojiği
stat: Komut durumu nedir?
Veri Hafızası
Mem.
read
Mem.
addr
okuma
yazma
Veri çıkışı
Mem.
data
valE valM
valA valP Mem.
write
Veri girişi
icode Stat
dmem_error
instr_valid imem_error
stat
## Komut durumunu belirle int Stat = [
imem_error || dmem_error : SADR;
!instr_valid: SINS;
icode == IHALT : SHLT;
1 : SAOK;
];
– 22 –
Memory Adresi
OPq rA, rB Memory
rmmovq rA, D(rB)
popq rA
jXX Dest
call Dest
ret
İşlem yok
M8[valE] valA
Memory Değeri hafızaya yaz
valM M8[valA]
Memory Yığından oku
M8[valE] valP
Memory Dönüş adresini yığına yaz
valM M8[valA]
Memory Dönüş adresini oku
Memory İşlem yok
int mem_addr = [
icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE;
icode in { IPOPQ, IRET } : valA;
# Diğer komutlar adrese ihtiyaç duymaz ];
– 23 –
Memory Read (Okuma)
OPq rA, rB Memory
rmmovq rA, D(rB)
popq rA
jXX Dest
call Dest
ret
İşlem yok
M8[valE] valA
Memory Değeri hafızaya yaz
valM M8[valA]
Memory Yığından oku
M8[valE] valP
Memory Dönüş adresini yığına yaz
valM M8[valA]
Memory Dönüş adresini oku
Memory İşlem yok
bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET };
PC Update (Güncelleme) Lojiği
New (Yeni) PC
PC’nin bir sonraki değerini seç
New (Yeni) PC
Cnd
icode valC valM valP
PC
– 25 –
PC
Update
OPq rA, rB
rmmovq rA, D(rB)
popq rA
jXX Hedef
call Hedef
ret
PC valP
PC update PC’yi güncelle
PC valP
PC update PC’yi güncelle
PC valP
PC update PC’yi güncelle
PC Cnd ? valC : valP
PC update PC’yi güncelle
PC valC
PC update PC’ye Hedef adresini yükle
PC valM
PC update PC’ye dönüş adresini yükle
int new_pc = [
icode == ICALL : valC;
icode == IJXX && Cnd : valC;
icode == IRET : valM;
1 : valP;
];
SEQ’in Çalışması
Durum
PC kaydedicisi
Durum kodu kaydedicisi
Veri hafızası
Kaydedici dizisi
Tamamı saat sinyalinin yükselen kenarında güncellenir
Kombinasyonel Lojik
ALU
Kontrol lojiği
Hafıza okumaları
Komut hafızası
Kaydedici dizisi
Veri hafızası
Kombinasyonel
lojik Veri
Hafızası
Kaydedici Dizisi
%rbx = 0x100
PC 0x014
CC
100 Okuma
portları
Yazma portları
Okuma Yazma
– 27 –
SEQ’in
Çalışması
#2
durum ikinci irmovq komutuna bağlı olarak set edilir
kombinasyonel lojik durum değişikliğine tepki vermeye başlar
0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz
0x01f: rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Cycle 3:
Cycle 4:
Cycle 5:
0x00a: irmovq $0x200,%rdx # %rdx <-- 0x200 Cycle 2:
0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 Cycle 1:
Clock
Cycle 1
j k l m
Cycle 2 Cycle 3 Cycle 4
Combinational
logic Veri
Hafızası
Kaydedici Dizisi
%rbx = 0x100
PC 0x014
CC
100 Okuma
portları
Yazma portları
Okuma Yazma
SEQ’in
Çalışması
#3
durum ikinci irmovq komutuna bağlı olarak set edilir
kombinasyonel lojik addq komutunun sonuçlarını oluşturur
Kombinasyonel
lojik Veri
Hafızası
Kaydedici Dizisi
%rbx = 0x100
PC 0x014
CC
100 Okuma
portları
Yazma portları
0x016
000
%rbx
<-- 0x300
Okuma Yazma
0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz
0x01f: rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Cycle 3:
Cycle 4:
Cycle 5:
0x00a: irmovq $0x200,%rdx # %rdx <-- 0x200 Cycle 2:
0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 Cycle 1:
Clock
Cycle 1
j k l m
Cycle 2 Cycle 3 Cycle 4
– 29 –
SEQ’in
Çalışması
#4
durum addq
komutuna bağlı olarak set edilir
kombinasyonel lojik durum
değişikliğine tepki vermeye başlar
0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz
0x01f: rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Cycle 3:
Cycle 4:
Cycle 5:
0x00a: irmovq $0x200,%rdx # %rdx <-- 0x200 Cycle 2:
0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 Cycle 1:
Clock
Cycle 1
j k l m
Cycle 2 Cycle 3 Cycle 4
Kombinasyonel
lojik Veri
Hafızası
Kaydedici Dizisi
%rbx = 0x300
PC 0x016
CC
000 Okuma
portları
Yazma portları
Okuma Yazma
SEQ’in
Çalışması
#5
durum addq
komutuna bağlı olarak set edilir
kombinasyonel lojik je
komutunun sonuçlarını oluşturur
0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz
0x01f: rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Cycle 3:
Cycle 4:
Cycle 5:
0x00a: irmovq $0x200,%rdx # %rdx <-- 0x200 Cycle 2:
0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 Cycle 1:
Clock
Cycle 1
j k l m
Cycle 2 Cycle 3 Cycle 4
Kombinasyonel
lojik Veri
Hafızası
Kaydedici Dizisi
%rbx = 0x300
PC 0x016
CC
000 Okuma
portları
Yazma portları
0x01f
Okuma Yazma
– 31 –
SEQ Özeti
Uygulaması
Herbir komut basit adımlar dizisi olarak ifade edilir
Her komut tipi için aynı genel akış izlenir
Kaydedici, hafızalar ve öntasarımlı kombinasyonel blokları birleştirir
Bu blokların birleşimini kontrol lojiği ile sağlar
Kısıtlamalar
Pratik uygulama açısından çok yavaştır
Bir saat palsinde, komut hafızası, kaydedici dizisi, ALU ve veri hafızası boyunca sinyallerin yayılmaları gerekir
Bu yayılma gereksinimi nedeniyle saat sinyalinin çok yavaş işlemesi gerekir