ורילוג
מתוך ויקיפדיה, האנציקלופדיה החופשית
ורילוג או Verilog הינה שפת תכנות, המאפשרת תכנון של מעגלים חשמליים דיגיטליים, בצורה המזכירה קידוד בשפת C.
הצורך בשפה לתיאור החומרה התפתח עם המעבר לתכנון שבבים (צ'יפים) המכילים מאות אלפי טרנזיסטורים. תכנון בסדר גודל כזה נקרא: VLSI (ראשי תיבות: Very Large Scale Integration). בשלב הזה אי אפשר היה עוד להסתפק בתכנון המסורתי הסכמטי, ונוצר צורך אצל מתכנני המעגלים הדיגיטליים בשפה שתאפשר תכנון מהיר של מעגלים, על ידי תאור מעגלים מורכבים ברמה אבסטרקטית, במונחים של פונקציונליות וזרימת נתונים. השפות הקיימות בעת פיתוח השפה, כמו C ו־Pascal, לא איפשרו בנייה של מעגלים חשמליים בצורה נוחה, כיון שהן אינן מותאמות לתיאור של חומרה.
שפת הורילוג מותאמת לתיאור חומרה ומאפשרת כתיבה ברמות שונות של אבסטרקציה: מהרמה החשמלית (switch level) שהיא הקרובה ביותר לחומרה, דרך השערים הלוגים (gate level), רמת זרימת הנתונים (RTL) ועד לרמת האלגוריתם (behavioural) שהיא רמת האבסטרקציה הגבוהה ביותר המתארת את הפונקציונליות ודומה בצורת הקידוד לשפות כמו C.
ורילוג היא שפה קלה ללימוד ולשימוש, ונתמכת על ידי כלים רבים המשמשים בתהליך התכנון של השבב- כלי הסימולציה וכלי הסינתזה.
השפה התפתחה בשנת 1983.
קיימות שפות מתחרות לורילוג, בהן VHDL.
להלן דוגמה לקוד פשוט בשפת ורילוג, המתאר מימוש של "ממספר אוטומטי" (קאונטר):
module Div20x (rst, clk, cet, cep, count,tc);
//TITLE 'Divide-by-20 Counter with enables'
//enable CEP is a clock enable only
//enable CET is a clock enable and enables the TC output
//a counter using the Verilog language
parameter size = 5;
parameter length = 20;
input rst; // These inputs/outputs represent connections to
input clk; // the module.
input cet;
input cep;
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)
begin
if (rst) // This simulates a reset of the counter
count <= 5'b0;
else if (cet && cep) // This simulates the enables both being true
begin
if (count == length-1)
begin
count <= 5'b0;
end
else
count <= count + 5'b1; // 5'b1 is 5 bits wide and
end // equal to the value 1.
end
// the value of tc is continuously assigned the value of the expression
assign tc = (cet && (count == length-1));
endmodule

