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

حلقة Forever

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

تكرر حلقة forever كتلة من البرمجية بشكل مستمر، وإلى الأبد. وهي لا تتوقف من تلقاء نفسها.

تنفذ حلقة forever بشكل متكرر دون نهاية. وهي مفيدة لتوليد نبضات الساعة (clocks) والإشارات المستمرة الأخرى في منصات الاختبار (testbenches).

الصيغة:

forever begin
  // الكود الذي يتكرر للأبد
end

مثال بسيط

forever begin
  $display("This prints forever");
end

سيتم طباعة هذا بشكل لا نهائي وسيؤدي إلى تعطل المحاكاة الخاصة بك. أضف دائماً تأخيراً أو شرطاً للتوقف.

توليد نبضات الساعة (الاستخدام الشائع)

الاستخدام الأكثر شيوعاً لـ forever هو لتوليد نبضات الساعة:

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk;   // التبديل كل 5 وحدات زمنية
  end
end

يؤدي هذا إلى إنشاء ساعة تعمل طوال فترة المحاكاة.

Forever مع Disable

يمكنك إيقاف حلقة forever باستخدام عبارة disable:

initial begin : clock_gen   // تم إضافة الاسم هنا
  clk = 0;
  forever begin
    #5 clk = ~clk;
  end
end
initial begin
  #100;
  disable clock_gen;   // الآن هذا يعمل
end

Forever مقابل الحلقات الأخرى

الحلقةهل تتوقف؟متى تُستخدم
forنعم (بعد تكرارات محددة)عدد تكرارات معروف
whileنعم (عندما يكون الشرط خاطئاً)شرط توقف غير معروف
repeatنعم (بعد تكرارات محددة)عدد تكرارات معروف
foreverلا (أبداً)إشارات مستمرة (ساعة)

قواعد هامة

القاعدةالشرح
يجب تضمين تأخير#10 أو @(posedge clk)
بدون تأخير، تتوقف المحاكاةحلقة لا نهائية دون تقدم في الوقت
استخدمها مع disable للتوقفوإلا فلن تنتهي المحاكاة أبداً
أفضل استخدام لها في منصات الاختبار (testbenches)غير قابلة للتصنيع (Not synthesizable)
challenge icon

التحدي

ماذا تفعل:

أضف حلقة forever المفقودة لإنشاء ساعة (clock) تتبدل قيمتها كل 10 وحدات زمنية.

ورقة مرجعية

تكرر حلقة forever كتلة من الكود باستمرار دون توقف. قم دائمًا بتضمين تأخير لمنع تعليق المحاكاة.

initial begin
  clk = 0;
  forever begin
    #5 clk = ~clk; // التبديل كل 5 وحدات زمنية
  end
end

أوقف حلقة forever باستخدام disable مع كتلة مسماة:

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

initial begin
  #100;
  disable clock_gen;
end

القواعد الرئيسية:

  • يجب تضمين تأخير (#10 أو @(posedge clk))، وإلا ستتوقف المحاكاة
  • استخدم disable للتوقف، وإلا فلن تنتهي المحاكاة أبدًا
  • غير قابل للتوليف (Not synthesizable) — للاستخدام في منصة الاختبار (testbench) فقط

جرّب بنفسك

module forever_challenge;
  reg clk;
  
  initial begin
    clk = 0;
    // مهمة: أضف حلقة forever لتبديل clk كل 10 وحدات زمنية
  end
endmodule
quiz iconاختبر نفسك

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

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