Altifigence Academy

61 / 63 · अवधारणा

रुक सकने वाली पाइपलाइन और बैकप्रेशर

हर चरण का ready निकालकर रुकावट और एक साथ आगे बढ़ने में डेटा की हानि, दोहराव और दोबारा गणना रोकें।

पाने वाला हर बार तैयार न हो तो

पूर्वज्ञान: एक स्थान का ready/validहैंडशेक उसी किनारे पर प्रेषक का valid और ग्रहणकर्ता का ready दोनों 1 होने पर हस्तांतरण निश्चित करने वाला अनुबंध। प्रतीक्षा के दौरान डेटा बनाए रखने के नियम भी इसका हिस्सा हैं। और जानें बफर और पाइपलाइनपाइपलाइन गणना को रजिस्टरों से अलग किए गए चरणों में बाँटकर कई इनपुट का प्रसंस्करण एक साथ चलाने वाली संरचना। डेटा, valid और नियंत्रण सिग्नलों का चरणों में संरेखण आवश्यक है। और जानें में डेटा संरेखण।

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

दोनों चरणों को एक-एक डेटा मद और एक-एक valid बिट से दर्शाएँ। दूसरा चरण खाली हो या वर्तमान आउटपुट भेज सके, तो नया मान ले सकता है। पहले चरण पर भी यही नियम लगाएँ।

r2=¬v2∨out_ready,r1=¬v1∨r2r_2=\neg v_2\lor\mathrm{out\_ready},\qquad r_1=\neg v_1\lor r_2

बाहरी in_ready, r1 है। r2=0 होने पर भी पहला चरण खाली हो तो एक नया इनपुट ले सकता है। इससे “आउटपुट रुके तो सभी इनपुट मना” वाली नीति की तुलना में भंडारण बेहतर उपयोग होता है।

हर चरण केवल आगे बढ़ने की अनुमति पर अपडेट हो

नीचे का उदाहरण unsignedunsigned बिट अनुक्रम को गैर-ऋणात्मक पूर्णांक मानने का नियम। n बिट की सीमा 0 से 2^n−1 है और वही बिट signed व्याख्या में अलग मान दे सकते हैं। और जानें 8-बिट x के लिए y=2(x+1) निकालता है। पहला चरण x+1 को 9 बिट में रखता है और दूसरा चरण 10 बिट में एक स्थान बाएँ खिसकाता है। अधिकतम इनपुट 255 का परिणाम 512 भी सटीक दर्शाया जाता है।

SystemVerilog
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
endmodule

Nonblockingnonblocking अनुक्रमिक RTL में <= द्वारा असाइनमेंट। दाईं ओर का मूल्यांकन कर अद्यतन निर्धारित करता है, जिससे उसी एज के रजिस्टर पुरानी अवस्था के आधार पर गणना करते हैं। और जानें असाइनमेंट होने से दूसरा चरण उसी एज पर नया निकला d1 नहीं, पुराना d1 लेता है। r1=0 पर v1,d1 और r2=0 पर v2,d2 बने रहते हैं। Valid को रोककर डेटा लगातार अपडेट करना गलत है।

दोनों चरण भरे हों तो क्रम देखें

शुरू में v2 में A का परिणाम, v1 में B का मध्यवर्ती मान और इनपुट पर प्रतीक्षा करता C मानें।

out_readyin_readyएज पर काम
00A,B बने रहें; C स्वीकार नहीं
00A,B बने रहें; C स्वीकार नहीं
11A भेजें, B दूसरे चरण में जाए, C स्वीकार करें

भेजने वाला C स्वीकार होने तक C और in_valid बनाए रखता है। पहले रुके एज पर C भेजा मानकर अगला डेटा प्रस्तुत कर दे तो C खो जाएगा।

हर स्तंभ उर्ध्वगामी एजउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और जानें के ठीक पहले के मान दर्शाता है। शुरू में अंतिम चरण में A, पहले में B और इनपुट पर प्रतीक्षा करता C है। E2 पर A भेजने और C स्वीकार करने के बाद, E3 के ठीक पहले आउटपुट B होता है।

दोनों चरण भरे होने पर बैकप्रेशर
तरंगरूप डेटा देखें
तरंगरूप डेटा: हर अक्षर एक अंतराल है; बिंदु पिछली अवस्था बनाए रखता है; p एक क्लॉक चक्र है।
संकेततरंगरूपबस मान
एज2345E0 → E1 → E2 → E3
out_ready0.1.
out_valid1...
out_data2..3A → B
in_valid1...
in_ready0.1.
in_data2..3C → D

संरक्षण के नियम जाँचें

Reset के बाद स्वीकार इनपुट संख्या Nin और भेजे आउटपुट संख्या Nout हो, तो संग्रह मात्रा नीचे दी गई है। Reset एज पर स्थानांतरण न गिनें।

Nin−Nout=v1+v2,0≤Nin−Nout≤2N_{\mathrm{in}}-N_{\mathrm{out}}=v_1+v_2,\qquad 0\le N_{\mathrm{in}}-N_{\mathrm{out}}\le2

सही संख्या होने पर भी 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 हैं, इसलिए और इनपुट नहीं ले सकते। इसी अंतर से दोनों भंडारण स्थानों का वास्तव में उपयोग होता है।

आपका चयन इस ब्राउज़र पर लागू होता है। फ़ुटर से कभी भी बदलें।