Verilog

Verilog היא שפת תיאור חומרה (Hardware Description Language, בקיצור HDL), המשמשת לתכנון, אימות ויישום של מעגלים חשמליים ספרתיים ואנלוגיים ומעגלים משולבים בצורה המזכירה תכנות בשפת C. השפה שימושית מאוד בתכנון מעגלים ברמת מעברי אוגר (Register Transfer Level, בקיצור RTL).
150px

ב-2009 אוחד תקן ורילוג (IEEE 1364-2005) עם תקן SystemVerilog.

== היסטוריה ==
Verilog הוצגה לראשונה בשנת 1984. הצורך בשפה לתיאור החומרה התפתח עם המעבר לתכנון מעגלים משולבים המכילים מאות אלפי טרנזיסטורים. תכנון בסדר גודל כזה נקרא VLSI (ראשי תיבות של Very Large Scale Integration).
בשלב הזה אי אפשר היה עוד להסתפק בתכנון המסורתי הסכמטי (תב"ם), ואצל מתכנני המעגלים נוצר צורך בשפה שתאפשר תכנון מהיר של מעגלים, על ידי תיאור מעגלים מורכבים ברמה אבסטרקטית, במונחים של פונקציונליות וזרימת נתונים. שפות התכנות הקיימות בעת פיתוח השפה, כמו C ו־Pascal, לא איפשרו בנייה של מעגלים חשמליים בצורה נוחה, כיוון שהן אינן מותאמות לתיאור של חומרה.

קיימות שפות תיאור חומרה מתחרות לוורילוג, אשר הבולטת בהן היא VHDL.

== מבנה השפה ==
שפת ורילוג מותאמת לתיאור חומרה ומאפשרת כתיבה ברמות שונות של אבסטרקציה: מהרמה החשמלית (switch level) שהיא הקרובה ביותר לחומרה, דרך השערים הלוגים (gate level), רמת מעברי אוגר (RTL) ועד לרמת האלגוריתם (behavioural) שהיא רמת האבסטרקציה הגבוהה ביותר המתארת את הפונקציונליות ודומה בצורת הקידוד לשפות כמו C.

אחד ההבדלים החשובים בין שפת חומרה לשפת תוכנה הוא, שבשפת חומרה השורות ("הפקודות") מתבצעות במקביל ולא בטור.

ורילוג היא שפה קלה ללימוד ולשימוש, ונתמכת על ידי כלים רבים המשמשים בתהליך התכנון של השבב – כלי הסימולציה וכלי הסינתזה.

== דוגמאות ==
* דוגמה לקוד ומעגל ספרתי של TFF:

<syntaxhighlight lang="verilog">
always@(posedge clk)
 Q<=~Q; 
 
</syntaxhighlight>

* דוגמה לקוד המתאר מימוש של "ממספר אוטומטי" (מונה):
<syntaxhighlight lang="verilog">
module Div20x (rst, clk, ce, count,tc);
/*מונה חילוק ב-20 עם כניסת בקרה
enable CE is a clock enable 
a counter using the Verilog 95 language */

parameter size = 5;
parameter max_value = 20;
input rst;//These represent the module connections 
input clk; 
input ce;
output [size-1:0] count; 
output tc;

reg [size-1:0] count;// Signals assigned within an always 
// (or initial) block must be of type reg
wire tc; // Other signals are of type wire
/* The always statement below is a parallel 
execution statement that executes any time 
the signals rst or clk transition from low to high */
always @ (posedge rst or posedge clk) 
 if (rst) //This simulates a reset of the counter 
 count<=5'b0;
 else if (ce) 
 //This simulates the enables both being true
 if (count==max_value-1)
 count<=5'b0;
 else
 count<=count+5'b1;

//the value of tc is continuously assigned 
assign tc = (ce && (count == max_value-1));

endmodule
</syntaxhighlight>

== תחביר השפה ופקודות ==
===קבועים===
ההגדרות של קבועים ב-Verilog כוללות גם את רוחב המשתנים. התחביר כדלהלן: <רוחב הקבוע>'<אות הבסיס><הערך>

דוגמאות:
<div style="direction: ltr;">
*12'h123 - Hexadecimal 123 (using 12 bits)
*20'd44 - Decimal 44 (using 20 bits - 0 extension is automatic)
*4'b1010 - Binary 1010 (using 4 bits)
*6'o77 - Octal 77 (using 6 bits)
</div>

== ראו גם ==
*VHDL

== קישורים חיצוניים ==
* [http://www.verilog.com/VerilogBNF.html תיאור השפה] 

קטגוריה:שפות תכנות
קטגוריה:תכן לוגי
קטגוריה:מיקרואלקטרוניקה
קטגוריה:מעגלים ספרתיים
קטגוריה:מעגלים משולבים