21 / 37 · अवधारणा
function automatic और पुनः उपयोग वाले व्यंजक
सिमुलेशन समय न लेने वाली फ़ंक्शन लिखें और लौटे मान की चौड़ाई, चिह्न तथा स्वतंत्र संदर्भ जाँचें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
गणना दोहराएँ, अनुबंध न छिपाएँ
SystemVerilog फ़ंक्शन बिना सिमुलेशन समय लिए मान लौटाती है। संश्लेषण योग्य संयोजन RTL में स्पष्ट इनपुट लें, हर पथ पर लौटने वाला मान असाइन करें और delay या event नियंत्रण न रखें। automatic हर कॉल के तर्क और स्थानीय चर अलग करता है, रजिस्टर या चक्र नहीं जोड़ता। यह स्थिर लूप आठ बिट का XOR करके संयोजन parity निकालता है।
module parity_function (
input logic [7:0] data,
output logic parity,
output logic [7:0] with_parity
);
function automatic logic parity8(input logic [7:0] value);
logic p;
integer bit_index;
begin
p = 1'b0;
for (bit_index = 0; bit_index < 8; bit_index = bit_index + 1)
p = p ^ value[bit_index];
parity8 = p;
end
endfunction
assign parity = parity8(data);
assign with_parity = {data[6:0], parity8(data)};
endmodulewith_parity, data[7] हटाकर parity लगाता है: आठ बिट ही हैं, सभी इनपुट रखने वाली नौ-बिट encoding नहीं। फ़ंक्शन सही हो सकती है लेकिन उसे बुलाने वाला डेटा खो सकता है।
लौटने वाले मान की चौड़ाई और चिह्न
यहाँ परिणाम एक-बिट logic है। आठ-बिट के दो बिना चिह्न इनपुट जोड़कर carry रखने के लिए नौ-बिट परिणाम चाहिए। फ़ंक्शन कॉल गंतव्य अपने आप नहीं बढ़ाती। चौड़ाई नियम और स्थिरांक इंटरफ़ेस के पास रखें; बदलते वैश्विक सिग्नल पर छिपी निर्भरता पुनः उपयोग और जाँच कठिन करती है।
कॉल का अर्थ क्रमिक साझा संसाधन नहीं
दो कॉल संश्लेषण को समय में साझा एक ऑपरेटर बनाने को बाध्य नहीं करतीं। औज़ार संयोजन तर्क सरल कर सकता है; क्रमिक साझा करने के लिए स्वीकृति नियम, अवस्था और परिणाम का समय चाहिए। कॉल गिनकर क्षेत्रफल या throughput न निकालें। टेस्टबेंच task घटनाएँ प्रतीक्षा कर सकती है; फ़ंक्शन और समय लेने वाली task की भूमिका अलग है। अगला पाठ गिरते किनारे पर उत्तेजना और बढ़ते किनारे के बाद देखने के लिए task लेता है।
अभ्यास: अलग संदर्भ
data=0,1,3,8'h80,8'hFF पर parity क्रम 0,1,0,1,0 होना चाहिए। 8'h80 पर with_parity=8'h01, क्योंकि ऊपर का बिट हटता है और parity=1। DUT की parity8 न बुलाकर पूर्णांक में चालू बिट गिनें और 2 से शेष लेकर सभी 256 मान जाँचें। लूप सीमा 7 करें:8'h80 विफल होना चाहिए, हालाँकि छोटे मान त्रुटि नहीं दिखाएँगे। फिर आउटपुट {data, parity8(data)} से नौ बिट करें और मॉडल बदलें: यह इंटरफ़ेस बदलना है, केवल स्वरूप नहीं।