Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

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 في النهايةلإيقاف المحاكاة
challenge icon

التحدي

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

ما يجب فعله:

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

  1. في كل سطر، عيّن القيمتين لـ x وy
  2. أضف #10 للتأخير
  3. أضف $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
quiz iconاختبر نفسك

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

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

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