إنشاء المحفزات
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 74 من 90.
يشير مصطلح Stimulus (المحفزات) إلى قيم المدخلات التي تطبقها على تصميمك لاختبار ما إذا كان يعمل بشكل صحيح. من خلال تغيير الـ inputs وملاحظة الـ outputs، يمكنك التحقق من أن تصميمك يتصرف كما هو متوقع.
فكّر في الأمر كأنه اختبار لآلة: تضغط على أزرار مختلفة (stimulus) وتراقب ما يحدث (المخرجات). يُعد إنشاء 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يتم تطبيق كل محرّك (stimulus)، ثم ننتظر 10 وحدات زمنية (#10) قبل المحرّك التالي. يعطي هذا للـ DUT وقتاً لإنتاج المخرج.
طرق إنشاء المحفزات (Stimulus)
| الطريقة | الأفضل لـ | مثال |
|---|---|---|
| التعيينات التتابعيات (Sequential assignments) | الاختبارات البسيطة | a = 0; b = 0; #10; |
| حلقة For | اختبار جميع الاحتمالات | for (i = 0; i < 4; i++) |
| حلقة Repeat | تكرار الأنماط | repeat (10) #5 clk = ~clk; |
| حلقة Forever | الإشارات المستمرة | forever #5 clk = ~clk; |
الطريقة 1: التعيينات المتتالية (Sequential Assignments)
أبسط طريقة لإنشاء التحفيز (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 Loop
مفيدة عندما تريد اختبار جميع تراكيب المدخلات (input) الممكنة.
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 Loop
مفيدة لتكرار نفس المحفز (stimulus) عدة مرات.
initial begin
a = 0; b = 1;
repeat (10) begin
#10 a = ~a;
end
$finish;
endالطريقة 4: حلقة Forever
مفيدة للإشارات المستمرة مثل إشارات الساعة (clocks).
initial begin
clk = 0;
forever #5 clk = ~clk;
endقواعد مهمة
| القاعدة | الشرح |
|---|---|
| استخدم فترات التأخير (delays) بين تعيينات الإشارة (stimulus assignments) | تتيح #10 وقتًا لـ DUT للاستجابة |
استخدم reg لإشارات الـ stimulus | لأنها تتغير بمرور الوقت |
أضف $finish في النهاية | لإيقاف المحاكاة |
التحدي
أنت مزود بوحدة وحدة بوابة OR (OR gate). مهمتك هي إضافة الإشارات التنبيهية (stimulus) المفقودة وجمل $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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات14أساسيات الـ Testbench
ما هو الـ Testbenchإنشاء المحفزاتالمهام Display و Monitorالمهام Dumpfile و Dumpvarsاستخدام مهام النظامملخص - Testbench كامل3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة