10 / 20 · प्रयोग
प्रयोगशाला: समय विस्थापित 2×2 सरणी
एक-किनारा फ़ॉरवर्डिंग विलंब का मॉडल बनाएँ और हर मध्यवर्ती संचायक जाँचें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
समान k मानों को मिलाएँ
A(i,k) को बाएँ सीमा पर तार्किक किनारा k+i और B(k,j) को ऊपर k+j पर इंजेक्ट करें। रजिस्टर फ़ॉरवर्डिंग क्षैतिज रूप में j और लंबवत i किनारे जोड़ती है। इसलिए दोनों ऑपरैंड PE(i,j) पर k+i+j में पहुँचते हैं। इस क्रमिक इंजेक्शन को इनपुट समय विस्थापन कहते हैं।
A=[[1,2],[3,4]], B=[[5,6],[7,8]] में clear, E0 से पहले पूरा होता है। सीमा समयक्रम:
| किनारा | बाईं पंक्ति 0 | बाईं पंक्ति 1 | ऊपर स्तंभ 0 | ऊपर स्तंभ 1 |
|---|---|---|---|---|
| E0 | 1(k0) | अवैध | 5(k0) | अवैध |
| E1 | 2(k1) | 3(k0) | 7(k1) | 6(k0) |
| E2 | अवैध | 4(k1) | अवैध | 8(k1) |
| E3 | अवैध | अवैध | अवैध | अवैध |
नीचे का कोड schedule-lab.mjs में सहेजें और node schedule-lab.mjs चलाएँ। पैकेज नहीं चाहिए और यह Schedule lab passed लिखता है। अवैध टोकन null हैं; वैध टोकन value और k रखते हैं। एक-जॉब मॉडल job टैग छोड़ता है, लेकिन k स्पष्ट जाँचता है।
import assert from 'node:assert/strict';
const A=[[1,2],[3,4]],B=[[5,6],[7,8]],N=2,K=2;
const fresh=()=>({a:null,b:null,acc:0,count:0});
let grid=Array.from({length:N},()=>Array.from({length:N},fresh));
const expected=[[[5,0],[0,0]],[[19,6],[15,0]],
[[19,22],[43,18]],[[19,22],[43,50]]];
const token=(value,k)=>({value,k});
for(let t=0;t<K+2*N-2;t++) {
const next=grid.map(r=>r.map(p=>({...p})));
for(let i=0;i<N;i++) for(let j=0;j<N;j++) {
const ka=t-i,kb=t-j;
const a=j?grid[i][j-1].a:(ka>=0&&ka<K?token(A[i][ka],ka):null);
const b=i?grid[i-1][j].b:(kb>=0&&kb<K?token(B[kb][j],kb):null);
const p=next[i][j];p.a=a;p.b=b;
if(a&&b){assert.equal(a.k,b.k);assert.equal(a.k,p.count);
p.acc+=a.value*b.value;p.count++;}
}
grid=next;
assert.deepEqual(grid.map(r=>r.map(p=>p.acc)),expected[t]);
}
assert.deepEqual(grid.map(r=>r.map(p=>p.count)),[[2,2],[2,2]]);
console.log('Schedule lab passed');हर PE पुरानी स्थिति पढ़कर अगली स्थिति लिखता है। वहीं अपडेट करके पुनरावृत्ति करने से गलत ढंग से एक किनारे में कई पड़ाव फ़ॉरवर्डिंग होगी।
E0 के बाद केवल C(0,0) का संचायक पाँच है। E1 उसे उन्नीस पर पूरा करता है और पड़ोसियों में छह तथा पंद्रह शुरू करता है। E2 वे बाईस और तैंतालीस पर पूरे होते हैं, जबकि अंतिम PE में केवल अठारह है। E3 बत्तीस जोड़कर पचास बनाता है।
पंक्ति इंजेक्शन t−i से t करें। टैग assertion को असंरेखण पकड़ना चाहिए। पूर्णता में चार advance किनारे और हर count दो चाहिए। आरंभीकरण तथा क्रमिक आउटपुट स्थानांतरण शामिल नहीं हैं। यह चलने वाला मॉडल निर्धारित समयक्रम जाँचता है; RTL या DDS निष्पादन का दावा नहीं करता।
वास्तविक RTL:रजिस्टर वाला 2×2 ग्रिड
संलग्न systolic_2x2.sv, signed_mac_pe.sv के चार इंस्टेंस जोड़ता है,सीमा N=K=2 है। A दाएँ और B नीचे रजिस्टर लिंक से जाते हैं,valid और k टैग साथ हैं। बाहरी सीमा आपूर्तिकर्ता समय विस्थापन करता है;टेस्टबेंच का step कार्य E0..E3 समयक्रम सीधे चलाता है। Clear,E0 से पहले पूरा है और अतिरिक्त गुणक पाइपलाइन नहीं।
तीनों संलग्न फ़ाइल साथ सहेजकर Icarus Verilog चलाएँ:
iverilog -g2012 -s tb_systolic_2x2 -o systolic.vvp signed_mac_pe.sv systolic_2x2.sv tb_systolic_2x2.sv
vvp systolic.vvpकिनारे-पश्चात मैट्रिक्स [[5,0],[0,0]], [[19,6],[15,0]], [[19,22],[43,18]] और [[19,22],[43,50]] हैं। Done केवल E3 बाद सक्रिय है। दो विराम से चार advance और छह भौतिक गणना किनारे हैं। जाँच [[10,9],[−6,3]],पूरी स्थिति रखना और बीच जॉब रीसेट भी लेती हैं। RTL PASS: अपेक्षित है।
RTL बदलाव अभ्यास में रजिस्टर ऑपरैंड लिंक को संयोजी पथ करें। पहली टैग-संरेखण या मध्यवर्ती योग विफलता अनुमान करें,लॉग तुलना करें और रजिस्टर लौटाएँ। ग्रिड N×N बढ़ाने में वायरिंग,समय विस्थापन,चौड़ाई,टैग और पूर्णता साथ फिर देखें।
खुद आज़माएँ
E2 के बाद PE(1,1) का संचायक और बचा पद क्या है? अवैध सीमा इनपुट के बावजूद E3 पर वह क्यों बदलता है?
व्याख्या पढ़ें
संचायक 3×6 से 18 है और 4×8=32 बचा है। ये ऑपरैंड आंतरिक फ़ॉरवर्डिंग रजिस्टर में हैं और E3 पर आते हैं; अवैध सीमाएँ सरणी तुरंत खाली नहीं करतीं।