Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

Casex و Casez

جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 56 من 90.

أحيانًا تهتم فقط بـ بتات معينة في قيمة ما، بينما يمكن تجاهل البتات الأخرى. على سبيل المثال، في مشفر الأولوية (priority encoder)، تريد العثور على أول بت قيمته 1 بغض النظر عن البتات الأخرى.

تتطلب جملة case الاعتيادية منك إدراج كل الاحتمالات الممكنة لبتات don't-care — وهو أمر مستحيل بالنسبة للنواقل (buses) العريضة.

<strong>casez</strong> و <strong>casex</strong> يحلان هذه المشكلة من خلال السماح لك بتمييز بتات معينة كـ "don't care" باستخدام ? أو z أو x.

Casez مقابل Casex مقابل Regular Case

البيانبتات عدم الاهتمام (Don't-Care Bits)الأفضل لـ
caseلا يوجدالمطابقة التامة
casezz أو ?مشفرات الأولوية (موصى به)
casexx، z، أو ?تجنب (يخفي الأخطاء)
  • <strong>casez</strong> يتجاهل البتات التي تكون z أو ? (موصى به)
  • <strong>casex</strong> يتجاهل أيضاً بتات x — والتي يمكن أن تخفي أخطاء المحاكاة

استخدم دائماً <strong>casez</strong>، وليس <strong>casex</strong>. تم إنشاء casex أولاً، ولكن المهندسين أدركوا أنه خطير لأنه يتجاهل قيم x (والتي غالباً ما تشير إلى سجلات غير مهيأة أو أخطاء في المحاكاة). تم تقديم casez كبديل أكثر أماناً.

مثال

casez (data)
  4'b???1: out = 0;   // يجب أن تكون Bit0 هي 1، والبتات الأخرى لا تهم
  4'b??1?: out = 1;   // يجب أن تكون Bit1 هي 1، والبتات الأخرى لا تهم
  4'b?1??: out = 2;   // يجب أن تكون Bit2 هي 1، والبتات الأخرى لا تهم
  4'b1???: out = 3;   // يجب أن تكون Bit3 هي 1، والبتات الأخرى لا تهم
endcase

تعني ? "لا يهم" — يمكن أن يكون ذلك البت 0 أو 1 أو أي شيء.

challenge icon

التحدي

ما يجب القيام به:

أضف جملة casez المفقودة لجعل وحدة فك التشفير (decoder) هذه تعمل.

كيفية العمل:

  • input = 4'b???1out = 4'b0001
  • input = 4'b??1?out = 4'b0010
  • input = 4'b?1??out = 4'b0100
  • input = 4'b1???out = 4'b1000
  • الافتراضي ← out = 4'b0000

ورقة مرجعية

تسمح casez بمطابقة الأنماط مع بتات "لا يهم" (don't-care bits) باستخدام ? أو z، وهي مفيدة لمشفرات الأولوية (priority encoders) حيث تهم بتات معينة فقط.

الجملةبتات "لا يهم"ملاحظات
caseلا يوجدمطابقة تامة
casezz أو ?موصى بها
casexx، z، أو ?تجنبها — تخفي الأخطاء البرمجية

يفضل دائماً استخدام casez على casex. حيث تتجاهل casex قيم x، مما قد يؤدي إلى إخفاء السجلات غير المهيأة أو أخطاء المحاكاة.

casez (data)
  4'b???1: out = 0;   // Bit0 must be 1, others don't matter
  4'b??1?: out = 1;   // Bit1 must be 1, others don't matter
  4'b?1??: out = 2;   // Bit2 must be 1, others don't matter
  4'b1???: out = 3;   // Bit3 must be 1, others don't matter
  default: out = 0;
endcase

تعني ? "لا يهم" (don't care) — أي أن هذا البت يمكن أن يكون 0، 1، أو أي شيء آخر.

جرّب بنفسك

module decoder (
  input [3:0] in,
  output reg [3:0] out
);
  
  always @(*) begin
    // TODO: casez أضف جملة
    // in = 4'b???1 -> out = 4'b0001
    // in = 4'b??1? -> out = 4'b0010
    // in = 4'b?1?? -> out = 4'b0100
    // in = 4'b1??? -> out = 4'b1000
    // default -> out = 4'b0000
  end
  
endmodule
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات