Creating Stimulus
جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 74 من 90.
يشير Stimulus إلى قيم input التي تطبقها على تصميمك لاختبار ما إذا كان يعمل بشكل صحيح. ومن خلال تغيير inputs ومراقبة المخرجات، يمكنك التحقق من أن تصميمك يتصرف كما هو متوقع.
فكّر في الأمر كما لو كنت تختبر آلة: تضغط على أزرار مختلفة (stimulus) وتراقب ما يحدث (outputs). يُعد إنشاء stimulus جيد جزءًا أساسيًا من كتابة testbench.
على سبيل المثال، انظر إلى stimulus في testbench التالي:
module testbench;
reg a, b;
wire c;
and_gate dut (
.a(a),
.b(b),
.c(c)
);
initial begin
// يبدأ التحفيز هنا
// حالة الاختبار 1: كلا المدخلين هما 0
a = 0; b = 0; #10;
// حالة الاختبار 2: a=0, b=1
a = 0; b = 1; #10;
// حالة الاختبار 3: a=1, b=0
a = 1; b = 0; #10;
// حالة الاختبار 4: كلا المدخلين هما 1
a = 1; b = 1; #10;
// ينتهي التحفيز هنا
$finish;
end
endmoduleيتم تطبيق كل منبّه، ثم ننتظر 10 وحدات زمنية (#10) قبل المنبّه التالي. وهذا يمنح DUT وقتًا لإنتاج مخرَج.
طرق إنشاء المحفزات
| الطريقة | الأنسب لـ | مثال |
|---|---|---|
| إسنادات متسلسلة | اختبارات بسيطة | a = 0; b = 0; #10; |
| حلقة For | اختبار جميع التركيبات | for (i = 0; i < 4; i++) |
| حلقة Repeat | تكرار الأنماط | repeat (10) #5 clk = ~clk; |
| حلقة Forever | الإشارات المستمرة | forever #5 clk = ~clk; |
الطريقة 1: التعيينات التسلسلية
أبسط طريقة لإنشاء stimulus. تُسند القيم واحدة تلو الأخرى مع فواصل زمنية.
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
a = 1; b = 0; #10;
a = 1; b = 1; #10;
$finish;
endالطريقة 2: حلقة For
مفيدة عندما تريد اختبار جميع تركيبات الإدخال الممكنة.
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i;
#10;
end
$finish;
endيختبر هذا: 00، 01، 10، 11.
الطريقة 3: حلقة repeat
مفيدة لتكرار نفس stimulus مرات عديدة.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endالطريقة 4: حلقة forever
مفيدة للإشارات المستمرة مثل إشارات الساعة.
initial begin
clk = 0;
forever #5 clk = ~clk;
endقواعد مهمة
| القاعدة | الشرح |
|---|---|
| استخدم تأخيرات بين تعيينات stimulus | يتيح #10 وقتًا لـ DUT للاستجابة |
استخدم reg لإشارات stimulus | لأنها تتغير بمرور الوقت |
أضف $finish في النهاية | لإيقاف المحاكاة |
التحدي
أُعطيت وحدة نمطية لبوابة OR. مهمتك هي إضافة التحفيزات المفقودة وعبارات $display لطباعة النتائج.
ما يجب فعله:
أضف تحفيزات لاختبار جميع تركيبات الإدخال الأربع (00، 01، 10، 11):
- في كل سطر، عيّن القيمتين لـ
xوy - أضف
#10للتأخير - أضف
$displayلطباعة النتيجة
يجب أن تبدو عبارة <strong>$display</strong> كما يلي:
$display("%d %d | %d", x, y, z);جرّب بنفسك
module or_gate (
input x,
input y,
output z
);
assign z = x | y;
endmodule
module testbench;
reg x, y;
wire z;
or_gate dut (
.x(x),
.y(y),
.z(z)
);
initial begin
$display("x y | z");
$display("---------");
// TODO: أضف التحفيز والعرض لـ 0 0
// TODO: أضف التحفيز والعرض لـ 0 1
// TODO: أضف التحفيز والعرض لـ 1 0
// TODO: أضف التحفيز والعرض لـ 1 1
$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 عبر الإنترنت