حلقة 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
endinitial begin
#100;
disable clock_gen; // الآن هذا يعمل
endForever مقابل الحلقات الأخرى
| الحلقة | هل تتوقف؟ | متى تُستخدم |
|---|---|---|
for | نعم (بعد تكرارات محددة) | عدد تكرارات معروف |
while | نعم (عندما يكون الشرط خاطئاً) | شرط توقف غير معروف |
repeat | نعم (بعد تكرارات محددة) | عدد تكرارات معروف |
forever | لا (أبداً) | إشارات مستمرة (ساعة) |
قواعد هامة
| القاعدة | الشرح |
|---|---|
| يجب تضمين تأخير | #10 أو @(posedge clk) |
| بدون تأخير، تتوقف المحاكاة | حلقة لا نهائية دون تقدم في الوقت |
استخدمها مع disable للتوقف | وإلا فلن تنتهي المحاكاة أبداً |
| أفضل استخدام لها في منصات الاختبار (testbenches) | غير قابلة للتصنيع (Not synthesizable) |
التحدي
ماذا تفعل:
أضف حلقة 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة