Bagaimana menghindari kait selama sintesis

9

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?

W5VO
sumber
Jika seseorang bisa mendapatkan apa yang saya coba tanyakan, mohon informasikan kepada saya
Saya tidak yakin apa yang Anda maksudkan dari teladan Anda. Silakan periksa untuk memastikan bahwa pencatatan ulang sesuai dengan niat awal Anda.
W5VO
@fatai, saya sudah berkomentar, ada metode khusus untuk menghapus akun Anda yang tersedia di meta.stackexchange.com. Saya ditautkan pada pertanyaan terakhir yang saya tandai. Moderator di situs tidak memiliki kekuatan ini. Ini membutuhkan menghubungi tim dev.
Kortuk

Jawaban:

13

Untuk menghindari kait, Anda perlu memastikan semua output Anda ditugaskan di semua cabang kode yang mungkin.

sebagai contoh,

if a = '1' then
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

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:

if a = '1' then
   b <= prev_b;
   b(0) <= '1';
else
   b(1 downto 0) <= "00";
end if;

...

if rising_edge (clk)
    prev_b <= b;
end if;

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.

fbo
sumber
Saya tidak berpikir pendekatan Anda b <= bakan menghindari kait, karena masih memerlukan menjaga keadaan sinyal.
Tomi Junnila
Kamu mungkin benar; Saya terlalu terbiasa dengan logika clock. Saya akan mengedit.
fbo
6

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.

Martin Thompson
sumber
5

Empat aturan untuk menghindari kait:

  • Jangan membaca dari sinyal yang Anda tulis.
  • Memiliki daftar sensitivitas yang benar (semua sinyal yang Anda baca harus ada dalam daftar sensitivitas)
  • Pastikan bahwa semua sinyal yang Anda tulis ditugaskan di setiap jalur. (misalnya: di setiap cabang pernyataan if-else-)
  • Untuk proses yang menggunakan variabel, pastikan setiap variabel diinisialisasi nilai default sebelum membacanya (dalam variabel atau sinyal lain).

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.

Philippe
sumber
+1 Seperangkat aturan yang bagus. Apakah Anda setuju bahwa aturan Anda # 2 (tentang daftar sensitivitas) sebenarnya penting untuk memastikan hasil yang konsisten antara sintesis dan simulasi, tetapi tidak benar-benar membuat perbedaan tentang inferensi kait?
rick
@rick AFAIK, tidak ada jaminan apa yang akan dilakukan alat sintesis dengan daftar sensitivitas yang tidak lengkap. Standar IEEE untuk Sintesis VHDL (1076.6-1999) menyatakan bahwa: "Daftar sensitivitas proses harus berisi semua sinyal yang dibaca dalam pernyataan proses. Proses dengan daftar sensitivitas yang tidak lengkap tidak didukung." Yang mengatakan, saya tahu bahwa alat sintesis tertentu (mungkin semua?) Menerima daftar sensitivitas yang tidak lengkap, tetapi mengabaikan daftar sensitivitas bersama-sama. Jika Anda akan mengandalkan perilaku itu alih-alih standar IEEE yang lebih ketat, saya kira pernyataan Anda akan benar.
Philippe
Terima kasih, itu kedengarannya benar, itu akan membuat model saya tidak sesuai dengan standar itu. Ini baru saja membuat saya penasaran karena semua alat sintesis yang saya lihat sejauh ini mengabaikan daftar sensitivitas, tetapi saya telah mendengar desas-desus bahwa beberapa dapat menyimpulkan kait.
rick
3

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):

COMBO: process(a)
begin
    b <= (others => '0'); -- Assign default value to b
    if a = '1' then
        b(0) <= '1';
    else
        b(1 downto 0) <= "00";
    end if;
end process COMBO;
Tomi Junnila
sumber
1
Ini adalah metode yang baik yang sering saya gunakan. Namun terkadang, peringatan kait dapat menunjukkan kepada Anda bahwa Anda lupa menetapkan beberapa bit, sedangkan metode ini mungkin membuat bug lebih sulit ditemukan. Misalnya, jika Anda menetapkan semua bit dari sinyal lebar secara terpisah, dan salah hitung.
fbo
2
Hanya dalam proses kombinatorial. Dalam proses yang sudah ditentukan, Anda dapat menyimpulkan flipflop, yang mungkin persis seperti yang Anda inginkan.
Martin Thompson