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

تأخيرات التعيين

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

في الدروس السابقة، قمنا بتغطية التأخيرات العامة (#10 a = b;) و تأخيرات البوابات (and #5 (out, a, b);). الآن سنغطي تأخيرات التعيين، وهي التأخيرات التي تحدث داخل كتلة إجرائية (مثل initial أو always) كجزء من عبارة التعيين.

ينتظر تأخير التعيين لفترة زمنية محددة، ثم يقوم بعملية التعيين. يتم وضع التأخير بعد الرمز # و قبل عملية التعيين.

الصيغة:

variable = #delay expression;

على عكس التأخير العام #10 a = b; (تأخير ثم إسناد)، فإن تأخير الإسناد a = #10 b; يأخذ قيمة b في تلك اللحظة، وينتظر 10 وحدات زمنية، ثم يسندها إلى a.

تأخير التعيين مقابل التأخير العام

 التأخير العامتأخير التعيين
بناء الجملة#10 a = b;a = #10 b;
متى يتم قراءة القيمة؟في وقت التعيين (بعد التأخير)فوراً (قبل التأخير)
ما هي القيمة التي يتم تعيينها؟قيمة b في تلك اللحظةقيمة b في الوقت 0 (أو وقت القراءة)
متى يتم تعيين القيمة؟بعد التأخيربعد التأخير

مثال: الفرق

initial begin
  b = 1;
  #5 b = 0;
  
  // تأخير عام
  #10 a1 = b;     // ينتظر 10، ثم يقرأ b (b=0) ← a1=0
  
  // تأخير التعيين
  a2 = #10 b;     // يقرأ b الآن (b=0)، ينتظر 10، ثم يعين ← a2=0
end

كلاهما يعطي نفس النتيجة هنا. يظهر الفرق عندما تتغير b أثناء التأخير.

مثال على الاختلاف الرئيسي

لإظهار تغير b أثناء التأخير، نحتاج إلى كتلتين initial منفصلتين تعملان بالتوازي:

initial begin
  b = 1;
  a1 = #10 b;     // يقرأ b=1 في الوقت 0، ويسند a1=1 في الوقت 10
end

initial begin
  #5 b = 0;       // يغير b إلى 0 في الوقت 5 (أثناء التأخير)
end
  • في الوقت 0: a1 يقرأ b = 1
  • في الوقت 5: b يتغير إلى 0 (بينما لا يزال a1 في حالة انتظار)
  • في الوقت 10: يتم تعيين القيمة 1 لـ a1 (وهي القيمة التي تمت قراءتها في الوقت 0)، وليس 0

باستخدام تأخير عام #10 a2 = b; في كتلة منفصلة، سيتم قراءة b في الوقت 10 (القيمة 0).

قواعد هامة

القاعدةالشرح
= تأتي قبل #a = #10 b; وليس a #10 = b;
تتم قراءة القيمة فوراًيتم تقييم الجانب الأيمن على الفور
يحدث التعيين بعد التأخيريحصل الجانب الأيسر على القيمة لاحقاً
للكتل الإجرائية فقطتُستخدم في initial أو always
challenge icon

التحدي

ماذا تفعل:

أضف تأخير التعيين المفقود بحيث تحصل a على قيمة b بعد 15 وحدة زمنية، ولكن تقرأ b فوراً.

ورقة مرجعية

تأخير التعيين (Assignment delay) يقرأ الجانب الأيمن فوراً، وينتظر التأخير، ثم يقوم بالتعيين:

variable = #delay expression;

الفرق الرئيسي مقابل التأخير العام:

التأخير العام #10 a = b;تأخير التعيين a = #10 b;
قيمة b المقروءةبعد التأخيرفوراً
القيمة المعينةبعد التأخيربعد التأخير

عندما تتغير b خلال فترة التأخير، تختلف النتائج:

initial begin
  b = 1;
  a1 = #10 b;   // Reads b=1 now, assigns a1=1 at time 10
  #5 b = 0;     // b changes at time 5 — a1 still gets 1
  // With #10 a2 = b; → reads b=0 at time 10, so a2=0
end

صالح فقط داخل الكتل الإجرائية (initial أو always).

جرّب بنفسك

module assignment_challenge;
  reg a, b;
  
  // كتلة منفصلة لتغيير b أثناء التأخير
  initial begin
    b = 1;
    // TODO: أضف تأخير التعيين
    // يجب أن تأخذ a قيمة b بعد 15 وحدة زمنية
    // اقرأ b الآن، وقم بالتعيين بعد التأخير

  end
  
  initial begin
    #5 b = 0;      // يغير b أثناء التأخير
    #20 $display("Time %0t: a = %b", $time, a);
    $finish;
  end
endmodule
quiz iconاختبر نفسك

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

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