إنشاء 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
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 عبر الإنترنت