Simulator Daya Mikro-Arsitektur (Peta) untuk Cortex-M3
Ringkasan
Simulator Cortex-M3 cepat yang menciptakan jejak daya. Informasi lebih lanjut dapat ditemukan di https://eprint.iacr.org/2017/1253.pdf
- ditulis dalam C ++ untuk kecepatan
- Membaca dan mensimulasikan file .bin yang dibuat dari sumber perakitan/c dengan GNU Arm Toolchain
Hanya instruksi yang biasanya ditemukan dalam pengkodean primitif crypto yang didukung. Instruksi yang tidak didukung dapat ditambahkan dalam CPU.CPP.
Menyusun
- Compile Simulator: Simulator (termasuk) fungsi utama, disimpan di pustaka statis.
- CD LIBSIM/Build
- membuat
- buat instal
- Kompilasi firmware implementasi. Kami menggunakan SEC_ADD_V05 sebagai contoh:
- CD SEC_ADD_V05/FW/Build
- membuat
- Kompilasi simulator implementasi (masih menggunakan SEC_ADD_V05 sebagai contoh):
- CD SEC_ADD_V05/SIM/Build
- membuat
Menggunakan simulator
Simulator membaca file .bin yang harus ditempatkan di direktori saat ini. Nama file .bin tergantung pada apa yang ditentukan dalam sumber simulator.
Simulator seharusnya digunakan saat mengembangkan firmware, jadi cara biasa menjalankan simulasi adalah
- Ubah direktori ke direktori firmware: cd sec_add_v05/fw/build
- Jalankan simulator: ../../sim/build/sim_sec_add_v05 -n 1000
Opsi '-h' menunjukkan opsi dan parameter yang valid.
Mengode Implementasi FW baru
Implementasi FW hanyalah fungsi C (mungkin berisi kode perakitan), mengikuti ARM ABI (parameter 1 di R0, dll ...) Tidak ada fungsi utama. Semua fungsi C dan pra-prosesor dapat digunakan.
Firmware dapat disusun oleh kompiler lengan apa pun yang mendukung Cortex-M3. Hanya lengan GCC yang telah diuji. Jalur ke Executable Compiler ARM dapat diubah dalam skrip/fw.mak dengan memodifikasi variabel "dir".
Mengkode simulator baru
Yang terbaik adalah memulai dan memodifikasi simulator yang sudah ada. Simulator harus berisi 3 fungsi:
- void check_sec_algo (void): Fungsi ini menerapkan beberapa vektor uji dan mencetak apakah tes lulus atau tidak.
- void t_test_sec_algo (Opsi & Opsi): Fungsi ini menjalankan T_TEST dengan menghasilkan input dan mengumpulkan jejak
- Pembungkus untuk memanggil fungsi FW (yang akan disimulasikan). Pembungkus ini (yang tanda tangannya tergantung pada fungsi FW) harus menulis argumen dalam memori simulator dan mengatur register prosesor yang sesuai. Kemudian, itu memulai simulasi. Setelah simulasi, ia harus menyalin hasil dari memori yang disimulasikan.
Mendukung lebih banyak instruksi ARM V7-M
Ikuti langkah -langkah itu untuk mendukung instruksi dalam simulator:
- Tambahkan nilai decoding dan topeng dalam file libsim/src/opcodes.h
- Dekode instruksi dalam langkah fungsi () di libsim/src/cpu.cpp
- Tambahkan eksekusi fungsi dalam file yang sama
- Jangan lupa untuk menambahkan fungsi baru ini ke daftar metode di CPU.H
Macros test_ins32 dan test_ins16 menyederhanakan decoding instruksi juga, jangan lupa untuk memvalidasi perilaku instruksi simulasi baru, terutama perilaku register pipa reg_a dan reg_b!
Validasi
Setiap instruksi yang didukung oleh simulator harus divalidasi terhadap simulasi RTL. Pohon RTL tidak disimpan dalam repositori ini karena milik ARM Limited. Sebagian besar prosedur yang dijelaskan di bawah ini hanya ada untuk dokumentasi saya sendiri.
- Tambahkan instruksi baru dalam file percobaan.c di pohon simulator
- Jalankan Make Check> Sim_Trace.Log 2> & 1 di arah build FW di pohon simulator
- Tambahkan instruksi baru di file bocor.c di pohon RTL
- Kompilasi: buat testcode testName = bocor
- Simulasi: buat run testname = bocor
- Konversi file jejak tarmac.log menjadi file jejak register: ../../../../../python/gen_trace.py> verilog_trace.log
- Salin file jejak register di pohon simulator: cp ~/dokumen/repo/peta/render/sse050/logis/testbench/execution_tb/verilog_trace.log.
- Bandingkan jejak simulator dan jejak RTL. Baik secara visual menggunakan gvim -d sim_trace.log verilog_trace.log, atau menggunakan: ./../../python/compare_traces.py
Bug/Batasan
Tahu batasannya adalah:
- Pipa untuk instruksi LDRB/STRB lebih kompleks daripada yang diterapkan dalam simulator. Misalnya, untuk kode berikut:
ldrb r2, [r0]
strb r2, [r0]
REG_A dan REG_B tidak akan disimulasikan dengan benar oleh simulator. Fungsionalitasnya masih benar. Ketika instruksi lain dimasukkan antara LDRB dan instruksi STRB, simulasinya benar.