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

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

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

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

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

الصياغة (Syntax):

variable = #delay expression;

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

Assignment Delay مقابل General Delay

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

مثال: الفرق

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

كلاهما يعطي نفس الـ result هنا. يظهر الفرق عندما تتغير b أثناء الـ delay.

مثال على الفرق الرئيسي

To show b changing during the delay, we need two separate initial blocks that run in parallel:

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

التحدي

ما يجب فعله:

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

جرّب بنفسك

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اختبر نفسك

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

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