השהיות השמה
חלק מהיחידה יסודות במסלול ה-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 מיד.
נסו בעצמכם
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השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה יסודות
5אופרטורים חלק 2
אופרטורים לוגייםאופרטורי צמצוםאופרטורי הזזהאופרטור שרשוראופרטור תנאיסיכום – אתגר האופרטורים3שיטת המספרים
ייצוג בינארימספרים בעלי גודל מוגדרמספרים ללא גודל מוגדרמספרים שלילייםהערכים המיוחדים X ו־Zסיכום – תבניות מספרים6מודולים
מבנה מודוליציאות קלט ופלטיציאות קלט-פלטיצירת מופע של מודולמיפוי יציאות לפי שםמיפוי יציאות לפי סדרסיכום – בניית מודולתרגלו בעצמכם: קומפיילר Verilog אונליין