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

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

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

التحدي

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

ما يجب القيام به:

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

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

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

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