Saya memiliki sirkuit bus sinkronisasi untuk melewati register luas di seluruh domain jam.
Saya akan memberikan deskripsi yang disederhanakan, menghilangkan logika reset asinkron.
Data dihasilkan dalam satu jam. Pembaruan jauh berbeda (setidaknya selusin) jam:
PROCESS (src_clk)
BEGIN
IF RISING_EDGE(clock) THEN
IF computation_done THEN
data <= computation;
ready_spin <= NOT ready_spin;
END IF;
END IF;
END PROCESS;
Sinyal kontrol untuk data baru, yang dikodekan NRZI (jadi kata yang valid di bus sesuai dengan transisi pada sinyal kontrol). Sinyal kontrol melewati rantai DFF yang bertindak sebagai sinkronisasi.
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
ready_spin_q3 <= ready_spin_q2;
ready_spin_q2 <= ready_spin_q1;
ready_spin_q1 <= ready_spin;
END IF;
END PROCESS;
Rangkaian sinkronisasi memperkenalkan penundaan singkat, yang menyediakan banyak waktu untuk menstabilkan bus data; bus data disampel secara langsung tanpa risiko metastabilitas:
PROCESS (dest_clk)
BEGIN
IF RISING_EDGE(dest_clk) THEN
IF ready_spin_q3 /= ready_spin_q2 THEN
rx_data <= data;
END IF;
END IF;
END PROCESS;
Ini mengkompilasi, dan bekerja dengan baik ketika disintesis menjadi FPGA Cyclone II. Namun, TimeQuest melaporkan pengaturan dan menahan pelanggaran waktu, karena tidak mengenali sinkronisasi. Lebih buruk, kata manual Quartus
Fokus pada peningkatan jalur yang menunjukkan kelonggaran terburuk. Fitter bekerja paling keras di jalur dengan kelonggaran terburuk. Jika Anda memperbaiki jalur ini, Fitter mungkin dapat meningkatkan jalur waktu gagal lainnya dalam desain.
Jadi saya ingin menambahkan batasan waktu yang tepat untuk proyek saya sehingga Quartus akan menghabiskan upaya Fitter pada bidang desain lainnya.
Saya cukup yakin itu set_multicycle_path
adalah perintah SDC (Synopsis Design Constraint) yang tepat, karena baris data akan memiliki beberapa siklus jam tujuan untuk distabilkan, tetapi saya tidak dapat menemukan contoh lengkap menggunakan perintah ini untuk menjelaskan logika crossing domain jam .
Saya benar-benar menghargai beberapa panduan tentang penulisan batasan waktu SDC untuk sinkronisasi. Jika Anda melihat masalah dengan pendekatan ini, harap beri tahu saya juga.
Detail jam:
Generator jam eksternal: Dua saluran, refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz, dan yang terkait).
Altera PLL: src_clk = refclk * 9/5 = 36 MHz
Altera PLL: dest_clk = refclk2 * 10 = 100 MHz
Saya juga memiliki data yang menuju ke arah lain, dengan 100 MHz src_clk dan 36 MHz dest_clk.
TL; DR: Apa kendala waktu SDC yang benar untuk kode di atas?