Bagaimana cara mendesain opcode untuk CPU secara efisien?


12

Saya sedang membangun CPU 16-bit sederhana di Logisim dan memiliki ALU yang siap dan opcodes yang ingin saya miliki. Sekarang saya merasa sangat sulit untuk menemukan pengkodean yang tepat untuk perintah-perintah sehingga sub-sirkuit yang berbeda (misalnya logika, aritmatika) tidak memerlukan semua kabel kontrol (yang membangun pengkodean) sebagai input, tetapi sesedikit mungkin. Apakah ada strategi atau metode yang membantu dengan desain opcode yang efisien?

terima kasih sebelumnya


1
Bangun ALU Anda terlebih dahulu, dan lihat kabel kontrol apa yang dibutuhkannya. Kemudian kirimkan langsung ke register "instruksi saat ini". Sama untuk logika kontrol akses memori, dan kelas opcode utama lainnya. Kemudian gunakan bit apa pun yang tersisa untuk memilih subcircuit mana yang diaktifkan.
user253751

1
Ada juga kertas asli dari Ken Chapman dari 8-bit diprogram statemachine KCPSM alias PicoBlaze. Ini menggambarkan bagaimana dia memilih instruksi dan mendesain ISA. dc.uba.ar/materias/disfpga/2010/c2/descargas/…
Paebbels

Jawaban:


9

Saya pikir itu adalah pendekatan yang baik untuk mempelajari beberapa set instruksi lainnya.

Yang kecil akan menjadi MSP430 dari TI itu adalah Prosesor 16bit dengan sekitar 22 instruksi.

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

Anda juga bisa melihat ke dalam Atmel AVR yang mereka juga memiliki set instruksi yang cukup kecil.

Dalam proyek kecil saya, saya mencoba mengembangkan prosesor 32 bit sederhana di VHDL dengan set instruksi kecil (14 instruksi):

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

Karena waktu luang saya saat ini belum sepenuhnya selesai. Instruksi dilaksanakan tetapi dua tidak diuji dan mungkin beberapa flag status hilang.


Tapi saya tidak menemukan sesuatu di mana saya bisa melihat apa pengkodean yang sebenarnya dan mengapa itu dipilih seperti ini.
Benjoyo

Anda dapat menemukan pengkodean yang sebenarnya dalam repo: github.com/TM90/MISC_Processor/raw/master/Documentation/… . Alasan saya memilih pengkodean ini dengan cara yang logika dalam decoder instruksi menjadi minimal.
TM90

7

Pelajari (tetapi jangan mereplikasi) pendekatan ARM untuk pengkodean instruksi. Ini sangat berorientasi pada awalan (seperti pendekatan pohon Huffman yang direkomendasikan oleh Dzarda) dan sangat seragam dalam hal di mana register memilih bagian dari instruksi tersebut.

Pendekatan tidak imajinatif tetapi dapat diandalkan adalah untuk menghitung semua sinyal kontrol yang Anda miliki, yang mungkin akan lebih dari 16 bit, dan kemudian mencoba untuk melakukan minimalisasi logika gaya peta-Karnaugh pada mereka.


Saya tidak benar-benar mendapatkan apa yang Anda maksud dengan sinyal kontrol.
Benjoyo

Apa yang saya temukan dan sukai tentang ARM adalah bidang kondisi, saya akan memasukkannya.
Benjoyo

Sinyal kontrol adalah input ke berbagai multiplexer dan memungkinkan data langsung antara bagian-bagian CPU.
pjc50

Untuk arsitektur 16-bit, saya rasa encoding instruksi ARM tidak tepat. Mayby thumb2 lebih baik. Tapi saya suka cara penyandian MIPS, sederhana dan mudah dimengerti, meskipun agak boros
phuclv

4

Suatu kali saya mencoba melakukan CPU 4-bit dengan inti instruksi panjang 8-bit di Logisim. Berakhir dengan mesin negara sederhana, lebih dari CPU, sungguh.

Hal-hal acak untuk dicari

  • Pohon Huffman
  • Memperbaiki panjang atau variabel?
  • Apakah ini desain von Neumann dengan ruang alamat tunggal, atau gaya Harvard dengan data / program terpisah?

Video luar biasa di Computerphile tentang pohon Huffman:

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


Pengodean Huffman tidak akan berfungsi untuk pengkodean panjang tetap, bukan?
Benjoyo

@Benjoyo Saya bisa membayangkan skenario dengan bit cadangan yang digunakan untuk variasi instruksi yang paling banyak digunakan, sehingga memberikan lebih banyak fungsi.
Dzarda

Tapi saya tidak mendapatkan optimasi seperti apa ini. Itu tidak membantu saya dengan desain sirkuit. Apa tujuan saat menggunakan pengodean Huffman untuk opcode?
Benjoyo

4

ISA yang saya tulis untuk kelas dulu memiliki kode op 4 bit seperti: 1XXX ALU instructions 01XX jump, jump register, call etc 001X branch not equal, branch equal zero 000X 0 - load, 1 - store

Alih-alih menjadi yang paling optimal, ini adalah salah satu gaya yang lebih mudah untuk membangun / mendesain gerbang karena sinyal input dari bit tunggal dapat sepenuhnya mengendalikan jalur logika apa yang diambil. Atau, Anda dapat Huffman Code simbol Anda yang paling sering digunakan dan nol pad mereka untuk mendapatkan kode op panjang tetap.


Jenis pengoptimalan inilah yang saya cari saat ini. Tapi saya punya opcode 5 bit dan saya berjuang dengan pengelompokan perintah bersama sehingga masuk akal di sirkuit.
Benjoyo

@Benjoyo Anda bisa memiliki banyak instruksi ALU dengan set bit atas. Juga cakupan kondisi lompatan saya cukup lemah dan sebagian besar cabang normal akan membutuhkan dua instruksi. Secara umum, saya memikirkan kategori sebagai: Matematika / Kontrol / Memori

3

Satu hal yang perlu Anda pertimbangkan adalah apakah akan mengizinkan segala bentuk instruksi multi-kata, atau apa pun yang dapat "bertindak" seperti instruksi multi-kata; jika ya, Anda mungkin ingin mempertimbangkan apakah akan menggunakan kata-kata instruksi tambahan mengikuti instruksi utama, atau kata-kata awalan sebelumnya. Mengizinkan awalan dan kata-kata tindak lanjut dapat meningkatkan kompleksitas penanganan interupsi, tetapi dapat menghindari kebutuhan untuk mencocokkan instruksi yang jarang digunakan dalam ruang opcode yang sama dengan yang biasa digunakan.

Jika instruksi diambil pada siklus sebelum dieksekusi, seseorang dapat memiliki instruksi "cabang kondisional" yang dapat menyebabkan kata instruksi berikutnya dilewati atau kontennya ditransfer langsung ke penghitung program; desain seperti itu mungkin menambah beberapa kompleksitas tambahan untuk menginterupsi urutan, tetapi bisa meringankan kebutuhan untuk menggunakan sebagian besar ruang opcode untuk instruksi "cabang", "lompat" dan "panggil", sambil memungkinkan jangkauan kondisi cabang yang jauh lebih luas. dari yang seharusnya mungkin terjadi. Karena cabang yang diambil umumnya akan memerlukan siklus mati setelah pelaksanaan instruksi itu sendiri terlepas dari mana alamat itu berasal, memiliki alamat berasal dari kata berikut yang telah diambil tetapi tidak akan dieksekusi tidak memerlukan biaya tambahan waktu.

Meskipun memindahkan alamat target dari instruksi cabang akan mengurangi seberapa banyak ruang opcode yang mereka makan, format opcode 16-bit masih cukup ketat. Menggunakan instruksi awalan dapat membantu hal itu. Jika, misalnya, seseorang ingin memiliki 32 register, yang memungkinkan setiap register untuk ditentukan secara independen sebagai source1, source2, dan tujuan akan memerlukan 15 bit dalam opcode, yang memungkinkan total dua instruksi. Sangat tidak berguna. Di sisi lain, bisa menggunakan 32 register untuk masing-masing dari ketiga operan akan menyenangkan. Satu dapat menyeimbangkan dua tujuan dengan memiliki operasi ALU yang tidak didahului oleh awalan menggunakan delapan bit untuk membuat dua satu dari enam belas pilihan register, tetapi memiliki operasi ALU yang segera mengikuti awalan menggunakan beberapa bit dalam awalan bersama dengan delapan dari instruksi berikut, sehingga memungkinkan pemilihan independen dari kedua sumber dan tujuan dari set lengkap 32. Instruksi yang menggunakan register atas akan mengambil dua kata / siklus daripada satu, tetapi dalam beberapa kasus tradeoff semacam itu bisa bermanfaat. Kesulitan terbesar dalam menggunakan awalan adalah bahwa seseorang harus mencegah interupsi dari terjadi antara awalan dan instruksi berikutnya atau memastikan bahwa jika interupsi memang terjadi di sana, instruksi setelah awalan masih akan menggunakan register yang tepat [misalnya dengan memiliki program -counter save logic menyimpan alamat instruksi non-awalan terakhir yang dijalankan]. tetapi dalam beberapa kasus pengorbanan seperti itu bisa bermanfaat. Kesulitan terbesar dalam menggunakan awalan adalah bahwa seseorang harus mencegah interupsi dari terjadi antara awalan dan instruksi berikutnya atau memastikan bahwa jika interupsi memang terjadi di sana, instruksi setelah awalan masih akan menggunakan register yang tepat [misalnya dengan memiliki program -counter save logic menyimpan alamat instruksi non-awalan terakhir yang dijalankan]. tetapi dalam beberapa kasus pengorbanan seperti itu bisa bermanfaat. Kesulitan terbesar dalam menggunakan awalan adalah bahwa seseorang harus mencegah interupsi dari terjadi antara awalan dan instruksi berikutnya atau memastikan bahwa jika interupsi memang terjadi di sana, instruksi setelah awalan masih akan menggunakan register yang tepat [misalnya dengan memiliki program -counter save logic menyimpan alamat instruksi non-awalan terakhir yang dijalankan].

Menggunakan instruksi multi-kata akan membuat beberapa aspek desain lebih sulit, tetapi mungkin mengurangi kebutuhan untuk membuat keputusan sulit lainnya.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.