30 / 37 · अवधारणा
Ready/valid और एक स्थान वाला लचीला बफर
रुक सकने वाले डेटापाथ में बिना हानि या दोहराव के स्थानांतरण तथा एक साथ इनपुट-आउटपुट के नियम बनाएँ।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
एक एज पर valid और ready दोनों 1 हों तो स्थानांतरण होता है
भेजने वाला मान्य डेटा प्रस्तुत करते समय valid=1 रखता है। पाने वाला डेटा ले सकने पर ready=1 रखता है। क्लॉक एज पर दोनों संकेत साथ पढ़कर स्थानांतरण तय होता है।
valid=1,ready=0 रहने तक भेजने वाले को valid और डेटा बनाए रखने चाहिए। Ready आने तक valid न देना, दूसरी ओर के नियमों के अनुसार deadlock पैदा कर सकता है। यहाँ सभी संकेत एक ही क्लॉक क्षेत्र में माने गए हैं। Ready/validहैंडशेक उसी किनारे पर प्रेषक का valid और ग्रहणकर्ता का ready दोनों 1 होने पर हस्तांतरण निश्चित करने वाला अनुबंध। प्रतीक्षा के दौरान डेटा बनाए रखने के नियम भी इसका हिस्सा हैं। अपने आप CDC हल नहीं करता।
प्रतीक्षा करता डेटा ठीक एक बार भेजें
नीचे के स्तंभ क्रम से नमूना चक्र 0–5 हैं। संकेत को संबंधित उर्ध्वगामी एजउदयी किनारा (rising edge) क्लॉक के 0 से 1 होने का क्षण। यह CLK=1 के पूरे स्तर-अंतराल से अलग है। और जानें के ठीक पहले का मान समझें। चक्र 1 और 2 में A प्रतीक्षा कर रहा है: valid=1,ready=0, इसलिए डेटा और valid बने रहते हैं। एज 3 पर A और एज 4 पर B स्वीकार होता है। क्लॉक और संकेत रेखाओं का संरेखण अनुबंध समझाता है; यह setupsetup कैप्चर एज से पहले इनपुट डेटा के स्थिर रहने का न्यूनतम समय। उल्लंघन होने पर संग्रहित परिणाम की गारंटी नहीं रहती। और जानें/hold विलंब का मॉडल नहीं है।
तरंगरूप डेटा देखें
| संकेत | तरंगरूप | बस मान |
|---|---|---|
| clk | p..... | |
| valid | 01...0 | |
| ready | 10.1.. | |
| transfer | 0..1.0 | |
| data | x3..4x | A → B |
Valid कई चक्र तक 1 रहे तो इसका अर्थ केवल एक स्थानांतरण नहीं है। जिस भी एज पर ready भी 1 हो, वहाँ अलग स्थानांतरण होता है।
एक मद रखने वाला बफर बनाएँ
बफर खाली हो, या वर्तमान डेटा इसी एज पर भेज सकता हो, तो नए डेटा के लिए स्थान है।
module elastic_buffer (
input logic clk,
input logic 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 [7:0] out_data
);
assign in_ready = !out_valid || out_ready;
always_ff @(posedge clk) begin
if (rst) begin
out_valid <= 1'b0;
end else if (in_ready) begin
out_valid <= in_valid;
if (in_valid) out_data <= in_data;
end
end
endmoduleखाली बफर इनपुट स्वीकार करे तो एज के बाद out_valid और out_data अपडेट होते हैं। संयोजी बाइपास नहीं है, इसलिए नए मान को उसी एज पर आउटपुट स्थानांतरण नहीं गिनते। Reset के दौरान स्थानांतरण नहीं गिनते और out_valid=0 पर out_data का मान अर्थहीन है। इसलिए डेटा रजिस्टररजिस्टर कई बिटों की अवस्था संग्रहित करता है। इस पाठ्यक्रम के तुल्यकालिक रजिस्टर निर्धारित इनपुट को क्लॉक एज पर संग्रहित करते हैं। और जानें को स्वयं resetरीसेट अवस्था को विनिर्दिष्ट प्रारंभिक मान पर लौटाने वाला नियंत्रण। उसका तुल्यकालिक या अतुल्यकालिक होना और अन्य नियंत्रणों पर प्राथमिकता साथ तय करें। और जानें करना हमेशा आवश्यक नहीं है।
भरा बफर भी डेटा बदल सकता है
| एज से पहले की अवस्था | out_ready | in_valid | एज पर काम |
|---|---|---|---|
| खाली | 0 या 1 | 1 | इनपुट रखें, valid=1 करें |
| भरा | 0 | 0 या 1 | वर्तमान डेटा और valid बनाए रखें |
| भरा | 1 | 0 | आउटपुट भेजकर खाली हों |
| भरा | 1 | 1 | पुराना आउटपुट भेजें और नया इनपुट साथ रखें |
अंतिम पंक्ति के कारण पहली बार भरने के बाद हर चक्र एक मद संसाधित हो सकती है। विलंब होने का अर्थ थ्रूपुटथ्रूपुट प्रति इकाई समय स्वीकार या पूर्ण किए जाने वाले कार्यों की संख्या। पाइपलाइन किसी एक कार्य का विलंब घटाए बिना भी थ्रूपुट बढ़ा सकती है। और जानें आधा होना नहीं है।
डेटा क्रम का सत्यापन मॉडल
संदर्भ मॉडल में अधिकतम लंबाई 1 वाली कतार रखें। हर एज के पिछले मानों से आउटपुट स्थानांतरण और इनपुट स्वीकृति तय करें। आउटपुट हो तो कतार की पहली मद से मिलाएँ, फिर नया इनपुट पीछे रखें। उसी एज पर dequeue और enqueue दोनों संभव हैं, इसलिए क्रम स्पष्ट रखें।
यह अपरिवर्तनीय शर्त, reset से गिनती फिर शुरू किए गए अंतराल में सही है। साथ ही जाँचें कि stall में डेटा स्थिर है, भेजने का क्रम सुरक्षित है और वही मद दो बार नहीं भेजी जाती। केवल संख्या की शर्त से डेटा मान की शुद्धता सत्यापित नहीं होती।
कई बफरों के ready को संयोजी रूप से लंबा जोड़ने पर पीछे की दिशा में टाइमिंग मार्ग लंबा हो सकता है। संरचना जोड़ते समय संयोजी लूप न होने की जाँच भी करें।
आगे पढ़ें: AMD UG934 — READY/VALID Handshake
खुद आज़माएँ
बफर A से भरा है और नए इनपुट B का in_valid=1 है। पहले एज पर out_ready=0 और अगले पर out_ready=1 है। हर एज पर A और B का क्या होगा? भेजने वाले को B कब तक बनाए रखना होगा?
व्याख्या पढ़ें
पहले एज पर in_ready=0 है, इसलिए A बना रहता है और B स्वीकार नहीं होता। भेजने वाला B और in_valid=1 बनाए रखता है। अगले एज पर in_ready=1 होने से A भेजा जाता है और B साथ ही सहेजा जाता है। उस एज के बाद बफर आउटपुट B है, लेकिन B अभी भेजा नहीं गया। B का आउटपुट स्थानांतरण बाद के ऐसे एज पर होगा जहाँ out_valid और out_ready दोनों 1 हों।