Saya ingin merancang blok logika kombinasional menggunakan VHDL, tetapi kadang-kadang hasil yang disintesis mengandung kait yang tidak disengaja.
Pedoman pengkodean apa yang harus saya ikuti untuk menghindari synthesizer dari menyimpulkan kait?
Contoh: dalam segmen kode yang kecil, haruskah saya menggunakan pernyataan if-else?
Jawaban:
Untuk menghindari kait, Anda perlu memastikan semua output Anda ditugaskan di semua cabang kode yang mungkin.
sebagai contoh,
akan menghasilkan kait, karena dalam kondisi pertama, nilai b (1) tidak ditentukan, sehingga kompiler memutuskan Anda ingin menyimpan nilai sebelumnya dari b (1) di sana. Salah satu cara untuk menulis ini yang tidak akan menghasilkan kait adalah:
Di sini Anda secara eksplisit menyatakan bahwa b harus mempertahankan nilai lamanya, dan kemudian menimpa b (0) dengan nilai baru.
Cara lain adalah dengan memberikan nilai default ba, seperti dalam jawaban @ TomiJ.
Jika Anda memposting kode yang menerima kait, kami dapat membantu Anda menemukan alasan spesifik.
sumber
b <= b
akan menghindari kait, karena masih memerlukan menjaga keadaan sinyal.Jika Anda menggunakan proses untuk logika kombinasional (dan saya menyarankan untuk itu hanya karena alasan ini) maka pastikan setiap jalur melalui proses memberikan sesuatu untuk setiap sinyal yang proses drive. Tidak ada output yang dapat bergantung pada salah satu output dari "terakhir kali" proses berjalan.
Kalau tidak, Anda menyimpulkan kait karena waktu proses berikutnya dijadwalkan harus menjaga nilai sinyal yang tidak mendapatkan nilai baru terakhir kali.
Saya lebih memilih untuk menjaga logika kombinasional murni sebagai tugas kontinu, dan menggunakan proses untuk logika clocked, maka saya tidak mendapatkan kait.
sumber
Empat aturan untuk menghindari kait:
Selain itu, jika Anda memiliki beberapa proses kombinasi, pastikan Anda tidak membuat loop.
Beberapa gaya pengkodean dapat membantu Anda mematuhi aturan-aturan ini, misalnya gaya dalam jawaban @ TomiJ. Seperti yang ditunjukkan oleh @Martin Thompson, mungkin lebih baik untuk menghindari logika kombinasional secara bersamaan. Alih-alih, masukkan segala sesuatu dalam proses yang telah ditentukan.
sumber
Seperti yang telah ditunjukkan oleh @fbo dan @Martin Thompson, Anda perlu memastikan setiap sinyal yang digerakkan oleh proses tersebut diberi nilai di setiap cabang proses, dan nilai itu tidak harus bergantung pada keadaan sebelumnya dari salah satu output dari proses.
Cara termudah untuk memastikan ini adalah dengan menetapkan beberapa nilai default untuk setiap output di awal proses, misalnya (mengkooptasi contoh fbo):
sumber