Menu
Coddy logo textTech

Verilog Cheat Sheet: דף עזר מהיר

עודכן לאחרונה

מבנה מודול ופורטים

מודול הוא אבן הבניין הבסיסית: יש לו שם ורשימת פורטים.

תחבירמשמעות
module adder(...); ... endmoduleהגדרת מודול והגוף שלו
input clk;פורט קלט
output q;פורט פלט
output reg q;פלט שמוזן מבלוק always
input [7:0] data;אפיק קלט של 8 ביט (ווקטור)
inout sda;פורט דו-כיווני
adder u1 (.a(x), .b(y), .sum(s));יצירת מופע של מודול עם פורטים לפי שם

טיפוסי נתונים

wire מייצג חיבור; reg מחזיק ערך שקוד פרוצדורלי מציב בו.

רכיבמה הוא עושה
wire w;net שמוזן על ידי assign או פלט של מודול
reg r;מחזיק ערך שהוצב בתוך בלוק always/initial
wire [3:0] bus;ווקטור של 4 ביט (ביטים 3 עד 0)
reg [7:0] count;רגיסטר של 8 ביט
bus[2]בחירת ביט יחיד
bus[3:1]בחירת טווח של ביטים (part-select)
reg mem [0:255];זיכרון: מערך של רגיסטרים
parameter WIDTH = 8;קבוע עם שם עבור המודול

ליטרלים מספריים

הפורמט הוא <size>'<base><value>: הגודל בביטים, והבסיס כ-b/o/d/h.

תחבירמשמעות
4'b1010בינארי של 4 ביט, ערך 10
8'hFFהקסדצימלי של 8 ביט, ערך 255
8'hffאותו דבר: ספרות הקסדצימליות לא תלויות באותיות גדולות או קטנות
16'd255עשרוני של 16 ביט, ערך 255
3'o7אוקטלי של 3 ביט, ערך 7
8'b1010_1100קווים תחתונים מקבצים ספרות לקריאות
1'bxערך ביט לא ידוע (x)
1'bzערך ביט בעכבה גבוהה (z)

אופרטורים

אופרטורים ברמת הביט, לוגיים, השוואה וצמצום.

אופרטורמה הוא עושה
& | ^ ~AND, OR, XOR, NOT ברמת הביט
&& || !AND, OR, NOT לוגיים (מחזירים ביט אחד)
== != < > <= >=אופרטורי השוואה
<< >>הזזה שמאלה וימינה
+ - * / %אופרטורים אריתמטיים
&busצמצום AND (AND של כל הביטים)
|busצמצום OR (OR של כל הביטים)
^busצמצום XOR (זוגיות של כל הביטים)
{a, b}שרשור; {4{1'b1}} משכפל ל-4'b1111

השמה רציפה

assign מזין wire באופן רציף: השתמשו בו ללוגיקה צירופית.

תחבירמשמעות
assign y = a & b;הזנת y ב-AND של a ו-b
assign sum = a + b;חישוב סכום באופן רציף
assign y = sel ? a : b;אופרטור טרנרי: מרבב (multiplexer) 2 ל-1
assign {c, s} = a + b;לכידת הנשא והסכום יחד
assign y = ~en;הזנת wire מאות הפוך

בלוקים פרוצדורליים

always ו-initial מריצים פקודות; רשימת הרגישות קובעת מתי.

תחבירמשמעות
always @(*) begin ... endלוגיקה צירופית (כל שינוי בקלט)
always @(posedge clk)הרצה בכל עליית שעון (סדרתי)
always @(negedge clk)הרצה בכל ירידת שעון
always @(posedge clk or posedge rst)בלוק מתוזמן עם reset אסינכרוני
initial begin ... endהרצה פעם אחת בזמן 0 (testbenches, בסימולציה בלבד)
begin ... endקיבוץ של כמה פקודות
#10השהיה של 10 יחידות זמן (בסימולציה בלבד)

השמה חוסמת מול לא חוסמת

השתמשו ב-= ללוגיקה צירופית וב-<= ללוגיקה סדרתית מתוזמנת.

תחבירמשמעות
a = b;חוסמת: מתבצעת לפי הסדר, מיד
a <= b;לא חוסמת: קודם קוראים את כל הצדדים הימניים, ואז מציבים
always @(*) y = a & b;לוגיקה צירופית: השתמשו בהשמה חוסמת =
always @(posedge clk) q <= d;Flip-flop: השתמשו בהשמה לא חוסמת <=
ערבוב של = ו-<= באותו בלוקהימנעו מזה: מקור נפוץ לבאגים

בקרת זרימה

תנאים והסתעפויות מרובות בתוך בלוקים פרוצדורליים.

תחבירמשמעות
if (cond) ... else ...משפט תנאי
if (a) x = 1; else x = 0;if/else בשורה אחת
case (sel) ... endcaseהסתעפות מרובה לפי ערך
2'b00: y = a;פריט case
default: y = 0;פריט case לברירת מחדל
for (i = 0; i < 8; i = i + 1)לולאה (לרוב בתוך generate או בסימולציה)
repeat (4) @(posedge clk);חזרה על פקודה N פעמים

תבניות נפוצות

אבני בניין שכותבים שוב ושוב, וגם משימות ל-testbench.

תבניתתחביר
D flip-flopalways @(posedge clk) q <= d;
רגיסטר עם resetalways @(posedge clk) if (rst) q <= 0; else q <= d;
מונהalways @(posedge clk) count <= count + 1;
רגיסטר המצב של FSMalways @(posedge clk) state <= next_state;
לוגיקת המצב הבא של FSMalways @(*) case (state) ... endcase
הדפסת ערך$display("q = %b", q);
הדפסה בכל שינוי$monitor("t=%0t q=%b", $time, q);
סיום הסימולציה$finish;

כל רכיבי התחביר של Verilog שאתם צריכים, בעמוד אחד. ה-Verilog cheat sheet הזה הוא דף עזר מהיר לשפת תיאור החומרה: הגדרת מודולים ופורטים, בחירת טיפוסי נתונים, כתיבת לוגיקה צירופית וסדרתית, ותבניות ה-always שמתארות מעגלים אמיתיים.

התחביר כאן הוא Verilog סטנדרטי (IEEE 1364) ועובד בסימולטורים נפוצים כמו Icarus Verilog ו-Verilator. העתיקו את מה שאתם צריכים, או נסו בזמן אמת בעורך האונליין של Verilog: כתבו מודול, הריצו עליו סימולציה וראו את הפלט בדפדפן.

שאלות נפוצות על ה-Verilog cheat sheet

האם ה-Verilog cheat sheet הזה חינמי?
כן. ה-Verilog cheat sheet הזה חינמי לגמרי, בלי צורך בהרשמה. שמרו אותו במועדפים וחזרו אליו בכל פעם שתצטרכו לבדוק תחביר, אופרטור או תבנית של בלוק always.
מה ההבדל בין wire ל-reg?
wire מייצג חיבור פיזי וחייב להיות מוזן באופן רציף, על ידי פקודת assign או פלט של מודול, ולכן משתמשים בו ל-nets צירופיים. reg שומר את הערך שלו עד שקוד פרוצדורלי משנה אותו, ולכן משתמשים בו לכל מה שמוצב בתוך בלוק always או initial. למרות השם, reg לא תמיד הופך לרגיסטר בחומרה; המשמעות היא רק שהערך נקבע באופן פרוצדורלי.
מה ההבדל בין השמה חוסמת להשמה לא חוסמת?
השמה חוסמת (=) מתבצעת מיד ולפי הסדר, כמו פקודה רגילה בתכנות, ולכן משתמשים בה ללוגיקה צירופית בבלוקי always @(*). השמה לא חוסמת (<=) מחשבת קודם את כל הצדדים הימניים ורק אז מעדכנת את כל הצדדים השמאליים יחד, וכך מתארת נכון flip-flops, ולכן משתמשים בה בבלוקים מתוזמנים מסוג always @(posedge clk). ערבוב של השתיים באותו בלוק הוא מקור קלאסי לבאגים בסימולציה.
אפשר לתרגל Verilog אונליין?
כן. פתחו את עורך האונליין של Verilog כדי לכתוב מודול, להריץ עליו סימולציה ולראות את הפלט בדפדפן, בלי להתקין כלום. כשתרצו מסגרת מסודרת, קורס ה-Verilog האינטראקטיבי והחינמי של Coddy ייקח אתכם צעד אחר צעד ממודולים וטיפוסי נתונים ועד בלוקי always ומכונות מצבים סופיות.
האם דף העזר הזה מתאים למתחילים?
כן. הוא מסודר מהיסודות (מודולים, פורטים וטיפוסי נתונים) ועד לוגיקה סדרתית ותבניות FSM, כך שאפשר להתחיל מהחלקים העליונים ולהתקדם עד לתיאור מעגלים אמיתיים.
איור של שפות התכנות ב-Coddy

ללמוד Verilog עם Coddy

להתחיל