ما هو Testbench
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 73 من 90.
إن testbench عبارة عن وحدة Verilog خاصة تُستخدم لاختبار وحدة أخرى. وهي توفّر مدخلات لتصميمك وتتحقق مما إذا كانت المخرجات صحيحة.
لماذا نحتاج إلى testbench؟
عندما تبني وحدة، تحتاج إلى التأكد من أنها تعمل بشكل صحيح. يتيح لك testbench ما يلي:
- تطبيق قيم input مختلفة على وحدتك
- مراقبة outputs
- تحقّق مما إذا كانت المخرجات تطابق ما تتوقعه
- نفّذ ذلك تلقائيًا دون إجراء اختبار يدوي
Testbench مقابل module التصميم
| module التصميم | Testbench | |
|---|---|---|
| الغرض | ينفّذ العتاد | يختبر module التصميم |
| هل يحتوي على ports؟ | نعم (inputs و outputs) | لا (مستقل بذاته) |
| قابل للتوليف؟ | نعم | لا (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 التي يحدث لها change (inputs إلى DUT) - يُستخدم
wireمع signals القادمة من DUT (outputs)
- تُسمّى الوحدة التي يتم اختبارها DUT (التصميم قيد الاختبار)
- ينهي
$finishالمحاكاة
سنتناول إنشاء المحفزات وعرض النتائج وميزات testbench الأخرى في الدروس التالية.
التحدي
أُعطيت وحدة بوابة AND. مهمتك هي إضافة الأجزاء المفقودة إلى testbench الخاص بها.
ما يجب فعله:
أضف الأجزاء التالية إلى testbench:
- صرّح عن
regللمدخلينaوb - صرّح عن
wireللمخرجc - أنشئ مثيلًا من
and_gateبالاسمdutوصِل المنافذ
التنسيق المطلوب للإخراج:
جرّب بنفسك
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العوامل الجزء 1
العوامل الحسابيةعامل باقي القسمةعوامل المقارنةمراجعة - الرياضيات البسيطةالعوامل على مستوى البتات7التعيين والبوابات
التعيين المستمرالتعيين باستخدام العواملالعناصر الأساسية المدمجة للبواباتبوابات AND وOR وNOTبوابات XOR وXNORمراجعة - دائرة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الربطالمعامل الشرطيمراجعة - تحدي المعاملات11الحلقات التكرارية
حلقة Forحلقة Whileحلقة التكرارحلقة لا نهائيةتعليمة التعطيلمراجعة - أنماط الحلقات التكرارية14أساسيات Testbench
ما هو Testbenchإنشاء Stimulusالعرض والمراقبةDumpfile وDumpvarsاستخدام مهام النظاممراجعة - Testbench كامل3نظام الأعداد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ الإدخال والإخراج ثنائية الاتجاهإنشاء مثيل للوحدةربط المنافذ حسب الاسمربط المنافذ حسب الترتيبمراجعة - بناء وحدة9الكتل الإجرائية
كتلة Alwaysكتلة Initialقائمة الحساسيةإسناد حاجزإسناد غير حاجزمراجعة - Always مقابل Initial15متحكّم إشارات المرور
تعريف الحالاتمنطق آلة الحالاتتدرّب بنفسك: مترجم Verilog عبر الإنترنت