31 / 37 · अवधारणा
गुणा-जोड़ पाइपलाइन और डेटा का संरेखण
गणना को रजिस्टर सीमाओं पर बाँटें और डेटा, valid तथा सहायक ऑपरेंड एक ही लेनदेन के साथ संरेखित रखें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
गणना के व्यंजक से दो चरणों तक
पूर्वज्ञान: signed अंकगणित, nonblockingnonblocking अनुक्रमिक RTL में <= द्वारा असाइनमेंट। दाईं ओर का मूल्यांकन कर अद्यतन निर्धारित करता है, जिससे उसी एज के रजिस्टर पुरानी अवस्था के आधार पर गणना करते हैं। और जानें असाइनमेंट, setupsetup कैप्चर एज से पहले इनपुट डेटा के स्थिर रहने का न्यूनतम समय। उल्लंघन होने पर संग्रहित परिणाम की गारंटी नहीं रहती। और जानें शर्त और valid संकेत।
मान लें हर इनपुट लेनदेन में signed 8-बिट a,b और signed 16-बिट c हैं, तथा परिणाम यह है। यह संचायक नहीं है; हर लेनदेन स्वतंत्र रूप से संसाधित करने वाला multiply-add है।
8-बिट गुणा के सटीक परिणाम को 16 बिट चाहिए। उसमें c जोड़ते समय यदि 16 बिट में गणना करके बाद में विस्तार करें, तो खोए ऊपरी बिट वापस नहीं मिलेंगे। दोनों ऑपरेंड पहले 17 बिट तक चिह्न-विस्तारित करें, फिर जोड़ें।
पहले चरण में गुणनफल और c साथ रखें। दूसरे चरण में उसी लेनदेन के दोनों मान जोड़ें। c विलंबित न करने पर पिछले लेनदेन के गुणनफल में वर्तमान लेनदेन का c मिल जाएगा।
module multiply_add_pipeline (
input logic clk, rst, in_valid,
input logic signed [7:0] a, b,
input logic signed [15:0] c,
output logic out_valid,
output logic signed [16:0] y
);
logic v1;
logic signed [15:0] p1, c1;
logic signed [16:0] p_ext, c_ext;
assign p_ext = {p1[15], p1};
assign c_ext = {c1[15], c1};
always_ff @(posedge clk) begin
if (rst) begin
v1 <= 1'b0;
out_valid <= 1'b0;
end else begin
v1 <= in_valid;
out_valid <= v1;
if (in_valid) begin
p1 <= a * b;
c1 <= c;
end
if (v1) y <= p_ext + c_ext;
end
end
endmoduleयह इंटरफेस हर एज पर इनपुट ले सकता है और मानता है कि पाने वाला हर आउटपुट स्वीकार कर सकता है। out_valid=0 वाले y की तुलना न करें। डेटा रजिस्टररजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। और जानें resetरीसेट अवस्था को विनिर्दिष्ट प्रारंभिक मान पर लौटाने वाला नियंत्रण। उसका तुल्यकालिक या अतुल्यकालिक होना और अन्य नियंत्रणों पर प्राथमिकता साथ तय करें। और जानें न करने पर भी valid आरंभ करने से अनुपयोगी डेटा अलग किया जा सकता है।
“दो चरण” और अवलोकन का समय अलग करें
नीचे हर एज पर इनपुट स्वीकार करने के ठीक बाद की रजिस्टर अवस्था है। A और B अलग लेनदेन हैं।
| एज | स्वीकार इनपुट | पहला चरण | आउटपुट रजिस्टर |
|---|---|---|---|
| E0 | A | A का गुणनफल और c | अमान्य |
| E1 | B | B का गुणनफल और c | A का परिणाम, मान्य |
| E2 | कोई नहीं | अमान्य | B का परिणाम, मान्य |
| E3 | कोई नहीं | अमान्य | अमान्य |
A का परिणाम E1 के ठीक बाद तैयार है। उसी क्लॉक का अगला परिपथ इसे E2 पर पढ़ता है। इसलिए E0 पर इनपुट स्वीकृति से E2 पर आउटपुट प्राप्ति तक दो अवधि हैं। विलंब बताते समय आउटपुट रजिस्टर बदलने का समय और अगला परिपथ उसे पाने का समय न मिलाएँ।
हर स्तंभ एक उर्ध्वगामी एजउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और जानें का अवलोकन है। इनपुट एज से ठीक पहले के और “एज के बाद” नाम वाली अवस्थाएँ अपडेट के ठीक बाद की हैं। स्तंभ संरेखण नमूनों का क्रम दिखाता है, भौतिक प्रसार विलंबप्रसार विलंब इनपुट बदलने के बाद आउटपुट सही मान पर स्थिर होने तक का समय। तार्किक समतुल्यता और समय-संबंधी गुण अलग हैं। और जानें नहीं। लेनदेन A=(2,3,10),B=(4,5,100) हैं। पहला चरण गुणनफल और c साथ रखता है और अगले एज पर पिछले चरण के दोनों मान जुड़ते हैं। डैश अमान्य अंतराल है।
तरंगरूप डेटा देखें
| संकेत | तरंगरूप | बस मान |
|---|---|---|
| एज | 2345 | E0 → E1 → E2 → E3 |
| स्वीकार | 234. | A → B → - |
| एज के बाद product1 | 234. | 6 → 20 → - |
| एज के बाद c1 | 234. | 10 → 100 → - |
| एज के बाद y | 2345 | - → 16 → 120 → - |
| एज के बाद out_valid | 01.0 |
पाइपलाइन बाँटने से कितनी गति मिलेगी
एक सरल मॉडल लें: गुणा विलंब 3.2 ns, जोड़ विलंब 1.1 ns और रजिस्टर का अतिरिक्त समय 0.2 ns। ये गणना के लिए मान्य धारणाएँ हैं।
अधिकतम आवृत्ति की ऊपरी सीमा लगभग 222 MHz से 294 MHz होती है। दो चरण होने से थ्रूपुट आवश्यक रूप से दुगुना नहीं होता। सबसे धीमा चरण और रजिस्टर की लागत अवधि तय करते हैं। वास्तविक परिणाम संश्लेषण, प्लेसमेंट और बाधाओं पर निर्भर हैं।
पूरे लेनदेन का सत्यापन करें
इनपुट स्वीकार होने पर पूर्णांक संदर्भ मॉडल का a×b+c कतार में डालें। जिस एज पर आउटपुट valid प्राप्त हो, वहाँ सामने का अपेक्षित मान निकालकर मिलाएँ। in_valid=0 के अंतराल भी डालें ताकि जाँच सकें कि bubble डेटा के साथ आगे बढ़ता है। हर लेनदेन में केवल c को बहुत बदलने वाला पैटर्न, उसका विलंब भूलने की गलती अच्छी तरह दिखाता है।
आगे पढ़ें: MIT OpenCourseWare — Performance Measures
खुद आज़माएँ
लगातार लेनदेन A=(a=3,b=-4,c=10) और B=(a=2,b=5,c=100) दें। सही आउटपुट क्रम निकालें। c को विलंबित किए बिना वर्तमान इनपुट c जोड़ने पर A का कौन-सा गलत परिणाम आ सकता है?
व्याख्या पढ़ें
सही परिणाम A के लिए -12+10=-2 और B के लिए 10+100=110 हैं। जब A का गुणनफल दूसरे चरण में हो और वर्तमान c, B का 100 हो, तो 88 मिलेगा। केवल valid सही विलंबित करने से भी ऑपरेंड का संरेखण गलत होने की यह गलती नहीं रुकती।