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

إنشاء المحفزات

جزء من قسم الأساسيات في رحلة 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 في النهايةلإيقاف المحاكاة
challenge icon

التحدي

أنت مزود بوحدة وحدة بوابة OR (OR gate). مهمتك هي إضافة الإشارات التنبيهية (stimulus) المفقودة وجمل $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اختبر نفسك

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

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