Bir CPU için opcode nasıl verimli bir şekilde tasarlanır?


12

Logisim'de basit bir 16-bit CPU yapıyorum ve ALU'yu hazır ve sahip olmak istediğim opcodes'im var. Şimdi farklı alt devrelerin (örn. Mantık, aritmetik) giriş olarak tüm kontrol kablolarına (kodlamayı oluşturan) ihtiyaç duymadığı kadar komutlar için doğru kodlamayı bulmak gerçekten zor. Etkin bir opcode tasarımına yardımcı olan herhangi bir strateji veya yöntem var mı?

şimdiden teşekkürler


1
Önce ALU'nuzu oluşturun ve hangi kontrol kablolarına ihtiyaç duyduğunu görün. Sonra bunları doğrudan "geçerli talimat" kaydına bağlayın. Bellek erişim kontrol mantığı ve diğer büyük opcode sınıfları için aynıdır. Ardından hangi alt devrenin etkinleştirileceğini seçmek için kalan bitleri kullanın.
user253751

1
Ayrıca, 8 bitlik programlanabilir staminachin KCPSM, yani PicoBlaze'nin Ken Chapman'ın orijinal makalesi de var. Talimatları nasıl seçtiğini ve ISA'yı nasıl tasarladığını anlatıyor. dc.uba.ar/materias/disfpga/2010/c2/descargas/…
Paebbels

Yanıtlar:


9

Diğer bazı öğretim setlerini incelemek iyi bir yaklaşımdır.

Küçük bir TI MSP430 olurdu, yaklaşık 22 talimatları ile 16bit İşlemci.

http://www.physics.mcmaster.ca/phys3b06/MSP430/MSP430_Instruction_Set_Summary.pdf

Ayrıca Atmel AVR'lere de oldukça küçük bir talimat seti de bakabilirsiniz.

Küçük bir projemde, VHDL'de küçük bir talimat seti ile basit bir 32 bit işlemci geliştirmeye çalıştım (14 talimat):

http://www.blog-tm.de/?p=80

Mevcut boş zamanım nedeniyle tamamen bitmedi. Talimatlar uygulandı, ancak ikisi test edilmedi ve belki bazı durum bayrakları eksik.


Ama gerçek kodlamanın ne olduğunu ve neden böyle seçildiğini görebildiğim bir şey bulamadım.
Benjoyo

Gerçek kodlamayı repo'da bulabilirsiniz: github.com/TM90/MISC_Processor/raw/master/Documentation/… . Bu kodlamaları, talimat kod çözücüdeki mantığın asgari düzeyde olacağı şekilde seçmemin nedeni
TM90

7

Talimat kodlamasına ARM yaklaşımını inceleyin (ama tekrarlamayın). Çok fazla önek yönelimlidir (Dzarda tarafından önerilen Huffman ağacı yaklaşımı gibi) ve kayıt işleminin talimatın bir kısmını seçtiği yer bakımından oldukça muntazamdır.

Yaratıcı olmayan ama güvenilir yaklaşım, sahip olduğunuz tüm kontrol sinyallerini numaralandırmak ve muhtemelen 16 bitten fazla olacak ve daha sonra üzerlerinde Karnaugh-harita tarzı mantık minimizasyonu yapmaya çalışacaktır.


Kontrol sinyalleri ile ne demek istediğini anlamıyorum.
Benjoyo

ARM hakkında bulduğum ve beğendiğim şey durum alanı, bunu dahil edeceğim.
Benjoyo

Kontrol sinyalleri çeşitli çoklayıcıların girişleridir ve CPU'nun parçaları arasında doğrudan veri olmasını sağlar.
pjc50

16-bit mimari için, ARM'nin komut kodlamasının uygun olduğunu düşünmüyorum. Mayby thumb2 daha iyi. Ama biraz savurgan olsa da, basit ve anlaşılması kolay MIPS kodlama yolunu seviyorum
phuclv

4

Bir keresinde Logisim'de 8 bit talimat uzunluğu çekirdekli 4 bit CPU yapmayı denedim. Gerçekten basit bir durum makinesi, bir CPU'dan daha fazlası ile sona erdi.

Aranacak rastgele şeyler

  • Huffman ağaçları
  • Sabit uzunlukta veya değişken kodlama?
  • Tek adres alanına sahip bir von Neumann tasarımı mı yoksa ayrı veri / programla Harvard tarzı mı?

Huffman ağaçları hakkında Computerphile hakkında mükemmel video:

https://www.youtube.com/watch?v=umTbivyJoiI


Huffman kodlaması sabit uzunluklu kodlama için çalışmaz, değil mi?
Benjoyo

@ Benjoyo En çok kullanılan talimatların varyasyonları için kullanılan yedek bitlerle bir senaryo hayal edebiliyorum, böylece daha fazla işlevsellik sağlıyorum.
Dzarda

Ama bunun ne tür bir optimizasyon getirmediğini anlamıyorum. Devre tasarımı konusunda bana yardımcı olmuyor. Opcode için Huffman kodlamasını kullanırken amaç nedir?
Benjoyo

4

Sınıf için yazdım ISA bir kez böyle 4 bit op kodu vardı: 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

Bu, en uygun olmaktan ziyade, kapıları inşa etmek / tasarlamak için daha kolay stillerden biridir çünkü tek bir bitin giriş sinyali, hangi mantık yolunun alındığını tamamen kontrol edebilir. Alternatif olarak, en çok kullandığınız sembolleri Huffman Kodlayabilir ve sabit uzunlukta bir op kodu almak için sıfırlayabilirsiniz.


Bu tür bir optimizasyon şu anda aradığım şey. Ama 5 bitlik bir opcode'um var ve komutları birlikte gruplamakta zorlanıyorum, böylece devrede mantıklı.
Benjoyo

@ Benjoyo, üst bit seti ile bir sürü daha fazla ALU talimatı olabilir. Ayrıca atlama koşulu kapsamım oldukça zayıftı ve çoğu normal dal iki talimat gerektiriyordu. Genel olarak, kategorileri düşündüm: Matematik / Kontrol / Bellek

3

Dikkate almanız gereken bir şey, herhangi bir çok kelimeli öğretime veya çok kelimeli bir komut gibi "davranabilecek" herhangi bir şeye izin verilip verilmeyeceğidir; bunu yaparsanız, ana talimatı izleyen ek talimat kelimeleri mi yoksa önek kelimelerini önek mi kullanacağınızı düşünebilirsiniz. Ön eklere ve takip sözcüklerine izin vermek, kesme işleminin karmaşıklığını artırabilir, ancak nadiren kullanılan talimatların yaygın olarak kullanılanlarla aynı opcode alanına sığdırılması gereğini ortadan kaldırabilir.

Talimatlar yürütülmeden önce döngüde getirilirse, ya bir sonraki talimat kelimesinin atlanmasına ya da içeriğinin doğrudan program sayacına aktarılmasına neden olan bir "koşullu dal" talimatı olabilir; böyle bir tasarım, sıralamayı kesmek için biraz daha karmaşıklık ekleyebilir, ancak çok daha fazla dal koşulu aralığına izin verirken, "dal", "atlama" ve "çağrı" talimatları için opcode alanının büyük bir bölümünü kullanma ihtiyacını kolaylaştırabilir. aksi takdirde mümkün olacaktır. Alınan bir dal, adresin nereden geldiğine bakılmaksızın, talimatın yürütülmesini takiben ölü bir döngü gerektireceğinden, adresin getirilen, ancak yürütülmeyecek aşağıdaki kelimeden gelmesi ekstra ücrete tabi değildir. saati.

Hedef adresi şube talimatlarının dışına taşımak, opcode alanının ne kadarını azaltabileceklerini azaltsa da, 16 bitlik bir opcode formatı hala oldukça sıkıdır. Önek talimatlarını kullanmak bu konuda yardımcı olabilir. Örneğin, herhangi bir kaydın kaynak1, kaynak2 ve hedef olarak bağımsız olarak belirtilmesine izin veren 32 kayıt olması istenirse, opcode içinde 15 bit gerekir ve toplam iki komutun tamamlanması sağlanır. Çok faydalı değil. Öte yandan, üç işlenenin her biri için 32 kayıttan herhangi birini kullanabilmek iyi olurdu. Bir önekten önce gelmeyen herhangi bir ALU işlemi ile iki hedef dengelenebilir, on altıdan biri iki kayıt seçimi yapmak için sekiz bit kullanılır, ancak öneki hemen takip eden bir önek izleyen bir ALU işlemi olabilir. aşağıdaki talimattan sekiziyle, Üst kaynakların kullanıldığı talimatlar, tek bir kaynak yerine iki kelime / döngü gerektirecektir, ancak bazı durumlarda böyle bir dengesizlik faydalı olabilir. Ön ekleri kullanmanın en büyük zorluğu, ya bir önek ile bir sonraki talimat arasında bir kesilmenin önlenmesi ya da bir kesinti gerçekleşirse, önekten sonraki komutun hala doğru kayıtları kullanmasını sağlamaktır [ör. -sayfa kaydetme mantığı yürütülen son önek olmayan talimatın adresini saklar]. ancak bazı durumlarda böyle bir ödünleşime değer olabilir. Ön ekleri kullanmanın en büyük zorluğu, ya bir önek ile bir sonraki talimat arasında bir kesilmenin önlenmesi ya da bir kesinti gerçekleşirse, önekten sonraki komutun hala doğru kayıtları kullanmasını sağlamaktır [ör. -sayfa kaydetme mantığı yürütülen son önek olmayan talimatın adresini saklar]. ancak bazı durumlarda böyle bir ödünleşime değer olabilir. Ön ekleri kullanmanın en büyük zorluğu, ya bir önek ile bir sonraki talimat arasında bir kesilmenin önlenmesi ya da bir kesinti gerçekleşirse, önekten sonraki komutun hala doğru kayıtları kullanmasını sağlamaktır [ör. -sayfa kaydetme mantığı yürütülen son önek olmayan talimatın adresini saklar].

Çok kelimeli talimatlar kullanmak, tasarımın bazı yönlerini daha zor hale getirecektir, ancak diğer zor kararlar verme ihtiyacını azaltabilir.


0

Bu adam, bir Kod Çözücünün sabit kodlanmış bölümünü, sabit kodlu bir CPU için kontrol hatlarını açıklayan en iyi ayrıntılara sahiptir: http://minnie.tuhs.org/CompArch/Tutes/week03.html Gördüğünüz gibi, Opcodes'teki seçim, Decode mantığının ne kadar karmaşık olduğunu gerçekten etkiler.

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.