Ketika insinyur merancang arsitektur kumpulan instruksi, dengan prosedur atau protokol apa, jika ada, yang mereka ikuti ketika menunjuk kode biner tertentu sebagai instruksi. Sebagai contoh, jika saya memiliki ISA yang mengatakan 10110 adalah instruksi muatan, dari mana angka biner itu berasal? Apakah itu dimodelkan dari tabel keadaan untuk mesin keadaan terbatas yang mewakili operasi beban?
Sunting: Setelah melakukan penelitian lebih lanjut, saya percaya apa yang saya coba tanyakan berkaitan dengan bagaimana opcodes untuk berbagai instruksi CPU ditugaskan. ADD mungkin ditunjuk dengan opcode 10011; instruksi pemuatan mungkin ditetapkan sebagai 10110. Proses pemikiran apa yang digunakan untuk menetapkan opcode biner ini untuk set instruksi?
sumber
Jawaban:
Dalam banyak kasus, pilihannya cukup sewenang-wenang atau didasarkan pada "di mana pun itu paling cocok" karena ISA tumbuh seiring waktu. Namun, MOS 6502 adalah contoh luar biasa dari sebuah chip di mana desain ISA sangat dipengaruhi oleh upaya untuk memeras sebanyak mungkin dari transistor terbatas.
Lihat video ini menjelaskan bagaimana 6502 direkayasa balik , khususnya mulai 34:20 dan seterusnya.
6502 adalah mikroprosesor 8-bit yang diperkenalkan pada tahun 1975. Walaupun memiliki gerbang 60% lebih sedikit daripada Z80, tetapi dua kali lebih cepat, dan meskipun lebih terbatas (dalam hal register dll), itu dibuat untuk itu dengan set instruksi yang elegan.
Ini berisi hanya 3.510 transistor, yang ditarik, dengan tangan , oleh tim kecil orang yang merangkak di atas beberapa lembaran plastik besar yang kemudian secara optik menyusut, membentuk berbagai lapisan 6502.
Seperti yang Anda lihat di bawah, 6502 meneruskan opcode instruksi dan data timing ke dalam decode ROM, kemudian meneruskannya ke komponen "random control logic" yang tujuannya mungkin untuk mengesampingkan output ROM dalam situasi kompleks tertentu.
Pada pukul 37:00 dalam video Anda dapat melihat tabel ROM decode yang menunjukkan kondisi apa yang harus dipenuhi input untuk mendapatkan "1" untuk output kontrol yang diberikan. Anda juga dapat menemukannya di halaman ini .
Anda dapat melihat bahwa sebagian besar hal dalam tabel ini memiliki Xs di berbagai posisi. Mari kita ambil contoh
Ini berarti 3 bit pertama opcode haruslah 011, dan G harus 2; tidak ada hal lain yang penting. Jika demikian, output bernama RORRORA akan menjadi kenyataan. Semua opcode ROR dimulai dengan 011; tetapi ada instruksi lain yang dimulai dengan 011 juga. Ini mungkin perlu disaring oleh unit "logika kontrol acak".
Jadi pada dasarnya, opcodes dipilih sehingga instruksi yang diperlukan untuk melakukan hal yang sama satu sama lain memiliki kesamaan di seluruh pola bit mereka. Anda dapat melihat ini dengan melihat tabel opcode ; semua instruksi ATAU mulai dengan 000, semua instruksi Store mulai dengan 010, semua instruksi yang menggunakan pengalamatan halaman nol adalah dalam bentuk xxxx01xx. Tentu saja, beberapa instruksi sepertinya tidak "pas", karena tujuannya bukan untuk memiliki format opcode yang benar-benar biasa, melainkan untuk menyediakan set instruksi yang kuat. Dan inilah mengapa "logika kontrol acak" diperlukan.
Halaman yang saya sebutkan di atas mengatakan bahwa beberapa garis output dalam ROM muncul dua kali, "Kami menganggap ini telah dilakukan karena mereka tidak memiliki cara untuk merutekan output dari beberapa baris di mana yang mereka inginkan, sehingga mereka meletakkan baris yang sama di tempat yang berbeda. lokasi lagi. " Saya bisa membayangkan para insinyur menggambar gerbang-gerbang itu satu per satu dan tiba-tiba menyadari kekurangan dalam desain dan mencoba mencari cara untuk menghindari memulai kembali seluruh proses.
sumber
Tergantung berapa umur ISA.
Pada hari-hari awal desain tangan, dan bahkan lebih lagi ketika CPU dikumpulkan dari logika diskrit, desain logika akan menjadi yang pertama, dan telah diperkecil secara luas, dan kemudian pola bit ISA akan menjadi nilai apa pun yang diperlukan untuk membuat nilai minimal kerja logika.
Jadi mungkin ada pola tertentu dari sinyal kontrol yang memungkinkan beberapa multiplexer untuk menghubungkan output ALU ke input file register GP, beberapa sinyal kontrol lagi yang menginstruksikan ALU untuk menambah, mengurangi, DAN, ATAU dll, dan beberapa bit alamat ke dalam file register. Tiga kelompok sinyal ini akan membentuk bidang dalam instruksi. Setiap kelompok akan disimpan bersama, dan makna terperinci mereka muncul dari desain untuk unit itu (ALU dll) tetapi kelompok-kelompok itu mungkin dalam urutan apa pun, hingga Anda mendesain decoder instruksi. (x86 sudah cukup tua sehingga Anda dapat mendeteksi beberapa ini jika Anda melihat di tempat yang tepat - itu bukan desain yang sama sekali baru, tetapi menarik dari 8080 yang lebih tua)
Kemudian SPA dapat "dibersihkan" dan dibuat lebih teratur dan lebih mudah untuk digunakan, dengan perangkat keras untuk menerjemahkan antara mereka dan sinyal kontrol tingkat perangkat keras yang sebenarnya, kadang-kadang melalui "mikrokode". Ini disebut "CISC" atau "Pengesetan Set Instruksi Kompleks". Awalan instruksi "Rep" x86 adalah contoh sederhana dari ini - ini menyebabkan instruksi berikut diulang beberapa kali, untuk menghemat keharusan menulis loop FOR.
Kemudian masih (pada 1980-an) datang gerakan kembali ke gaya yang lebih sederhana dari pengkodean langsung (RISC - Reduced Instruction Set Coding) yang dapat Anda lihat dalam prosesor ARM. Ini didorong oleh ukuran kecil ASIC pada saat itu, dan keinginan untuk menempatkan CPU 32-bit pada mereka, maka tidak ada kapasitas cadangan untuk decoder set instruksi yang kompleks, untuk membuat CPU lengkap turun menjadi sekitar 20.000 gerbang. (Ada juga peningkatan kinerja sementara, karena orang belum mengembangkan teknik untuk membuat decoder CISC cepat - yang datang sekitar 1995 dengan Pentium Pro)
Dan saat ini tidak masalah - CPU membaca beberapa instruksi sekaligus, dan mencurahkan jutaan transistor untuk mendekode mereka, memesan kembali, dan mengeksekusi sebanyak mungkin sekaligus, untuk mempercepat program yang mungkin telah ditulis untuk yang tertua gaya ISA.
sumber
Jika Anda mengelompokkan instruksi yang serupa bersama-sama, pola akan muncul. Ini sangat jelas dalam ARM, di mana manual ISA benar-benar menunjukkan Anda sedikit kata instruksi yang sesuai dengan fungsi, pilihan register, dll. Tetapi juga dapat disimpulkan untuk X86 .
Pada akhirnya bagian "function" dari opcode masuk ke beberapa decoder biner-ke-satu yang benar-benar mengaktifkan fungsi atau urutan tertentu dari operasi pipelined. Biasanya tidak terkait dengan konten mesin negara mana pun, kecuali kami mempertimbangkan instruksi panjang variabel yang membutuhkan mesin negara untuk memecahkan kode.
sumber
Seseorang pada suatu titik duduk dan mendefinisikannya.
ISA yang baik akan membuat decoder sesederhana mungkin.
Misalnya dengan instruksi ALU Anda dapat membiarkan beberapa bit opcode dikirim langsung ke baris kontrol ALU.
sumber
Biasanya, Anda akan membagi ISA Anda menjadi kelompok fungsional. Masuk akal (baik untuk optimasi logika atau hanya rapi) bahwa pasangan pelengkap dibedakan oleh perubahan bit tunggal (load vs store), dan bahwa Anda memiliki beberapa hierarki bit yang memengaruhi pohon keputusan dekode.
Pada akhirnya, alokasi bit yang sewenang-wenang untuk blok fungsi (sebagai lawan menempatkan bidang 'data' dalam instruksi hanya akan berdampak kecil pada efisiensi desain keseluruhan Anda - tetapi Anda memiliki banyak pilihan tentang cara 'optimalkan' penyandian ISA Anda tergantung pada apa yang Anda rasakan sebagai parameter penting.
sumber
Pengkodean instruksi adalah kompromi yang buruk antara.
Membuat decode sederhana, untuk ini Anda ingin satu set bidang sederhana yang masing-masing dapat diterjemahkan secara terpisah dan dialihkan ke bagian terpisah dari mesin eksekusi.
Mengemas fungsionalitas sebanyak mungkin ke dalam kata instruksi ukuran terbatas. Ini mengarah pada hal-hal seperti format konstan khusus yang dapat menyandikan berbagai angka umum.
Maju dan mundur kompatibilitas. Jika Anda menetapkan fungsionalitas untuk setiap opcode yang mungkin, Anda tidak punya ruang untuk memperluas arsitektur nanti. Jika Anda menambahkan ke arsitektur yang sudah ada, Anda harus memasukkan instruksi baru Anda ke dalam opcode cadangan.
sumber
Randy Hyde luar biasa (jika agak ketinggalan jaman) Seni Majelis masuk ke instruksi x86 diatur dalam beberapa detail dalam bab 3.3.4 Unit Kontrol dan Set Instruksi dan berikut.
Dia kemudian menunjukkan cukup menarik dan panjang lebar bagaimana pasangan pertama colokan berdiri untuk instruksi, colokan berikutnya menyandikan sumber dan tujuan. Tentu saja, hari ini tidak ada lagi "colokan", tetapi untuk ISA yang benar-benar tua, bit-bit pada opcode pada dasarnya melakukan pekerjaan yang sama dengan colokan sebelumnya.
Anda berakhir dengan sesuatu seperti ini:
sumber