61 / 63 · अवधारणा
रुक सकने वाली पाइपलाइन और बैकप्रेशर
हर चरण का ready निकालकर रुकावट और एक साथ आगे बढ़ने में डेटा की हानि, दोहराव और दोबारा गणना रोकें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
पाने वाला हर बार तैयार न हो तो
पूर्वज्ञान: एक स्थान का ready/validहैंडशेक उसी किनारे पर प्रेषक का valid और ग्रहणकर्ता का ready दोनों 1 होने पर हस्तांतरण निश्चित करने वाला अनुबंध। प्रतीक्षा के दौरान डेटा बनाए रखने के नियम भी इसका हिस्सा हैं। और जानें बफर और पाइपलाइनपाइपलाइन गणना को रजिस्टरों से अलग किए गए चरणों में बाँटकर कई इनपुट का प्रसंस्करण एक साथ चलाने वाली संरचना। डेटा, valid और नियंत्रण सिग्नलों का चरणों में संरेखण आवश्यक है। और जानें में डेटा संरेखण।
निश्चित गति की पाइपलाइन में केवल out_ready जोड़कर आउटपुट रोकना पर्याप्त नहीं है। अंतिम चरण भरा होने से रुके तो पहले वाले चरण भी ओवरराइट नहीं होने चाहिए। रुकने का अनुरोध इनपुट की ओर पहुँचाने वाला बैकप्रेशरबैकप्रेशर पाने वाले द्वारा भेजने वाले को अस्थायी रूप से डेटा न ले पाने की सूचना देकर प्रवाह रोकना। रुकावट के दौरान अभी न भेजा गया डेटा सुरक्षित रहना चाहिए। और जानें डिजाइन करना होगा।
दोनों चरणों को एक-एक डेटा मद और एक-एक valid बिट से दर्शाएँ। दूसरा चरण खाली हो या वर्तमान आउटपुट भेज सके, तो नया मान ले सकता है। पहले चरण पर भी यही नियम लगाएँ।
बाहरी in_ready, r1 है। r2=0 होने पर भी पहला चरण खाली हो तो एक नया इनपुट ले सकता है। इससे “आउटपुट रुके तो सभी इनपुट मना” वाली नीति की तुलना में भंडारण बेहतर उपयोग होता है।
हर चरण केवल आगे बढ़ने की अनुमति पर अपडेट हो
नीचे का उदाहरण unsignedunsigned बिट अनुक्रम को गैर-ऋणात्मक पूर्णांक मानने का नियम। n बिट की सीमा 0 से 2^n−1 है और वही बिट signed व्याख्या में अलग मान दे सकते हैं। और जानें 8-बिट x के लिए y=2(x+1) निकालता है। पहला चरण x+1 को 9 बिट में रखता है और दूसरा चरण 10 बिट में एक स्थान बाएँ खिसकाता है। अधिकतम इनपुट 255 का परिणाम 512 भी सटीक दर्शाया जाता है।
module stallable_pipeline (
input logic clk, rst,
input logic in_valid,
output logic in_ready,
input logic [7:0] in_data,
output logic out_valid,
input logic out_ready,
output logic [9:0] out_data
);
logic v1, v2, r1, r2;
logic [8:0] d1;
logic [9:0] d2;
assign r2 = !v2 || out_ready;
assign r1 = !v1 || r2;
assign in_ready = r1;
assign out_valid = v2;
assign out_data = d2;
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
v2 <= 1'b0;
end else begin
if (r2) begin
v2 <= v1;
if (v1) d2 <= {d1, 1'b0};
end
if (r1) begin
v1 <= in_valid;
if (in_valid) d1 <= {1'b0, in_data} + 9'd1;
end
end
end
endmoduleNonblockingnonblocking अनुक्रमिक RTL में <= द्वारा असाइनमेंट। दाईं ओर का मूल्यांकन कर अद्यतन निर्धारित करता है, जिससे उसी एज के रजिस्टर पुरानी अवस्था के आधार पर गणना करते हैं। और जानें असाइनमेंट होने से दूसरा चरण उसी एज पर नया निकला d1 नहीं, पुराना d1 लेता है। r1=0 पर v1,d1 और r2=0 पर v2,d2 बने रहते हैं। Valid को रोककर डेटा लगातार अपडेट करना गलत है।
दोनों चरण भरे हों तो क्रम देखें
शुरू में v2 में A का परिणाम, v1 में B का मध्यवर्ती मान और इनपुट पर प्रतीक्षा करता C मानें।
| out_ready | in_ready | एज पर काम |
|---|---|---|
| 0 | 0 | A,B बने रहें; C स्वीकार नहीं |
| 0 | 0 | A,B बने रहें; C स्वीकार नहीं |
| 1 | 1 | A भेजें, B दूसरे चरण में जाए, C स्वीकार करें |
भेजने वाला C स्वीकार होने तक C और in_valid बनाए रखता है। पहले रुके एज पर C भेजा मानकर अगला डेटा प्रस्तुत कर दे तो C खो जाएगा।
हर स्तंभ उर्ध्वगामी एजउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और जानें के ठीक पहले के मान दर्शाता है। शुरू में अंतिम चरण में A, पहले में B और इनपुट पर प्रतीक्षा करता C है। E2 पर A भेजने और C स्वीकार करने के बाद, E3 के ठीक पहले आउटपुट B होता है।
तरंगरूप डेटा देखें
| संकेत | तरंगरूप | बस मान |
|---|---|---|
| एज | 2345 | E0 → E1 → E2 → E3 |
| out_ready | 0.1. | |
| out_valid | 1... | |
| out_data | 2..3 | A → B |
| in_valid | 1... | |
| in_ready | 0.1. | |
| in_data | 2..3 | C → D |
संरक्षण के नियम जाँचें
Reset के बाद स्वीकार इनपुट संख्या Nin और भेजे आउटपुट संख्या Nout हो, तो संग्रह मात्रा नीचे दी गई है। Reset एज पर स्थानांतरण न गिनें।
सही संख्या होने पर भी A दो बार भेजकर B खोने की गलती छूट सकती है, इसलिए संदर्भ कतार से मान और क्रम भी जाँचें। इनपुट valid और आउटपुट ready स्वतंत्र बदलें; लंबी रुकावट, लगातार प्रसंस्करण और reset में खाली करना शामिल करें।
Ready का मार्ग भी टाइमिंग मार्ग है
कई चरण जोड़ने से r2→r1 जैसा विपरीत दिशा का संयोजी मार्ग लंबा होता है। एक रजिस्टर से ready विलंबित करने पर उस विलंब में पहले से स्वीकार करने का वादा किए इनपुटों को रखने के लिए अतिरिक्त जगह चाहिए हो सकती है। भंडारण और प्रोटोकॉल पर विचार किए बिना ready में केवल फ्लिप-फ्लॉप डालना सुरक्षित टाइमिंग अनुकूलन नहीं है।
खुद आज़माएँ
v1=0,v2=1 और out_ready=0 है। क्या in_valid=1 वाला इनपुट लिया जा सकता है? अगले चक्र में भी out_ready=0 रहे तो क्या अतिरिक्त इनपुट लगातार लेते रह सकते हैं?
व्याख्या पढ़ें
पहले r2=0 लेकिन r1=1 है, इसलिए एक इनपुट लेकर पहला चरण भर सकता है। एज के बाद v1=v2=1 होने पर r1=r2=0 हैं, इसलिए और इनपुट नहीं ले सकते। इसी अंतर से दोनों भंडारण स्थानों का वास्तव में उपयोग होता है।