حلقة Forever
جزء من قسم الأساسيات في رحلة Verilog على Coddy — الدرس 61 من 90.
تكرر الحلقة التكرارية forever كتلة من البرمجة بشكل مستمر وللأبد. فهي لا تتوقف تلقائياً أبداً.
تُنفَّذ حلقة forever بشكل متكرر دون end. وهي مفيدة لإنشاء الإشارات الزمنية (clocks) والإشارات المستمرة الأخرى في بيئات الاختبار (testbenches).
الصياغة (Syntax):
forever begin
// كود يتكرر إلى الأبد
endمثال بسيط
forever begin
$display("This prints forever");
endسيؤدي هذا إلى الطباعة بشكل لا نهائي والتسبب في تعطل المحاكاة الخاصة بك. أضف دائمًا تأخيرًا (delay) أو شرط توقف.
توليد إشارة الساعة (استخدام شائع)
الاستخدام الأكثر شيوعًا لـ forever هو توليد إشارة الساعة (clock):
initial begin
clk = 0;
forever begin
#5 clk = ~clk; // تبديل كل 5 وحدات زمنية
end
endهذا ينشئ clk يستمر بالعمل طوال فترة المحاكاة بالكامل.
Forever مع Disable
يمكنك إيقاف حلقة forever باستخدام عبارة disable:
initial begin : clock_gen // الاسم مضاف هنا
clk = 0;
forever begin
#5 clk = ~clk;
end
endinitial begin
#100;
disable clock_gen; // الآن هذا يعمل
endForever مقابل الحلقات الأخرى
| الحلقة | هل تتوقف؟ | متى تُستخدم |
|---|---|---|
for | نعم (بعد تكرارات محددة) | عدد معروف من التكرارات |
while | نعم (عندما يكون الشرط خاطئاً) | شرط توقف غير معروف |
repeat | نعم (بعد تكرارات محددة) | عدد معروف من التكرارات |
forever | لا (أبداً) | إشارات مستمرة (الساعة) |
قواعد مهمة
| القاعدة | الشرح |
|---|---|
| يجب أن تتضمن تأخيرًا | #10 أو @(posedge clk) |
| بدون تأخير، تتوقف المحاكاة (hangs) | تكرار لا نهائي (Infinite loop) بدون تقدم في الوقت time |
تُستخدم مع disable لإيقافها | وإلا لن تنتهي المحاكاة أبدًا |
| أفضل استخدام لها يكون في منصات الاختبار (testbenches) | غير قابلة للتجميع البرمجي (Not synthesizable) |
التحدي
ما يجب فعله:
أضف حلقة forever المفقودة لتوليد ساعة (clock) تتغير قيمتها (toggles) كل 10 time units.
جرّب بنفسك
module forever_challenge;
reg clk;
initial begin
clk = 0;
// TODO: أضف حلقة forever لتبديل clk كل 10 وحدات زمنية
end
endmoduleيتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة