تأخيرات التعيين
جزء من قسم الأساسيات في رحلة 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 |
التحدي
ماذا تفعل:
أضف تأخير التعيين المفقود بحيث تحصل 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4المعاملات - الجزء الأول
المعاملات الحسابيةمعامل باقي القسمة (Modulo)معاملات المقارنةملخص - رياضيات بسيطةمعاملات Bitwise7التعيين والبوابات المنطقية
التعيين المستمرالتعيين باستخدام العملياتالبوابات الأساسية المدمجةبوابات AND و OR و NOTبوابات XOR و XNORمراجعة - دارة البوابات المنطقية13التوقيت والتأخيرات
ما هي التأخيراتتأخيرات البواباتتأخيرات التعيينتوجيه Timescaleتوليد الساعةمراجعة - التحكم في التوقيت5المعاملات - الجزء الثاني
المعاملات المنطقيةمعاملات الاختزالمعاملات الإزاحةمعامل الدمجالمعامل الشرطيمراجعة - تحدي المعاملات3أنظمة العد
التمثيل الثنائيالأعداد محددة الحجمالأعداد غير محددة الحجمالأعداد السالبةالقيم الخاصة X و Zمراجعة - تنسيقات الأعداد6الوحدات
هيكل الوحدةمنافذ الإدخال والإخراجمنافذ Inoutاستدعاء الوحداتربط المنافذ بالاسمربط المنافذ بالترتيبمراجعة - بناء وحدة