תיעוד Verilog
מדריך עיון תמציתי ל-Verilog, מבוסס דוגמאות. קוראים את המושג, רואים את הקוד, ואז מתרגלים אותו במסלול של Coddy.
להתחיל מסלול Verilog מודרךGetting Started
- מה זה Verilog?היכרות פשוטה וברורה עם Verilog: מה זה, למה משתמשים בה, במה היא שונה משפת תכנות רגילה, ולמה מתכנני מערכות ספרתיות עדיין בוחרים בה אחרי 40 שנה.
- חומרה מול תוכנהלמה Verilog מבלבלת אחרי שפות תוכנה: מקביליות כברירת מחדל, זמן כמושג מרכזי, והוראות שלא רצות לפי הסדר.
- התקנת Verilogהתקינו את Icarus Verilog ו-GTKWave כדי לקמפל ולהריץ סימולציות Verilog מקומית. או דלגו על ההתקנה והשתמשו בעורך שבדפדפן: שתי הדרכים מתאימות למסמכים האלה.
- המודול הראשוןכתבו את מודול ה-Verilog המלא הראשון שלכם מאפס: הצהרה, פורטים, קטע של לוגיקה צירופית ו-testbench שמזין אותו. אפשר להריץ בדפדפן.
- הערותאיך כותבים הערות של שורה אחת והערות מרובות שורות ב-Verilog, ואילו תבניות תיעוד מתכנני מערכות ספרתיות משתמשים בהן כדי לשמור על מודולים קריאים ככל שהם גדלים.
Data Types & Numbers
- wire ו-regשני טיפוסי הנתונים העיקריים ב-Verilog, `wire` לחיבורים רציפים ו-`reg` לאחסון פרוצדורלי, והכלל לבחירה ביניהם בכל פעם.
- וקטורים ומערכיםאיך מצהירים על אותות מרובי ביטים עם `[7:0]`, חותכים אותם, משלבים ביניהם, ומה ההבדל בין וקטור packed לבין מערך זיכרון.
- פרמטריםאיך משתמשים ב-`parameter` וב-`localparam` כדי להגדיר קבועים של זמן קומפילציה, לתת פרמטרים לרוחבים ולעומקים, ולדרוס ערכים כשיוצרים מופע של מודול.
- ליטרלים מספרייםאיך כותבים קבועים ב-Verilog: עם גודל ובלי גודל, הבסיסים `'b` `'h` `'d` `'o`, מספרים עם סימן, קווים תחתונים לקריאות, והמלכודות שתופסות מתחילים.
- ערכי X ו-Zלאותות ב-Verilog יש ארבעה ערכים אפשריים, לא שניים. הנה מה ש-`x` (לא ידוע) ו-`z` (עכבה גבוהה) באמת אומרים בסימולציה, ואיך מדבגים אותם.
Operators
- אופרטוריםאופרטורי הליבה של Verilog: אריתמטיים, השוואה, לוגיים, והאופרטור המותנה `?:`, עם הכללים והמלכודות סביב רוחבים מעורבים וסימן.
- Bitwise ו-Reductionהאופרטורים ברמת הביט ב-Verilog: AND/OR/XOR ביט אחר ביט, צורות ההיפוך, ואופרטורי ה-reduction שמכווצים וקטור שלם לביט יחיד.
- שרשור ושכפולאיך מדביקים אותות יחד עם `{}` ומעתיקים תבנית N פעמים עם `{N{...}}`: אופרטורים חיוניים ב-Verilog לבניית אפיקים רחבים יותר מחלקים.
Modules & Structure
- פורטים של מודולאיך מצהירים על פורטים של מודול, input, output ו-inout, רשימת הפורטים בסגנון ANSI, ומתי פלט צריך להיות `wire` ומתי `reg`.
- יצירת מופעים של מודוליםאיך יוצרים מופע של מודול אחד בתוך מודול אחר, ההבדל בין חיבורי פורטים לפי שם ולפי מיקום, ותבניות המופעים המרובים שתשתמשו בהן כדי לבנות תכנונים אמיתיים.
- השמה רציפהאיך `assign` עובד: הקשר שתמיד מתקיים שהוא מתאר, מה הוא יכול ומה הוא לא יכול להזין, והתבניות שבהן הוא מצטיין לעומת קוד פרוצדורלי.
Procedural Blocks
- בלוק alwaysאיך בלוקים של `always` עובדים, מה ההבדל בין `always @(*)` צירופי לבין `always @(posedge clk)` שמסונכרן לשעון, והכללים שקובעים איזו חומרה כל אחד מייצר.
- בלוק initialבמה בלוקים של `initial` שונים מ-`always`, למה הם קיימים רק בסימולציה, והתבניות הנפוצות שבהן משתמשים בהם: גירוי, הגדרת waveform, כותרות ללוג.
- Blocking מול Non-blockingהנושא שמבלבל הכי הרבה מתחילים ב-Verilog. מה `=` ו-`<=` באמת אומרים בתוך בלוק `always`, והכלל שמונע את רוב ה-race conditions.
Control Flow
- If-Elseאיך `if`/`else` עובד בתוך בלוק `always`, מלכודת ה-latch שתופסת מתחילים, וחומרת ה-priority encoder ששרשרת של `else if` מייצרת.
- משפט caseאיך `case` עובד לפענוח רב כיווני נקי, ה-`default` שאסור לדלג עליו, וההבדלים בין `case`, `casex` ו-`casez`.
- לולאות forבמה לולאות `for` ב-Verilog שונות מבנות הדודות שלהן בתוכנה: הסינתיסייזר פורש אותן לחומרה מקבילית, ולא מריץ אותן באיטרציות בזמן ריצה.
Sequential Logic & FSMs
Testbenches & Simulation
- יסודות testbenchאיך כותבים testbench ב-Verilog: יצירת שעון, רצף reset, גירוי, תצפית, והשלד הסטנדרטי שמניע כל סימולציה שתריצו.
- Display ו-Monitorאיך `$display`, `$write` ו-`$monitor` עובדים: מצייני הפורמט שתשתמשו בהם, ההבדל ביניהם, ומתי כל אחד הוא הכלי הנכון.
- Dumpfile ו-VCDאיך מוסיפים פלט waveform של VCD ל-testbench: `$dumpfile`, `$dumpvars`, בחירת תחום, ואיך צופים בקובץ שנוצר ב-GTKWave או בעורך שבדפדפן.
- Timescale ו-delayאיך ההנחיה `` `timescale `` קובעת את היחידה של `#delay`, מה הכללים לשילוב יחידות שונות בין קבצים, ואיך השהיות מתנהגות לצד לוגיקה מתוזמנת בשעון.