nanoFOX - kernel RISC-V sederhana yang kompatibel

Pengantar kecil:


Gagasan untuk menulis inti Anda sendiri muncul setelah melewati seminar sekolah tentang sirkuit digital di kota Tomsk . Pada acara ini, pengantar dibuat untuk bahasa deskripsi perangkat keras saat ini (Verilog HDL dan VHDL), serta inti prosesor schoolMIPS kecil. Untuk memahami struktur inti, diputuskan untuk menciptakan sepeda mereka sendiri, mengikuti jalur pengembangan schoolMIPS, tetapi menggunakan sistem komando lain sebagai dasar. Karena semakin populernya RISC-V dan keterbukaan sistem komandonya (MIPS tidak memiliki sistem perintah terbuka pada saat kernel ditulis), serangkaian instruksi RISC-V, yaitu RV32I, dipilih untuk pengembangan kernel masa depan. RV32I memiliki sejumlah kecil instruksi dasar (37 tidak termasuk yang khusus) dan dapat diperluas jika diinginkan, misalnya, dengan menambahkan instruksi integer perkalian dan pembagian (RV32M) atau dukungan untuk instruksi singkat (RV32C). Juga, proyek ini disusun sebagai pendidikan, sehingga diputuskan untuk memaksimalkan visibilitas kernel untuk secara efektif menunjukkan pekerjaannya.


Dengan analogi dengan schoolMIPS, versi kernel berikut diimplementasikan:


  1. Versi siklus tunggal (00_simple_risc_v_cpu).
  2. Versi siklus tunggal dengan dukungan untuk instruksi lw / sw (memuat kata / kata penyimpanan) (01_simple_risc_v_cpu_lwsw).
  3. Versi pipa (konveyor 5-tahap) (02_pipe_risc_v_cpu).

Saat ini, versi kernel berikutnya dijelaskan (03_pipe_risc_v_cpu_fc) dengan set lengkap perintah RV32I (tanpa mempertimbangkan beberapa yang khusus).


Informasi singkat:


Dalam uraian kernel, cara untuk meningkatkan visibilitas kerja, debugging dan verifikasi dipikirkan. Saat ini menerapkan metode berikut:


  1. Menambahkan modul VGA teks debug (untuk dua cabang kernel siklus tunggal). Dimasukkannya modul ini memungkinkan Anda untuk secara bersamaan melacak nilai 32 register pada layar monitor, yang tidak mungkin ketika menggunakan output informasi pada indikator tujuh-segmen. Pada gambar yang disajikan di bawah ini, kernel menghitung angka Leonardo dan menampilkan informasi pada modul debugging yang sesuai;


    hex_display dan DebugScreenCore

    Output informasi pada indikator tujuh segmen: gambar
    Output informasi pada layar VGA: gambar


  2. Menambahkan pesan ke terminal simulator tentang status file register dan saat ini menjalankan instruksi. Metode ini memungkinkan Anda untuk menganalisis operasi kernel dengan lebih baik pada tahap awal pengembangan, tetapi tidak selalu nyaman;


    Terminal

    Inisialisasi file register: gambar
    Ubah nilai sp: gambar


  3. Menambahkan variabel string ke waveform dengan tampilan instruksi yang dapat dieksekusi. Menggunakan variabel string ini, pengembang dapat melacak pengaturan yang benar dari sinyal kontrol di semua tahap pipa;


    Bentuk gelombang

    Inisialisasi file register: gambar
    Ubah nilai sp: gambar


  4. Menambah kemampuan untuk menulis informasi debug tentang status kernel dalam file teks. Status file register disajikan dalam bentuk tabel, dan instruksi / instruksi yang saat ini dijalankan oleh kernel juga ditunjukkan. Ini adalah analog dari 2 poin, tetapi memungkinkan lebih banyak manipulasi dengan informasi yang diterima;


    File teks

    Inisialisasi file register: gambar
    Ubah nilai sp: gambar


  5. Menambah kemampuan untuk menulis informasi debug tentang status kernel dalam file HTML. Status file register disajikan dalam bentuk tabular dengan catatan tentang mengubah nilai sel, serta instruksi yang saat ini dijalankan oleh kernel ditampilkan. Ini adalah analog dari paragraf 2 dan 4, tetapi selain itu memungkinkan Anda untuk dengan mudah menunjukkan perubahan data. Seperti dapat dilihat pada gambar di bawah, jika nilai register tidak ditentukan, maka register disorot dalam warna merah (register s0 / fp - t6). Pada siklus 17, nilai register s0 / fp berubah dan sel disorot dalam warna hijau.
    Pada siklus 41, nilai 0x00010000 dimuat ke register sp.


    File HTML

    Inisialisasi file register: gambar
    Ubah nilai sp: gambar



Perbandingan cabang kernel:

Instruksi kernel yang didukung saat ini untuk cabang yang berbeda:


Instruksi manual00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu
tambah+++
dan--+
sll--+
atau+++
addi+++
ori--+
slli+++
lw-++
jalr--+
lui+++
beq+++
dulu--+
sw-++
jal--+
sub++-

Periferal yang didukung:


Periferal00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu
RAM-++
PWM-++
GPIO-++
UART--+

Bahasa yang didukung untuk program penulisan:


Bahasa00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu
Assembler+++
C--+

Sumber daya FPGA yang diperlukan untuk kernel (nf_cpu):


EP4CE22F17C6 (de0_nano):


01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu03_pipe_risc_v_cpu_fc
Total memori bit0 / 608.256 (0%)2.048 / 608.256 (<1%)2.144 / 608.256 (<1%)
Total elemen logika3.645 / 22.320 (16%)1.739 / 22.320 (8%)2.058 / 22.320 (9%)
Fungsi kombinasional total2.653 / 22.320 (12%)1,472 / 22,320 (7%)1,838 / 22,320 (8%)
Register logika khusus1.055 / 22.320 (5%)575 / 22.320 (3%)606 / 22.320 (3%)

10M50DAF484C7G (de10_lite):


00_simple_risc_v_cpu01_simple_risc_v_cpu_lwsw02_pipe_risc_v_cpu03_pipe_risc_v_cpu_fc
Total memori bit0 / 1,677,312 (0%)0 / 1,677,312 (0%)2.048 / 1.677.312 (<1%)2.144 / 1.677.312 (<1%)
Total elemen logika2,851 / 49,760 (6%)2,881 / 49,760 (6%)1.629 / 49.760 (3%)1.927 / 49.760 (4%)
Fungsi kombinasional total2.613 / 49.760 (5%)2.653 / 49.760 (5%)1.473 / 49.760 (3%)1,849 / 49,760 (4%)
Register logika khusus1.055 / 49.760 (2%)1.055 / 49.760 (2%)575 / 49.760 (1%)606 / 49.760 (1%)

Pengembangan proyek.


Apa yang direncanakan akan dilakukan di masa depan:


  1. tambahkan semua instruksi RV32I (pada tahap deskripsi);
  2. mengimplementasikan debugging;
  3. tambahkan pengontrol DMA (DMA);
  4. tambahkan dukungan untuk ban lain AXI, Avalon, Wishbone;
  5. tambahkan memori cache (cache);
  6. mengintegrasikan berbagai periferal (SPI, TWI (I2C), Ethernet (10 base-t));
  7. tambahkan interrupt controller;
  8. port versi yang berbeda ke papan debug lain;
  9. tambahkan metode lain untuk meningkatkan visibilitas kernel;
  10. menjalankan RTOS, misalnya zephyr .

Rekomendasi dan saran untuk pengembangan kernel juga diterima.


Tautan ke repositori: nanoFOX .

Source: https://habr.com/ru/post/id451388/


All Articles