3 / 24 · प्रयोग
प्रयोगशाला: आठ बिट का ALU संदर्भ मॉडल
स्वतंत्र प्रोग्राम में ADD, SUB, AND, XOR, कैरी और बॉरो जाँचें।
पाठ पढ़ना मुफ़्त है। प्रगति सेव करने के लिए नामांकन करें।
संख्यात्मक अनुबंध को चलने योग्य बनाएँ
इस प्रयोगशाला में JavaScript पूर्णांकों से संयोजी ALU का मॉडल बनाया जाता है। ऑपरैंड 0 से 255 तक और ऑपरेशन 0 से 3 तक हैं। आउटपुट y हमेशा आठ बिट में समाता है। फ़्लैग का अर्थ ADD कैरी या SUB बॉरो है और तार्किक ऑपरेशन में वह शून्य होता है। इस इंटरफ़ेस में a छोटा होने पर b से बॉरो एक होता है। अन्य आर्किटेक्चर घटाव के फ़्लैग को अलग अर्थ दे सकते हैं; हमारा अनुबंध स्पष्ट है।
स्थानीय फ़ोल्डर बनाएँ, या Digital Design Studio में स्वयं खाली परियोजना बनाकर alu-model.mjs जोड़ें। नीचे की फ़ाइल सहेजें। Node.js वाले टर्मिनल में उस फ़ोल्डर में जाएँ और node alu-model.mjs चलाएँ। DDS में फ़ाइल संपादित करना और JavaScript चलाना अलग क्रियाएँ हैं। किसी पैकेज की स्थापना या स्वचालित आयात सुविधा की आवश्यकता नहीं है।
import assert from 'node:assert/strict';
function alu(a, b, op) {
if (op === 0) {
const wide = a + b;
return { y: wide & 255, flag: Number(wide > 255) };
}
if (op === 1) return { y: (a - b) & 255, flag: Number(a < b) };
if (op === 2) return { y: a & b, flag: 0 };
if (op === 3) return { y: a ^ b, flag: 0 };
throw new RangeError('operation');
}
assert.deepEqual(alu(250, 10, 0), { y: 4, flag: 1 });
assert.deepEqual(alu(3, 5, 1), { y: 254, flag: 1 });
assert.deepEqual(alu(170, 204, 2), { y: 136, flag: 0 });
assert.deepEqual(alu(170, 204, 3), { y: 102, flag: 0 });
let checks = 0;
for (let a = 0; a < 256; a++) {
for (let b = 0; b < 256; b++) {
const add = alu(a, b, 0), sub = alu(a, b, 1);
assert.equal(add.y + 256 * add.flag, a + b);
assert.equal(sub.y - 256 * sub.flag, a - b);
assert.equal(alu(a, b, 2).y | alu(a, b, 3).y, a | b);
checks += 3;
}
}
console.log(`ALU PASS: ${checks} identities`);250+10 के लिए y=4 और carry=1 मिलकर 260 को पुनर्निर्मित करते हैं। 3-5 के लिए y=254 और borrow=1 मिलकर -2 बनाते हैं। 170 का बाइनरी रूप 10101010 और 204 का 11001100 है: AND से 136 और XOR से 102 मिलता है। लूप सभी 65536 ऑपरैंड युग्मों पर चलता है और प्रत्येक के लिए तीन सर्वसमिकाएँ जाँचता है। सफल रन 196608 जाँचों की सूचना देता है।
संदर्भ मॉडल में RTL से अलग तरीका अपनाएँ। यदि हार्डवेयर नौ बिट के योजक से कैरी निकालता है, तो यह मॉडल गणितीय सीमा जाँचता है। इससे दोनों कार्यान्वयनों में एक जैसी गलतियों की संभावना घटती है। ये जाँचें HDL के X/Z मान, प्रसार समय या क्लॉक व्यवहार नहीं परखतीं। RTL लागू करते समय इन वेक्टरों को सिम्युलेटर में फिर प्रयोग करें। हमेशा डेटा के साथ फ़्लैग भी तुलना करें; सही चक्रीय बिट गलत सीमा फ़्लैग को छिपा सकते हैं।
खुद आज़माएँ
यदि SUB हमेशा flag=0 लौटाए, तो कौन सी संख्यात्मक सर्वसमिका विफल होगी? a=0, b=1 को हाथ से जाँचें और कार्यान्वयन ठीक करें।
व्याख्या पढ़ें
y का मान 255 है। flag=0 के साथ y-256×flag का मान -1 के बजाय 255 है, इसलिए घटाव का पुनर्निर्माण विफल होता है। borrow=1 से 255-256=-1 मिलता है। केवल y जाँचने से यह त्रुटि पकड़ में नहीं आती।