إنشاء المحفزات
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 74 من 90.
يشير Stimulus (المحفز) إلى قيم المدخلات التي تطبقها على تصميمك لاختبار ما إذا كان يعمل بشكل صحيح. من خلال تغيير المدخلات ومراقبة المخرجات، يمكنك التحقق من أن تصميمك يتصرف كما هو متوقع.
فكر في الأمر كأنه اختبار لآلة: حيث تضغط على أزرار مختلفة (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 وقتاً لإنتاج مخرج.
طرق إنشاء المحفزات (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: التعيينات المتسلسلة
أبسط طريقة لإنشاء التحفيز (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
مفيدة لتكرار نفس المحفز مرات عديدة.
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قواعد هامة
| القاعدة | الشرح |
|---|---|
| استخدم فترات تأخير بين تعيينات المحفزات | #10 يتيح الوقت لـ DUT للاستجابة |
استخدم reg لإشارات المحفزات | لأنها تتغير بمرور الوقت |
أضف $finish في النهاية | لإيقاف المحاكاة |
التحدي
لقد تم تزويدك بوحدة بوابة OR. مهمتك هي إضافة التحفيز (stimulus) المفقود وعبارات $display لطباعة النتائج.
ما يجب القيام به:
أضف التحفيز لاختبار جميع تركيبات المدخلات الأربعة (00، 01، 10، 11):
- في كل سطر، قم بتعيين قيم
xوy - أضف
#10للتأخير - أضف
$displayلطباعة النتيجة
يجب أن تبدو عبارة <strong>$display</strong> كما يلي:
$display("%d %d | %d", x, y, z);ورقة مرجعية
Stimulus (المحفز) هو قيم المدخلات المطبقة على الـ DUT (الجهاز قيد الاختبار) في بيئة الاختبار (testbench) للتحقق من السلوك الصحيح.
طرق إنشاء المحفز (Stimulus)
التعيينات المتسلسلة (Sequential assignments) – النهج الأبسط:
initial begin
a = 0; b = 0; #10;
a = 0; b = 1; #10;
$finish;
endحلقة For – لاختبار جميع تركيبات المدخلات:
integer i;
initial begin
for (i = 0; i < 4; i = i + 1) begin
{a, b} = i; #10;
end
$finish;
endحلقة Repeat – تكرار المحفز N من المرات:
repeat (10) begin
#10 a = ~a;
endحلقة Forever – للإشارات المستمرة مثل نبضات الساعة (clocks):
initial begin
clk = 0;
forever #5 clk = ~clk;
endالقواعد الأساسية
- استخدم
regلإشارات المحفز (لأنها تتغير بمرور الوقت) - أضف تأخيرات (مثل
#10) بين التعيينات للسماح للـ DUT بالاستجابة - أنهِ المحاكاة باستخدام
$finish
جرّب بنفسك
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استدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة