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 delay | after 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 |
التحدي
ما يجب فعله:
أضف تأخير 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يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس الأساسيات
4Operators Part 1
Arithmetic OperatorsModulo OperatorComparison OperatorsRecap - Simple MathBitwise Operators7Assign And Gates
Continuous AssignmentAssign With OperatorsBuilt In Gate PrimitivesAND OR NOT GatesXOR XNOR GatesRecap - Logic Gate Circuit10Decision Making
If StatementIf - ElseRecap - Simple ComparatorCase StatementCasex And CasezRecap - ALU Design13Timing And Delays
What Are DelaysGate DelaysAssignment DelaysTimescale DirectiveClock GenerationRecap - Timing Control5Operators Part 2
Logical OperatorsReduction OperatorsShift OperatorsConcatenation OperatorConditional OperatorRecap - Operator Challenge3Number System
Binary RepresentationSized NumbersUnsized NumbersNegative NumbersSpecial Values X And ZRecap - Number Formats6Modules
Module StructureInput And Output PortsInout PortsModule InstantiationPort Mapping By NamePort Mapping By OrderRecap - Build A Module9Procedural Blocks
Always BlockInitial BlockSensitivity ListBlocking AssignmentNon Blocking AssignmentRecap - Always vs Initial15Traffic Light Controller
Defining The StatesState Machine Logicتدرّب بنفسك: مترجم Verilog عبر الإنترنت