Verifikasi soft-CPU

18

Saat ini saya sedang dalam proses mendesain CPU sederhana dalam VHDL menggunakan Xilinx ISE dan ISIM. Bagian desain berjalan dengan sangat baik, tetapi saya tidak bisa menemukan cara untuk melakukan verifikasi secara konsisten.

Saat ini saya memiliki bangku tes VHDL yang saya perbarui untuk menguji fungsi yang sedang saya kerjakan pada saat tertentu. Ini sangat ad-hoc, dan itu tidak membantu saya untuk menangkap regresi dan tidak dapat digunakan untuk memverifikasi kepatuhan dengan set spesifikasi / instruksi.

Saya sudah berpikir tentang mengembangkan suite pengujian yang luas, tetapi masalahnya adalah bahwa keadaan potensial bagian tujuan umum sebagai CPU sangat besar dibandingkan komponen yang kurang umum.

Saya mencari metode yang memungkinkan saya untuk melakukan desain dan pengujian dengan cara yang lebih terkontrol. Semacam "hardware TDD" jika Anda mau. Apakah hal semacam itu ada? Bisakah itu diterapkan relatif mudah untuk bagian keperluan umum seperti CPU?

drxzcl
sumber

Jawaban:

16

Seluruh masalah verifikasi CPU sangat besar dan sulit. Ada orang yang berkarier hanya dengan ini. Saya hanya akan memberi Anda ikhtisar ...

  1. Tulis program bahasa rakitan yang menguji setiap instruksi dan setiap detail kecil dari setiap instruksi. Misalnya, saat menguji instruksi ADD Anda dapat mengujinya dengan angka yang positif, negatif, dan masing-masing (dua kali). Anda kemudian akan menguji flag carry, flag nol, dll. Fitur khusus CPU lainnya (seperti prediksi cabang, dll) akan memiliki bagian khusus mereka sendiri dari pengujian ini.

  2. Menulis, menggunakan C / C ++ atau sesuatu, model CPU Anda. Ini adalah CPU virtual Anda. Ini juga "CPU emas" Anda, artinya ini adalah CPU yang dibandingkan dengan yang lainnya. Idealnya orang yang menulis VHDL BUKAN orang yang sama yang menulis model C / C ++.

  3. Tulis / Buat sistem tempat Anda dapat menjalankan model C / C ++ dan model VHDL secara berdampingan, dan bandingkan hasilnya berdasarkan siklus-per-siklus. Jalankan program perakitan Anda dari Langkah 1 dan pastikan kedua model cocok.

  4. Jalankan kedua model Anda dengan "instruksi" acak. Pada dasarnya, isi "ram" dengan data acak dan jalankan data acak itu seolah-olah itu adalah instruksi nyata. Jalankan data acak yang sama pada model VHDL dan C / C ++ dan bandingkan hasilnya. Model C / C ++ ini akan berjalan pada beberapa workstation dan / atau server (bukan CPU baru itu sendiri).

  5. Pengaturan mesin, atau beberapa mesin, untuk mengulangi langkah 4 pada dasarnya selamanya. Bahkan jika CPU Anda "selesai" dan telah diproduksi selama satu tahun atau lebih, Anda masih akan menjalankan tes ini.

  6. Ulangi langkah-langkah ini setiap kali ada lebih banyak hal untuk disimulasikan. Misalnya, Anda akan menjalankannya pada VHDL pasca-rute dengan waktu ketika itu tersedia.

Tidak ada jaminan bahwa membandingkan versi VHDL dan C / C ++ akan menangkap setiap bug - tetapi sebenarnya tidak ada cara yang lebih baik. Dan menguji CPU pada instruksi acak membutuhkan waktu, tetapi itu juga sangat berguna. Satu-satunya alternatif nyata untuk ini adalah mempekerjakan banyak orang untuk hanya menulis kode sepanjang hari untuk menguji berbagai bagian CPU - dan perusahaan-perusahaan besar melakukan ini, tetapi mereka juga melakukan hal-hal data acak juga.

Untuk satu orang yang menulis kode VHDL, biasanya hanya langkah # 1 yang dilakukan. Tetapi jika Anda akan menjual CPU maka setidaknya beberapa langkah lain harus dilakukan (dan sungguh, Anda harus melakukan semuanya).


sumber
Jawaban yang bagus, terima kasih! Ini sangat masuk akal. "Golden CPU" memang merupakan bagian yang hilang dari teka-teki yang memungkinkan Anda melakukan verifikasi siklus demi siklus saat pengujian. Karena ini sebagian besar adalah proyek mainan, saya pikir saya akan menyesuaikan diri dengan kalimat pertama paragraf terakhir dan melakukan langkah # 1 saja. Tetapi mengetahui apa yang seharusnya saya lakukan sangat berharga.
drxzcl
Anda juga dapat memiliki model C ++ berwarna emas, tetapi tidak akurat, yang memungkinkannya menjadi lebih sederhana dan karena itu lebih mungkin benar - berguna untuk menguji fungsi ALU misalnya ("2 + 2 = 4 dan beberapa flag, saya tidak peduli ketika "daripada" 2 + 2 = 4 setelah satu kutu dan bendera setelah 2 kutu ")
Martin Thompson
Juga, jalankan kode-cakupan (untuk memeriksa Anda melakukan semuanya) dan cakupan-tes (untuk memeriksa semua tes telah diuji untuk pas dan gagal)
Martin Thompson
Tindak lanjut: Menggunakan prosedur "langkah pertama", saya berhasil menemukan banyak kesalahan ... di assembler saya: P Inti itu sendiri tampaknya relatif ok.
drxzcl