القيم الخاصة X و Z
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 17 من 90.
تُعد القيمتان X و Z قيمًا خاصة تمنحنا معلومات حول حالة العتاد (hardware state) أثناء المحاكاة.
X (Unknown) — للتصحيح (Debugging)
تظهر القيمة X في المحاكاة للإشارة إلى وجود مشكلات في تصميمك.
عندما ترى X، أحياناً ما تعني:
- مسجل غير مهيأ (Uninitialized register) — نسيت تعيين قيمة قبل استخدامه
- مشغلات متعددة (Multiple drivers) — تحاول جهتان مختلفان التحكم في السلك نفسه في الوقت نفسه
- انتهاك التوقيت (Timing violation) — تغيرت الإشارة في الوقت الخطأ، مما أدى إلى إنشاء حالة غير مستقرة
لا وجود للحالة X في العتاد الفعلي (hardware). بل هي أداة محاكاة تخبرك بوجود خطأ ما في تصميمك حتى تتمكن من إصلاحه قبل تصنيع الشريحة الفعالية.
بدون X، قد ترى قيم 0 أو 1 عشوائية دون أن تدرك وجود مشكلة. X يجعل الأخطاء البرمجية مرئية.
الأسباب الشائعة:
reg a; // في البداية X (غير معروف)
reg b;
assign b = a; // b يصبح X لأن a هو XZ (High Impedance)
يمثل Z حالة معاوقة عالية (high-impedance) أو حالة غير متصلة.
- تكون إشارة ما بحالة Z عندما لا يتم قيادتها بواسطة أي شيء
- تعني Z "هذا السلك مفصول"
- تُستخدم لمصدات الحالة الثلاثية (tri-state buffers) والنواقل المشتركة (shared buses)
الأسباب الشائعة:
wire c; // في البداية Z (غير متصل)
assign c = 1'bZ; // Explicitly set to Zكتابة X و Z في Verilog
يمكنك assign قيم X و Z تمامًا مثل 0 و 1:
reg [3:0] data;
data = 4'b10X0; // Bit 1 is unknown (0-indexed from the right)
data = 4'b01Z1; // البت 1 ذو ممانعة عالية
data = 4'bXXXX; // All bits unknown
data = 4'bZZZZ; // جميع البتات ذات ممانعة عاليةX و Z في الأشكال الموجية
في أشكال موجات المحاكاة:
- يظهر X كخط أحمر أو "X"
- يظهر Z كخط في المنتصف أو "Z"
تساعدك هذه على استكشاف أخطاء تصميمك وإصلاحها عن طريق إظهار الموضع الذي تكون فيه الإشارات غير معروفة (`unknown`) أو منفصلة.
ملاحظات مهمة
- X ينتشر عبر المنطق (X AND 0 = 0، ولكن X AND 1 = X)
- Z يُستخدم عادةً لناقلات الحالة الثلاثية (tri-state buses)
- في عملية التصنيع البرمجي (synthesis)، قد يتم التعامل مع X و Z بشكل مختلف
- قم دائمًا بتهيئ إشارات `reg` لتجنب حالة `X` في المحاكاة
التحدي
أكمل الكود بكتابة القيم الصحيحة التي تحتوي على X و Z.
ما يجب فعله:
- قم بضبط
aعلى قيمة من 4 أسنان (4-bit) حيث يكون Bit 1 عبارة عنunknown(وothersتكون 0) - قم بضبط
cلتكون كل الـbitsعبارة عنunknown(4 bits) - قم بضبط
dلتكون كل الـbitsعبارة عنhigh-impedance(4 bits)
جرّب بنفسك
module xz_challenge;
wire [3:0] a, c, d;
assign a = 4'b______; // Bit 1 is X (others 0)
assign c = 4'b______; // جميع البتات X
assign d = 4'b______; // All bits Z
initial begin
$display("a = %b", a);
$display("c = %b", c);
$display("d = %b", d);
$finish;
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة