ما هو الـ Testbench
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 73 من 90.
تُعد testbench وحدة Verilog خاصة تُستخدم لاختبار وحدة أخرى. فهي توفر inputs للتصميم الخاص بك وتتحقق مما إذا كانت outputs صحيحة.
لماذا نحتاج إلى منصة اختبار (Testbench)؟
عندما تقوم ببناء module، فإنك بحاجة إلى التأكد من أنه يعمل بشكل صحيح. تسمح لك منصة الاختبار بـ:
- تطبيق قيم input مختلفة على module الخاص بك
- ملاحظة outputs
- تحقق مما إذا كانت المخرجات تطابق ما تتوقعه
- قم بذلك تلقائيًا دون الحاجة إلى اختبار يدوي
Testbench مقابل Design module
| Design module | Testbench | |
|---|---|---|
| الغرض | يقوم بتمثيل العتاد (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) الأخرى في الدروس القادمة.
التحدي
يُعطى لك وحدة بوابات AND (and_gate). مهمتك هي إضافة الأجزاء المفقودة إلى الـ testbench الخاص بها.
ما يجب فعله:
أضف الأجزاء التالية إلى الـ testbench:
- قم بإعلان
regللمدخلاتaوb - قم بإعلان
wireللمخرجc - قم بعمل
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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات14أساسيات الـ Testbench
ما هو الـ Testbenchإنشاء المحفزاتالمهام Display و Monitorالمهام Dumpfile و Dumpvarsاستخدام مهام النظامملخص - Testbench كامل3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة