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

ما هو الـ Testbench

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

تُعد testbench وحدة Verilog خاصة تُستخدم لاختبار وحدة أخرى. فهي توفر inputs للتصميم الخاص بك وتتحقق مما إذا كانت outputs صحيحة.

لماذا نحتاج إلى منصة اختبار (Testbench)؟

عندما تقوم ببناء module، فإنك بحاجة إلى التأكد من أنه يعمل بشكل صحيح. تسمح لك منصة الاختبار بـ:

  • تطبيق قيم input مختلفة على module الخاص بك
  • ملاحظة outputs
  • تحقق مما إذا كانت المخرجات تطابق ما تتوقعه
  • قم بذلك تلقائيًا دون الحاجة إلى اختبار يدوي

Testbench مقابل Design module

 Design moduleTestbench
الغرضيقوم بتمثيل العتاد (Hardware)يختبر Design module
هل يحتوي على ports؟نعم (inputs و outputs)لا (مستقل بذاته)
قابل للتجميع (Synthesizable)؟نعملا (simulation فقط)

مثال بسيط على Testbench

module testbench;              // لا منافذ!

  // تأتي المدخلات والمخرجات من الوحدة التي نختبرها (الـ DUT).
  reg a, b;                    // reg للمدخلات
  wire c;                      // wire للمخرج
  

  // هذه هي عملية إنشاء مثيل للوحدة — تقوم بإنشاء نسخة من وحدة and_gate وتسميها dut
  and_gate dut (               // إنشاء مثيل DUT
    .a(a),
    .b(b),
    .c(c)
  );

  // هذه كتلة initial تطبق قيم اختبار على مدخلات الوحدة الجاري اختبارها.
  initial begin                // تطبيق قيم الاختبار
    a = 0; b = 0; #10;
    a = 0; b = 1; #10;
    a = 1; b = 0; #10;
    a = 1; b = 1; #10;
    $finish;
  end
endmodule

النقاط الرئيسية

  • لا يملك الـ `testbench` أي **`ports`**
  • يُستخدم reg للـ `signals` التي تتغير (`inputs` لـ `DUT`)
  • يُستخدم wire للـ `signals` القادمة من `DUT` (`outputs`)
  • يُطلق على الـ module الذي يتم اختباره اسم DUT (Design Under Test)
  • يقوم $finish بإنهاء الـ simulation

سنغطي إنشاء المحفزات (stimulus)، وعرض النتائج، وميزات منصة الاختبار (testbench) الأخرى في الدروس القادمة.

challenge icon

التحدي

يُعطى لك وحدة بوابات AND (and_gate). مهمتك هي إضافة الأجزاء المفقودة إلى الـ testbench الخاص بها.

ما يجب فعله:

أضف الأجزاء التالية إلى الـ testbench:

  1. قم بإعلان reg للمدخلات a و b
  2. قم بإعلان wire للمخرج c
  3. قم بعمل Instantiate لـ and_gate باسم dut وقم بتوصيل الـ ports

جرّب بنفسك

module and_gate (
  input a,
  input b,
  output c
);
  assign c = a & b;
endmodule

module testbench;
  
  // المهمة 1: تعريف reg للمدخلات a و b
  
  
  // المهمة 2: تعريف wire للمخرج c
  

  // المهمة 3: إنشاء مثيل لـ and_gate بالاسم dut
  // وصل .a(a)، .b(b)، .c(c)


  initial begin
    a = 0; b = 0; #10 $display("%d & %d = %d", a, b, c);
    a = 0; b = 1; #10 $display("%d & %d = %d", a, b, c);
    a = 1; b = 0; #10 $display("%d & %d = %d", a, b, c);
    a = 1; b = 1; #10 $display("%d & %d = %d", a, b, c);
    $finish;
  end
endmodule
quiz iconاختبر نفسك

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

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