Menu
CoddyTech

בלוק Initial

חלק מהיחידה יסודות במסלול ה-Verilog של Coddy. שיעור 47 מתוך 90.

ל-Verilog יש שני בלוקים פרוצדורליים: initial (רץ פעם אחת) ו-always (רץ ברציפות). עכשיו נעסוק בבלוק initial.

מהו בלוק initial?

בלוק ה-initial רץ רק פעם אחת בתחילת הסימולציה (בזמן 0). כשהוא מסתיים, הוא לא רץ שוב.

הוא משמש בעיקר בספסלי בדיקה עבור:

  • הגדרת ערכים התחלתיים
  • יצירת אותות בדיקה
  • הצגת הודעות
  • התחלת הסימולציה

תחביר

initial begin
  // הפקודות מתבצעות פעם אחת, לפי הסדר
end

דוגמה בסיסית

initial begin
  $display("Simulation started");
  $display("This runs once");
  $finish;
end

פלט:

Simulation started
This runs once

שימוש בבלוק initial לאותות בדיקה

initial begin
  a = 0;
  #10 a = 1;
  #10 a = 0;
  #10 $finish;
end

הדבר משנה את a בזמנים: 0, 10 ו־20.

התחלתי לעומת תמיד

 initialalways
פועלפעם אחתברציפות (לנצח)
שימוש עבורספסלי בדיקה, אתחולחומרה (כפכפים, מונים)
ניתן לסינתזה?רק עבור ערכי התחלה (FPGA)כן (עם רשימת רגישות)

הערות חשובות

  • בלוקים של initial מיועדים בעיקר לסימולציה. כלי סינתזה אינם יכולים להפוך השהיות כגון #10 או משימות כגון $display לחומרה
  • השתמשו ב-initial בעיקר בספסלי בדיקה. במודול תכנון, רק כלי סינתזה של FPGA משתמשים בו, ורק כדי לקבוע את ערך ההתחלה של אוגר או זיכרון
  • אם ספסל הבדיקה מכיל שעון שפועל ללא הפסקה (למשל, always #5 clk = ~clk;), הסימולציה תרוץ לנצח, אלא אם תפעילו את $finish; כשיש רק בלוק initial, הסימולטור נעצר מעצמו כשלא נותרות עוד התרחשויות, אך עדיין מומלץ להשתמש ב-$finish
challenge icon

אתגר

הוסף את בלוק initial החסר, שמגדיר את a ל־0, ואז לאחר 10 יחידות זמן מגדיר את a ל־1.

מה לעשות:

  1. הוסף initial begin ו־end
  2. הגדר את a = 0
  3. המתן #10
  4. הגדר את a = 1
  5. הוסף את $finish כדי לסיים את הסימולציה

נסו בעצמכם

module test;
  reg a;
  
  // TODO: הוסף כאן בלוק initial
  // קבע a = 0
  // המתן #10
  // קבע a = 1
  // הוסף $finish; כדי לסיים את הסימולציה
  
endmodule
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה יסודות

תרגלו בעצמכם: קומפיילר Verilog אונליין