Menu
CoddyTech

إنشاء Stimulus

جزء من قسم الأساسيات في رحلة Verilog على Coddy. الدرس 74 من 90.

يشير Stimulus إلى قيم الإدخال التي تطبّقها على تصميمك لاختبار ما إذا كان يعمل على النحو الصحيح. ومن خلال تغيير المدخلات وملاحظة المخرجات، يمكنك التحقق من أن تصميمك يتصرف كما هو متوقع.

فكّر في الأمر كما لو كنت تختبر آلة: تضغط على أزرار مختلفة (STIMULUS) وتراقب ما يحدث (المخرجات). يُعد إنشاء مُدخلات اختبار جيدة جزءًا أساسيًا من كتابة منصة اختبار.

على سبيل المثال، ألقِ نظرة على التحفيز في منصة الاختبار التالية:

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

الطريقةالأفضل لـمثال
إسنادات متسلسلةالاختبارات البسيطةa = 0; b = 0; #10;
حلقة forاختبار جميع التركيباتfor (i = 0; i < 4; i++)
حلقة repeatتكرار الأنماطrepeat (10) #5 clk = ~clk;
حلقة foreverالإشارات المستمرةforever #5 clk = ~clk;

الطريقة 1: الإسنادات المتتابعة

أبسط طريقة لإنشاء مُحفِّز. تُسنِد القيم واحدة تلو الأخرى مع فترات تأخير.

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: حلقة التكرار

مفيدة لتكرار المُحفِّز نفسه مرات عديدة.

initial begin
  a = 0; b = 1;
  repeat (10) begin
    #10 a = ~a;
  end
  $finish;
end

الطريقة 4: حلقة لا نهائية

مفيدة للإشارات المستمرة مثل إشارات الساعة.

initial begin
  clk = 0;
  forever #5 clk = ~clk;
end

قواعد مهمة

القاعدةالتفسير
استخدم فواصل زمنية بين تعيينات إشارة التحفيزيتيح #10 وقتًا لـ DUT للاستجابة
استخدم reg لإشارات التحفيزلأنها تتغير بمرور الوقت
أضف $finish في النهايةلإيقاف المحاكاة
challenge icon

التحدي

لديك وحدة بوابة OR. مهمتك هي إضافة إشارات الاختبار وعبارات $display الناقصة لطباعة النتائج.

ما المطلوب:

أضف إشارات اختبار لاختبار جميع تراكيب المدخلات الأربعة (00، 01، 10، 11):

  1. في كل سطر، عيّن القيمتين x وy
  2. أضف #10 للتأخير
  3. أضف $display لطباعة النتيجة

يجب أن تكون عبارة $display بهذا الشكل:

$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
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس الأساسيات

تدرّب بنفسك: مترجم Verilog عبر الإنترنت