What Is A 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge14Testbench Basics
What Is A TestbenchCreating StimulusDisplay And MonitorDumpfile And DumpvarsUsing System TasksRecap - Full Testbench3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت