Modul Membangun CPU berakhir dengan datapath siklus tunggal dan pipeline yang berjalan, sedangkan modul Bahasa Mesin berakhir dengan program assembly RV32I yang dieksekusi simulator. Proyek puncak jalur ini menawarkan dua arah lanjutan, yaitu memperluas CPU yang sudah dibangun atau menulis emulator RV32I subset dari nol. Topik ini membandingkan kedua opsi dari sisi cakupan, alat, tingkat kesulitan, dan tanda selesai, kemudian menutup dengan kriteria pemilihan beserta peran sim.py sebagai pembanding keluaran. Pilihan yang jatuh pada salah satu arah dapat langsung dicatat pada berkas catatan keputusan proyek.
Dua arah proyek puncak#
Opsi pertama melanjutkan pekerjaan pada datapath siklus tunggal atau pipeline 16 bit dari modul Membangun CPU, yang berjalan dengan empat instruksi fiktif, yaitu add, load, store, dan beq. Tiga perluasan lazim tersedia, dan masing-masing menyentuh bagian datapath yang berbeda. Menambah instruksi baru, misalnya sub untuk pengurangan atau operasi logika pada ALU, berarti menambah operasi beserta sinyal kontrol yang memilihnya. Menambah pengali shift-add, yaitu algoritma perkalian yang menjumlahkan hasil pergeseran bit demi bit, menuntut perulangan mikro di dalam satu instruksi. Menambah I/O model, yaitu perangkat sederhana yang dipetakan ke alamat memori khusus, menyentuh jalur akses memori. Seluruh perluasan bekerja di atas komponen yang sudah teruji, sehingga setiap perubahan dapat diperiksa terhadap perilaku lama yang sudah benar.
Opsi kedua berpindah tingkat abstraksi, yaitu menulis emulator lengkap untuk subset RV32I dari nol, tanpa menyalin sim.py dan dengan tabel decode buatan sendiri. Emulator membaca program assembly, mengeksekusinya pada model register dan memori, lalu melayani ecall untuk pencetakan dan penghentian program. Cakupan minimalnya mencakup instruksi aritmetika dan logika, load dan store, percabangan, serta lompatan jal dan jalr, atau kira-kira 15-20 instruksi inti. Pekerjaannya berdiri sendiri mulai dari tabel instruksi hingga keadaan mesin, sehingga waktu yang dibutuhkan lebih besar, tetapi hasilnya satu program utuh yang dibangun sendiri.
Perbandingan cakupan, alat, dan tanda selesai#
Tabel berikut menyandingkan kedua opsi pada empat aspek yang paling sering menentukan pilihan.
| Aspek | Memperluas CPU | Menulis emulator RV32I |
|---|---|---|
| Cakupan | satu datapath 16 bit beserta satu hingga tiga perluasan | subset RV32I berisi 15-20 instruksi inti, memori, dan ecall |
| Alat | python3 dan berkas datapath yang sudah ada | python3, tabel decode sendiri, dan program uji .s |
| Tingkat kesulitan | sedang, kerjanya terbagi per komponen | lebih berat pada awal, saat tabel decode dan keadaan mesin dibangun |
| Tanda selesai | program uji 8 instruksi berjalan dengan jejak yang benar | program uji berisi perulangan dan fungsi, dengan keluaran ecall yang cocok dengan sim.py |
Cakupan pada baris pertama menunjukkan perbedaan arah yang paling mendasar. Perluasan menambah kemampuan pada satu mesin yang bentuknya sudah jelas, sedangkan emulator menghasilkan mesin baru yang cakupannya ditentukan sendiri dari spesifikasi. Baris alat menegaskan bahwa kedua opsi cukup dijalankan dengan python3, sejalan dengan pilihan alat jalur ini yang berupa simulator berbasis teks. Perbedaan terpenting justru berada di dua baris terakhir. Kesulitan opsi emulator terkonsentrasi pada awal proyek, ketika tabel decode dan keadaan mesin belum ada, sedangkan opsi perluasan menyebarkan kerjanya pada komponen yang sudah ada. Tanda selesai pada kedua opsi sengaja dinyatakan sebagai bukti yang dapat dijalankan, bukan pernyataan umum seperti sudah berjalan, karena pernyataan umum berlaku untuk satu instruksi sekalipun. Program uji yang konkret membuat status proyek dapat diperiksa kapan saja, dan bukti inilah yang menjadi dasar pernyataan selesai pada akhir proyek.
sim.py sebagai oracle#
Oracle adalah istilah pengujian untuk program pembanding yang keluarannya dianggap benar, sehingga program yang sedang dibangun dapat dinilai dari kesesuaiannya dengan oracle itu. sim.py dari modul Bahasa Mesin dapat dijadikan oracle untuk emulator buatan sendiri. Caranya langsung, yaitu menyusun program uji .s, menjalankan berkas yang sama pada kedua mesin, lalu membandingkan keluaran program beserta jejak eksekusinya. Program uji pertama cukup berisi beberapa instruksi berurutan, kemudian cakupannya ditambah bertahap dengan percabangan, perulangan, dan pemanggilan fungsi.
Kekuatan cara ini terletak pada biayanya yang kecil. Setiap perbedaan keluaran menunjuk instruksi yang perilakunya keliru, dan penunjuk itu muncul tanpa perlu membaca seluruh kode emulator. Program uji yang lama tetap digunakan ulang setiap kali fitur baru ditambahkan, sehingga perbaikan pada satu instruksi tidak merusak instruksi lain tanpa ketahuan. Yang perlu dijaga adalah batas peran oracle itu, yaitu pembanding keluaran dan bukan sumber kode. Tabel decode emulator tetap ditulis dari spesifikasi RV32I, dan sim.py baru ditarik ke meja pemeriksaan setelah emulator berjalan.
Kriteria memilih opsi#
Kriteria pertama adalah waktu yang tersedia. Estimasi pada skrip di bawah menempatkan opsi perluasan pada sekitar enam sesi kerja, sedangkan emulator pada sekitar sembilan sesi, dengan asumsi setiap sesi berlangsung dua hingga tiga jam dan diakhiri satu tanda selesai yang tercapai. Angka tersebut adalah alat penyesuaian cakupan, bukan janji kemampuan. Cakupan yang melebihi waktu yang ada akan memotong bagian pengujian lebih dahulu, dan bagian itulah yang paling mahal harganya.
Kriteria kedua adalah minat, karena kedua opsi menawarkan pekerjaan yang berbeda sifatnya. Opsi perluasan berfokus pada perilaku komponen perangkat keras, mulai dari mux, ALU, hingga sinyal kontrol, dan cocok untuk kerja yang dipandu diagram jalur data. Opsi emulator berfokus pada spesifikasi, mulai dari membaca daftar instruksi, menata tabel decode, hingga menaati aturan ecall, dan cocok untuk kerja yang dipandu kontrak tertulis. Kriteria ketiga adalah tujuan. Perluasan CPU memperkuat pemahaman jalur data yang menjadi dasar materi performa prosesor, sedangkan emulator memperkuat pemahaman ISA dan assembly yang telah dibangun pada modul Bahasa Mesin.
Skrip berikut mencetak ringkasan kedua opsi beserta estimasi cakupannya. Keluarannya pendek dan dapat disalin ke berkas catatan keputusan proyek sebagai bahan awal, sebelum keputusan rancangannya didokumentasikan dengan format catatan keputusan pada topik Trade-off Rancangan.
"""Mencetak ringkasan dua opsi proyek puncak beserta estimasi cakupannya.
Skrip ini murni teks dan deterministik, sehingga keluarannya dapat
dibandingkan langsung dengan blok Keluaran pada topik ini.
"""
OPSI = [
{
"kode": "A",
"nama": "memperluas CPU siklus tunggal",
"tugas": ["menambah instruksi baru", "menambah pengali shift-add", "menambah I/O model"],
"sesi": 6,
"tanda_selesai": "program uji berjalan dengan jejak yang benar",
},
{
"kode": "B",
"nama": "menulis emulator RV32I subset",
"tugas": ["membangun tabel decode sendiri", "membangun memori dan stack", "mendukung ecall cetak dan keluar"],
"sesi": 9,
"tanda_selesai": "program uji assembly mencetak keluaran yang cocok dengan oracle",
},
]
for opsi in OPSI:
print(f"Opsi {opsi['kode']}: {opsi['nama']}")
for tugas in opsi["tugas"]:
print(f" - {tugas}")
print(f" estimasi: {opsi['sesi']} sesi kerja")
print(f" tanda selesai: {opsi['tanda_selesai']}")Opsi A: memperluas CPU siklus tunggal
- menambah instruksi baru
- menambah pengali shift-add
- menambah I/O model
estimasi: 6 sesi kerja
tanda selesai: program uji berjalan dengan jejak yang benar
Opsi B: menulis emulator RV32I subset
- membangun tabel decode sendiri
- membangun memori dan stack
- mendukung ecall cetak dan keluar
estimasi: 9 sesi kerja
tanda selesai: program uji assembly mencetak keluaran yang cocok dengan oracleKesalahan umum#
- Memilih emulator karena terlihat lebih mengesankan tanpa menghitung pekerjaannya. Emulator menuntut tabel decode, keadaan mesin, dan program uji yang semuanya baru, sehingga ukurannya mudah terlewat saat keputusan diambil. Perbaikannya berupa perhitungan terbuka, yaitu daftar instruksi yang akan didukung dan daftar program uji yang akan dijalankan.
- Menyalin tabel decode dari
sim.py. Oracle dipakai sebagai pembanding keluaran, bukan sebagai sumber kode, dan tabel yang disalin membuat tujuan proyek hilang tanpa terlihat karena emulatornya memang berjalan. Perbaikannya berupa tabel yang ditulis dari spesifikasi RV32I, lalu dibandingkan terhadap oracle setelah emulator berjalan. - Menetapkan tanda selesai yang tidak terukur. Pernyataan sudah berjalan berlaku untuk satu instruksi sekalipun, sehingga tidak membedakan proyek yang hampir selesai dari yang baru dimulai. Perbaikannya berupa program uji konkret beserta keluaran yang diharapkan.
- Memperluas cakupan di tengah proyek tanpa menyesuaikan waktu. Fitur baru menggeser pekerjaan pengujian, dan proyek berakhir tanpa bukti yang dapat dijalankan. Perbaikannya berupa catatan ide sebagai perluasan berikutnya, sedangkan tanda selesai yang sudah ditetapkan duntaskan lebih dahulu.
Ringkasan#
- Dua opsi puncak jalur ini adalah memperluas CPU dari modul Membangun CPU atau menulis emulator RV32I subset dari nol dengan tabel decode sendiri.
- Kedua opsi cukup dijalankan dengan python3, sedangkan perbedaannya terletak pada cakupan, sebaran kesulitan, dan ukuran waktunya.
sim.pydari modul Bahasa Mesin dijadikan oracle, yaitu pembanding keluaran program uji, dan tetap bukan sumber kode untuk disalin.- Tanda selesai dinyatakan sebagai program uji konkret beserta keluaran yang diharapkan, sehingga status proyek dapat diperiksa kapan saja.
Referensi#
- Nand to Tetris — Nisan dan Schocken — Kursus yang menjadikan proyek membangun komputer sebagai inti pembelajaran, dengan tiap proyek memperluas hasil proyek sebelumnya.
- RISC-V Instruction Set Manual — RISC-V International — Spesifikasi RV32I beserta daftar instruksi dan encodingnya, dasar penyusunan tabel decode pada opsi emulator.
- Computer Systems: A Programmer’s Perspective — Carnegie Mellon — Mendefinisikan Y86-64, set instruksi sederhana yang diturunkan dari x86-64, beserta implementasi prosesornya sebagai contoh proyek bahasa mesin yang utuh.