मेरे पास घड़ी डोमेन में एक विस्तृत रजिस्टर पास करने के लिए एक बस सिंक्रोनाइज़र सर्किट है।
मैं एक सरलीकृत विवरण प्रदान करूंगा, अतुल्यकालिक रीसेट तर्क को छोड़ देना।
डेटा एक घड़ी पर उत्पन्न होता है। अपडेट कई (कम से कम एक दर्जन) घड़ी के किनारों के अलावा हैं:
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;
ताजा डेटा के लिए नियंत्रण संकेत, जो एनआरजेडआई एनकोडेड है (इसलिए बस पर एक वैध शब्द नियंत्रण संकेत पर एक संक्रमण से मेल खाता है)। नियंत्रण संकेत एक डीएफएफ श्रृंखला के माध्यम से एक सिंक्रोनाइज़र के रूप में कार्य करता है।
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;
सिंक्रोनाइज़र सर्किट एक छोटी देरी का परिचय देता है, जो डेटा बस को स्थिर करने के लिए बहुत समय प्रदान करता है; डेटा बस को मेटास्टेबिलिटी के जोखिम के बिना सीधे नमूना लिया जाता है:
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;
यह चक्रवात II FPGA में संश्लेषित होने पर संकलित करता है, और अच्छी तरह से काम करता है। हालाँकि, TimeQuest सेटअप रिपोर्ट करता है और समय उल्लंघनों को पकड़ता है, क्योंकि यह सिंक्रनाइज़र को नहीं पहचानता है। इससे भी बदतर, क्वार्टस मैनुअल कहता है
उन रास्तों को बेहतर बनाने पर ध्यान दें जो सबसे खराब सुस्त दिखाते हैं। फिटर सबसे खराब स्लैक वाले रास्तों पर सबसे ज्यादा मेहनत करता है। यदि आप इन रास्तों को ठीक करते हैं, तो फिटर डिजाइन में अन्य विफल समय पथों को सुधारने में सक्षम हो सकता है।
इसलिए मैं अपने प्रोजेक्ट में सही टाइमिंग बाधाओं को जोड़ना चाहता हूं ताकि क्वार्टस अपने फिटर के प्रयास को डिजाइन के अन्य क्षेत्रों में खर्च करे।
मुझे पूरा यकीन है कि set_multicycle_path
उचित SDC (Synopsis Design Constraint) कमांड है, क्योंकि डेटा लाइनों को स्थिर करने के लिए गंतव्य घड़ी के कई चक्र होंगे, लेकिन मुझे इस आदेश का उपयोग करते हुए घड़ी डोमेन क्रॉसिंग लॉजिक का वर्णन करने के लिए कोई पूर्ण उदाहरण नहीं मिल सकता है ।
मैं वास्तव में सिंक्रनाइज़ेशन के लिए SDC समय की कमी लिखने पर कुछ मार्गदर्शन की सराहना करता हूँ। यदि आप इस दृष्टिकोण के साथ कोई समस्या देखते हैं, तो कृपया मुझे भी बताएं।
घड़ी का विवरण:
बाहरी घड़ी जनरेटर: दो चैनल, Refclk = 20 MHz, refclk2 = refclk / 2 (10 MHz, और संबंधित)।
एलटरला PLL: src_clk = refclk * 9/5 = 36 MHz
एलटरला PLL: dest_clk = refclk2 * 10 = 100 MHz
मेरे पास 100 MHz src_clk और 36 MHz dest_clk के साथ दूसरी दिशा में जाने वाले डेटा भी हैं।
TL; DR: उपरोक्त कोड के लिए सही SDC टाइमिंग बाधाएँ क्या हैं?