Filosofi RISC-V

ISA terbuka dengan ekstensi modular dan desain basis minimal RV64I beserta implikasinya.

Daftar isi

RISC-V memperkenalkan pendekatan yang berbeda dari arsitektur berhak cipta seperti x86-64. Topik ini membahas instruction set architecture (ISA) RISC-V sebagai standar terbuka, basis minimal RV64I, serta skema ekstensi modular yang membentuk profil RV64GC. Setelah membacanya, latar desain di balik setiap instruksi yang dirakit dan dijalankan pada topik-topik lain dalam modul ini dapat dipahami secara utuh.

ISA terbuka dan tata kelolanya#

RISC-V adalah ISA yang diterbitkan sebagai open standard, yaitu spesifikasi yang dapat dibaca, diimplementasikan, dan diverifikasi siapa pun tanpa menuntut royalti lisensi. Arsitektur ini lahir di University of California, Berkeley sekitar tahun 2010 sebagai arsitektur penelitian, kemudian pengelolaannya diserahkan kepada RISC-V International, konsorsium keanggotaan yang merawat dan mengembangkan spesifikasinya. Perbedaannya dengan x86-64 dan ARM cukup tajam, karena kedua arsitektur tersebut dikendalikan oleh pemilik haknya sehingga implementasi baru menuntut perjanjian lisensi dari pemegang haknya.

Sifat terbuka ini berdampak langsung pada cara belajar assembly-nya. Spesifikasi resmi dapat diunduh dan dibaca utuh tanpa pendaftaran, dan setiap keputusan encoding yang ditemui sepanjang modul ini dapat diverifikasi terhadap teks spesifikasinya. Spesifikasi RISC-V berkembang lewat proses ratifikasi yang terbuka bagi setiap anggota, sehingga bagian yang telah diratifikasi dinyatakan stabil untuk diimplementasikan. Dukungan perangkat lunaknya juga tumbuh pada jalur yang sudah mapan, yaitu toolchain GNU, port Linux, dan emulator seperti QEMU yang digunakan modul ini. Kombinasi itulah yang membuat seluruh latihan modul ini dapat dijalankan di sandbox tanpa perangkat keras RISC-V sama sekali. Spesifikasi terbuka juga tidak berarti seluruh implementasinya sama, sebab setiap pembuat inti prosesor tetap bebas menambahkan ekstensi atau mikroarsitektur sendiri, sedangkan basis bahasa instruksinya tetap satu dan sama.

Basis minimal RV64I#

RISC-V dirancang dengan basis sesederhana mungkin. Basis RV64I adalah himpunan instruksi integer 64-bit yang hanya memuat hal-hal yang paling mendasar, yaitu perpindahan data antar register, load dan store, aritmetika serta operasi perbineran antar register, cabang, lompatan, dan ecall untuk meminta layanan sistem. Tidak ada instruksi perkalian pada basis ini, karena perkalian ditempatkan pada ekstensi M yang terpisah. Panjang setiap instruksi basis tetap 4 byte, sehingga pencacah program selalu berpindah sejauh kelipatan empat.

Desain basis minimal ini berkonsekuensi pada prosesor, bukan pada pembaca spesifikasinya. Dekoder yang harus diterapkan perangkat keras jauh lebih kecil daripada dekoder x86-64 yang mewarisi instruksi dari beberapa dekade sekaligus. Spesifikasi unprivileged, yaitu jilid spesifikasi untuk instruksi tingkat pengguna, mendefinisikan basis ini beserta seluruh ekstensinya, dan itulah dokumen yang menjadi rujukan utama modul ini.

RV64I berkerabat dekat dengan RV32I, yaitu basis untuk arsitektur 32-bit. Keduanya memuat instruksi inti yang sama, sedangkan RV64I menambahkan beberapa instruksi memori dan aritmetika seperti ld, sd, lwu, dan addiw. Instruksi ecall juga menjadi bagian basis, sehingga program paling sederhana sekalipun dapat meminta layanan sistem tanpa ekstensi apa pun.

Ekstensi modular dan RV64GC#

Di atas basis yang minimal, RISC-V menyediakan ekstensi modular yang masing-masing berdiri sendiri. Ekstensi M menambahkan perkalian dan pembagian integer, ekstensi A menambahkan instruksi atomik untuk sinkronisasi antar prosesor, ekstensi F menambahkan floating point presisi tunggal, dan ekstensi D menambahkan floating point presisi ganda. Ekstensi C (compressed) memampatkan instruksi yang paling sering digunakan menjadi 16 bit, sehingga ukuran program dapat mengecil tanpa mengubah semantiknya.

Kombinasi yang paling umum dijumpai pada perangkat lunak 64-bit adalah RV64GC. Huruf G pada penamaan tersebut bukan ekstensi tersendiri, melainkan singkatan gabungan IMAFD beserta dua ekstensi sistem kecil, yaitu Zicsr untuk akses register kontrol dan Zifencei untuk sinkronisasi aliran instruksi. Dengan demikian, RV64GC setara dengan RV64IMAFDC.

Modularitas ini terlihat langsung pada toolchain. Assembler, linker, dan emulator yang digunakan sepanjang modul ini sama persis untuk setiap profil, sedangkan opsi -march menentukan instruksi mana yang boleh dirakit. Berkas sumber yang sama dapat dirakit sebagai basis murni maupun sebagai profil lengkap, dan perbedaannya terlihat pada encoding hasilnya.

Panjang instruksi pada dua profil#

Bukti modularitas paling mudah diamati dari panjang instruksinya. Berkas berikut berisi empat instruksi basis yang tidak menggunakan apa pun di luar RV64I, lalu dirakit dua kali dengan dua profil berbeda.

asm dasar.asm
.global _start
.text
_start:
    addi    t0, x0, 7       # muat konstanta kecil
    add     t1, t0, t0      # gandakan
    sub     t2, t1, t0      # kurangi kembali
    and     t3, t1, t2      # perbineran
bash
# rakit sumber yang sama sebagai basis RV64I tanpa kompresi
riscv64-linux-gnu-as -march=rv64i -o dasar-rv64i.o dasar.asm

# rakit sumber yang sama sebagai RV64GC dengan ekstensi C
riscv64-linux-gnu-as -march=rv64gc -o dasar-rv64gc.o dasar.asm

# bandingkan encoding keduanya
riscv64-linux-gnu-objdump -d dasar-rv64i.o
riscv64-linux-gnu-objdump -d dasar-rv64gc.o
text Keluaran

dasar-rv64i.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <_start>:
   0:	00700293          	li	t0,7
   4:	00528333          	add	t1,t0,t0
   8:	405303b3          	sub	t2,t1,t0
   c:	00737e33          	and	t3,t1,t2

dasar-rv64gc.o:     file format elf64-littleriscv


Disassembly of section .text:

0000000000000000 <_start>:
   0:	429d                	li	t0,7
   2:	00528333          	add	t1,t0,t0
   6:	405303b3          	sub	t2,t1,t0
   a:	00737e33          	and	t3,t1,t2

Kedua daftar menampilkan nama instruksi yang sama persis, tetapi byte dan alamatnya berbeda. Pada profil RV64I, empat instruksi menempati alamat 0, 4, 8, dan c, sehingga semuanya berukuran 4 byte. Pada profil RV64GC, alamatnya menjadi 0, 2, 6, dan a, yang berarti instruksi pertama hanya 2 byte. Instruksi addi t0, x0, 7 dirakit sebagai c.li oleh ekstensi C, sedangkan tiga instruksi lainnya tetap 4 byte karena pola operannya tidak memenuhi bentuk terkompresi, misalnya c.add menuntut register sumber pertama sama dengan register tujuan.

Perbandingan ini sekaligus menegaskan perbedaan dengan x86-64. Instruksi x86-64 memiliki panjang variabel dari 1 sampai 15 byte, sehingga prosesor harus menelusuri batas instruksi untuk menemukan awal instruksi berikutnya. Basis RISC-V menetapkan panjang tetap 4 byte, dan ekstensi C hanya menambahkan panjang kedua yang tetap, yaitu 2 byte, sehingga alamat setiap instruksi tetap mudah ditentukan.

Ringkasan#

  • RISC-V adalah ISA open standard yang dikelola RISC-V International dan dapat diimplementasikan tanpa royalti lisensi.
  • Basis RV64I hanya memuat instruksi integer paling mendasar dengan panjang tetap 4 byte, sedangkan kemampuan lain masuk lewat ekstensi.
  • Ekstensi M, A, F, D, dan C membentuk profil RV64GC, yaitu singkatan untuk RV64IMAFDC yang digunakan secara luas pada perangkat lunak 64-bit.
  • Opsi -march pada assembler GNU menentukan profil target, dan panjang instruksi hasilnya dapat dibaca langsung dari alamat pada keluaran objdump.

Referensi#