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

Assignment Delays

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

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

ينتظر delay الخاص بـ assignment مدةً محددة من time، ثم ينفّذ assignment. يوضع delay after الرمز # وقبل assignment.

البنية النحوية:

variable = #delay expression;

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

Assignment التأخير مقابل General التأخير

 General التأخيرAssignment التأخير
البنية#10 a = b;a = #10 b;
متى تتم قراءة القيمة؟عند time التعيين (after delay)فورًا (قبل delay)
ما القيمة التي يتم تعيينها؟قيمة b في تلك اللحظةقيمة b عند time 0 (أو وقت القراءة)
متى يتم تعيين القيمة؟after delayafter 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

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

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

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
  • عند time 0: يقرأ a1 القيمة b = 1
  • عند time 5: تتغير b إلى 0 (بينما لا يزال a1 في حالة انتظار)
  • عند time 10: يتم إسناد 1 إلى a1 (القيمة التي تمت قراءتها عند time 0)، وليس 0

مع تأخير General‏ #10 a2 = b; في Separate block، ستتم قراءة b عند time 10 (القيمة 0).

قواعد مهمة

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

التحدي

ما يجب فعله:

أضف تأخير assignment المفقود بحيث a gets قيمة b after 15 time units، لكنه reads 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اختبر نفسك

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

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

تدرّب بنفسك: مترجم Verilog عبر الإنترنت