15 / 20 · प्रयोग
प्रयोगशाला: बैकप्रेशर और रीसेट
वैश्विक विराम, परिणाम बनाए रखना और अधूरी जॉब का रीसेट चलाएँ।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
तार्किक समय एक इकाई की तरह रोकें
सीखने की सरणी वैश्विक advance लेती है। सीमा शेड्यूलर और सभी PE केवल अगला तार्किक-कदम समूह उपलब्ध होने पर चलते हैं। अवैध निर्धारित लेन को असली ऑपरैंड नहीं चाहिए। केवल एक स्ट्रीम आगे बढ़ाने से समय विस्थापन टूटता है। स्वतंत्र स्टॉल वाले लिंक को अतिरिक्त बफ़रिंग और मिलान नियम चाहिए, जो इस आधार मॉडल से बाहर हैं।
आउटपुट का अलग valid/ready अनुबंध है। परिणाम तैयार हो तो valid, डेटा और job स्थिर रखें, जब तक valid&&ready वाला किनारा उसे ठीक एक बार स्थानांतरित न करे। सरल रैपर पुराने परिणाम के लंबित रहते नई जॉब शुरू नहीं करता। पर्याप्त परिणाम भंडारण हो तो उपभोक्ता की तैयार स्थिति को गणना रोकने की जरूरत नहीं।
इसे stall-lab.mjs में सहेजें और node stall-lab.mjs चलाएँ। दो-पद PE और परिणाम रजिस्टर का मॉडल है, पैकेज नहीं चाहिए और Stall/reset lab passed लिखता है।
import assert from 'node:assert/strict';
let s;
function reset(){s={step:0,acc:0,valid:false,data:0,job:7};}
const pairs=[[-2,3],[4,-5]];
function tick({advance=true,ready=false,rst=false}={}){
if(rst){reset();return null;}
if(s.valid){if(!ready)return null;
const out={data:s.data,job:s.job};s.valid=false;return out;}
if(advance&&s.step<pairs.length){
const [a,b]=pairs[s.step];s.acc+=a*b;s.step++;
if(s.step===pairs.length){s.data=s.acc;s.valid=true;}}
return null;
}
reset();tick();assert.equal(s.acc,-6);
const held={...s};tick({advance:false});assert.deepEqual(s,held);
tick();assert.equal(s.data,-26);assert.equal(s.valid,true);
const blocked={...s};tick({ready:false});tick({ready:false});
assert.deepEqual(s,blocked);
assert.deepEqual(tick({ready:true}),{data:-26,job:7});
assert.equal(tick({ready:true}),null);
reset();tick();tick({rst:true,advance:false});
assert.deepEqual(s,{step:0,acc:0,valid:false,data:0,job:7});
tick();tick();assert.equal(s.data,-26);
console.log('Stall/reset lab passed');जाँच का अर्थ समझें
विराम पहला योग −6 और समयक्रम स्थिति रखता है। दूसरा पद −26 बनाता है। दो रोके आउटपुट किनारे परिणाम रखते हैं; तैयार किनारा उसे एक बार देता है। अधूरी जॉब में रीसेट संचायक, स्थिति और result-valid साफ़ करता है, इसलिए पुनर्प्राप्ति जॉब दोबारा शुरू करती है।
चार-कदम 2×2 समयक्रम में दो वैश्विक विराम जोड़ने से चार advance और छह भौतिक किनारे हैं। परिणाम और उपयोग की k सूची बिना स्टॉल रन से मिलनी चाहिए। तार्किक पूर्णता सूत्र नहीं बदलता।
यह समकालिक नियंत्रण संदर्भ है। भौतिक रीसेट समकालिकरण और क्लॉक डोमेन क्रॉसिंग का अलग डिज़ाइन चाहिए। रीसेट से रद्द जॉब कभी सफल पूर्णता न बताए; पुनः आरंभ से पहले ऊपरी बफ़र साफ़ करें। मॉडल की सफलता RTL, स्थापित ऐप या हार्डवेयर स्वीकृति नहीं स्थापित करती।
खुद आज़माएँ
तीन किनारों तक valid=1 और ready=0 रखें, फिर ready सक्रिय करें। कौन से संकेत स्थिर चाहिए, कितने स्थानांतरण होंगे और प्रतीक्षा में रीसेट आए तो क्या होगा?
व्याख्या पढ़ें
डेटा, job और valid रखें। प्रतीक्षा में शून्य परिणाम जाते हैं; ready किनारा एक देता है। रीसेट लंबित valid स्थिति छोड़ता है और उस जॉब को सफल नहीं देना चाहिए। रद्द करने की किसी सूचना का अलग स्थिति अनुबंध चाहिए।