השהיות השמה
חלק מהיחידה יסודות במסלול ה-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 |
אתגר
מה צריך לעשות:
הוסף את השהיית ההשמה החסרה כך ש־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 אונליין