ما هو الـ Testbench
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 73 من 90.
تُعد testbench وحدة Verilog خاصة تُستخدم لاختبار وحدة أخرى. فهي توفر مدخلات لتصميمك وتتحقق مما إذا كانت المخرجات صحيحة.
لماذا نحتاج إلى منصة اختبار (Testbench)؟
عندما تقوم ببناء وحدة (module)، يجب عليك التأكد من أنها تعمل بشكل صحيح. تتيح لك منصة الاختبار (testbench) القيام بما يلي:
- تطبيق قيم مدخلات مختلفة على الوحدة الخاصة بك
- مراقبة المخرجات
- تحقق مما إذا كانت المخرجات تطابق ما تتوقعه
- قم بذلك تلقائياً دون اختبار يدوي
Testbench مقابل Design Module
| وحدة التصميم (Design Module) | بيئة الاختبار (Testbench) | |
|---|---|---|
| الغرض | تنفيذ العتاد (Hardware) | اختبار وحدة التصميم |
| هل تحتوي على منافذ؟ | نعم (مدخلات ومخرجات) | لا (مستقلة بذاتها) |
| قابلة للتوليف (Synthesizable)؟ | نعم | لا (للمحاكاة فقط) |
مثال بسيط لمنصة اختبار (Testbench)
module testbench; // لا توجد منافذ!
// تأتي المدخلات والمخرجات من الوحدة التي نختبرها (الـ DUT).
reg a, b; // reg للمدخلات
wire c; // wire للمخرجات
// هذا هو استنساخ الوحدة (module instantiation) — حيث ينشئ نسخة من وحدة 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للإشارات التي تتغير (المدخلات إلى DUT) - يُستخدم
wireللإشارات القادمة من DUT (المخرجات)
- يُسمى النموذج الذي يتم اختباره DUT (تصميم قيد الاختبار)
$finishينهي المحاكاة
سنغطي إنشاء المحفزات (stimulus)، وعرض النتائج، وميزات منصة الاختبار (testbench) الأخرى في الدروس التالية.
التحدي
لقد تم تزويدك بوحدة بوابة AND. مهمتك هي إضافة الأجزاء المفقودة إلى منصة الاختبار (testbench) الخاصة بها.
ما يجب القيام به:
أضف الأجزاء التالية إلى منصة الاختبار (testbench):
- قم بالتصريح عن
regللمدخلاتaوb - قم بالتصريح عن
wireللمخرجc - قم بإنشاء مثيل (Instantiate) لـ
and_gateبالاسمdutوقم بتوصيل المنافذ
ورقة مرجعية
تعد منصة الاختبار (testbench) وحدة Verilog تُستخدم لاختبار وحدة أخرى (تسمى DUT - التصميم قيد الاختبار). وهي لا تحتوي على منافذ وتُستخدم للمحاكاة فقط.
module testbench; // لا توجد منافذ!
reg a, b; // reg للمدخلات (الإشارات التي تتغير)
wire c; // wire لمخرجات الـ DUT
and_gate dut ( // إنشاء نسخة من الـ DUT
.a(a),
.b(b),
.c(c)
);
initial begin // تطبيق قيم الاختبار
a = 0; b = 0; #10;
a = 1; b = 1; #10;
$finish; // إنهاء المحاكاة
end
endmodule- استخدم
regللإشارات التي يتم التحكم بها داخل كتلinitial(مدخلات الـ DUT) - استخدم
wireللإشارات القادمة من الـ DUT (المخرجات) $finishينهي عملية المحاكاة
جرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة