Menu
Coddy logo textTech

השהיות השמה

חלק מהיחידה יסודות במסלול ה-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
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 אונליין