Menu
CoddyTech

השהיות השמה

חלק מהיחידה יסודות במסלול ה-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 (הערך שנקרא בזמן 0) מוקצה ל־a1, ולא 0

עם השהיה כללית #10 a2 = b; בבלוק נפרד, הערך של b ייקרא בזמן 10 (הערך 0).

כללים חשובים

כללהסבר
= מופיע לפני #a = #10 b; ולא a #10 = b;
הערך נקרא מידהצד הימני מחושב מיד
ההשמה מתבצעת לאחר השהיההצד השמאלי מקבל את הערך מאוחר יותר
רק עבור בלוקים פרוצדורלייםמשמש ב-initial או ב-always
challenge icon

אתגר

מה צריך לעשות:

הוסף את השהיית ההשמה החסרה כך ש־a יקבל את הערך של b לאחר 15 יחידות זמן, אך יקרא את 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 אונליין