ISA opcodes --- Nereden geliyorlar?


13

Mühendisler bir talimat seti mimarisi tasarlarken, varsa hangi prosedür veya protokolle, belirli ikili kodları talimat olarak belirlerken takip ederler. Örneğin, 10110'un bir yük talimatı olduğunu söyleyen bir ISA'm varsa, bu ikili sayı nereden geldi? Bir yük işlemini temsil eden bir sonlu durum makinesi için durum tablosundan modellenmiş miydi?

Düzenleme: Daha fazla araştırma yaptıktan sonra, çeşitli CPU talimatları için opcodes nasıl atandığını endişe sormaya çalışıyorum inanıyorum. ADD, 10011 kodlu bir kodla belirtilebilir; Bir yük talimatı 10110 olarak atanmış olabilir. Komut kümesi için bu ikili opcodların atanması için hangi düşünce süreci başlar?


8
Monte Dalrymple's, "Verilog HDL Kullanarak Mikroişlemci Tasarımı", Z80 CPU için çok ayrıntılı bir tasarım yaklaşımı sunuyor ve bence sorunuz hakkında çok şey öğreneceksiniz. Ancak, belirli bir seçime giren, diğer öğretim setlerinin, derleyici çıktılarının, vb. İstatistiksel analizi de dahil olmak üzere birçok husus vardır. Bununla birlikte, bu kitapla başlamanızı tavsiye ederim. Bilinen bir tasarımla başlasa da, onun hakkında ayrıntılı bir ayrıntıya giriyor ve bence birkaç şey alacaksınız. İyi kitap.
jonk

Ya da, belki de, yürütme motoru tasarımını soruyorsunuz ve talimattaki bitlerin nasıl oynayabileceğini merak ediyorsunuz? İfadelerinizden emin değilim.
jonk

2
Başka biri bu soruyu soruyor. Salı olmalı.
Ignacio Vazquez-Abrams

5
@Steven Bir düşünün. Eğer siz bir ISA tasarlamak zorunda ne olur sen düşün? Talimatlarınız aynı uzunlukta tüm olmasaydı, nasıl olurdu Eğer talimatlar için daha kısa veya daha uzun talimat kelimeleri seçmek? Eğer bir tasarım olsaydı kod çözme aşaması , ne olacağını dilek gibi bakmak için ISA için? Sorunun gereksiz yere geniş olduğunu düşünüyorum (ve böylece tamamen cevaplamak neredeyse imkansız), ancak biraz daha kendi düşüncelerini koyarak ve cevaplamak için bir kitap yazmamızı gerektirmeyecek kesin bir soru sorarak bunu çok geliştirebilirsiniz. o.
Marcus Müller

4
RISC-V özellikleri onlar makine talimatlarının kodlaması hakkında adil bir bit dahil, tüm düzeylerde yapılan tasarım kararları hakkında konuşmak. (Bu bir işlemci el kitabı için olağandışıdır; RISC-V ilk olarak akademik bir alıştırmadır ve ikinci olarak, çoğunun aksine CPU mimarisidir.)
zwol

Yanıtlar:


6

Çoğu durumda, seçim oldukça keyfi veya ISA'lar zamanla büyüdükçe "en uygun yere" dayanıyor. Bununla birlikte, MOS 6502, sınırlı transistörlerden mümkün olduğunca sıkmaya çalışarak ISA tasarımının büyük ölçüde etkilendiği harika bir çip örneğidir.

Check out 6502 ters mühendislik nasıl açıklayan bu videoyu özellikle itibaren 34:20 dan.

6502, 1975'te tanıtılan 8 bitlik bir mikroişlemcidir. Z80'den% 60 daha az kapıya sahip olmasına rağmen, iki kat daha hızlıydı ve daha fazla kısıtlanmış olmasına rağmen (kayıtlar vb. Açısından), zarif talimat seti.

6502'nin çeşitli katmanlarını oluşturan, daha sonra optik olarak daraltılmış bazı büyük plastik levhalar üzerinde sürünen küçük bir ekip tarafından elle çekilen sadece 3510 transistör içerir .

Aşağıda görebileceğiniz gibi, 6502, talimat op kodunu ve zamanlama verilerini kod çözme ROM'una geçirir, ardından amacı muhtemelen belirli karmaşık durumlarda ROM çıktısını geçersiz kılmak olan bir "rastgele kontrol mantığı" bileşenine geçirir.

6502 blok şeması

Videoda 37: 00'de kod çözme ROM'unda, girişlerin belirli bir kontrol çıkışı için "1" elde etmek için hangi koşulları yerine getirmesi gerektiğini gösteren bir tablo görebilirsiniz. Ayrıca bu sayfada bulabilirsiniz .

Bu tablodaki şeylerin çoğunun çeşitli konumlarda X'leri olduğunu görebilirsiniz. Örneğin alalım

011XXXXX 2 X RORRORA

Bu, op kodun ilk 3 bitinin 011 ve G'nin 2 olması gerektiği anlamına gelir; Nothing Else Matters. Eğer öyleyse, RORRORA adlı çıktı gerçek olur. Tüm ROR opodları 011 ile başlar; ancak 011 ile başlayan başka talimatlar da vardır. Bunların muhtemelen "rastgele kontrol mantığı" birimi tarafından filtrelenmesi gerekir.

Temel olarak, opcodlar seçildi, böylece birbirleriyle aynı şeyi yapmak için gereken talimatlar bit desenlerinde ortak bir şeye sahipti. Bunu bir opcode tablosuna bakarak görebilirsiniz ; tüm VEYA talimatları 000 ile başlar, tüm Mağaza talimatları 010 ile başlar, sıfır sayfa adresleme kullanan tüm talimatlar xxxx01xx biçimindedir. Tabii ki, bazı talimatlar "uygun" görünmüyor, çünkü amaç tamamen düzenli bir opcode formatına sahip olmak değil, güçlü bir talimat seti sağlamaktır. İşte bu yüzden "rastgele kontrol mantığı" gerekliydi.

Yukarıda bahsettiğim sayfa, ROM'daki bazı çıktı satırlarının iki kez göründüğünü söylüyor. tekrar konum. " Mühendislerin bu kapıları teker teker çizdiklerini ve aniden tasarımda bir kusur fark ettiklerini ve tüm süreci yeniden başlatmayı önlemek için bir yol bulmaya çalıştıklarını hayal edebiliyorum.


22

ISA'nın yaşına bağlıdır.

El tasarımının ilk günlerinde ve daha da fazlası, CPU'lar ayrı mantıktan birleştirildiğinde, mantık tasarımı önce gelirdi ve kapsamlı bir şekilde minimize edilirdi ve daha sonra ISA bit modelleri, bunu en aza indirmek için gerekli olan her değer olurdu. mantık çalışması.

Bu nedenle, bazı çoklayıcıların ALU çıkışını GP kayıt dosyasının girişine bağlamasını sağlayan belirli bir kontrol sinyalleri paterni, ALU'ya toplama, çıkarma ve VEYA vb. adres bitlerini kayıt dosyasına kaydedin. Bu üç sinyal grubu talimat içinde alanlar oluşturacaktır. Her grup bir arada tutulacak ve ayrıntılı anlamları bu birimin (ALU vb.) Tasarımından kaynaklanacaktır, ancak talimatlar kod çözücüyü tasarlayana kadar gruplar herhangi bir sırada olabilir. (x86, doğru yere bakarsanız bunlardan bazılarını tespit edebileceğiniz kadar eski - tamamen yeni bir tasarım değildi, ancak eski 8080'den çekildi)

Daha sonra ISA'lar, bazen "mikro kod" aracılığıyla aralarında gerçek donanım seviyesi kontrol sinyalleri arasında çeviri yapacak donanım ile "temizlenebilir" ve kullanımı daha düzenli ve basit hale getirilebilir. Bunlara "CISC" veya "Karmaşık Komut Seti Kodlaması" denir. X86 "Rep" komut öneki bunun basit bir örneğidir - bir FOR döngüsü yazmak zorunda kalmamak için aşağıdaki komutun birkaç kez tekrarlanmasına neden olur.

Daha sonra (1980'lerde) ARM işlemcilerinde görebileceğiniz daha basit bir doğrudan kodlama stiline (RISC - Azaltılmış Komut Seti Kodlama) bir hareket geldi. Bu, o sırada küçük boyutlu ASIC'ler tarafından yönlendirildi ve üzerlerine 32 bit CPU koyma arzusu, bu nedenle karmaşık komut seti kod çözücüleri için tam CPU'yu yaklaşık 20.000 kapıya düşürmek için yedek kapasite yoktu. (Geçici bir performans artışı da vardı, çünkü insanlar henüz CISC kod çözücüleri hızlı hale getirmek için teknikler geliştirmemişti - bu Pentium Pro ile yaklaşık 1995'te geldi)

Ve günümüzde önemli değil - CPU'lar bir kerede birkaç talimat okuyor ve milyonlarca transistörü kod çözmeye, yeniden sipariş vermeye ve aynı anda mümkün olan en fazla sayıda programı çalıştırmaya hızlandırmak için mümkün olduğunca çok çalıştırmaya ayırıyor ISA tarzı.


2
CISC'ye "kullanımı daha kolay" diyeceğime emin değilim. Bu asıl niyet olabilirdi, ancak 30 yıl sonra bunlar "kullanımı kolay" antitezidir (en azından RISC ISA'lara kıyasla).
tonysdg

2
Kullanımı daha kolay olan saygıları vardır ... derleyiciler nispeten önemsiz programlar olduğunda düzenlilik (diklik büyük bir konuydu) ya da derleyiciden daha az çeviri gerektiren doğrudan üst düzey işlemleri destekleyerek. Ancak bu çok uzun zaman önceydi ve hayatta kalan herhangi bir CISC'nin orijinal talimat setinin üstünde çok fazla revizyon katmanı var. Derleyiciler de tüm tanıma biçimlerinden değişti - o zamanlar gcc tarafından yapılan bin optimizasyon geçişi düşünülemezdi. Peki o zaman "kolay" olan şey şu anda çok az ilişki taşıyor.
Brian Drummond

4
Bu ayrım hem aşınmış (daha fazla talimat ekleyerek "RISC" setleri) ve VLIW gibi yeni, daha karmaşık mimariler tarafından üstüste getirilmiştir; gerçekten tek fikir birliği x86 (16 ve 32 bit) kullanımı zor olmasıdır
pjc50

1
@tonysdg: Kullanımı zor RISC ve kullanımı zor CISC vardır. "Programcı dostu" iyi bir karşılaştırma 68k vs ARM karşılaştırmak için. ARM bir derleyici için tasarlanmıştır, bu yüzden RAM'den veri almak ve RAM'e geri yazmak için çok fazla manuel iş yapmanız gerekiyordu. 68k, montaj programcıları için tasarlanmıştır ve doğrudan RAM'deki veriler üzerinde çalışmanıza izin verir. 68k ISA'ya bakarsanız, bir istisna dışında modern RISC ISA'ya çok benzediğini göreceksiniz - RISC sadece kayıtlarda çalışmanıza izin verirken doğrudan RAM'de çalışabilirsiniz.
slebetman

1
Mikrokod öncelikle bir CISC özelliğidir. Ancak mikro kod olmadan CISC uygulayabilirsiniz: talimat kod çözücü daha karmaşık olacaktır. Ayrıca Pentium-Pro'dan itibaren dahili olarak RISC olarak tanımlanan bazı CISC'leri göreceksiniz; her CISC talimatını bir veya daha fazla dahili RISC ops'e çevirme: mikrokod için başka bir isim (farklılıklar süperskalar yürütme birimlerinde bulanıklaşsa da)
Brian Drummond

9

Benzer talimatları birlikte gruplandırırsanız, desenler ortaya çıkar. Bu, ISA kılavuzunun aslında hangi talimat kelimesinin bitinin işleve, kayıt seçimine vb. Karşılık geldiğini gösterdiği ARM'de çok açıktır. Ancak X86 için de çıkarılabilir .

Sonuçta, opkodların "fonksiyon" kısmı, belirli bir fonksiyonu veya boru hatlı operasyon dizisini aktive eden bir ikili-bir-sıcak dekodere girer. Kod çözülmesi için bir durum makinesi gerektiren değişken uzunluktaki talimatları düşünmüyorsak, genellikle herhangi bir durum makinesinin içeriği ile ilgili değildir.


Temelde çip üzerinde mümkün olan en düşük transistör sayısı için atış yaptığını söylüyorsunuz. OP sorusu bağlamında tamamen katılıyorum, burada daha temiz bir talimat seti için yüzlerce ekstra transistör göze alamazlar. Milyon-transistörlü CPU'ların bakım için neredeyse bir nedeni yoktur, ancak elbette birçoğu geriye dönük uyumluluk için tutmaktadır.
Harper - Monica

@Harper Hala bir sebep var, çünkü transistörler küçüldükçe hala büyüklükleri var - ve bu arada saat oranları çok arttı. Bu nedenle, çok büyük bir talimat kod çözücü hala performans için bir darboğaz olabilir (birçok CPU'nun önceden kodlama talimatlarını tercih etmesinin nedenlerinden biri ). Transistör sayısı hakkında değil, daha çok kalıp alanıyla birlikte saat hızı hakkında. Bilgilerin yayılması hala zaman alıyor ve modern CPU'lar ışık hızında çalışmıyorken, önemli iyileştirmeler beklemek için hız sınırından yeterince uzakta değiller.
Luaan

@Luaan: Aslında, "tüm bu transistörlerle ne yapacağız" bugünlerde gerçek bir soru. Bugünlerde atılan tüm L2 / L3 önbelleklerine bakın. Bu sessiz bir giriş, milyonlarca transistör için daha iyi bir kullanımımız yok. En son Xeon, 2 milyardan fazla transistörü önbelleğe ayırıyor !
MSalters

6

Bir noktada biri oturdu ve onları tanımladı.

İyi bir ISA, kod çözücüyü mümkün olduğunca basit hale getirecektir.

Örneğin bir ALU komutuyla, opcodeun bazı bitlerinin doğrudan ALU'nun kontrol hatlarına gönderilmesine izin verebilirsiniz.


Mükemmel cevaplar için herkese teşekkürler. Hepiniz bunu daha iyi anlamama yardımcı oldunuz.
Steven

4
Aslında, kod çözücü basitliği dışında dikkate alınması gereken birkaç faktör vardır. Koşullara ve kullanım amacına bağlı olarak, diğerleri (örneğin, kod yoğunluğu) kod çözücü basitliğinden daha önemli olabilir. Modern bir işlemcide, kod yoğunluğu çoğu durumda kod çözücü basitliğine ağır basar .
Jerry Coffin

5

Genellikle, ISA'nızı işlevsel gruplara bölerdiniz. Tamamlayıcı çiftlerin tek bir bit değişikliği (mağazaya karşı yükleme) ile ayırt edilmesi ve kod çözme karar ağacını etkileyen bazı bit hiyerarşisine sahip olmanız mantıklıdır (mantık optimizasyonu veya sadece düzenli olmak için).

Günün sonunda, fonksiyon bloğu için keyfi bir bit tahsisi ('veri' alanlarını talimatlara yerleştirmenin aksine, genel tasarım verimliliğiniz üzerinde sadece küçük bir etkisi olacaktır - ancak nasıl yapılacağına dair birçok seçeneğiniz vardır. Önemli bir parametre olduğunu düşündüğünüz şeye bağlı olarak ISA kodlamanızı 'optimize edin'.


1

Talimat kodlaması çirkin bir uzlaşmadır.

Kod çözmeyi basitleştirmek için, bunun için her biri ayrı olarak kodu çözülebilen ve yürütme motorunun ayrı bir bölümüne yönlendirilebilen basit bir alan kümesi istersiniz.

Sınırlı bir talimat kelimesi içine mümkün olduğunca çok işlevsellik paketleme. Bu, çeşitli ortak sayıları kodlayabilen özel sabit formatlar gibi şeylere yol açar.

İleri ve geri uyumluluk. Mümkün olan her opcode'a işlevsellik atarsanız, kendinize mimariyi daha sonra genişletmek için yer kalmaz. Mevcut bir mimariye ekliyorsanız, yeni talimatlarınızı yedek opcode yerleştirmeniz gerekir.


1

Randy Hyde'in mükemmel (biraz tarihli) Meclis Sanatı, 3.3.4 Kontrol Ünitesi ve Komut Setleri ve izleyen bölümlerde ayrıntılı olarak açıklanan x86 yönergesine girer .

Erken (Von Neumann öncesi) bilgisayar sistemlerindeki programlar genellikle devrelere "kabloyla bağlanmıştır". Yani, bilgisayarın kablolaması bilgisayarın hangi sorunu çözeceğini belirledi. Programı değiştirmek için devreyi yeniden bağlamak zorunda kaldı. Çok zor bir iş. Bilgisayar tasarımındaki bir sonraki ilerleme, bir bilgisayar programcısının bir dizi soket ve fiş kablosu kullanarak bilgisayar sistemini kolayca "yeniden sarmasına" izin veren programlanabilir bilgisayar sistemiydi. Bir bilgisayar programı, her biri programın yürütülmesi sırasında bir işlemi temsil eden bir dizi delik sırasından (soketler) oluşur. Programcı, istenen talimat için belirli sokete bir kablo takarak çeşitli talimatlardan birini seçebilir.

Daha sonra oldukça akılda kalıcı ve ilk iki fişin talimat için nasıl durduğunu gösterir, bir sonraki fişler kaynak ve hedefi kodlar. Tabii ki, bugün artık kimse "fişe takmıyor", ama gerçekten eski ISA'lar için, opcode'daki bitler temelde daha önce fişlerle aynı işi yapıyor.

Böyle bir şeyle sonuçlanırsınız:

resim açıklamasını buraya girin


Hyde'den bağlantı için teşekkürler! Çok bilgilendirici ve mükemmel bir öğretim tarzına sahip gibi görünüyor.
Steven
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.