बस सिंक्रोनाइजर सर्किट के लिए समय की कमी


10

मेरे पास घड़ी डोमेन में एक विस्तृत रजिस्टर पास करने के लिए एक बस सिंक्रोनाइज़र सर्किट है।

मैं एक सरलीकृत विवरण प्रदान करूंगा, अतुल्यकालिक रीसेट तर्क को छोड़ देना।

डेटा एक घड़ी पर उत्पन्न होता है। अपडेट कई (कम से कम एक दर्जन) घड़ी के किनारों के अलावा हैं:

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 टाइमिंग बाधाएँ क्या हैं?


1
यह प्रस्तावित FPGA डिजाइन साइट पर बेहतर होगा, लेकिन यह प्रस्ताव अभी तक बीटा तक नहीं पहुंचा है।
बेन वोइगट

क्या आप src_clk और dest_clk के लिए घड़ी की परिभाषाएँ पोस्ट कर सकते हैं? क्या वे किसी भी तरह से संबंधित हैं (तुल्यकालिक गुणक)? यदि वे असंबंधित घड़ियां हैं तो इस स्थिति में set_false_path का उपयोग करना विशिष्ट है।
एंडी

@Andy: मैंने कुछ विवरण जोड़े। इसके साथ मदद करने के लिए धन्यवाद।
बेन वोइगट

जवाबों:


9

मेरे पास क्वार्ट्स के साथ अनुभव नहीं है, इसलिए इसे सामान्य सलाह के रूप में मानें।

क्लॉक डोमेन के बीच के रास्तों पर काम करते समय, टाइमिंग टूल्स घड़ियों को उनके कम से कम कई पीरियड्स तक विस्तारित करते हैं और किनारों की निकटतम जोड़ी का चयन करते हैं।

36 मेगाहर्ट्ज घड़ी (27.777 एनएस) से 100 मेगाहर्ट्ज घड़ी (10 एनएस) के रास्तों के लिए, अगर मैंने अपनी त्वरित गणना सही ढंग से की, तो बढ़ती किनारों की निकटतम जोड़ी स्रोत घड़ी पर 138.888 एनएम और गंतव्य घड़ी पर 140 एनएम है। यह उन मार्गों के लिए प्रभावी रूप से एक 900 मेगाहर्ट्ज बाधा है! गोलाई के आधार पर (या बिना किसी रिश्ते वाली घड़ियों के लिए), यह उससे भी बदतर हो सकता है।

इस संरचना के लिए बाधाओं को लिखने के लिए कम से कम तीन तरीके हैं। मैं घड़ियों को कॉल करने जा रहा हूं fast_clkऔर slow_clkजैसा कि मुझे लगता है कि चित्रण के लिए यह स्पष्ट है।

विकल्प 1: समय के साथ अक्षम करें set_false_path

सबसे आसान उपाय set_false_pathघड़ियों के बीच समय को निष्क्रिय करना है:

set_false_path -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_false_path -from [get_clocks slow_clk] -to [get_clocks fast_clk]

यह कड़ाई से सही नहीं है, क्योंकि सिंक्रोनाइजर के सही ढंग से काम करने के लिए समय की आवश्यकताएं हैं। यदि भौतिक कार्यान्वयन नियंत्रण संकेत के सापेक्ष डेटा को बहुत अधिक विलंबित करता है, तो सिंक्रनाइज़र काम नहीं करेगा। हालाँकि, मार्ग में कोई तर्क नहीं है, यह संभावना नहीं है कि समय की कमी का उल्लंघन किया जाएगा। set_false_pathआमतौर पर इस तरह की संरचना के लिए उपयोग किया जाता है, यहां तक ​​कि एएसआईसीएस में भी, जहां कम संभावना वाले विफलताओं के लिए जोखिम बनाम जोखिम का प्रयास एफपीजीए की तुलना में अधिक सतर्क है।

विकल्प 2: बाधा के साथ आराम करें set_multicycle_path

आप कुछ रास्तों के लिए अतिरिक्त समय की अनुमति दे सकते हैं set_multicycle_path। बारीकी से संबंधित घड़ियों (जैसे कि 1X और 2X घड़ियों को इंटरैक्ट करना) के साथ मल्टीसाइकल पथों का उपयोग करना अधिक आम है, लेकिन यह यहां काम करेगा यदि उपकरण इसे पर्याप्त रूप से समर्थन करता है।

set_multicycle_path 2 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -setup
set_multicycle_path 1 -from [get_clocks slow_clk] -to [get_clocks fast_clk] -end -hold

सेटअप के लिए डिफ़ॉल्ट किनारे संबंध एकल चक्र है, अर्थात set_multicycle_path 1। ये कमांड -endसेटअप पथ के लिए समापन बिंदु घड़ी ( ) के एक और चक्र की अनुमति देते हैं। -holdएक नंबर एक सेटअप बाधा से भी कम समय के साथ समायोजन लगभग हमेशा जब बहु साइकिल पथ की स्थापना, और अधिक नीचे देखें लिए आवश्यक है।

अन्य दिशाओं में भी इसी तरह से अवरोध करने के लिए (तेज घड़ी की एक अवधि में बाधा को कम करना), को बदल -endदें -start:

set_multicycle_path 2 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -setup
set_multicycle_path 1 -from [get_clocks fast_clk] -to [get_clocks slow_clk] -start -hold

विकल्प 3: आवश्यकता को सीधे निर्दिष्ट करें set_max_delay

यह प्रभाव के समान है, set_multicycle_pathलेकिन धार रिश्तों के माध्यम से सोचने के लिए बचाता है और पकड़ बाधाओं पर प्रभाव पड़ता है।

set_max_delay 10 -from [get_clocks fast_clk] -to [get_clocks slow_clk]
set_max_delay 10 -from [get_clocks slow_clk] -to [get_clocks fast_clk]

आप इसे set_min_delayहोल्ड चेक के साथ जोड़ सकते हैं , या डिफ़ॉल्ट होल्ड चेक को जगह में छोड़ सकते हैं। set_false_path -holdयदि आपका टूल इसका समर्थन करता है, तो आप होल्ड चेक को अक्षम करने में भी सक्षम हो सकते हैं ।


बहु-चक्र पथों के लिए किनारे के चयन का विवरण

प्रत्येक सेटअप समायोजन के साथ जोड़े जाने वाले पकड़ समायोजन को समझने के लिए, 3: 2 संबंध के साथ इस सरल उदाहरण पर विचार करें। प्रत्येक अंक एक बढ़ती घड़ी बढ़त का प्रतिनिधित्व करता है:

1     2     3
4   5   6   7

डिफ़ॉल्ट सेटअप चेक किनारों 2 और 6 का उपयोग करता है। डिफ़ॉल्ट होल्ड चेक किनारों 1 और 4 का उपयोग करता है।

2 के एक बहु-चक्र बाधा को लागू करने के साथ -endडिफ़ॉल्ट सेटअप को समायोजित करता है और मूल रूप से वे जो उपयोग कर रहे थे उसके बाद अगले किनारे का उपयोग करने के लिए चेक पकड़ते हैं, जिसका अर्थ है कि सेटअप चेक अब किनारों 2 और 7 का उपयोग करता है और होल्ड चेक 1 और 5 का उपयोग करता है। दो के लिए एक ही आवृत्ति पर घड़ियां, यह समायोजन समझ में आता है - प्रत्येक डेटा लॉन्च एक डेटा कैप्चर के साथ मेल खाता है, और यदि कैप्चर एज को एक से बाहर ले जाया जाता है, तो होल्ड चेक को भी एक से बाहर जाना चाहिए। इस तरह की बाधा एक ही घड़ी की दो शाखाओं के लिए समझ में आ सकती है अगर शाखाओं में से एक में बड़ी देरी हो। हालांकि, यहां की स्थिति के लिए, किनारों 1 और 5 का उपयोग करके एक पकड़ की जांच करना वांछनीय नहीं है, क्योंकि इसे ठीक करने का एकमात्र तरीका पथ पर देरी के पूरे घड़ी चक्र को जोड़ना है।

1 के बहु-चक्र पकड़ बाधा (पकड़ के लिए, डिफ़ॉल्ट 0 है) गंतव्य घड़ी uesd के किनारे को एक किनारे से पीछे की जाँच के लिए समायोजित करता है। 2-चक्र सेटअप MCP और 1-चक्र होल्ड MCP बाधाओं का संयोजन किनारों 2 और 7 का उपयोग करके एक सेटअप चेक में परिणाम देगा, और किनारों 1 और 4 का उपयोग करके एक होल्ड चेक होगा।


2

मुझे एल्टर के उत्तर का पता नहीं है, लेकिन ज़िलिनक्स लैंड में आप एक घड़ी डोमेन से अगले में समय की देरी निर्धारित कर सकते हैं। आपको गणित पर काम करना होगा (यह डिजाइन निर्भर है), लेकिन यह आमतौर पर दो घड़ी अवधियों में सबसे छोटा है। इस समय को किसी भी दो संकेतों (अपने नियंत्रण संकेत सहित) के बीच अधिकतम तिरछा के रूप में सोचें, और यदि आपका सिंक सर्किट इससे निपटने में सक्षम होने जा रहा है तो आप काम कर सकते हैं।

set_muloline_path उपयोग करने के लिए सही बात नहीं है क्योंकि यह सामान्य रूप से उन मामलों से निपटता है जब स्रोत और गंतव्य दोनों एक ही घड़ी डोमेन पर होते हैं। फिर, मैं अपने Xilinx अनुभव से दूर है कि अपने लाभ भिन्न हो सकते हैं।


1

मुझे लगता है कि सिंक्रोनाइज़र के ऊपर एक set_false_path डालना सुरक्षित है।

इसके अलावा आप क्वार्टस को सिंक्रोनाइज़र की मदद करने के लिए qsf में "set_global_assignment -name SYNCHRONIZER_IDENTIFICATION AUTO" डाल सकते हैं।


वो कैसा लगता है? set_false_path -from ready_spin -to ready_spin_q2? और set_false_path -from data -to rx_data?
बेन वोइगट

set_false_path -from src_clk -to ready_spinमुझे यकीन नहीं है कि डेटा पर गलत पथ डालना उचित है क्योंकि आप इसे सिंक्रनाइज़ नहीं कर रहे हैं।
फबो

0

मुझे संदेह है कि समस्या यह है कि जब आप जान सकते हैं कि बस सिग्नल उस बिंदु के पास कहीं भी बदलने नहीं जा रहे हैं जहाँ वे लटके हुए हैं, तो सॉफ्टवेयर यह नहीं जानता है। आपका सबसे अच्छा दांव संभवतः सॉफ़्टवेयर को स्पष्ट रूप से बताना है कि आने वाले बस सिग्नल बस घड़ी के साथ सिंक्रनाइज़ किए जाते हैं, और उस जगह के अग्रिम में किसी भी अनुकूलन को अक्षम करते हैं जहां आप वास्तव में उन्हें लचकाते हैं (एक अनुकूलक सैद्धांतिक रूप से आपके सर्किट को एक के साथ बदल सकता है जो समकक्ष होगा। अगर इनपुट वास्तव में तुल्यकालिक थे, लेकिन जिसे लूप के लिए फेंक दिया जा सकता है अगर वे घड़ी चक्रों पर बदलते हैं जो आपके द्वारा आकर्षित सर्किट की परवाह नहीं करता है)।


set_multicycle_pathसिंथेसाइज़र / टाइमिंग एनालाइज़र को यह बताने का तरीका नहीं होगा कि स्रोत सिग्नल कितनी बार बदल सकते हैं? और मुझे यकीन नहीं है कि आप "बस घड़ी" से क्या मतलब है, यहां एक सिग्नल बस है जो घड़ी के डोमेन को पार कर रही है, इसलिए आप किस घड़ी को "बस घड़ी" कह रहे हैं? मुझे लगता है कि आप सही कह रहे हैं कि अभी भी मेटास्टेबिलिटी हो सकती है यदि सिंथेसाइज़र पीरियड्स के दौरान ग्लिट्स का परिचय देता है जब मैं अपडेट नहीं कर रहा हूँ data। मुझे लगता है कि मैं विशेष रूप से वहां डीएफएफ ब्लॉकों को तत्काल कर सकता हूं :(
बेन वोइगट

@BenVoigt: मुझे लगता है कि "set_multoline_path" का उपयोग अक्सर समय सत्यापनकर्ता को बताने के लिए किया जाता है कि दो लाचिंग बिंदुओं के बीच कॉम्बिनेटरियल लॉजिक की एक श्रृंखला को N (Tc) -Ts-Tp (N समय चक्र समय शून्य से नमूना समय माइनस लैच) लेने की अनुमति दी जानी चाहिए। प्रचार समय) सिर्फ Tc-Ts-Th के बजाय। मुझे नहीं पता कि इस तरह की चीज विभिन्न घड़ियों द्वारा लैचिंग के साथ कैसे बातचीत करेगी।
सुपरकैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.