ब्लॉकिंग और नॉनब्लॉकिंग असाइनमेंट वेरिलॉग के बीच अंतर


15

जब मैं निम्नलिखित में आया तो मैं इस पृष्ठ को http://www.asic-world.com/verilog/verilog_one_day3.html पढ़ रहा था :

हमें आम तौर पर फ्लिप-फ्लॉप को रीसेट करना पड़ता है, इस प्रकार हर बार घड़ी 0 से 1 तक संक्रमण (posedge) कर देती है, हम जांचते हैं कि क्या रीसेट एसेर्स्ड (तुल्यकालिक रीसेट) है, तो हम सामान्य तर्क के साथ चलते हैं। यदि हम निकट से देखते हैं, तो हम देखते हैं कि संयोजन के तर्क के लिए हमारे पास असाइनमेंट के लिए "=" था, और अनुक्रमिक ब्लॉक के लिए हमारे पास "<=" ऑपरेटर था। खैर, "=" असाइनमेंट को रोक रहा है और "<=" असाइनमेंट को अनब्लॉक कर रहा है। = "" एक शुरुआत / अंत के अंदर क्रमिक रूप से कोड निष्पादित करता है, जबकि "<=" समानांतर में गैर-निष्पादित होता है।

मुझे पूरा यकीन था कि नॉनब्लॉकिंग असाइनमेंट अनुक्रमिक थे जबकि ब्लॉकिंग असाइनमेंट समानांतर थे। आखिरकार, आप हमेशा ब्लॉक के बाहर असाइन किए गए स्टेटमेंट के साथ ब्लॉकिंग असाइनमेंट बना सकते हैं, और वे सभी समानांतर में चलते हैं। क्या यह एक गलती है, या हमेशा एक ब्लॉक के अंदर व्यवहार अलग है? और, यदि व्यवहार हमेशा एक ब्लॉक के अंदर भिन्न होता है, तो क्या हमेशा एक ब्लॉक के बाहर गैर-असाइनमेंट असाइन किया जा सकता है?

जवाबों:


21

काफी हद तक सुनिश्चित था कि नॉनब्लॉकिंग असाइनमेंट अनुक्रमिक थे जबकि ब्लॉकिंग असाइनमेंट समानांतर थे।

ब्लॉकिंग असाइनमेंट "सीरीज़" में निष्पादित होता है क्योंकि एक ब्लॉकिंग असाइनमेंट अगले स्टेटमेंट के निष्पादन को तब तक ब्लॉक करता है जब तक कि यह पूरा नहीं हो जाता। इसलिए अगले बयान के परिणाम पहले पूरा होने पर निर्भर हो सकते हैं।

गैर-अवरुद्ध असाइनमेंट समानांतर में निष्पादित होता है क्योंकि यह उन असाइनमेंट का वर्णन करता है जो सभी एक ही समय में होते हैं। 2 पंक्ति पर एक बयान का परिणाम पहली पंक्ति पर बयान के परिणामों पर निर्भर नहीं करेगा। इसके बजाय, दूसरी पंक्ति निष्पादित करेगी जैसे कि 1 पंक्ति अभी तक नहीं हुई थी।


तो क्या बयान के बारे में बताएं? क्या वे सिर्फ अपने स्वयं के एक पूरे वर्ग में हैं?
शून्य तारा

4
हां, assignकथन हमेशा ब्लॉक के बाहर होते हैं और आम तौर पर कॉम्बिनेटरियल (अन-लैच्ड) लॉजिक का वर्णन करने के लिए उपयोग किया जाता है (जबकि हमेशा ब्लॉक, कुछ अपवादों के साथ, अनुक्रमिक लॉजिक का वर्णन करता है)। AFAIK, assignबयान हमेशा "समानांतर में" निष्पादित करते हैं जब भी उनके LHS में मूल्य परिवर्तन होता है।
फोटोन

ठीक है ... मुझे यह आभास होने लगा है कि वेरिलॉग अभी सबसे सुरुचिपूर्ण ढंग से डिज़ाइन की गई भाषा नहीं है। यह सीखने वाला है जैसे C था।
शून्य सितारा

1
वेरिलॉग को पहले से मौजूद हार्डवेयर को "वर्णन" करने के लिए डिज़ाइन किया गया था। इसे एक भाषा के रूप में उपयोग करना (संश्लेषित) हार्डवेयर को हैक करना है।
फोटॉन

4
अगर वेरिलॉग "लर्निंग सी" एक समस्या है, तो वीएचडीएल पर एक नज़र डालें। कुछ लोगों को एक या दूसरे के लिए काफी मजबूत प्राथमिकताएं हैं। कुछ के लिए, VHDL सिर्फ बहुत अधिक क्रिया है। मेरे लिए, यह बहुत बेहतर है। (संकेत / चर असाइनमेंट शब्दार्थ उदाहरण के लिए अवरुद्ध / गैर से बहुत स्पष्ट हैं)। stackoverflow.com/questions/13954193/… और sigasi.com/content/vhdls-crown-jewel आप इसे पसंद कर सकते हैं या नफरत कर सकते हैं। लेकिन यह देखने लायक है।
ब्रायन ड्रमंड

6

असाइन किए गए कथन न तो "अवरुद्ध" या "नॉनब्लॉकिंग" हैं, वे "निरंतर" हैं। एक असाइनमेंट स्टेटमेंट का आउटपुट हमेशा इनपुट के निर्दिष्ट फ़ंक्शन के बराबर होता है। "ब्लॉकिंग" और "नॉनब्लॉकिंग" असाइनमेंट केवल हमेशा ब्लॉक के भीतर ही मौजूद रहते हैं।

एक अवरुद्ध असाइनमेंट तुरंत प्रभावित होता है इसे संसाधित किया जाता है। वर्तमान "समय डेल्टा" को संसाधित करने के अंत में एक नॉनब्लॉकिंग असाइनमेंट होता है।

हमेशा ब्लॉक का उपयोग या तो कॉम्बिनेटरियल या अनुक्रमिक तर्क के लिए किया जा सकता है (systemverilog के पास हमेशा_कॉम और हमेशा_ यह स्पष्ट करने के लिए)। जब कॉम्बिनेटर लॉजिक मॉडलिंग करता है तो आमतौर पर इसका उपयोग करना अधिक कुशल होता है = लेकिन यह आमतौर पर वास्तव में मायने नहीं रखता है।

जब अनुक्रमिक तर्क मॉडलिंग करते हैं (उदाहरण हमेशा @ @ (posedge clk)) तो आप सामान्य रूप से नॉनब्लॉकिंग अस्सिंग का उपयोग करते हैं। यह आपको "घड़ी की धार से पहले राज्य" के संदर्भ में "घड़ी की बढ़त के बाद की स्थिति" का पता लगाने की अनुमति देता है।

कभी-कभी अनुक्रमिक हमेशा ब्लॉक में "चर" के रूप में अवरुद्ध असाइनमेंट का उपयोग करना उपयोगी होता है। यदि आप ऐसा करते हैं तो ध्यान में रखने के दो प्रमुख नियम हैं।

  1. एक क्रम का उपयोग न करें जो हमेशा उस ब्लॉक के बाहर से एक अनुक्रमिक के अंदर अवरुद्ध कार्य के साथ सेट होता है जिसे इसे सौंपा गया है।
  2. ब्लॉकिंग और नॉनब्लॉकिंग असाइनमेंट को एक ही रेज में न मिलाएं।

इन नियमों को तोड़ने से संश्लेषण विफलताओं और / या सिमुलेशन और संश्लेषण के बीच व्यवहार के अंतर के परिणामस्वरूप होने की संभावना है।


"" एक रेग का उपयोग नहीं करते हैं जो हमेशा उस ब्लॉक के बाहर से एक क्रमिक ब्लॉक के अंदर असाइनमेंट को रोकने के साथ सेट होता है जिसे इसे सौंपा गया है। "" क्या आप कृपया इसे समझा सकते हैं?
user125575

विभिन्न अनुक्रमिक हमेशा ब्लॉक में एक परिभाषित आदेश नहीं होता है। इसलिए एक "रेज" सेट को हमेशा एक दूसरे से ब्लॉक करने में ब्लॉकिंग अस्सिटमेंट को पढ़ने से हमेशा अनपेक्षित व्यवहार होता है।
पीटर ग्रीन

और यहां तक ​​कि अगर यह सिमुलेशन में काम करने के लिए प्रकट होता है, तो एक संश्लेषण उपकरण को उस पर देखना चाहिए और "नोप" कहना चाहिए। मैं उन मध्यवर्ती संस्करणों के लिए स्थानीय रजिस्टरों का उपयोग करता हूं, और सुनिश्चित करें कि वे हमेशा पढ़ने से पहले हर घड़ी पर असाइन किए जाते हैं, ताकि कोई 'स्टोरेज' निहित न हो।
ग्राग्गो

IIRC कम से कम क्वार्टस में यह केवल एक चेतावनी माना जाता है एक त्रुटि नहीं है।
पीटर ग्रीन

5

शब्द ब्लॉकिंग असाइनमेंट लोगों को भ्रमित करता है क्योंकि ब्लॉकिंग शब्द समय-अनुक्रमिक तर्क का सुझाव देता है। लेकिन संश्लेषित तर्क में इसका मतलब यह नहीं है , क्योंकि सब कुछ समानांतर में संचालित होता है

शायद एक कम भ्रामक शब्द तत्काल असाइनमेंट होगा, जो अभी भी इनपुट से गैर-पारदर्शी मेमोरी तत्वों (उदाहरण के लिए रजिस्टर्ड रजिस्टरों) के लिए दहनशील तर्क के मध्यवर्ती परिणामों को अलग करेगा, जिससे असाइनमेंट में देरी हो सकती है ।

एक कानूनी दृष्टिकोण से, यह सब बहुत अच्छी तरह से काम करता है। आप वास्तव में, दृश्यों के भीतर भी =एक अवरुद्ध (समय-अनुक्रमिक) ऑपरेशन के रूप में विचार कर सकते हैं always_comb। हालांकि, समय-अनुक्रमिक और समानांतर के बीच का अंतर इस मामले में बिल्कुल कोई फर्क नहीं पड़ता क्योंकि दalways_comb ब्लॉक को दोहराने के लिए तब तक परिभाषित किया जाता है जब तक कि निर्देश अनुक्रम स्थिर स्थिति में परिवर्तित नहीं हो जाता - जो कि हार्डवेयर सर्किटरी करेगा (यदि यह समय पूरा करता है) आवश्यकताओं)।

Verilog (और विशेष रूप से SystemVerilog) का संश्लेषित सबसेट बेहद सरल और उपयोग में आसान है - एक बार जब आप आवश्यक मुहावरों को जान लेते हैं। आपको बस भाषा में तथाकथित व्यवहार तत्वों से जुड़ी शब्दावली का चतुर उपयोग करना है।


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

बेशक , SystemVerilog का प्रक्रियात्मक मोड, विशेष रूप से ब्लॉकों के initialभीतर बयानों के लिए लागू होता है, विशेष रूप से असाइनमेंटprogram (समय-अनुक्रमिक) अवरुद्ध असाइनमेंट का उपयोग करता है । यह टेस्टबेंच डिजाइन के लिए उपयोगी है , लेकिन आम तौर पर आरटीएल विनिर्देश के लिए नहीं।
नोबार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.