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/ 1
call un Yürütülmesi call Hedef 8 0 Hedef Dönüş noktası: XX XX Hedef: XX XX Fetch Decode 2 9 byte okunur PC 9 arttırılır Yığın pointer ı okunur Yığın pointer ı 8 azaltılır 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
Hesaplama Aşamaları: call call Hedef Fetch Decode Write back PC update icode:ifun M 1 [PC] valc M 8 [PC+1] valp PC+9 valb R[%rsp] vale valb + 8 M 8 [vale] valp R[%rsp] vale PC valc Komut byte ını oku Hedef adresini oku Dönüş noktasının adresini hesapla Yığın pointer ını oku Yığın pointer ını azalt Dönüş noktasının adresini yığına yaz Yığın pointer ını güncelle PC ye Hedef adresini yükle 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 3
ret in Yürütülmesi ret 9 0 return: XX XX Fetch Decode 1 byte okunur Yığın pointer ı okunur Yığın pointer ı 8 arttırılır 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 4
Hesaplama Aşamaları: ret ret icode:ifun M 1 [PC] Komut byte ını oku Fetch Decode Write back PC update vala R[%rsp] valb R[%rsp] vale valb + 8 valm M 8 [vala] R[%rsp] vale PC valm İşlem yapılacak yığın pointer ını oku İşlem yapılacak yığın pointer ını oku Yığın pointer ını arttır Geri dönüş adresini oku Yığın pointer ını güncelle PC ye geri dönüş adresini yükle Yığın pointer ını arttırmak için ALU kullanılır Geri dönüş adresi hafızadan okunur 5
Hesaplama Adımları OPq ra, rb icode,ifun icode:ifun M 1 [PC] Komut byte ını oku Fetch ra,rb valc ra:rb M 1 [PC+1] Kaydedici byte nı oku [Sabit sözcüğü oku] valp valp PC+2 Bir sonraki PC'yi hesapla Decode vala, srca valb, srcb vala R[rA] valb R[rB] İşlem yapılacak A değerini oku İşlem yapılacak B değerini oku vale Cond code vale valb OP vala Set CC ALU işlemini gerçekleştir Durum kodlarını güncelle valm [Hafızadan oku/hafızaya yaz] Write dste R[rB] vale ALU sonucunu geri yaz back dstm [Hafıza sonucunu geri yaz] PC update PC PC valp PC yi güncelle Tüm komutlar aynı genel biçimi izler Her bir adımda hesaplananlar farklılaşır 6
Hesaplama Adımları call Dest icode,ifun icode:ifun M 1 [PC] Komut byte ını oku Fetch ra,rb valc valc M 8 [PC+1] [Kaydedici byte nı oku] Sabit sözcüğü oku valp valp PC+9 Bir sonraki PC'yi hesapla Decode vala, srca valb, srcb valb R[%rsp] [İşlem yapılacak A değerini oku] İşlem yapılacak B değerini oku vale Cond code vale valb + 8 ALU işlemini gerçekleştir [Durum kodlarını güncelle/kullan] Write valm dste M 8 [vale] valp R[%rsp] vale Hafızaya yaz ALU sonucunu geri yaz back PC update dstm PC PC valc [Hafıza sonucunu geri yaz] PC yi güncelle Tüm komutlar aynı genel biçimi izler Her bir adımda hesaplananlar farklılaşır 7
Hesaplanan Değerler Fetch icode Komut kodu vale ALU sonucu ifun ra Komut fonksiyonu Komut kaydedicisi A Cnd Şartlı Dallanma/taşıma bayrağı rb Komut kaydedicisi B valc valp Komut sabiti Arttırılmış PC valm Hafızadan okunan veri 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 8
SEQ Donanımı Mavi kutular: öntasarımlı donanım blokları Örnek: hafızalar, ALU 9 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 icode ifun ra rb valc valp Instr valid (komut geçerli) Need valc (valc gerekli) Need regids (regid gerekli) PC arttırma icode ifun Böl Byte 0 Hizala Bytes 1-9 imem_error Komut hafızası Öntasarımlı bloklar 10 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 PC
Fetch Lojiği icode ifun ra rb valc valp Instr valid (komut geçerli) Need valc (valc gerekli) Need regids (regid gerekli) PC arttırma icode ifun Böl Byte 0 Hizala Bytes 1-9 imem_error Komut hafızası Kontrol lojiği 11 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ı? PC
HCL dilinde Fetch Kontrol Lojiği icode ifun Böl Byte 0 # Komut kodunu belirle int icode = [ imem_error: INOP; 1: imem_icode; ]; # Komut fonksiyonunu belirle int ifun = [ imem_error: FNONE; 1: imem_ifun; ]; imem_error Komut hafızası PC 12
HCL dilinde Fetch Kontrol Lojiği halt 0 0 nop 1 0 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 jxx Hedef 7 fn Hedef call Hedef 8 0 Hedef ret 9 0 pushq ra A 0 ra F popq ra B 0 ra F 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 }; 13
Decode Lojiği Kaydedici Dizisi Okuma portları: A, B Yazma portları: E, M Cnd vala valb valm vale Adresler kaydedici ID leri veya 15 (0xF) tir (kaydedici erişimi olmaması durumunda) Kontrol Lojiği A B M Kaydedici dizisi E dste dstm srca srcb srca, srcb: Okuma port adresleri dste dstm srca srcb dste, dstm: Yazma port adresleri icode ra rb Sinyaller Cnd: Şartlı taşıma yapılıp yapılmayacağını belirtir 14 aşamasında hesaplanır
A Değerinin Kaynakları Decode Decode OPq ra, rb vala R[rA] cmovxx ra, rb vala R[rA] rmmovq ra, D(rB) İşlem yapılacak A değerini oku İşlem yapılacak A değerini oku Decode Decode vala R[rA] popq ra vala R[%rsp] İşlem yapılacak A değerini oku Yığın pointer ını oku jxx Dest Decode İşlem yapılacak bir şey yok call Dest Decode İşlem yapılacak bir şey yok ret Decode vala R[%rsp] Yığın pointer ını oku int srca = [ icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ } : ra; icode in { IPOPQ, IRET } : RRSP; 1 : RNONE; # Kaydediciye gerek yok ]; 15
E Değerinin Yazılacağı Yerler Write-back Write-back OPq ra, rb R[rB] vale cmovxx ra, rb R[rB] vale Sonucu geri yaz Şarta bağlı olarak sonucu geri yaz rmmovq ra, D(rB) Write-back Hiçbir şey yok popq ra Write-back R[%rsp] vale Yığın pointer ını güncelle jxx Dest Write-back Hiçbir şey yok call Dest Write-back R[%rsp] vale Yığın pointer ını güncelle ret Write-back R[%rsp] vale Yığın pointer ını güncelle 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 16 ];
Lojiği Birimler 17 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ı? Cnd cond CC Set CC ALU A vale ALU ALU B icode ifun valc vala valb ALU fun.
ALU A Girişi OPq ra, rb vale valb OP vala cmovxx ra, rb ALU işlemini gerçekleştir vale 0 + vala vala yı ALU üzerinden aktar rmmovq ra, D(rB) vale valb + valc Efektif adresi hesapla popq ra vale valb + 8 Yığın pointer ını arttır jxx Dest İşlem yok call Dest vale valb + 8 Yığın pointer ını azalt ret vale valb + 8 Yığın pointer ını arttır 18 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 ];
ALU İşlemi OPl ra, rb vale valb OP vala cmovxx ra, rb vale 0 + vala ALU işlemini gerçekleştir vala yı ALU üzerinden aktar rmmovl ra, D(rB) vale valb + valc Efektif adresi hesapla popq ra vale valb + 8 Yığın pointer ını arttır jxx Dest İşlem yok call Dest vale valb + 8 Yığın pointer ını azalt ret vale valb + 8 Yığın pointer ını arttır 19 int alufun = [ icode == IOPQ : ifun; 1 : ALUADD; ];
Lojiği 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 Stat stat instr_valid imem_error icode Mem. read Mem. write dmem_error okuma yazma Veri Hafızası Mem. addr vale valm Veri çıkışı Mem. data Veri girişi vala valp 20
Komut durumu Stat Kontrol Lojiği stat: Komut durumu nedir? stat instr_valid imem_error Mem. read Mem. write dmem_error okuma yazma valm Veri çıkışı Veri Hafızası Veri girişi Mem. addr Mem. data 21 icode ## Komut durumunu belirle int Stat = [ imem_error dmem_error : SADR;!instr_valid: SINS; icode == IHALT : SHLT; 1 : SAOK; ]; vale vala valp
Adresi OPq ra, rb İşlem yok rmmovq ra, D(rB) M 8 [vale] vala popq ra valm M 8 [vala] jxx Dest call Dest M 8 [vale] valp ret valm M 8 [vala] Değeri hafızaya yaz Yığından oku İşlem yok Dönüş adresini yığına yaz Dönüş adresini oku 22 int mem_addr = [ icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : vale; icode in { IPOPQ, IRET } : vala; # Diğer komutlar adrese ihtiyaç duymaz ];
Read (Okuma) OPq ra, rb rmmovq ra, D(rB) M 8 [vale] vala popq ra valm M 8 [vala] jxx Dest call Dest M 8 [vale] valp ret valm M 8 [vala] İşlem yok Değeri hafızaya yaz Yığından oku İşlem yok Dönüş adresini yığına yaz Dönüş adresini oku bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET }; 23
PC Update (Güncelleme) Lojiği PC New (Yeni) PC PC nin bir sonraki değerini seç New (Yeni) PC icode Cnd valc valm valp 24
PC Update PC update OPq ra, rb PC valp PC yi güncelle rmmovq ra, D(rB) PC update PC valp PC yi güncelle popq ra PC update PC valp PC yi güncelle jxx Hedef PC update PC Cnd? valc : valp PC yi güncelle call Hedef PC update PC valc PC ye Hedef adresini yükle ret PC update PC valm PC ye dönüş adresini yükle 25 int new_pc = [ icode == ICALL : valc; icode == IJXX && Cnd : valc; icode == IRET : valm; 1 : valp; ];
SEQ in Çalışması 26 Kombinasyonel lojik CC 100 PC 0x014 Okuma Okuma portları Veri Hafızası Kaydedici Dizisi %rbx = 0x100 Yazma Yazma portları 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ı
SEQ in Çalışması #2 Clock Cycle 1: Cycle 2: Cycle 3: Cycle 4: Cycle 5: 0x00a: 0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz 0x01f: Cycle 1 Cycle 2 Cycle 3 Cycle 4 j k l m 0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 irmovq $0x200,%rdx # %rdx <-- 0x200 rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Combinational logic CC 100 Okuma Okuma portları Veri Hafızası Kaydedici Dizisi %rbx = 0x100 Yazma Yazma portları durum ikinci irmovq komutuna bağlı olarak set edilir kombinasyonel lojik durum değişikliğine tepki vermeye başlar PC 0x014 27
SEQ in Çalışması #3 Clock Cycle 1: Cycle 2: Cycle 3: Cycle 4: Cycle 5: 0x00a: 0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz 0x01f: Cycle 1 Cycle 2 Cycle 3 Cycle 4 j k l m 0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 irmovq $0x200,%rdx # %rdx <-- 0x200 rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Kombinasyonel lojik CC 100 000 Okuma Okuma portları Veri Hafızası Kaydedici Dizisi %rbx = 0x100 Yazma Yazma portları %rbx <-- 0x300 durum ikinci irmovq komutuna bağlı olarak set edilir kombinasyonel lojik addq komutunun sonuçlarını oluşturur PC 0x014 0x016 28
SEQ in Çalışması #4 Clock Cycle 1: Cycle 2: Cycle 3: Cycle 4: Cycle 5: 0x00a: 0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz 0x01f: Cycle 1 Cycle 2 Cycle 3 Cycle 4 j k l m 0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 irmovq $0x200,%rdx # %rdx <-- 0x200 rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Kombinasyonel lojik CC 000 Okuma Okuma portları Veri Hafızası Kaydedici Dizisi %rbx = 0x300 Yazma Yazma portları durum addq komutuna bağlı olarak set edilir kombinasyonel lojik durum değişikliğine tepki vermeye başlar PC 0x016 29
SEQ in Çalışması #5 Clock Cycle 1: Cycle 2: Cycle 3: Cycle 4: Cycle 5: 0x00a: 0x014: addq %rdx,%rbx # %rbx <-- 0x300 CC <-- 000 0x016: je hedef # Dallanma olmaz 0x01f: Cycle 1 Cycle 2 Cycle 3 Cycle 4 j k l m 0x000: irmovq $0x100,%rbx # %rbx <-- 0x100 irmovq $0x200,%rdx # %rdx <-- 0x200 rmmovq %rbx,0(%rdx) # M[0x200] <-- 0x300 Kombinasyonel lojik CC 000 PC 0x016 0x01f Okuma Okuma portları Veri Hafızası Kaydedici Dizisi %rbx = 0x300 Yazma Yazma portları durum addq komutuna bağlı olarak set edilir kombinasyonel lojik je komutunun sonuçlarını oluşturur 30
SEQ Özeti Uygulaması 31 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 Donanım alt birimleri saat palsinin sadece belli bir kısmında aktif olarak çalışırlar (saat palsinin geri kalan süresinde sadece beklerle, herhangi bir işlem gerçekleştirmezler)