15 / 37 · अवधारणा
Nonblocking assignment और एक साथ अवस्था अद्यतन
पुराने और अगले मानों को अलग करके पाइपलाइन तथा काउंटर RTL का सही अर्थ निकालें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
दाएँ पक्ष के व्यंजक पुरानी अवस्था से मूल्यांकित होते हैं
क्लॉक आधारित अनुक्रमिक ब्लॉक में <= पहले दाएँ पक्ष का मूल्यांकन करता है और परिणाम को nonblockingnonblocking अनुक्रमिक RTL में <= द्वारा असाइनमेंट। दाईं ओर का मूल्यांकन कर अद्यतन निर्धारित करता है, जिससे उसी एज के रजिस्टर पुरानी अवस्था के आधार पर गणना करते हैं। अद्यतन चरण में लागू करता है। एक ही किनारे पर कई रजिस्टरोंरजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। और पढ़ें को अद्यतन करते समय इससे ऐसा लिखा जा सकता है कि नई वैल्यू कोड की पंक्तियों के क्रम से तुरंत आगे न बह जाए।
always_ff @(posedge clk) begin
if (rst) begin
a <= 8'd0;
b <= 8'd0;
end else begin
a <= d;
b <= a;
end
endयदि प्रारंभ में a=b=0 और इनपुट क्रम 5, 9, 2 है, तो किनारों के बाद (a,b) क्रमशः (5,0), (9,5), (2,9) होते हैं। दूसरी पंक्ति को अद्यतन a पढ़ने वाला मानना पाइपलाइनपाइपलाइन गणना को रजिस्टरों से अलग किए गए चरणों में बाँटकर कई इनपुट का प्रसंस्करण एक साथ चलाने वाली संरचना। डेटा, valid और नियंत्रण सिग्नलों का चरणों में संरेखण आवश्यक है। और पढ़ें का एक चरण मिटाने के समान है।
हर स्तंभ एक उदयी किनारेउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और पढ़ें का अवलोकन है। इनपुट किनारे से ठीक पहले के हैं; नाम में after वाली अवस्थाएँ अद्यतन के तुरंत बाद की हैं। स्तंभों का क्रम नमूनों का क्रम दिखाता है, भौतिक प्रसार विलंबप्रसार विलंब इनपुट बदलने के बाद आउटपुट सही मान पर स्थिर होने तक का समय। तार्किक समतुल्यता और समय-संबंधी गुण अलग हैं। और पढ़ें नहीं। शुरुआत a=b=0 से होती है। जब a नया d संग्रहित करता है, तब b पुराना a संग्रहित करता है, इसलिए दोनों पंक्तियाँ एक चरण से खिसकी हुई हैं।
तरंगरूप डेटा देखें
| संकेत | तरंगरूप | बस मान |
|---|---|---|
| edge | 234 | E0 → E1 → E2 |
| d | 234 | 5 → 9 → 2 |
| a बाद में | 234 | 5 → 9 → 2 |
| b बाद में | 234 | 0 → 5 → 9 |
Blocking में बदलना जोखिमपूर्ण क्यों है?
उसी ब्लॉक में a=d; b=a; लिखने पर b की गणना उस ब्लॉक में पहले ही बदला गया a इस्तेमाल कर सकती है। अन्य अनुक्रमिक ब्लॉकों की scheduling के अनुसार race भी हो सकती है। सामान्य नियम के रूप में संयोजन गणना के लिए blocking और अवस्था संग्रहण के लिए nonblocking उपयोग करें। अपवाद तभी अपनाएँ जब उनके event अर्थ स्पष्ट कर सकें।
एक ही रजिस्टर को कई बार assignment न दें
एक प्रक्रिया में एक ही q को कई nonblocking assignments चलाने पर अंतिम चलाया गया assignment परिणाम तय कर सकता है। कई स्वतंत्र if में प्राथमिकता छिपाने के बजाय if / else if / else या स्पष्ट next-state चर से व्यवहार लिखें। एक ही रजिस्टर को कई ब्लॉकों से drive करने से बचें।
RTL समीक्षा में हर रजिस्टर का एक अगली-अवस्था समीकरण लिखना उपयोगी है। यदि दो समीकरण बनें या किसी शर्त पर मान परिभाषित न हो, तो नियंत्रण प्राथमिकता फिर जाँचें।
खुद आज़माएँ
प्रारंभ में a=1, b=4 हैं। एक ही क्लॉक ब्लॉक में a<=b; b<=a; चलाने पर एक और दो किनारों के बाद अवस्था क्या होगी?
व्याख्या पढ़ें
एक किनारे के बाद (a,b)=(4,1), दो के बाद (1,4) होंगे। दोनों assignments एक ही पुरानी अवस्था पढ़ते हैं, इसलिए मान अदल-बदल जाते हैं। a=b; b=a; लिखने पर क्रम के कारण दोनों पुराने b के बराबर हो सकते हैं; यह समान व्यवहार नहीं है।